#include <vector>
#include <algorithm>
#include <numeric>
#include <iterator>
#include <functional>
#include "iota.h"
#include "cppunit/cppunit_proxy.h"
#if !defined (STLPORT) || defined(_STLP_USE_NAMESPACES)
using namespace std;
#endif
//
// TestCase class
//
class PermTest : public CPPUNIT_NS::TestCase
{
CPPUNIT_TEST_SUITE(PermTest);
CPPUNIT_TEST(nextprm0);
CPPUNIT_TEST(nextprm1);
CPPUNIT_TEST(nextprm2);
CPPUNIT_TEST(prevprm0);
CPPUNIT_TEST(prevprm1);
CPPUNIT_TEST(prevprm2);
CPPUNIT_TEST_SUITE_END();
protected:
void nextprm0();
void nextprm1();
void nextprm2();
void prevprm0();
void prevprm1();
void prevprm2();
};
CPPUNIT_TEST_SUITE_REGISTRATION(PermTest);
//
// tests implementation
//
void PermTest::prevprm0()
{
int v1[3] = { 0, 1, 2 };
prev_permutation(v1, v1 + 3);
CPPUNIT_ASSERT(v1[0]==2);
CPPUNIT_ASSERT(v1[1]==1);
CPPUNIT_ASSERT(v1[2]==0);
}
void PermTest::prevprm1()
{
vector <int> v1(3);
__iota(v1.begin(), v1.end(), 0);
prev_permutation(v1.begin(), v1.end());
CPPUNIT_ASSERT(v1[0]==2);
CPPUNIT_ASSERT(v1[1]==1);
CPPUNIT_ASSERT(v1[2]==0);
prev_permutation(v1.begin(), v1.end());
CPPUNIT_ASSERT(v1[0]==2);
CPPUNIT_ASSERT(v1[1]==0);
CPPUNIT_ASSERT(v1[2]==1);
prev_permutation(v1.begin(), v1.end());
CPPUNIT_ASSERT(v1[0]==1);
CPPUNIT_ASSERT(v1[1]==2);
CPPUNIT_ASSERT(v1[2]==0);
prev_permutation(v1.begin(), v1.end());
CPPUNIT_ASSERT(v1[0]==1);
CPPUNIT_ASSERT(v1[1]==0);
CPPUNIT_ASSERT(v1[2]==2);
prev_permutation(v1.begin(), v1.end());
CPPUNIT_ASSERT(v1[0]==0);
CPPUNIT_ASSERT(v1[1]==2);//
CPPUNIT_ASSERT(v1[2]==1);
prev_permutation(v1.begin(), v1.end());
CPPUNIT_ASSERT(v1[0]==0);
CPPUNIT_ASSERT(v1[1]==1);
CPPUNIT_ASSERT(v1[2]==2);
prev_permutation(v1.begin(), v1.end());
CPPUNIT_ASSERT(v1[0]==2);
CPPUNIT_ASSERT(v1[1]==1);
CPPUNIT_ASSERT(v1[2]==0);
prev_permutation(v1.begin(), v1.end());
CPPUNIT_ASSERT(v1[0]==2);
CPPUNIT_ASSERT(v1[1]==0);
CPPUNIT_ASSERT(v1[2]==1);
prev_permutation(v1.begin(), v1.end());
CPPUNIT_ASSERT(v1[0]==1);
CPPUNIT_ASSERT(v1[1]==2);
CPPUNIT_ASSERT(v1[2]==0);
}
void PermTest::prevprm2()
{
vector <int> v1(3);
__iota(v1.begin(), v1.end(), 0);
prev_permutation(v1.begin(), v1.end(), greater<int>());
CPPUNIT_ASSERT(v1[0]==0);
CPPUNIT_ASSERT(v1[1]==2);
CPPUNIT_ASSERT(v1[2]==1);
prev_permutation(v1.begin(), v1.end(), greater<int>());
CPPUNIT_ASSERT(v1[0]==1);
CPPUNIT_ASSERT(v1[1]==0);
CPPUNIT_ASSERT(v1[2]==2);
prev_permutation(v1.begin(), v1.end(), greater<int>());
CPPUNIT_ASSERT(v1[0]==1);
CPPUNIT_ASSERT(v1[1]==2);
CPPUNIT_ASSERT(v1[2]==0);
prev_permutation(v1.begin(), v1.end(), greater<int>());
CPPUNIT_ASSERT(v1[0]==2);
CPPUNIT_ASSERT(v1[1]==0);
CPPUNIT_ASSERT(v1[2]==1);
prev_permutation(v1.begin(), v1.end(), greater<int>());
CPPUNIT_ASSERT(v1[0]==2);
CPPUNIT_ASSERT(v1[1]==1);
CPPUNIT_ASSERT(v1[2]==0);
prev_permutation(v1.begin(), v1.end(), greater<int>());
CPPUNIT_ASSERT(v1[0]==0);
CPPUNIT_ASSERT(v1[1]==1);
CPPUNIT_ASSERT(v1[2]==2);
prev_permutation(v1.begin(), v1.end(), greater<int>());
CPPUNIT_ASSERT(v1[0]==0);
CPPUNIT_ASSERT(v1[1]==2);
CPPUNIT_ASSERT(v1[2]==1);
prev_permutation(v1.begin(), v1.end(), greater<int>());
CPPUNIT_ASSERT(v1[0]==1);
CPPUNIT_ASSERT(v1[1]==0);
CPPUNIT_ASSERT(v1[2]==2);
prev_permutation(v1.begin(), v1.end(), greater<int>());
CPPUNIT_ASSERT(v1[0]==1);
CPPUNIT_ASSERT(v1[1]==2);
CPPUNIT_ASSERT(v1[2]==0);
}
void PermTest::nextprm0()
{
int v1[3] = { 0, 1, 2 };
next_permutation(v1, v1 + 3);
CPPUNIT_ASSERT(v1[0]==0);
CPPUNIT_ASSERT(v1[1]==2);
CPPUNIT_ASSERT(v1[2]==1);
}
void PermTest::nextprm1()
{
vector <int> v1(3);
__iota(v1.begin(), v1.end(), 0);
next_permutation(v1.begin(), v1.end());
CPPUNIT_ASSERT(v1[0]==0);
CPPUNIT_ASSERT(v1[1]==2);
CPPUNIT_ASSERT(v1[2]==1);
next_permutation(v1.begin(), v1.end());
CPPUNIT_ASSERT(v1[0]==1);
CPPUNIT_ASSERT(v1[1]==0);
CPPUNIT_ASSERT(v1[2]==2);
next_permutation(v1.begin(), v1.end());
CPPUNIT_ASSERT(v1[0]==1);
CPPUNIT_ASSERT(v1[1]==2);
CPPUNIT_ASSERT(v1[2]==0);
next_permutation(v1.begin(), v1.end());
CPPUNIT_ASSERT(v1[0]==2);
CPPUNIT_ASSERT(v1[1]==0);
CPPUNIT_ASSERT(v1[2]==1);
next_permutation(v1.begin(), v1.end());
CPPUNIT_ASSERT(v1[0]==2);
CPPUNIT_ASSERT(v1[1]==1);
CPPUNIT_ASSERT(v1[2]==0);
next_permutation(v1.begin(), v1.end());
CPPUNIT_ASSERT(v1[0]==0);
CPPUNIT_ASSERT(v1[1]==1);
CPPUNIT_ASSERT(v1[2]==2);
next_permutation(v1.begin(), v1.end());
CPPUNIT_ASSERT(v1[0]==0);
CPPUNIT_ASSERT(v1[1]==2);
CPPUNIT_ASSERT(v1[2]==1);
next_permutation(v1.begin(), v1.end());
CPPUNIT_ASSERT(v1[0]==1);
CPPUNIT_ASSERT(v1[1]==0);
CPPUNIT_ASSERT(v1[2]==2);
next_permutation(v1.begin(), v1.end());
CPPUNIT_ASSERT(v1[0]==1);
CPPUNIT_ASSERT(v1[1]==2);
CPPUNIT_ASSERT(v1[2]==0);
}
void PermTest::nextprm2()
{
vector <char> v1(3);
__iota(v1.begin(), v1.end(), 'A');
next_permutation(v1.begin(), v1.end(), less<char>());
CPPUNIT_ASSERT(v1[0]=='A');
CPPUNIT_ASSERT(v1[1]=='C');
CPPUNIT_ASSERT(v1[2]=='B');
next_permutation(v1.begin(), v1.end(), less<char>());
CPPUNIT_ASSERT(v1[0]=='B');
CPPUNIT_ASSERT(v1[1]=='A');
CPPUNIT_ASSERT(v1[2]=='C');
next_permutation(v1.begin(), v1.end(), less<char>());
CPPUNIT_ASSERT(v1[0]=='B');
CPPUNIT_ASSERT(v1[1]=='C');
CPPUNIT_ASSERT(v1[2]=='A');
next_permutation(v1.begin(), v1.end(), less<char>());
CPPUNIT_ASSERT(v1[0]=='C');
CPPUNIT_ASSERT(v1[1]=='A');
CPPUNIT_ASSERT(v1[2]=='B');
next_permutation(v1.begin(), v1.end(), less<char>());
CPPUNIT_ASSERT(v1[0]=='C');
CPPUNIT_ASSERT(v1[1]=='B');
CPPUNIT_ASSERT(v1[2]=='A');
next_permutation(v1.begin(), v1.end(), less<char>());
CPPUNIT_ASSERT(v1[0]=='A');
CPPUNIT_ASSERT(v1[1]=='B');
CPPUNIT_ASSERT(v1[2]=='C');
next_permutation(v1.begin(), v1.end(), less<char>());
CPPUNIT_ASSERT(v1[0]=='A');
CPPUNIT_ASSERT(v1[1]=='C');
CPPUNIT_ASSERT(v1[2]=='B');
next_permutation(v1.begin(), v1.end(), less<char>());
CPPUNIT_ASSERT(v1[0]=='B');
CPPUNIT_ASSERT(v1[1]=='A');
CPPUNIT_ASSERT(v1[2]=='C');
next_permutation(v1.begin(), v1.end(), less<char>());
CPPUNIT_ASSERT(v1[0]=='B');
CPPUNIT_ASSERT(v1[1]=='C');
CPPUNIT_ASSERT(v1[2]=='A');
}