File indexing completed on 2024-12-08 06:46:07
0001 #include "enginetest.h" 0002 0003 #include "renderer.h" 0004 0005 #include <KGlobal> 0006 #include <KStandardDirs> 0007 0008 0009 Killbots::EngineTest::EngineTest(QObject *parent) 0010 : QObject(parent) 0011 { 0012 KGlobal::dirs()->addResourceDir("ruleset", KDESRCDIR "/../rulesets/"); 0013 KGlobal::dirs()->addResourceDir("appdata", KDESRCDIR "/../"); 0014 0015 m_coordinator = new Coordinator(this); 0016 m_coordinator->setAnimationSpeed(0); 0017 0018 m_engine = new Engine(m_coordinator, this); 0019 m_engine->setRuleset(Ruleset::load("default.desktop")); 0020 m_coordinator->setEngine(m_engine); 0021 0022 m_scene = new Scene(this); 0023 m_coordinator->setScene(m_scene); 0024 } 0025 0026 Killbots::EngineTest::~EngineTest() 0027 { 0028 Killbots::Renderer::cleanup(); 0029 } 0030 0031 void Killbots::EngineTest::testValidCells_data() 0032 { 0033 QTest::addColumn<int>("row"); 0034 QTest::addColumn<int>("column"); 0035 QTest::addColumn<bool>("valid"); 0036 0037 int rowCount = m_engine->ruleset()->rows(); 0038 int columnCount = m_engine->ruleset()->columns(); 0039 0040 for (int r = 0; r < rowCount; ++r) { 0041 QTest::newRow("Cell to left of grid") << r << -1 << false; 0042 for (int c = 0; c < columnCount; ++c) { 0043 const QString description = QString("Row %1. column %2").arg(r).arg(c); 0044 QTest::newRow("Cell inside grid") << r << c << true; 0045 } 0046 QTest::newRow("Cell to right of grid") << r << columnCount << false; 0047 } 0048 0049 for (int c = -1; c <= columnCount; ++c) { 0050 QTest::newRow("Cell above grid") << -1 << c << false; 0051 QTest::newRow("Cell below grid") << rowCount << c << false; 0052 } 0053 } 0054 0055 void Killbots::EngineTest::testValidCells() 0056 { 0057 QFETCH(int, row); 0058 QFETCH(int, column); 0059 0060 QTEST(m_engine->cellIsValid(QPoint(column, row)), "valid"); 0061 } 0062 0063 void Killbots::EngineTest::testRandomEmptyCell_data() 0064 { 0065 m_engine->startNewGame(); 0066 } 0067 0068 void Killbots::EngineTest::testRandomEmptyCell() 0069 { 0070 for (int i = 0; i < 100; ++i) { 0071 QPoint point = m_engine->randomEmptyCell(); 0072 QVERIFY(m_engine->cellIsValid(point)); 0073 QVERIFY(m_engine->spriteTypeAt(point) == NoSprite); 0074 } 0075 } 0076 0077 void Killbots::EngineTest::testMoveIsValid_data() 0078 { 0079 //0123456789012345 0080 QString layout = " j \n" // 0 0081 " r j jj\n" // 1 0082 " f j \n" // 2 0083 "rjjj \n" // 3 0084 " \n" // 4 0085 " \n" // 5 0086 " \n" // 6 0087 " \n" // 7 0088 " \n" // 8 0089 " \n" // 9 0090 " \n" //10 0091 " \n" //11 0092 " \n" //12 0093 " \n" //13 0094 " \n" //14 0095 " "; //15 0096 m_engine->startNewRound(false, layout); 0097 const Ruleset *rules = m_engine->ruleset(); 0098 0099 QTest::addColumn<int>("row"); 0100 QTest::addColumn<int>("column"); 0101 QTest::addColumn<int>("action"); 0102 QTest::addColumn<bool>("valid"); 0103 0104 QTest::newRow("Leaving the grid by the corner") << -1 << -1 << int(UpRight) << false; 0105 QTest::newRow("Leaving the grid by the edge") << -1 << 8 << int(Up) << false; 0106 QTest::newRow("Leaving the grid by teleport") << 25 << -12 << int(Teleport) << false; 0107 0108 QTest::newRow("Moving onto a robot") << 1 << 1 << int(Right) << false; 0109 QTest::newRow("Moving onto a fastbot") << 2 << 2 << int(Down) << false; 0110 0111 QTest::newRow("Pushing a junkheap") << 0 << 2 << int(Left) << (rules->pushableJunkheaps() != Ruleset::None); 0112 QTest::newRow("Pushing two junkheaps") << 1 << 8 << int(DownLeft) << (rules->pushableJunkheaps() == Ruleset::Many); 0113 QTest::newRow("Pushing a junkheap out of the grid") << 0 << 2 << int(Up) << false; 0114 QTest::newRow("Pushing two junkheaps out of the grid") << 1 << 14 << int(Right) << false; 0115 QTest::newRow("Pushing a junkheap onto a fastbot") << 3 << 2 << int(Up) << (rules->pushableJunkheaps() != Ruleset::None && rules->squaskKillsEnabled()); 0116 QTest::newRow("Pushing three junkheaps onto a robot") << 3 << 3 << int(Left) << (rules->pushableJunkheaps() == Ruleset::Many && rules->squaskKillsEnabled()); 0117 } 0118 0119 void Killbots::EngineTest::testMoveIsValid() 0120 { 0121 QFETCH(int, row); 0122 QFETCH(int, column); 0123 QFETCH(int, action); 0124 0125 QTEST(m_engine->moveIsValid(QPoint(column, row), HeroAction(action)), "valid"); 0126 } 0127 0128 void Killbots::EngineTest::testMoveIsSafe_data() 0129 { 0130 //0123456789012345 0131 QString layout = "----- ------- \n" // 0 0132 "-!!!- -!!!!!- \n" // 1 0133 "-!r!- -!!!!!- \n" // 2 0134 "-!!!- -!!f!!- \n" // 3 0135 "----- -!!!!!- \n" // 4 0136 " -!!!!!- \n" // 5 0137 " ------- \n" // 6 0138 "frj j \n" // 7 0139 " r \n" // 8 0140 " f j \n" // 9 0141 " \n" //10 0142 " f f ff f \n" //11 0143 "r r jjj \n" //12 0144 " - f fj-j \n" //13 0145 "f r jjjf \n" //14 0146 " rf f f "; //15 0147 m_engine->startNewRound(false, layout); 0148 0149 QTest::addColumn<int>("row"); 0150 QTest::addColumn<int>("column"); 0151 QTest::addColumn<int>("action"); 0152 QTest::addColumn<bool>("safe"); 0153 0154 // Proximity of a robot 0155 QTest::newRow("Cell above above right right of robot") << 0 << 0 << int(Hold) << true; 0156 QTest::newRow("Cell above above right of robot") << 0 << 1 << int(Hold) << true; 0157 QTest::newRow("Cell above above robot") << 0 << 2 << int(Hold) << true; 0158 QTest::newRow("Cell above above left of robot") << 0 << 3 << int(Hold) << true; 0159 QTest::newRow("Cell above above left left of robot") << 0 << 4 << int(Hold) << true; 0160 QTest::newRow("Cell above right right of robot") << 1 << 0 << int(Hold) << true; 0161 QTest::newRow("Cell above right of robot") << 1 << 1 << int(Hold) << false; 0162 QTest::newRow("Cell above robot") << 1 << 2 << int(Hold) << false; 0163 QTest::newRow("Cell above left of robot") << 1 << 3 << int(Hold) << false; 0164 QTest::newRow("Cell above left left of robot") << 1 << 4 << int(Hold) << true; 0165 QTest::newRow("Cell right right of robot") << 2 << 0 << int(Hold) << true; 0166 QTest::newRow("Cell right of robot") << 2 << 1 << int(Hold) << false; 0167 QTest::newRow("Cell left of robot") << 2 << 3 << int(Hold) << false; 0168 QTest::newRow("Cell left left robot") << 2 << 4 << int(Hold) << true; 0169 QTest::newRow("Cell below right right of robot") << 3 << 0 << int(Hold) << true; 0170 QTest::newRow("Cell below right of robot") << 3 << 1 << int(Hold) << false; 0171 QTest::newRow("Cell below robot") << 3 << 2 << int(Hold) << false; 0172 QTest::newRow("Cell below left of robot") << 3 << 3 << int(Hold) << false; 0173 QTest::newRow("Cell below left left of robot") << 3 << 4 << int(Hold) << true; 0174 QTest::newRow("Cell below below right right of robot") << 4 << 0 << int(Hold) << true; 0175 QTest::newRow("Cell below below right of robot") << 4 << 1 << int(Hold) << true; 0176 QTest::newRow("Cell below below robot") << 4 << 2 << int(Hold) << true; 0177 QTest::newRow("Cell below below left of robot") << 4 << 3 << int(Hold) << true; 0178 QTest::newRow("Cell below below left left of robot") << 4 << 4 << int(Hold) << true; 0179 0180 // Proximity of a fastbot 0181 QTest::newRow("Cell above above above right right right of fastbot") << 0 << 6 << int(Hold) << true; 0182 QTest::newRow("Cell above above above right right of fastbot") << 0 << 7 << int(Hold) << true; 0183 QTest::newRow("Cell above above above right of fastbot") << 0 << 8 << int(Hold) << true; 0184 QTest::newRow("Cell above above above fastbot") << 0 << 9 << int(Hold) << true; 0185 QTest::newRow("Cell above above above left of fastbot") << 0 << 10 << int(Hold) << true; 0186 QTest::newRow("Cell above above above left left of fastbot") << 0 << 11 << int(Hold) << true; 0187 QTest::newRow("Cell above above above left left left of fastbot") << 0 << 12 << int(Hold) << true; 0188 QTest::newRow("Cell above above right right right of fastbot") << 1 << 6 << int(Hold) << true; 0189 QTest::newRow("Cell above above right right of fastbot") << 1 << 7 << int(Hold) << false; 0190 QTest::newRow("Cell above above right of fastbot") << 1 << 8 << int(Hold) << false; 0191 QTest::newRow("Cell above above fastbot") << 1 << 9 << int(Hold) << false; 0192 QTest::newRow("Cell above above left of fastbot") << 1 << 10 << int(Hold) << false; 0193 QTest::newRow("Cell above above left left of fastbot") << 1 << 11 << int(Hold) << false; 0194 QTest::newRow("Cell above above left left left of fastbot") << 1 << 12 << int(Hold) << true; 0195 QTest::newRow("Cell above right right right of fastbot") << 2 << 6 << int(Hold) << true; 0196 QTest::newRow("Cell above right right of fastbot") << 2 << 7 << int(Hold) << false; 0197 QTest::newRow("Cell above right of fastbot") << 2 << 8 << int(Hold) << false; 0198 QTest::newRow("Cell above fastbot") << 2 << 9 << int(Hold) << false; 0199 QTest::newRow("Cell above left of fastbot") << 2 << 10 << int(Hold) << false; 0200 QTest::newRow("Cell above left left of fastbot") << 2 << 11 << int(Hold) << false; 0201 QTest::newRow("Cell above left left left of fastbot") << 2 << 12 << int(Hold) << true; 0202 QTest::newRow("Cell right right right of fastbot") << 3 << 6 << int(Hold) << true; 0203 QTest::newRow("Cell right right of fastbot") << 3 << 7 << int(Hold) << false; 0204 QTest::newRow("Cell right of fastbot") << 3 << 8 << int(Hold) << false; 0205 QTest::newRow("Cell left of fastbot") << 3 << 10 << int(Hold) << false; 0206 QTest::newRow("Cell left left of fastbot") << 3 << 11 << int(Hold) << false; 0207 QTest::newRow("Cell left left left of fastbot") << 3 << 12 << int(Hold) << true; 0208 QTest::newRow("Cell below right right right of fastbot") << 4 << 6 << int(Hold) << true; 0209 QTest::newRow("Cell below right right of fastbot") << 4 << 7 << int(Hold) << false; 0210 QTest::newRow("Cell below right of fastbot") << 4 << 8 << int(Hold) << false; 0211 QTest::newRow("Cell below fastbot") << 4 << 9 << int(Hold) << false; 0212 QTest::newRow("Cell below left of fastbot") << 4 << 10 << int(Hold) << false; 0213 QTest::newRow("Cell below left left of fastbot") << 4 << 11 << int(Hold) << false; 0214 QTest::newRow("Cell below left left left of fastbot") << 4 << 12 << int(Hold) << true; 0215 QTest::newRow("Cell below below right right right of fastbot") << 5 << 6 << int(Hold) << true; 0216 QTest::newRow("Cell below below right right of fastbot") << 5 << 7 << int(Hold) << false; 0217 QTest::newRow("Cell below below right of fastbot") << 5 << 8 << int(Hold) << false; 0218 QTest::newRow("Cell below below fastbot") << 5 << 9 << int(Hold) << false; 0219 QTest::newRow("Cell below below left of fastbot") << 5 << 10 << int(Hold) << false; 0220 QTest::newRow("Cell below below left left of fastbot") << 5 << 11 << int(Hold) << false; 0221 QTest::newRow("Cell below below left left left of fastbot") << 5 << 12 << int(Hold) << true; 0222 QTest::newRow("Cell below below below right right right of fastbot") << 6 << 6 << int(Hold) << true; 0223 QTest::newRow("Cell below below below right right of fastbot") << 6 << 7 << int(Hold) << true; 0224 QTest::newRow("Cell below below below right of fastbot") << 6 << 8 << int(Hold) << true; 0225 QTest::newRow("Cell below below below fastbot") << 6 << 9 << int(Hold) << true; 0226 QTest::newRow("Cell below below below left of fastbot") << 6 << 10 << int(Hold) << true; 0227 QTest::newRow("Cell below below below left left of fastbot") << 6 << 11 << int(Hold) << true; 0228 QTest::newRow("Cell below below below left left left of fastbot") << 6 << 12 << int(Hold) << true; 0229 0230 QTest::newRow("Cell with fastbots blocked by junkheaps") << 13 << 2 << int(Hold) << true; 0231 0232 QTest::newRow("Cell with fastbots that will collide with other bots") << 13 << 8 << int(Hold) << true; 0233 0234 QTest::newRow("Pushing junkheap horizontally as a blocker") << 7 << 2 << int(Left) << true; 0235 QTest::newRow("Pushing junkheap diagonally as a blocker") << 7 << 7 << int(DownLeft) << true; 0236 QTest::newRow("Pushing junkheap vertically as a blocker") << 9 << 11 << int(Down) << true; 0237 0238 QTest::newRow("Pushing junkheap diagonally without blocking") << 7 << 2 << int(UpLeft) << false; 0239 QTest::newRow("Pushing junkheap diagonally without blocking") << 9 << 11 << int(DownLeft) << false; 0240 QTest::newRow("Pushing junkheap horizontally without blocking") << 7 << 7 << int(Left) << false; 0241 QTest::newRow("Pushing junkheap vertically without blocking") << 7 << 7 << int(Down) << false; 0242 } 0243 0244 void Killbots::EngineTest::testMoveIsSafe() 0245 { 0246 QFETCH(int, row); 0247 QFETCH(int, column); 0248 QFETCH(int, action); 0249 0250 QTEST(m_engine->moveIsSafe(QPoint(column, row), HeroAction(action)), "safe"); 0251 } 0252 0253 QTEST_MAIN(Killbots::EngineTest) 0254 0255 #include "enginetest.moc" 0256 #include "moc_enginetest.cpp"