#include <algorithm> #include <cstring> #include <vector> #include <iterator> #include "cppunit/cppunit_proxy.h" #if !defined (STLPORT) || defined(_STLP_USE_NAMESPACES) using namespace std; #endif // // TestCase class // class CopyTest : public CPPUNIT_NS::TestCase { CPPUNIT_TEST_SUITE(CopyTest); CPPUNIT_TEST(copy_array); CPPUNIT_TEST(copy_volatile); CPPUNIT_TEST(copy_vector); CPPUNIT_TEST(copy_insert); CPPUNIT_TEST(copy_back); CPPUNIT_TEST(copy_back_array); CPPUNIT_TEST_SUITE_END(); protected: void copy_array(); void copy_volatile(); void copy_vector(); void copy_insert(); void copy_back(); void copy_back_array(); }; CPPUNIT_TEST_SUITE_REGISTRATION(CopyTest); // // tests implementation // void CopyTest::copy_array() { char string[23] = "A string to be copied."; char result[23]; copy(string, string + 23, result); CPPUNIT_ASSERT(!strncmp(string, result, 23)); } void CopyTest::copy_volatile() { { int a[] = {0, 1, 2, 3, 4, 5}; const size_t size = sizeof(a) / sizeof(a[0]); volatile int va[size]; copy(a, a + size, va); for (size_t i = 0; i != size; ++i) { CPPUNIT_ASSERT( a[i] == va[i] ); } } { const int a[] = {0, 1, 2, 3, 4, 5}; const size_t size = sizeof(a) / sizeof(a[0]); volatile int va[size]; copy(a, a + size, va); for (size_t i = 0; i != size; ++i) { CPPUNIT_ASSERT( a[i] == va[i] ); } } // Following code can be activated to check that it doesn't compiled #if 0 { int a[] = {0, 1, 2, 3, 4, 5}; const size_t size = sizeof(a) / sizeof(a[0]); const volatile int va[size] = {5, 4, 3, 2, 1, 0}; copy(a, a + size, va); for (size_t i = 0; i != size; ++i) { CPPUNIT_ASSERT( a[i] == va[i] ); } } #endif } void CopyTest::copy_vector() { vector<int> v1(10); for (int i = 0; (size_t)i < v1.size(); ++i) v1[i] = i; vector<int> v2(v1.size()); copy(v1.begin(), v1.end(), v2.begin()); CPPUNIT_ASSERT( v2 == v1 ); } void CopyTest::copy_insert() { vector<int> v1(10); for (int loc = 0; (size_t)loc < v1.size(); ++loc) v1[loc] = loc; vector<int> v2; insert_iterator<vector<int> > i(v2, v2.begin()); copy(v1.begin(), v1.end(), i); CPPUNIT_ASSERT( v2 == v1 ); } void CopyTest::copy_back() { vector<int> v1(10); for (int i = 0; (size_t)i < v1.size(); ++i) v1[i] = i; vector<int> v2(v1.size()); copy_backward(v1.begin(), v1.end(), v2.end()); CPPUNIT_ASSERT( v2 == v1 ); } void CopyTest::copy_back_array() { int numbers[5] = { 1, 2, 3, 4, 5 }; int result[5]; copy_backward(numbers, numbers + 5, (int*)result + 5); CPPUNIT_ASSERT(result[0]==numbers[0]); CPPUNIT_ASSERT(result[1]==numbers[1]); CPPUNIT_ASSERT(result[2]==numbers[2]); CPPUNIT_ASSERT(result[3]==numbers[3]); CPPUNIT_ASSERT(result[4]==numbers[4]); }