]> ruin.nu Git - germs.git/blobdiff - src/test/threadgenesortertest.cpp
Initial thread infrastructure and test
[germs.git] / src / test / threadgenesortertest.cpp
diff --git a/src/test/threadgenesortertest.cpp b/src/test/threadgenesortertest.cpp
new file mode 100644 (file)
index 0000000..58d4893
--- /dev/null
@@ -0,0 +1,110 @@
+#include <cppunit/TestFixture.h>
+#include <cppunit/extensions/HelperMacros.h>
+
+#include <threadgenesorter.h>
+#include <geneorder.h>
+#include <genealgorithms.h>
+#include <reverseaction.h>
+#include <models.h>
+#include <model.h>
+
+#include <algorithm>
+#include <iterator>
+
+#include <iostream>
+using namespace std;
+
+/*
+ * A test case that is designed to produce
+ * example errors and failures.
+ *
+ */
+
+#define TESTNAME ThreadGeneSorterTest
+
+
+class TESTNAME : public CPPUNIT_NS::TestFixture
+{
+  CPPUNIT_TEST_SUITE( TESTNAME );
+  CPPUNIT_TEST( testCreate );
+  CPPUNIT_TEST( testSort );
+  CPPUNIT_TEST_SUITE_END();
+
+protected:
+               vector<int> _validPerm;
+               vector<int> _validPerm2;
+               vector<int> _validPerm3;
+               vector<int> _validPerm4;
+
+public:
+
+       void setUp (){
+               int validPerm[] = {1,2,3,4};
+               _validPerm.assign(validPerm,validPerm+4);
+               int validPerm2[] = {1,-3,-2,4};
+               _validPerm2.assign(validPerm2,validPerm2+4);
+               int validPerm3[] = {0,-2,-1,4,3,5,-8,6,7,9};
+               _validPerm3.assign(validPerm3,validPerm3+10);
+               int validPerm4[] = {-3,1,2,4,6,5,7,-15,-13,-14,-12,-10,-11,-9,8};
+               _validPerm4.assign(validPerm4,validPerm4+15);
+
+       }
+
+protected:
+
+       void testCreate (){
+               ThreadGeneSorter so(Model(new Models::ModelImpl));
+               so = so;
+       }
+       void testSort (){
+               ThreadGeneSorter so(Model(new Models::ModelImpl), 3);
+               GeneOrder go(_validPerm.begin(),_validPerm.end());
+               so.start(go);
+               so.join();
+               ThreadGeneSorter::SolutionsQueue sq  = so.solutions();
+               CPPUNIT_ASSERT_EQUAL((size_t)1u,sq.size());
+               GeneSorter::ActionList al = sq.top().second;
+               CPPUNIT_ASSERT_EQUAL((size_t)0u,al.size());
+
+               GeneOrder go2(_validPerm2.begin(),_validPerm2.end());
+               so.start(go2);
+               so.join();
+               sq  = so.solutions();
+               CPPUNIT_ASSERT_EQUAL((size_t)1u,sq.size());
+               al = sq.top().second;
+               CPPUNIT_ASSERT_EQUAL((size_t)1u,al.size());
+               CPPUNIT_ASSERT(sq.top().second[0] == ReverseAction(2,3));
+
+               sq.top().second[0](go2);
+               CPPUNIT_ASSERT(equal(go.begin(),go.end(),go2.begin()));
+
+               GeneOrder go3(_validPerm3.begin(),_validPerm3.end());
+               so.start(go3);
+               so.join();
+               sq  = so.solutions();
+               CPPUNIT_ASSERT_EQUAL((size_t)24u,sq.size());
+               al = sq.top().second;
+               CPPUNIT_ASSERT_EQUAL((size_t)5u,al.size());
+               for (size_t i = 0; i < al.size(); ++i)
+                       al[i](go3);
+               int perm[] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};
+               CPPUNIT_ASSERT(equal(go3.begin(),go3.end(),perm));
+
+               GeneOrder go4(_validPerm4.begin(),_validPerm4.end());
+
+               so.start(go3);
+               so.join();
+               sq  = so.solutions();
+               CPPUNIT_ASSERT_EQUAL((size_t)1u,sq.size());
+               al = sq.top().second;
+               CPPUNIT_ASSERT_EQUAL((size_t)13u,al.size());
+               for (size_t i = 0; i < al.size(); ++i)
+                       al[i](go4);
+               CPPUNIT_ASSERT(equal(go3.begin(),go3.end(),perm));
+
+       }
+};
+
+CPPUNIT_TEST_SUITE_REGISTRATION( TESTNAME );
+
+#undef TESTNAME