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 "../puzzle.h"
00023
00024 using namespace Sudoku;
00025
00026 class Test_Puzzle : public CxxTest::TestSuite
00027 {
00028 public:
00029 void test_Pos()
00030 {
00031 Pos pos;
00032 TS_ASSERT_EQUALS(pos, Pos::first());
00033 TS_ASSERT_EQUALS(pos, 0u);
00034 TS_ASSERT_EQUALS(pos.col(), 0u);
00035 TS_ASSERT_EQUALS(pos.row(), 0u);
00036 TS_ASSERT_EQUALS(pos.reg(), 0u);
00037 TS_ASSERT_EQUALS(pos, Pos(0, 0));
00038
00039 TS_ASSERT_EQUALS(pos.prev_col(), pos);
00040 TS_ASSERT_EQUALS(pos.prev_row(), pos);
00041
00042 TS_ASSERT_EQUALS(pos.next(), Pos(1, 0));
00043 TS_ASSERT_EQUALS(pos.next_col(), Pos(1, 0));
00044 TS_ASSERT_EQUALS(pos.next_row(), Pos(0, 1));
00045
00046 pos = pos.symmetric();
00047 TS_ASSERT_EQUALS(pos, Pos::last());
00048 TS_ASSERT_EQUALS(pos, 80u);
00049 TS_ASSERT_EQUALS(pos.col(), 8u);
00050 TS_ASSERT_EQUALS(pos.row(), 8u);
00051 TS_ASSERT_EQUALS(pos.reg(), 8u);
00052 TS_ASSERT_EQUALS(pos, Pos(8, 8));
00053
00054 TS_ASSERT_EQUALS(pos.next(), Pos::last()+1);
00055 TS_ASSERT_EQUALS(pos.next_col(), pos);
00056 TS_ASSERT_EQUALS(pos.next_row(), pos);
00057
00058 TS_ASSERT_EQUALS(pos.prev_col(), Pos(7, 8));
00059 TS_ASSERT_EQUALS(pos.prev_row(), Pos(8, 7));
00060
00061 pos = Pos(0, 4);
00062 TS_ASSERT_EQUALS(pos.prev_col(), pos);
00063 pos = Pos(4, 0);
00064 TS_ASSERT_EQUALS(pos.prev_row(), pos);
00065 pos = Pos(4, 8);
00066 TS_ASSERT_EQUALS(pos.next_row(), pos);
00067 pos = Pos(8, 4);
00068 TS_ASSERT_EQUALS(pos.next_col(), pos);
00069 TS_ASSERT_EQUALS(pos.next(), Pos(0, 5));
00070
00071 pos = Pos::center();
00072 TS_ASSERT_EQUALS(pos, 40u);
00073 TS_ASSERT_EQUALS(pos.col(), 4u);
00074 TS_ASSERT_EQUALS(pos.row(), 4u);
00075 TS_ASSERT_EQUALS(pos.reg(), 4u);
00076 TS_ASSERT_EQUALS(pos, Pos(4, 4));
00077
00078 pos = pos.next().next_col().next_row();
00079 TS_ASSERT_EQUALS(pos, Pos(6, 5));
00080 TS_ASSERT_EQUALS(pos, 51u);
00081 TS_ASSERT_EQUALS(pos.col(), 6u);
00082 TS_ASSERT_EQUALS(pos.row(), 5u);
00083 TS_ASSERT_EQUALS(pos.reg(), 5u);
00084
00085 pos = pos.prev_col().prev_row();
00086 TS_ASSERT_EQUALS(pos, Pos(5, 4));
00087
00088 for (Pos p = Pos::first(); p <= Pos::last(); p = p.next())
00089 if (p == pos)
00090 { TS_ASSERT(!p.interacts_with(pos)); }
00091 else if (p.col() == pos.col())
00092 { TS_ASSERT(p.interacts_with(pos)); }
00093 else if (p.row() == pos.row())
00094 { TS_ASSERT(p.interacts_with(pos)); }
00095 else if (p.reg() == pos.reg())
00096 { TS_ASSERT(p.interacts_with(pos)); }
00097 else
00098 { TS_ASSERT(!p.interacts_with(pos)); }
00099 }
00100
00101 void test_NumbersEmptyDump()
00102 {
00103 Numbers numbers;
00104 const char dump[] = "_________+"
00105 "_________+"
00106 "_________+"
00107 "_________+"
00108 "_________+"
00109 "_________+"
00110 "_________+"
00111 "_________+"
00112 "_________";
00113 TS_ASSERT_SAME_DATA(numbers.get_dump(), dump, sizeof(dump));
00114 }
00115
00116 void test_NumbersConstruct()
00117 {
00118 const char dump[] = "________9+"
00119 "_______8_+"
00120 "______7__+"
00121 "_____6___+"
00122 "____5____+"
00123 "___4_____+"
00124 "__3______+"
00125 "_2_______+"
00126 "1________";
00127 Numbers numbers(dump);
00128 for (Pos p = Pos::first(); p <= Pos::last(); p = p.next())
00129 if (p.col() == DIM - 1 - p.row())
00130 { TS_ASSERT_EQUALS(numbers.get(p), p.col()+1); }
00131 else
00132 { TS_ASSERT_EQUALS(numbers.get(p), 0u); }
00133 TS_ASSERT_SAME_DATA(numbers.get_dump(), dump, sizeof(dump));
00134 }
00135
00136 void test_NumbersSetGet()
00137 {
00138 Numbers numbers;
00139 numbers.set(Pos(0, 0), 1);
00140 numbers.set(Pos(1, 1), 2);
00141 numbers.set(Pos(2, 2), 3);
00142 numbers.set(Pos(3, 3), 4);
00143 numbers.set(Pos(4, 4), 5);
00144 numbers.set(Pos(5, 5), 6);
00145 numbers.set(Pos(6, 6), 7);
00146 numbers.set(Pos(7, 7), 8);
00147 numbers.set(Pos(8, 8), 9);
00148 for (Pos p = Pos::first(); p <= Pos::last(); p = p.next())
00149 if (p.col() == p.row())
00150 { TS_ASSERT_EQUALS(numbers.get(p), p.col()+1); }
00151 else
00152 { TS_ASSERT_EQUALS(numbers.get(p), 0u); }
00153 }
00154
00155 void test_PuzzleEmpty()
00156 {
00157 Puzzle puzzle;
00158 for (Pos p = Pos::first(); p <= Pos::last(); p = p.next())
00159 {
00160 TS_ASSERT_EQUALS(puzzle.get(p), 0u);
00161 TS_ASSERT(!puzzle.given(p));
00162 }
00163 }
00164
00165 void test_PuzzleNumbers()
00166 {
00167 const char dump[] = "________9+"
00168 "_______8_+"
00169 "______7__+"
00170 "_____6___+"
00171 "____5____+"
00172 "___4_____+"
00173 "__3______+"
00174 "_2_______+"
00175 "1________";
00176 Numbers numbers(dump);
00177 Puzzle puzzle(dump);
00178 for (Pos p = Pos::first(); p <= Pos::last(); p = p.next())
00179 {
00180 TS_ASSERT_EQUALS(puzzle.get(p), numbers.get(p));
00181 TS_ASSERT_EQUALS(puzzle.given(p), numbers.get(p) != 0u);
00182 }
00183 }
00184 };