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 RmCpTest : public CPPUNIT_NS::TestCase
14{
15  CPPUNIT_TEST_SUITE(RmCpTest);
16  CPPUNIT_TEST(remcopy1);
17  CPPUNIT_TEST(remcpif1);
18  CPPUNIT_TEST(remif1);
19  CPPUNIT_TEST(remove1);
20  CPPUNIT_TEST(repcpif1);
21  CPPUNIT_TEST(replace0);
22  CPPUNIT_TEST(replace1);
23  CPPUNIT_TEST(replcpy1);
24  CPPUNIT_TEST(replif1);
25  CPPUNIT_TEST(revcopy1);
26  CPPUNIT_TEST(reverse1);
27  CPPUNIT_TEST_SUITE_END();
28
29protected:
30  void remcopy1();
31  void remcpif1();
32  void remif1();
33  void remove1();
34  void repcpif1();
35  void replace0();
36  void replace1();
37  void replcpy1();
38  void replif1();
39  void revcopy1();
40  void reverse1();
41
42};
43
44CPPUNIT_TEST_SUITE_REGISTRATION(RmCpTest);
45
46static bool odd(int a_)
47{
48  return (a_ % 2) != 0;
49}
50//
51// tests implementation
52//
53
54void RmCpTest::reverse1()
55{
56  int numbers[6] = { 0, 1, 2, 3, 4, 5 };
57
58  reverse(numbers, numbers + 6);
59  CPPUNIT_ASSERT(numbers[0]==5);
60  CPPUNIT_ASSERT(numbers[1]==4);
61  CPPUNIT_ASSERT(numbers[2]==3);
62  CPPUNIT_ASSERT(numbers[3]==2);
63  CPPUNIT_ASSERT(numbers[4]==1);
64  CPPUNIT_ASSERT(numbers[5]==0);
65}
66
67void RmCpTest::revcopy1()
68{
69  int numbers[6] = { 0, 1, 2, 3, 4, 5 };
70
71  int result[6];
72  reverse_copy((int*)numbers, (int*)numbers + 6, (int*)result);
73  // 5 4 3 2 1 0
74  CPPUNIT_ASSERT(result[0]==5);
75  CPPUNIT_ASSERT(result[1]==4);
76  CPPUNIT_ASSERT(result[2]==3);
77  CPPUNIT_ASSERT(result[3]==2);
78  CPPUNIT_ASSERT(result[4]==1);
79  CPPUNIT_ASSERT(result[5]==0);
80}
81
82void RmCpTest::replif1()
83{
84  vector <int> v1(10);
85  for (int i = 0; (size_t)i < v1.size(); ++i)
86    v1[i] = i % 5;
87
88  replace_if(v1.begin(), v1.end(), odd, 42);
89
90  // 0 42 2 42 4 0 42 2 42 4
91  CPPUNIT_ASSERT(v1[0]==0);
92  CPPUNIT_ASSERT(v1[1]==42);
93  CPPUNIT_ASSERT(v1[2]==2);
94  CPPUNIT_ASSERT(v1[3]==42);
95  CPPUNIT_ASSERT(v1[4]==4);
96  CPPUNIT_ASSERT(v1[5]==0);
97  CPPUNIT_ASSERT(v1[6]==42);
98  CPPUNIT_ASSERT(v1[7]==2);
99  CPPUNIT_ASSERT(v1[8]==42);
100  CPPUNIT_ASSERT(v1[9]==4);
101}
102
103void RmCpTest::replcpy1()
104{
105  int numbers[6] = { 0, 1, 2, 0, 1, 2 };
106  int result[6] = { 0, 0, 0, 0, 0, 0 };
107
108  replace_copy((int*)numbers, (int*)numbers + 6, (int*)result, 2, 42);
109  CPPUNIT_ASSERT(result[0]==0);
110  CPPUNIT_ASSERT(result[1]==1);
111  CPPUNIT_ASSERT(result[2]==42);
112  CPPUNIT_ASSERT(result[3]==0);
113  CPPUNIT_ASSERT(result[4]==1);
114  CPPUNIT_ASSERT(result[5]==42);
115}
116
117void RmCpTest::replace0()
118{
119  int numbers[6] = { 0, 1, 2, 0, 1, 2 };
120
121  replace(numbers, numbers + 6, 2, 42);
122
123  // 0 1 42 0 1 42
124  CPPUNIT_ASSERT(numbers[0]==0);
125  CPPUNIT_ASSERT(numbers[1]==1);
126  CPPUNIT_ASSERT(numbers[2]==42);
127  CPPUNIT_ASSERT(numbers[3]==0);
128  CPPUNIT_ASSERT(numbers[4]==1);
129  CPPUNIT_ASSERT(numbers[5]==42);
130}
131
132void RmCpTest::replace1()
133{
134  vector <int> v1(10);
135  for (int i = 0; (size_t)i < v1.size(); ++i)
136    v1[i] = i % 5;
137  replace(v1.begin(), v1.end(), 2, 42);
138
139  // 0 1 2 3 4 0 1 2 3 4
140  // 0 1 42 3 4 0 1 42 3 4
141  CPPUNIT_ASSERT(v1[0]==0);
142  CPPUNIT_ASSERT(v1[1]==1);
143  CPPUNIT_ASSERT(v1[2]==42);
144  CPPUNIT_ASSERT(v1[3]==3);
145  CPPUNIT_ASSERT(v1[4]==4);
146  CPPUNIT_ASSERT(v1[5]==0);
147  CPPUNIT_ASSERT(v1[6]==1);
148  CPPUNIT_ASSERT(v1[7]==42);
149  CPPUNIT_ASSERT(v1[8]==3);
150  CPPUNIT_ASSERT(v1[9]==4);
151}
152
153void RmCpTest::repcpif1()
154{
155  vector <int> v1(10);
156  for (int i = 0; (size_t)i < v1.size(); ++i)
157    v1[i] = i % 5;
158  vector <int> v2(v1.size());
159
160  // 0 1 2 3 4 0 1 2 3 4
161  // 0 1 2 3 4 0 1 2 3 4
162  // 0 42 2 42 4 0 42 2 42 4
163  replace_copy_if(v1.begin(), v1.end(), v2.begin(), odd, 42);
164  CPPUNIT_ASSERT(v1[0]==0);
165  CPPUNIT_ASSERT(v1[1]==1);
166  CPPUNIT_ASSERT(v1[2]==2);
167  CPPUNIT_ASSERT(v1[3]==3);
168  CPPUNIT_ASSERT(v1[4]==4);
169  CPPUNIT_ASSERT(v1[5]==0);
170  CPPUNIT_ASSERT(v1[6]==1);
171  CPPUNIT_ASSERT(v1[7]==2);
172  CPPUNIT_ASSERT(v1[8]==3);
173  CPPUNIT_ASSERT(v1[9]==4);
174
175  CPPUNIT_ASSERT(v2[0]==0);
176  CPPUNIT_ASSERT(v2[1]==42);
177  CPPUNIT_ASSERT(v2[2]==2);
178  CPPUNIT_ASSERT(v2[3]==42);
179  CPPUNIT_ASSERT(v2[4]==4);
180  CPPUNIT_ASSERT(v2[5]==0);
181  CPPUNIT_ASSERT(v2[6]==42);
182  CPPUNIT_ASSERT(v2[7]==2);
183  CPPUNIT_ASSERT(v2[8]==42);
184  CPPUNIT_ASSERT(v2[9]==4);
185}
186
187void RmCpTest::remove1()
188{
189  int numbers[6] = { 1, 2, 3, 1, 2, 3 };
190  remove((int*)numbers, (int*)numbers + 6, 1);
191
192  // 2 3 2 3 2 3
193  CPPUNIT_ASSERT(numbers[0]==2);
194  CPPUNIT_ASSERT(numbers[1]==3);
195  CPPUNIT_ASSERT(numbers[2]==2);
196  CPPUNIT_ASSERT(numbers[3]==3);
197  CPPUNIT_ASSERT(numbers[4]==2);
198  CPPUNIT_ASSERT(numbers[5]==3);
199}
200
201void RmCpTest::remif1()
202{
203  int numbers[6] = { 0, 0, 1, 1, 2, 2 };
204
205  remove_if((int*)numbers, (int*)numbers + 6, odd);
206
207  // 0 0 2 2 2 2
208  CPPUNIT_ASSERT(numbers[0]==0);
209  CPPUNIT_ASSERT(numbers[1]==0);
210  CPPUNIT_ASSERT(numbers[2]==2);
211  CPPUNIT_ASSERT(numbers[3]==2);
212  CPPUNIT_ASSERT(numbers[4]==2);
213  CPPUNIT_ASSERT(numbers[5]==2);
214}
215
216void RmCpTest::remcopy1()
217{
218  int numbers[6] = { 1, 2, 3, 1, 2, 3 };
219  int result[6] = { 0, 0, 0, 0, 0, 0 };
220
221  remove_copy((int*)numbers, (int*)numbers + 6, (int*)result, 2);
222
223  CPPUNIT_ASSERT(result[0]==1);
224  CPPUNIT_ASSERT(result[1]==3);
225  CPPUNIT_ASSERT(result[2]==1);
226  CPPUNIT_ASSERT(result[3]==3);
227  CPPUNIT_ASSERT(result[4]==0);
228  CPPUNIT_ASSERT(result[5]==0);
229}
230
231void RmCpTest::remcpif1()
232{
233  int numbers[6] = { 1, 2, 3, 1, 2, 3 };
234  int result[6] = { 0, 0, 0, 0, 0, 0 };
235
236  remove_copy_if((int*)numbers, (int*)numbers + 6, (int*)result, odd);
237
238  // 2 2 0 0 0 0
239  CPPUNIT_ASSERT(result[0]==2);
240  CPPUNIT_ASSERT(result[1]==2);
241  CPPUNIT_ASSERT(result[2]==0);
242  CPPUNIT_ASSERT(result[3]==0);
243  CPPUNIT_ASSERT(result[4]==0);
244  CPPUNIT_ASSERT(result[5]==0);
245}
246