]> ruin.nu Git - germs.git/blob - src/test/threadgenesortertest.cpp
58d489387d55189257363dadf39b0a7624224f00
[germs.git] / src / test / threadgenesortertest.cpp
1 #include <cppunit/TestFixture.h>
2 #include <cppunit/extensions/HelperMacros.h>
3
4 #include <threadgenesorter.h>
5 #include <geneorder.h>
6 #include <genealgorithms.h>
7 #include <reverseaction.h>
8 #include <models.h>
9 #include <model.h>
10
11 #include <algorithm>
12 #include <iterator>
13
14 #include <iostream>
15 using namespace std;
16
17 /*
18  * A test case that is designed to produce
19  * example errors and failures.
20  *
21  */
22
23 #define TESTNAME ThreadGeneSorterTest
24
25
26 class TESTNAME : public CPPUNIT_NS::TestFixture
27 {
28   CPPUNIT_TEST_SUITE( TESTNAME );
29   CPPUNIT_TEST( testCreate );
30   CPPUNIT_TEST( testSort );
31   CPPUNIT_TEST_SUITE_END();
32
33 protected:
34                 vector<int> _validPerm;
35                 vector<int> _validPerm2;
36                 vector<int> _validPerm3;
37                 vector<int> _validPerm4;
38
39 public:
40
41         void setUp (){
42                 int validPerm[] = {1,2,3,4};
43                 _validPerm.assign(validPerm,validPerm+4);
44                 int validPerm2[] = {1,-3,-2,4};
45                 _validPerm2.assign(validPerm2,validPerm2+4);
46                 int validPerm3[] = {0,-2,-1,4,3,5,-8,6,7,9};
47                 _validPerm3.assign(validPerm3,validPerm3+10);
48                 int validPerm4[] = {-3,1,2,4,6,5,7,-15,-13,-14,-12,-10,-11,-9,8};
49                 _validPerm4.assign(validPerm4,validPerm4+15);
50
51         }
52
53 protected:
54
55         void testCreate (){
56                 ThreadGeneSorter so(Model(new Models::ModelImpl));
57                 so = so;
58         }
59         void testSort (){
60                 ThreadGeneSorter so(Model(new Models::ModelImpl), 3);
61                 GeneOrder go(_validPerm.begin(),_validPerm.end());
62                 so.start(go);
63                 so.join();
64                 ThreadGeneSorter::SolutionsQueue sq  = so.solutions();
65                 CPPUNIT_ASSERT_EQUAL((size_t)1u,sq.size());
66                 GeneSorter::ActionList al = sq.top().second;
67                 CPPUNIT_ASSERT_EQUAL((size_t)0u,al.size());
68
69                 GeneOrder go2(_validPerm2.begin(),_validPerm2.end());
70                 so.start(go2);
71                 so.join();
72                 sq  = so.solutions();
73                 CPPUNIT_ASSERT_EQUAL((size_t)1u,sq.size());
74                 al = sq.top().second;
75                 CPPUNIT_ASSERT_EQUAL((size_t)1u,al.size());
76                 CPPUNIT_ASSERT(sq.top().second[0] == ReverseAction(2,3));
77
78                 sq.top().second[0](go2);
79                 CPPUNIT_ASSERT(equal(go.begin(),go.end(),go2.begin()));
80
81                 GeneOrder go3(_validPerm3.begin(),_validPerm3.end());
82                 so.start(go3);
83                 so.join();
84                 sq  = so.solutions();
85                 CPPUNIT_ASSERT_EQUAL((size_t)24u,sq.size());
86                 al = sq.top().second;
87                 CPPUNIT_ASSERT_EQUAL((size_t)5u,al.size());
88                 for (size_t i = 0; i < al.size(); ++i)
89                         al[i](go3);
90                 int perm[] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};
91                 CPPUNIT_ASSERT(equal(go3.begin(),go3.end(),perm));
92
93                 GeneOrder go4(_validPerm4.begin(),_validPerm4.end());
94
95                 so.start(go3);
96                 so.join();
97                 sq  = so.solutions();
98                 CPPUNIT_ASSERT_EQUAL((size_t)1u,sq.size());
99                 al = sq.top().second;
100                 CPPUNIT_ASSERT_EQUAL((size_t)13u,al.size());
101                 for (size_t i = 0; i < al.size(); ++i)
102                         al[i](go4);
103                 CPPUNIT_ASSERT(equal(go3.begin(),go3.end(),perm));
104
105         }
106 };
107
108 CPPUNIT_TEST_SUITE_REGISTRATION( TESTNAME );
109
110 #undef TESTNAME