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)
8using namespace std;
9#endif
10
11//
12// TestCase class
13//
14class 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
25protected:
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
36CPPUNIT_TEST_SUITE_REGISTRATION(AdjTest);
37
38//
39// tests implementation
40//
41void 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}
53void 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}
66void AdjTest::adjfind2()
67{
68  typedef vector <const char*> CStrVector;
69
70  const 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}
81int AdjTest::equal_length(const char* v1_, const char* v2_)
82{
83  return ::strlen(v1_) == ::strlen(v2_);
84}
85void 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}
96void 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}
114void 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}
132int AdjTest::mult(int a_, int b_)
133{
134  return a_ * b_;
135}
136