File indexing completed on 2024-04-28 04:05:22
0001 #include "streaks_test.h" 0002 0003 #include <QTest> 0004 0005 #include "streaks.h" 0006 0007 QTEST_GUILESS_MAIN(StreaksTest) 0008 0009 #define STREAK_TEST(map, state, expected) do { \ 0010 QSharedPointer<Streaks> s = generateStreaks(map, state); \ 0011 if (!s) { \ 0012 QFAIL("Streak generation failed."); \ 0013 } \ 0014 QList<Streaks::Streak> row = s->getRowStreak(0); \ 0015 QVERIFY(streakEquals(row, expected)); \ 0016 } while (false); 0017 0018 /** 0019 * Generates a Streaks instance from the given string representations 0020 * of map and state. A map string consists of '.' and 'b' chars, representing 0021 * respectively Nothing and Box cells. A state string consists of '.', 'b' and 0022 * 'x' chars (with 'x' representing cross cells). If the board has more than 0023 * one row, each line is terminated by '\n'. 0024 */ 0025 static QSharedPointer<Streaks> 0026 generateStreaks(const QString &map, const QString &state) 0027 { 0028 if (map.size() != state.size()) { 0029 return QSharedPointer<Streaks>(); 0030 } 0031 0032 /* Generate the map. */ 0033 0034 QList<Board::State> ss; 0035 for (int i = 0; i < map.size(); i++) { 0036 switch (map[i].toLatin1()) { 0037 case '.': /* Nothing. */ 0038 ss.append(Board::Nothing); 0039 break; 0040 case 'b': /* Box. */ 0041 ss.append(Board::Box); 0042 break; 0043 default: 0044 return QSharedPointer<Streaks>(); 0045 } 0046 } 0047 0048 QSharedPointer<BoardMap> mptr(new BoardMap(map.size(), 1, ss)); 0049 0050 /* Generate the state. */ 0051 0052 QSharedPointer<BoardState> sptr(new BoardState(state.size(), 1)); 0053 0054 for (int i = 0; i < state.size(); i++) { 0055 switch (state[i].toLatin1()) { 0056 case '.': /* Nothing. */ 0057 break; 0058 case 'b': /* Box. */ 0059 sptr->set(i, 0, Board::Box); 0060 break; 0061 case 'x': /* Cross. */ 0062 sptr->set(i, 0, Board::Cross); 0063 break; 0064 default: 0065 return QSharedPointer<Streaks>(); 0066 } 0067 } 0068 0069 return QSharedPointer<Streaks>(new Streaks(mptr, sptr)); 0070 } 0071 0072 /** 0073 * Compares the actual streak result against a string representing the 0074 * expected result. The string consists of 'x' and '.' characters representing, 0075 * respectively, solved and unsolved streaks. 0076 */ 0077 static bool 0078 streakEquals(const QList<Streaks::Streak> &actual, 0079 const QString &expected) 0080 { 0081 if (actual.size() != expected.size()) { 0082 qWarning() << "Actual size not equal to expected size."; 0083 return false; 0084 } 0085 0086 QString actualString; 0087 0088 for (int i = 0; i < expected.size(); i++) { 0089 if (actual[i].solved) { 0090 actualString.append(QLatin1Char('x')); 0091 } else { 0092 actualString.append(QLatin1Char('.')); 0093 } 0094 } 0095 0096 if (actualString == expected) { 0097 return true; 0098 } 0099 0100 qWarning() << QStringLiteral("Result mismatch. Actual: ") + actualString + QStringLiteral(", Expected: ") + expected; 0101 0102 return false; 0103 } 0104 0105 void StreaksTest::testSanity() 0106 { 0107 QSharedPointer<Streaks> s = generateStreaks(QStringLiteral("....b"), QStringLiteral("xxxxb")); 0108 0109 QCOMPARE(1, 1); 0110 } 0111 0112 void StreaksTest::test00() 0113 { 0114 /* Lifted from https://bugs.kde.org/show_bug.cgi?id=321842 */ 0115 STREAK_TEST(QStringLiteral("bb.b.bbbb.bbb.b"), 0116 QStringLiteral("bbxbxbb.bxbbbxb"), 0117 QStringLiteral("xx.xx")); 0118 } 0119 0120 void StreaksTest::test01() 0121 { 0122 /* Lifted from https://bugs.kde.org/show_bug.cgi?id=321842 */ 0123 STREAK_TEST(QStringLiteral("bb.b.bbbb.bbb.b"), 0124 QStringLiteral("bbxbxbb.bxb.bxb"), 0125 QStringLiteral("xx..x")); 0126 } 0127 0128 void StreaksTest::test02() 0129 { 0130 /* Lifted from https://bugs.kde.org/show_bug.cgi?id=321842 */ 0131 STREAK_TEST(QStringLiteral("bb.b.bbbb.bbb.b"), 0132 QStringLiteral("bbxbxbbbbxbbbxb"), 0133 QStringLiteral("xxxxx")); 0134 } 0135 0136 void StreaksTest::test03() 0137 { 0138 STREAK_TEST(QStringLiteral("bb.b.bbbb.bbb.b"), 0139 QStringLiteral("bbxbxbbbbxbb..."), 0140 QStringLiteral("xxx..")); 0141 } 0142 0143 void StreaksTest::test04() 0144 { 0145 STREAK_TEST(QStringLiteral("bb.b.bbbb.bbb.b"), 0146 QStringLiteral("bbxbxbbbbxbbb.."), 0147 QStringLiteral("xxxx.")); 0148 } 0149 0150 void StreaksTest::test05() 0151 { 0152 STREAK_TEST(QStringLiteral("b.b......."), 0153 QStringLiteral("bxb....bxb"), 0154 QStringLiteral("..")); 0155 } 0156 0157 void StreaksTest::test06() 0158 { 0159 STREAK_TEST(QStringLiteral("b.b......."), 0160 QStringLiteral("b........b"), 0161 QStringLiteral("xx")); 0162 } 0163 0164 void StreaksTest::test07() 0165 { 0166 STREAK_TEST(QStringLiteral("b.b......."), 0167 QStringLiteral("bxb....bxb"), 0168 QStringLiteral("..")); 0169 } 0170 0171 void StreaksTest::test08() 0172 { 0173 STREAK_TEST(QStringLiteral("b.b......."), 0174 QStringLiteral("bxb......."), 0175 QStringLiteral("xx")); 0176 } 0177 0178 void StreaksTest::test09() 0179 { 0180 STREAK_TEST(QStringLiteral("b.bb.bbb."), 0181 QStringLiteral("bxbb..bbb"), 0182 QStringLiteral("xxx")); 0183 } 0184 0185 void StreaksTest::test10() 0186 { 0187 STREAK_TEST(QStringLiteral("b.bb.bbb."), 0188 QStringLiteral("bxb...bbb"), 0189 QStringLiteral("x.x")); 0190 } 0191 0192 void StreaksTest::test11() 0193 { 0194 STREAK_TEST(QStringLiteral("b.bb.bbb."), 0195 QStringLiteral("bxbbxxbbb"), 0196 QStringLiteral("xxx")); 0197 } 0198 0199 void StreaksTest::test12() 0200 { 0201 STREAK_TEST(QStringLiteral("bb.b....."), 0202 QStringLiteral("bb...xbxb"), 0203 QStringLiteral(".x")); 0204 } 0205 0206 void StreaksTest::test13() 0207 { 0208 STREAK_TEST(QStringLiteral("b.b.b.b.bb"), 0209 QStringLiteral("bbbxbxb..."), 0210 QStringLiteral(".xx..")); 0211 } 0212 0213 void StreaksTest::bench00() 0214 { 0215 QSharedPointer<Streaks> s = generateStreaks(QStringLiteral("b.b.b.b.bbb.b.b.b.bb"), 0216 QStringLiteral("bbbxbxb...bbbxbxb...")); 0217 if (!s) { 0218 QFAIL("Streak generation failed."); 0219 } 0220 QBENCHMARK { 0221 s->update(0, 0); 0222 s->getRowStreak(0); 0223 } 0224 } 0225 0226 #include "moc_streaks_test.cpp"