1 #include <numeric>
2 #include <vector>
3 #include <algorithm>
4
5 #include "iota.h"
6 #include "cppunit/cppunit_proxy.h"
7
8 #if !defined (STLPORT) || defined(_STLP_USE_NAMESPACES)
9 using namespace std;
10 #endif
11
12 //
13 // TestCase class
14 //
15 class RotateTest : public CPPUNIT_NS::TestCase
16 {
17 CPPUNIT_TEST_SUITE(RotateTest);
18 CPPUNIT_TEST(rotate0);
19 CPPUNIT_TEST(rotate1);
20 CPPUNIT_TEST(rotcopy0);
21 CPPUNIT_TEST(rotcopy1);
22 CPPUNIT_TEST_SUITE_END();
23
24 protected:
25 void rotate0();
26 void rotate1();
27 void rotcopy0();
28 void rotcopy1();
29 };
30
31 CPPUNIT_TEST_SUITE_REGISTRATION(RotateTest);
32
33 //
34 // tests implementation
35 //
rotate0()36 void RotateTest::rotate0()
37 {
38 int numbers[6] = { 0, 1, 2, 3, 4, 5 };
39 // 3 4 5 0 1 2
40 rotate((int*)numbers, numbers + 3, numbers + 6);
41 CPPUNIT_ASSERT(numbers[0]==3);
42 CPPUNIT_ASSERT(numbers[1]==4);
43 CPPUNIT_ASSERT(numbers[2]==5);
44 CPPUNIT_ASSERT(numbers[3]==0);
45 CPPUNIT_ASSERT(numbers[4]==1);
46 CPPUNIT_ASSERT(numbers[5]==2);
47 }
rotate1()48 void RotateTest::rotate1()
49 {
50 vector <int> v1(10);
51 __iota(v1.begin(), v1.end(), 0);
52
53 rotate(v1.begin(), v1.begin()+1, v1.end());
54 CPPUNIT_ASSERT(v1[0]==1);
55 CPPUNIT_ASSERT(v1[1]==2);
56 CPPUNIT_ASSERT(v1[2]==3);
57 CPPUNIT_ASSERT(v1[3]==4);
58 CPPUNIT_ASSERT(v1[4]==5);
59 CPPUNIT_ASSERT(v1[5]==6);
60 CPPUNIT_ASSERT(v1[6]==7);
61 CPPUNIT_ASSERT(v1[7]==8);
62 CPPUNIT_ASSERT(v1[8]==9);
63 CPPUNIT_ASSERT(v1[9]==0);
64
65 rotate(v1.begin(), v1.begin()+2, v1.end());
66 CPPUNIT_ASSERT(v1[0]==3);
67 CPPUNIT_ASSERT(v1[1]==4);
68 CPPUNIT_ASSERT(v1[2]==5);
69 CPPUNIT_ASSERT(v1[3]==6);
70 CPPUNIT_ASSERT(v1[4]==7);
71 CPPUNIT_ASSERT(v1[5]==8);
72 CPPUNIT_ASSERT(v1[6]==9);
73 CPPUNIT_ASSERT(v1[7]==0);
74 CPPUNIT_ASSERT(v1[8]==1);
75 CPPUNIT_ASSERT(v1[9]==2);
76
77 rotate(v1.begin(), v1.begin()+7, v1.end());
78 CPPUNIT_ASSERT(v1[0]==0);
79 CPPUNIT_ASSERT(v1[1]==1);
80 CPPUNIT_ASSERT(v1[2]==2);
81 CPPUNIT_ASSERT(v1[3]==3);
82 CPPUNIT_ASSERT(v1[4]==4);
83 CPPUNIT_ASSERT(v1[5]==5);
84 CPPUNIT_ASSERT(v1[6]==6);
85 CPPUNIT_ASSERT(v1[7]==7);
86 CPPUNIT_ASSERT(v1[8]==8);
87 CPPUNIT_ASSERT(v1[9]==9);
88
89 }
rotcopy0()90 void RotateTest::rotcopy0()
91 {
92 int numbers[6] = { 0, 1, 2, 3, 4, 5 };
93
94 int result[6];
95 rotate_copy((int*)numbers, (int*)numbers + 3, (int*)numbers + 6, (int*)result);
96 // 3 4 5 0 1 2
97 CPPUNIT_ASSERT(result[0]==3);
98 CPPUNIT_ASSERT(result[1]==4);
99 CPPUNIT_ASSERT(result[2]==5);
100 CPPUNIT_ASSERT(result[3]==0);
101 CPPUNIT_ASSERT(result[4]==1);
102 CPPUNIT_ASSERT(result[5]==2);
103 }
rotcopy1()104 void RotateTest::rotcopy1()
105 {
106 vector <int> v1(10);
107 __iota(v1.begin(), v1.end(), 0);
108 vector <int> v2(v1.size());
109
110 rotate_copy(v1.begin(), v1.begin()+1, v1.end(), v2.begin());
111 CPPUNIT_ASSERT(v2[0]==1);
112 CPPUNIT_ASSERT(v2[1]==2);
113 CPPUNIT_ASSERT(v2[2]==3);
114 CPPUNIT_ASSERT(v2[3]==4);
115 CPPUNIT_ASSERT(v2[4]==5);
116 CPPUNIT_ASSERT(v2[5]==6);
117 CPPUNIT_ASSERT(v2[6]==7);
118 CPPUNIT_ASSERT(v2[7]==8);
119 CPPUNIT_ASSERT(v2[8]==9);
120 CPPUNIT_ASSERT(v2[9]==0);
121
122 rotate_copy(v1.begin(), v1.begin()+3, v1.end(), v2.begin());
123 CPPUNIT_ASSERT(v2[0]==3);
124 CPPUNIT_ASSERT(v2[1]==4);
125 CPPUNIT_ASSERT(v2[2]==5);
126 CPPUNIT_ASSERT(v2[3]==6);
127 CPPUNIT_ASSERT(v2[4]==7);
128 CPPUNIT_ASSERT(v2[5]==8);
129 CPPUNIT_ASSERT(v2[6]==9);
130 CPPUNIT_ASSERT(v2[7]==0);
131 CPPUNIT_ASSERT(v2[8]==1);
132 CPPUNIT_ASSERT(v2[9]==2);
133 }
134