os/ossrv/genericopenlibs/cppstdlib/stl/test/unit/find_test.cpp
author sl@SLION-WIN7.fritz.box
Fri, 15 Jun 2012 03:10:57 +0200
changeset 0 bde4ae8d615e
permissions -rw-r--r--
First public contribution.
     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 }