os/ossrv/genericopenlibs/cppstdlib/stl/test/unit/adj_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 <numeric>
     3 #include <algorithm>
     4 
     5 #include "cppunit/cppunit_proxy.h"
     6 
     7 #if !defined (STLPORT) || defined(_STLP_USE_NAMESPACES)
     8 using namespace std;
     9 #endif
    10 
    11 //
    12 // TestCase class
    13 //
    14 class AdjTest : public CPPUNIT_NS::TestCase
    15 {
    16   CPPUNIT_TEST_SUITE(AdjTest);
    17   CPPUNIT_TEST(adjfind0);
    18   CPPUNIT_TEST(adjfind1);
    19   CPPUNIT_TEST(adjfind2);
    20   CPPUNIT_TEST(adjdiff0);
    21   CPPUNIT_TEST(adjdiff1);
    22   CPPUNIT_TEST(adjdiff2);
    23   CPPUNIT_TEST_SUITE_END();
    24 
    25 protected:
    26   void adjfind0();
    27   void adjfind1();
    28   void adjfind2();
    29   void adjdiff0();
    30   void adjdiff1();
    31   void adjdiff2();
    32   static int equal_length(const char* v1_, const char* v2_);
    33   static int mult(int a_, int b_);
    34 };
    35 
    36 CPPUNIT_TEST_SUITE_REGISTRATION(AdjTest);
    37 
    38 //
    39 // tests implementation
    40 //
    41 void AdjTest::adjfind0()
    42 {
    43   int numbers1 [5] = { 1, 2, 4, 8, 16 };
    44   int numbers2 [5] = { 5, 3, 2, 1, 1 };
    45 
    46   int* location = adjacent_find((int*)numbers1, (int*)numbers1 + 5);
    47   CPPUNIT_ASSERT(location == numbers1 + 5); // no adj so loc should be _last
    48 
    49   location = adjacent_find((int*)numbers2, (int*)numbers2 + 5);
    50   CPPUNIT_ASSERT(location != numbers2 + 5); // adj location off should be 3 (first 1)
    51   CPPUNIT_ASSERT((location - numbers2)==3);
    52 }
    53 void AdjTest::adjfind1()
    54 {
    55   typedef vector<int> IntVector;
    56   IntVector v(10);
    57   for (int i = 0; (size_t)i < v.size(); ++i)
    58     v[i] = i;
    59   IntVector::iterator location;
    60   location = adjacent_find(v.begin(), v.end());
    61   CPPUNIT_ASSERT(location == v.end());
    62   v[6] = 7;
    63   location = adjacent_find(v.begin(), v.end());
    64   CPPUNIT_ASSERT(location != v.end());
    65 }
    66 void AdjTest::adjfind2()
    67 {
    68   typedef vector <char*> CStrVector;
    69 
    70   char* names[] = { "Brett", "Graham", "Jack", "Mike", "Todd" };
    71 
    72   const int nameCount = sizeof(names)/sizeof(names[0]);
    73   CStrVector v(nameCount);
    74   for(int i = 0; i < nameCount; i++)
    75     v[i] = names[i];
    76   CStrVector::iterator location;
    77   location = adjacent_find(v.begin(), v.end(), equal_length);
    78 
    79   CPPUNIT_ASSERT(location != v.end());
    80 }
    81 int AdjTest::equal_length(const char* v1_, const char* v2_)
    82 {
    83   return ::strlen(v1_) == ::strlen(v2_);
    84 }
    85 void AdjTest::adjdiff0()
    86 {
    87   int numbers[5] = { 1, 2, 4, 8, 16 };
    88   int difference[5];
    89   adjacent_difference(numbers, numbers + 5, (int*)difference);
    90   CPPUNIT_ASSERT(difference[0]==1);
    91   CPPUNIT_ASSERT(difference[1]==1);
    92   CPPUNIT_ASSERT(difference[2]==2);
    93   CPPUNIT_ASSERT(difference[3]==4);
    94   CPPUNIT_ASSERT(difference[4]==8);
    95 }
    96 void AdjTest::adjdiff1()
    97 {
    98   vector <int> v(10);
    99   for(int i = 0; (size_t)i < v.size(); ++i)
   100     v[i] = i * i;
   101   vector<int> result(v.size());
   102   adjacent_difference(v.begin(), v.end(), result.begin());
   103   CPPUNIT_ASSERT(result[0]==0)
   104   CPPUNIT_ASSERT(result[1]==1)
   105   CPPUNIT_ASSERT(result[2]==3)
   106   CPPUNIT_ASSERT(result[3]==5)
   107   CPPUNIT_ASSERT(result[4]==7)
   108   CPPUNIT_ASSERT(result[5]==9)
   109   CPPUNIT_ASSERT(result[6]==11)
   110   CPPUNIT_ASSERT(result[7]==13)
   111   CPPUNIT_ASSERT(result[8]==15)
   112   CPPUNIT_ASSERT(result[9]==17)
   113 }
   114 void AdjTest::adjdiff2()
   115 {
   116   vector <int> v(10);
   117   for (int i = 0; (size_t)i < v.size(); ++i)
   118     v[i] = i + 1;
   119   vector <int> result(v.size());
   120   adjacent_difference(v.begin(), v.end(), result.begin(), mult);
   121   CPPUNIT_ASSERT(result[0]==1)
   122   CPPUNIT_ASSERT(result[1]==2)
   123   CPPUNIT_ASSERT(result[2]==6)
   124   CPPUNIT_ASSERT(result[3]==12)
   125   CPPUNIT_ASSERT(result[4]==20)
   126   CPPUNIT_ASSERT(result[5]==30)
   127   CPPUNIT_ASSERT(result[6]==42)
   128   CPPUNIT_ASSERT(result[7]==56)
   129   CPPUNIT_ASSERT(result[8]==72)
   130   CPPUNIT_ASSERT(result[9]==90)
   131 }
   132 int AdjTest::mult(int a_, int b_)
   133 {
   134   return a_ * b_;
   135 }