1 #include <vector>
2 #include <algorithm>
3 #include <numeric>
4 #include <iterator>
5 #include <functional>
6 
7 #include "iota.h"
8 #include "cppunit/cppunit_proxy.h"
9 
10 #if !defined (STLPORT) || defined(_STLP_USE_NAMESPACES)
11 using namespace std;
12 #endif
13 
14 //
15 // TestCase class
16 //
17 class PermTest : public CPPUNIT_NS::TestCase
18 {
19   CPPUNIT_TEST_SUITE(PermTest);
20   CPPUNIT_TEST(nextprm0);
21   CPPUNIT_TEST(nextprm1);
22   CPPUNIT_TEST(nextprm2);
23   CPPUNIT_TEST(prevprm0);
24   CPPUNIT_TEST(prevprm1);
25   CPPUNIT_TEST(prevprm2);
26   CPPUNIT_TEST_SUITE_END();
27 
28 protected:
29   void nextprm0();
30   void nextprm1();
31   void nextprm2();
32   void prevprm0();
33   void prevprm1();
34   void prevprm2();
35 };
36 
37 CPPUNIT_TEST_SUITE_REGISTRATION(PermTest);
38 
39 //
40 // tests implementation
41 //
prevprm0()42 void PermTest::prevprm0()
43 {
44   int v1[3] = { 0, 1, 2 };
45   prev_permutation(v1, v1 + 3);
46 
47   CPPUNIT_ASSERT(v1[0]==2);
48   CPPUNIT_ASSERT(v1[1]==1);
49   CPPUNIT_ASSERT(v1[2]==0);
50 }
prevprm1()51 void PermTest::prevprm1()
52 {
53   vector <int> v1(3);
54   __iota(v1.begin(), v1.end(), 0);
55 
56   prev_permutation(v1.begin(), v1.end());
57   CPPUNIT_ASSERT(v1[0]==2);
58   CPPUNIT_ASSERT(v1[1]==1);
59   CPPUNIT_ASSERT(v1[2]==0);
60   prev_permutation(v1.begin(), v1.end());
61   CPPUNIT_ASSERT(v1[0]==2);
62   CPPUNIT_ASSERT(v1[1]==0);
63   CPPUNIT_ASSERT(v1[2]==1);
64   prev_permutation(v1.begin(), v1.end());
65   CPPUNIT_ASSERT(v1[0]==1);
66   CPPUNIT_ASSERT(v1[1]==2);
67   CPPUNIT_ASSERT(v1[2]==0);
68   prev_permutation(v1.begin(), v1.end());
69   CPPUNIT_ASSERT(v1[0]==1);
70   CPPUNIT_ASSERT(v1[1]==0);
71   CPPUNIT_ASSERT(v1[2]==2);
72   prev_permutation(v1.begin(), v1.end());
73   CPPUNIT_ASSERT(v1[0]==0);
74   CPPUNIT_ASSERT(v1[1]==2);//
75   CPPUNIT_ASSERT(v1[2]==1);
76   prev_permutation(v1.begin(), v1.end());
77   CPPUNIT_ASSERT(v1[0]==0);
78   CPPUNIT_ASSERT(v1[1]==1);
79   CPPUNIT_ASSERT(v1[2]==2);
80   prev_permutation(v1.begin(), v1.end());
81   CPPUNIT_ASSERT(v1[0]==2);
82   CPPUNIT_ASSERT(v1[1]==1);
83   CPPUNIT_ASSERT(v1[2]==0);
84   prev_permutation(v1.begin(), v1.end());
85   CPPUNIT_ASSERT(v1[0]==2);
86   CPPUNIT_ASSERT(v1[1]==0);
87   CPPUNIT_ASSERT(v1[2]==1);
88   prev_permutation(v1.begin(), v1.end());
89   CPPUNIT_ASSERT(v1[0]==1);
90   CPPUNIT_ASSERT(v1[1]==2);
91   CPPUNIT_ASSERT(v1[2]==0);
92 }
prevprm2()93 void PermTest::prevprm2()
94 {
95   vector <int> v1(3);
96   __iota(v1.begin(), v1.end(), 0);
97 
98   prev_permutation(v1.begin(), v1.end(), greater<int>());
99   CPPUNIT_ASSERT(v1[0]==0);
100   CPPUNIT_ASSERT(v1[1]==2);
101   CPPUNIT_ASSERT(v1[2]==1);
102   prev_permutation(v1.begin(), v1.end(), greater<int>());
103   CPPUNIT_ASSERT(v1[0]==1);
104   CPPUNIT_ASSERT(v1[1]==0);
105   CPPUNIT_ASSERT(v1[2]==2);
106   prev_permutation(v1.begin(), v1.end(), greater<int>());
107   CPPUNIT_ASSERT(v1[0]==1);
108   CPPUNIT_ASSERT(v1[1]==2);
109   CPPUNIT_ASSERT(v1[2]==0);
110   prev_permutation(v1.begin(), v1.end(), greater<int>());
111   CPPUNIT_ASSERT(v1[0]==2);
112   CPPUNIT_ASSERT(v1[1]==0);
113   CPPUNIT_ASSERT(v1[2]==1);
114   prev_permutation(v1.begin(), v1.end(), greater<int>());
115   CPPUNIT_ASSERT(v1[0]==2);
116   CPPUNIT_ASSERT(v1[1]==1);
117   CPPUNIT_ASSERT(v1[2]==0);
118   prev_permutation(v1.begin(), v1.end(), greater<int>());
119   CPPUNIT_ASSERT(v1[0]==0);
120   CPPUNIT_ASSERT(v1[1]==1);
121   CPPUNIT_ASSERT(v1[2]==2);
122   prev_permutation(v1.begin(), v1.end(), greater<int>());
123   CPPUNIT_ASSERT(v1[0]==0);
124   CPPUNIT_ASSERT(v1[1]==2);
125   CPPUNIT_ASSERT(v1[2]==1);
126   prev_permutation(v1.begin(), v1.end(), greater<int>());
127   CPPUNIT_ASSERT(v1[0]==1);
128   CPPUNIT_ASSERT(v1[1]==0);
129   CPPUNIT_ASSERT(v1[2]==2);
130   prev_permutation(v1.begin(), v1.end(), greater<int>());
131   CPPUNIT_ASSERT(v1[0]==1);
132   CPPUNIT_ASSERT(v1[1]==2);
133   CPPUNIT_ASSERT(v1[2]==0);
134 }
nextprm0()135 void PermTest::nextprm0()
136 {
137   int v1[3] = { 0, 1, 2 };
138   next_permutation(v1, v1 + 3);
139 
140   CPPUNIT_ASSERT(v1[0]==0);
141   CPPUNIT_ASSERT(v1[1]==2);
142   CPPUNIT_ASSERT(v1[2]==1);
143 }
nextprm1()144 void PermTest::nextprm1()
145 {
146   vector <int> v1(3);
147   __iota(v1.begin(), v1.end(), 0);
148 
149   next_permutation(v1.begin(), v1.end());
150   CPPUNIT_ASSERT(v1[0]==0);
151   CPPUNIT_ASSERT(v1[1]==2);
152   CPPUNIT_ASSERT(v1[2]==1);
153   next_permutation(v1.begin(), v1.end());
154   CPPUNIT_ASSERT(v1[0]==1);
155   CPPUNIT_ASSERT(v1[1]==0);
156   CPPUNIT_ASSERT(v1[2]==2);
157   next_permutation(v1.begin(), v1.end());
158   CPPUNIT_ASSERT(v1[0]==1);
159   CPPUNIT_ASSERT(v1[1]==2);
160   CPPUNIT_ASSERT(v1[2]==0);
161   next_permutation(v1.begin(), v1.end());
162   CPPUNIT_ASSERT(v1[0]==2);
163   CPPUNIT_ASSERT(v1[1]==0);
164   CPPUNIT_ASSERT(v1[2]==1);
165   next_permutation(v1.begin(), v1.end());
166   CPPUNIT_ASSERT(v1[0]==2);
167   CPPUNIT_ASSERT(v1[1]==1);
168   CPPUNIT_ASSERT(v1[2]==0);
169   next_permutation(v1.begin(), v1.end());
170   CPPUNIT_ASSERT(v1[0]==0);
171   CPPUNIT_ASSERT(v1[1]==1);
172   CPPUNIT_ASSERT(v1[2]==2);
173   next_permutation(v1.begin(), v1.end());
174   CPPUNIT_ASSERT(v1[0]==0);
175   CPPUNIT_ASSERT(v1[1]==2);
176   CPPUNIT_ASSERT(v1[2]==1);
177   next_permutation(v1.begin(), v1.end());
178   CPPUNIT_ASSERT(v1[0]==1);
179   CPPUNIT_ASSERT(v1[1]==0);
180   CPPUNIT_ASSERT(v1[2]==2);
181   next_permutation(v1.begin(), v1.end());
182   CPPUNIT_ASSERT(v1[0]==1);
183   CPPUNIT_ASSERT(v1[1]==2);
184   CPPUNIT_ASSERT(v1[2]==0);
185 }
nextprm2()186 void PermTest::nextprm2()
187 {
188   vector <char> v1(3);
189   __iota(v1.begin(), v1.end(), 'A');
190 
191   next_permutation(v1.begin(), v1.end(), less<char>());
192   CPPUNIT_ASSERT(v1[0]=='A');
193   CPPUNIT_ASSERT(v1[1]=='C');
194   CPPUNIT_ASSERT(v1[2]=='B');
195   next_permutation(v1.begin(), v1.end(), less<char>());
196   CPPUNIT_ASSERT(v1[0]=='B');
197   CPPUNIT_ASSERT(v1[1]=='A');
198   CPPUNIT_ASSERT(v1[2]=='C');
199   next_permutation(v1.begin(), v1.end(), less<char>());
200   CPPUNIT_ASSERT(v1[0]=='B');
201   CPPUNIT_ASSERT(v1[1]=='C');
202   CPPUNIT_ASSERT(v1[2]=='A');
203   next_permutation(v1.begin(), v1.end(), less<char>());
204   CPPUNIT_ASSERT(v1[0]=='C');
205   CPPUNIT_ASSERT(v1[1]=='A');
206   CPPUNIT_ASSERT(v1[2]=='B');
207   next_permutation(v1.begin(), v1.end(), less<char>());
208   CPPUNIT_ASSERT(v1[0]=='C');
209   CPPUNIT_ASSERT(v1[1]=='B');
210   CPPUNIT_ASSERT(v1[2]=='A');
211   next_permutation(v1.begin(), v1.end(), less<char>());
212   CPPUNIT_ASSERT(v1[0]=='A');
213   CPPUNIT_ASSERT(v1[1]=='B');
214   CPPUNIT_ASSERT(v1[2]=='C');
215   next_permutation(v1.begin(), v1.end(), less<char>());
216   CPPUNIT_ASSERT(v1[0]=='A');
217   CPPUNIT_ASSERT(v1[1]=='C');
218   CPPUNIT_ASSERT(v1[2]=='B');
219   next_permutation(v1.begin(), v1.end(), less<char>());
220   CPPUNIT_ASSERT(v1[0]=='B');
221   CPPUNIT_ASSERT(v1[1]=='A');
222   CPPUNIT_ASSERT(v1[2]=='C');
223   next_permutation(v1.begin(), v1.end(), less<char>());
224   CPPUNIT_ASSERT(v1[0]=='B');
225   CPPUNIT_ASSERT(v1[1]=='C');
226   CPPUNIT_ASSERT(v1[2]=='A');
227 
228 }
229