Home | History | Annotate | Download | only in unit
      1 #include <vector>
      2 #include <algorithm>
      3 
      4 #include "cppunit/cppunit_proxy.h"
      5 
      6 #if !defined (STLPORT) || defined(_STLP_USE_NAMESPACES)
      7 using namespace std;
      8 #endif
      9 
     10 //
     11 // TestCase class
     12 //
     13 class 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 
     23 protected:
     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 
     33 CPPUNIT_TEST_SUITE_REGISTRATION(FindTest);
     34 
     35 //
     36 // tests implementation
     37 //
     38 void 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 
     51 struct 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 
     64 void 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 
     74 void 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 
     96 void 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 
    107 bool FindTest::odd(int a_)
    108 {
    109   return (a_ % 2) != 0;
    110 }
    111 
    112 bool FindTest::div_3(int a_)
    113 {
    114   return a_ % 3 ? 0 : 1;
    115 }
    116 
    117 void 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