1#include <vector> 2#include <algorithm> 3 4#include "cppunit/cppunit_proxy.h" 5 6#if !defined (STLPORT) || defined(_STLP_USE_NAMESPACES) 7using namespace std; 8#endif 9 10// 11// TestCase class 12// 13class FindTest : public CPPUNIT_NS::TestCase 14{ 15 CPPUNIT_TEST_SUITE(FindTest); 16 CPPUNIT_TEST(find0); 17 CPPUNIT_TEST(find1); 18 CPPUNIT_TEST(findif0); 19 CPPUNIT_TEST(findif1); 20 CPPUNIT_TEST(find_char); 21 CPPUNIT_TEST_SUITE_END(); 22 23protected: 24 void find0(); 25 void find1(); 26 void findif0(); 27 void findif1(); 28 void find_char(); 29 static bool odd(int a_); 30 static bool div_3(int a_); 31}; 32 33CPPUNIT_TEST_SUITE_REGISTRATION(FindTest); 34 35// 36// tests implementation 37// 38void FindTest::find0() 39{ 40 int numbers[10] = { 0, 1, 4, 9, 16, 25, 36, 49, 64 }; 41 42 int *location = find((int*)numbers, (int*)numbers + 10, 25); 43 44 CPPUNIT_ASSERT((location - numbers)==5); 45 46 int *out_range = find((int*)numbers, (int*)numbers + 10, 128); 47 48 CPPUNIT_ASSERT( out_range == (int *)(numbers + 10) ); 49} 50 51struct Key 52{ 53 int data; 54 55 /* This operator should rather be global and commutative 56 but implementing it this way show that STLport used to 57 ask too much from the user code. */ 58 bool operator == (int d) const 59 { 60 return data == d; 61 } 62}; 63 64void FindTest::find1() 65{ 66 int years[] = { 1942, 1952, 1962, 1972, 1982, 1992 }; 67 68 const unsigned yearCount = sizeof(years) / sizeof(years[0]); 69 int* location = find((int*)years, (int*)years + yearCount, 1972); 70 71 CPPUNIT_ASSERT((location - years)==3); 72} 73 74void FindTest::findif0() 75{ 76 { 77 int numbers[6] = { 2, 4, 8, 15, 32, 64 }; 78 int *location = find_if((int*)numbers, (int*)numbers + 6, odd); 79 80 CPPUNIT_ASSERT((location - numbers)==3); 81 82 int numbers_even[6] = { 2, 4, 8, 16, 32, 64 }; 83 84 int *out_range = find_if((int*)numbers_even, (int*)numbers_even + 6, odd); 85 86 CPPUNIT_ASSERT( out_range == (int *)(numbers_even + 6) ); 87 } 88 89 { 90 Key keys[10] = { {0}, {0}, {0}, {0}, {0}, {0}, {0}, {0}, {0}, {0} }; 91 Key const* k = find(keys + 0, keys + 10, 5); 92 CPPUNIT_ASSERT( k == keys + 10 ); 93 } 94} 95 96void FindTest::findif1() 97{ 98 typedef vector <int> IntVec; 99 IntVec v(10); 100 for(int i = 0; (size_t)i < v.size(); ++i) 101 v[i] =(i + 1) *(i + 1); 102 IntVec::iterator iter; 103 iter = find_if(v.begin(), v.end(), div_3); 104 CPPUNIT_ASSERT((iter - v.begin())==2); 105} 106 107bool FindTest::odd(int a_) 108{ 109 return (a_ % 2) != 0; 110} 111 112bool FindTest::div_3(int a_) 113{ 114 return a_ % 3 ? 0 : 1; 115} 116 117void FindTest::find_char() 118{ 119 char str[] = "abcdefghij"; 120 char *pstr = (char*)str; 121 const char* cpstr = (const char*)str; 122 size_t str_size = sizeof(str) / sizeof(char); 123 124 char *d = find(pstr, pstr + str_size, 'd'); 125 CPPUNIT_ASSERT( *d == 'd' ); 126 127 const char *e = find(cpstr, cpstr + str_size, 'e'); 128 CPPUNIT_ASSERT( *e == 'e' ); 129 130 char *last = find(pstr, pstr + str_size, 'x'); 131 CPPUNIT_ASSERT( last == pstr + str_size ); 132 133 const char *clast = find(cpstr, cpstr + str_size, 'x'); 134 CPPUNIT_ASSERT( clast == cpstr + str_size ); 135} 136