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)
11using namespace std;
12#endif
13
14//
15// TestCase class
16//
17class 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
28protected:
29  void nextprm0();
30  void nextprm1();
31  void nextprm2();
32  void prevprm0();
33  void prevprm1();
34  void prevprm2();
35};
36
37CPPUNIT_TEST_SUITE_REGISTRATION(PermTest);
38
39//
40// tests implementation
41//
42void 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}
51void 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}
93void 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}
135void 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}
144void 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}
186void 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