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"