test_backtrack.h
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include <cxxtest/TestSuite.h>
00022 #include "../backtrack.h"
00023
00024 using namespace BackTrack;
00025
00026 template<typename Type, unsigned int Size>
00027 class Permutation : public Solution
00028 {
00029 Type (&list)[Size];
00030 public:
00031 Permutation(Type (&list)[Size]) : list(list) {}
00032 virtual void set_first_at(unsigned int level) { list[level] = (Type)0; }
00033 virtual void set_next_at(unsigned int level) { ++list[level]; }
00034 virtual void reset_at(unsigned int level) {}
00035 virtual bool is_last_at(unsigned int level) const
00036 {
00037 return list[level] >= (Type)Size-1;
00038 }
00039 virtual bool is_valid_at(int level) const
00040 {
00041 for (int idx = 0; idx < level; ++idx)
00042 if (list[idx] == list[level])
00043 return false;
00044 return true;
00045 }
00046 virtual bool is_last_level(int level) const { return level >= int(Size)-1; }
00047 };
00048
00049 class Test_BackTrack : public CxxTest::TestSuite
00050 {
00051 public:
00052 void test_PermutationBackTrack()
00053 {
00054 int list[3];
00055 Permutation<int, 3> perm(list);
00056 Algorithm algorithm(perm);
00057 algorithm.find_next_solution();
00058
00059 bool first_permutation = algorithm.solution_is_valid();
00060 TS_ASSERT(first_permutation);
00061 TS_ASSERT_EQUALS(list[0], 0);
00062 TS_ASSERT_EQUALS(list[1], 1);
00063 TS_ASSERT_EQUALS(list[2], 2);
00064 algorithm.find_next_solution();
00065
00066 bool second_permutation = algorithm.solution_is_valid();
00067 TS_ASSERT(second_permutation);
00068 TS_ASSERT_EQUALS(list[0], 0);
00069 TS_ASSERT_EQUALS(list[1], 2);
00070 TS_ASSERT_EQUALS(list[2], 1);
00071 algorithm.find_next_solution();
00072
00073 bool third_permutation = algorithm.solution_is_valid();
00074 TS_ASSERT(third_permutation);
00075 TS_ASSERT_EQUALS(list[0], 1);
00076 TS_ASSERT_EQUALS(list[1], 0);
00077 TS_ASSERT_EQUALS(list[2], 2);
00078 algorithm.find_next_solution();
00079
00080 bool fourth_permutation = algorithm.solution_is_valid();
00081 TS_ASSERT(fourth_permutation);
00082 TS_ASSERT_EQUALS(list[0], 1);
00083 TS_ASSERT_EQUALS(list[1], 2);
00084 TS_ASSERT_EQUALS(list[2], 0);
00085 algorithm.find_next_solution();
00086
00087 bool fifth_permutation = algorithm.solution_is_valid();
00088 TS_ASSERT(fifth_permutation);
00089 TS_ASSERT_EQUALS(list[0], 2);
00090 TS_ASSERT_EQUALS(list[1], 0);
00091 TS_ASSERT_EQUALS(list[2], 1);
00092 algorithm.find_next_solution();
00093
00094 bool sixth_permutation = algorithm.solution_is_valid();
00095 TS_ASSERT(sixth_permutation);
00096 TS_ASSERT_EQUALS(list[0], 2);
00097 TS_ASSERT_EQUALS(list[1], 1);
00098 TS_ASSERT_EQUALS(list[2], 0);
00099 algorithm.find_next_solution();
00100
00101 bool too_many_permutations = algorithm.solution_is_valid();
00102 TS_ASSERT(!too_many_permutations);
00103 }
00104 };