| OLD | NEW |
| (Empty) |
| 1 part of ppw_test; | |
| 2 | |
| 3 class TestGame { | |
| 4 static void run() { | |
| 5 group('Game', () { | |
| 6 test('initial values', _testInitial); | |
| 7 test('setFlag', _testSetFlag); | |
| 8 test('cannot reveal flagged', _testCannotRevealFlagged); | |
| 9 test('cannot flag revealed', _testCannotFlagRevealed); | |
| 10 test('reveal zero', _testRevealZero); | |
| 11 test('loss', _testLoss); | |
| 12 test('win', _testWin); | |
| 13 test('random winner', _testRandomField); | |
| 14 test('good chord', _testGoodChord); | |
| 15 test('bad chord', _testBadChord); | |
| 16 test('no-op chord', _testNoopChord); | |
| 17 test('canReveal', _testCanReveal); | |
| 18 test('canFlag', _testCanFlag); | |
| 19 test('cannot re-reveal', _testCannotReReveal); | |
| 20 }); | |
| 21 } | |
| 22 | |
| 23 static void _testCannotReReveal() { | |
| 24 final f = TestField.getSampleField(); | |
| 25 final g = new Game(f); | |
| 26 | |
| 27 expect(g.canReveal(5, 3), isTrue); | |
| 28 var r = g.reveal(5, 3); | |
| 29 | |
| 30 g.setFlag(4, 2, true); | |
| 31 | |
| 32 expect(g.canReveal(5, 3), isTrue); | |
| 33 r = g.reveal(5, 3); | |
| 34 | |
| 35 expect(g.canReveal(5, 3), isFalse); | |
| 36 } | |
| 37 | |
| 38 static void _testCanFlag() { | |
| 39 final f = TestField.getSampleField(); | |
| 40 final g = new Game(f); | |
| 41 | |
| 42 expect(g.canToggleFlag(0, 0), isTrue); | |
| 43 expect(g.state, GameState.reset); | |
| 44 g.setFlag(0, 0, true); | |
| 45 expect(g.state, GameState.started); | |
| 46 expect(g.canToggleFlag(0, 0), isTrue); | |
| 47 g.setFlag(0, 0, false); | |
| 48 expect(g.canToggleFlag(0, 0), isTrue); | |
| 49 | |
| 50 expect(g.canToggleFlag(5, 4), isTrue); | |
| 51 g.reveal(5, 4); | |
| 52 expect(g.canToggleFlag(5, 4), isFalse); | |
| 53 } | |
| 54 | |
| 55 static void _testCanReveal() { | |
| 56 final f = TestField.getSampleField(); | |
| 57 final g = new Game(f); | |
| 58 | |
| 59 expect(g.canReveal(0, 0), isTrue); | |
| 60 expect(g.state, GameState.reset); | |
| 61 g.setFlag(0, 0, true); | |
| 62 expect(g.state, GameState.started); | |
| 63 expect(g.canReveal(0, 0), isFalse); | |
| 64 | |
| 65 expect(g.canReveal(5, 4), isTrue); | |
| 66 g.reveal(5, 4); | |
| 67 expect(g.canReveal(5, 4), isFalse); | |
| 68 | |
| 69 g.setFlag(4, 2, true); | |
| 70 expect(g.canReveal(5, 3), isTrue); | |
| 71 expect(g.canReveal(4, 3), isFalse); | |
| 72 g.setFlag(3, 2, true); | |
| 73 expect(g.canReveal(4, 3), isTrue); | |
| 74 | |
| 75 // now we'll over flag | |
| 76 expect(g.canReveal(5, 3), isTrue); | |
| 77 g.setFlag(5, 2, true); | |
| 78 expect(g.canReveal(5, 3), isFalse); | |
| 79 } | |
| 80 | |
| 81 static void _testBadChord() { | |
| 82 final f = TestField.getSampleField(); | |
| 83 final g = new Game(f); | |
| 84 | |
| 85 expect(g.bombsLeft, equals(13)); | |
| 86 final startReveals = f.length - 13; | |
| 87 expect(g.revealsLeft, equals(startReveals)); | |
| 88 expect(g.state, equals(GameState.reset)); | |
| 89 | |
| 90 g.reveal(2, 3); | |
| 91 g.setFlag(1, 2, true); | |
| 92 g.setFlag(3, 2, true); | |
| 93 | |
| 94 expect(g.bombsLeft, equals(11)); | |
| 95 expect(g.revealsLeft, equals(startReveals - 1)); | |
| 96 | |
| 97 var revealed = g.reveal(2, 3); | |
| 98 expect(revealed, isNull); | |
| 99 expect(g.state, equals(GameState.lost)); | |
| 100 } | |
| 101 | |
| 102 // Adjacent flag count != square count | |
| 103 // so nothing happens | |
| 104 static void _testNoopChord() { | |
| 105 final f = TestField.getSampleField(); | |
| 106 final g = new Game(f); | |
| 107 | |
| 108 expect(g.bombsLeft, equals(13)); | |
| 109 final startReveals = f.length - 13; | |
| 110 expect(g.revealsLeft, equals(startReveals)); | |
| 111 expect(g.state, equals(GameState.reset)); | |
| 112 | |
| 113 var revealed = g.reveal(2, 3); | |
| 114 expect(revealed, unorderedEquals([const Coordinate(2, 3)])); | |
| 115 | |
| 116 g.setFlag(2, 2, true); | |
| 117 | |
| 118 expect(g.bombsLeft, equals(12)); | |
| 119 expect(g.revealsLeft, equals(startReveals - 1)); | |
| 120 | |
| 121 expect(() => g.reveal(2, 3), throwsException); | |
| 122 } | |
| 123 | |
| 124 static void _testGoodChord() { | |
| 125 final f = TestField.getSampleField(); | |
| 126 final g = new Game(f); | |
| 127 | |
| 128 expect(g.bombsLeft, equals(13)); | |
| 129 final startReveals = f.length - 13; | |
| 130 expect(g.revealsLeft, equals(startReveals)); | |
| 131 expect(g.state, equals(GameState.reset)); | |
| 132 | |
| 133 g.reveal(2, 3); | |
| 134 g.setFlag(2, 2, true); | |
| 135 g.setFlag(3, 2, true); | |
| 136 | |
| 137 expect(g.bombsLeft, equals(11)); | |
| 138 expect(g.revealsLeft, equals(startReveals - 1)); | |
| 139 | |
| 140 g.reveal(2, 3); | |
| 141 expect(g.bombsLeft, equals(11)); | |
| 142 expect(g.revealsLeft, equals(startReveals - 11)); | |
| 143 expect(g.duration, isNot(isNull)); | |
| 144 } | |
| 145 | |
| 146 // Test 5 random fields five times | |
| 147 static void _testRandomField() { | |
| 148 final rnd = new Random(); | |
| 149 for(int i = 0; i < 5; i++) { | |
| 150 final f = new Field(); | |
| 151 | |
| 152 for(int j = 0; j < 5; j++) { | |
| 153 final g = new Game(f); | |
| 154 while(g.revealsLeft > 0) { | |
| 155 final x = rnd.nextInt(f.width); | |
| 156 final y = rnd.nextInt(f.height); | |
| 157 if(g.getSquareState(x, y) == SquareState.hidden) { | |
| 158 if(f.get(x, y)) { | |
| 159 g.setFlag(x, y, true); | |
| 160 } else if(!f.get(x, y)) { | |
| 161 g.reveal(x, y); | |
| 162 } | |
| 163 } | |
| 164 } | |
| 165 expect(g.state == GameState.won, isTrue); | |
| 166 } | |
| 167 } | |
| 168 } | |
| 169 | |
| 170 static void _testRevealZero() { | |
| 171 final f = TestField.getSampleField(); | |
| 172 final g = new Game(f); | |
| 173 | |
| 174 expect(g.bombsLeft, equals(13)); | |
| 175 final startReveals = f.length - 13; | |
| 176 expect(g.revealsLeft, equals(startReveals)); | |
| 177 expect(g.state, equals(GameState.reset)); | |
| 178 | |
| 179 g.reveal(5, 4); | |
| 180 expect(g.revealsLeft, equals(startReveals - 10)); | |
| 181 } | |
| 182 | |
| 183 static void _testInitial() { | |
| 184 final f = TestField.getSampleField(); | |
| 185 final g = new Game(f); | |
| 186 | |
| 187 expect(g.bombsLeft, equals(13)); | |
| 188 expect(g.revealsLeft, equals(f.length - 13)); | |
| 189 expect(g.state, equals(GameState.reset)); | |
| 190 expect(g.duration, isNull); | |
| 191 | |
| 192 for(int x = 0; x < f.width; x++) { | |
| 193 for(int y = 0; y < f.height; y++) { | |
| 194 expect(g.getSquareState(x,y), equals(SquareState.hidden)); | |
| 195 } | |
| 196 } | |
| 197 } | |
| 198 | |
| 199 static void _testSetFlag() { | |
| 200 final g = new Game(TestField.getSampleField()); | |
| 201 | |
| 202 expect(g.getSquareState(0,0), equals(SquareState.hidden)); | |
| 203 g.setFlag(0, 0, true); | |
| 204 expect(g.getSquareState(0,0), equals(SquareState.flagged)); | |
| 205 expect(g.bombsLeft, equals(12)); | |
| 206 expect(g.state, equals(GameState.started)); | |
| 207 } | |
| 208 | |
| 209 static void _testCannotRevealFlagged() { | |
| 210 final g = new Game(TestField.getSampleField()); | |
| 211 | |
| 212 expect(g.getSquareState(0,0), equals(SquareState.hidden)); | |
| 213 g.setFlag(0, 0, true); | |
| 214 expect(g.getSquareState(0,0), equals(SquareState.flagged)); | |
| 215 expect(g.bombsLeft, equals(12)); | |
| 216 expect(g.state, equals(GameState.started)); | |
| 217 | |
| 218 expect(() => g.reveal(0,0), throwsException); | |
| 219 } | |
| 220 | |
| 221 static void _testCannotFlagRevealed() { | |
| 222 final g = new Game(TestField.getSampleField()); | |
| 223 | |
| 224 expect(g.getSquareState(1,1), equals(SquareState.hidden)); | |
| 225 g.reveal(1, 1); | |
| 226 expect(g.getSquareState(1,1), equals(SquareState.revealed)); | |
| 227 expect(g.state, equals(GameState.started)); | |
| 228 | |
| 229 expect(() => g.setFlag(1,1,true), throwsException); | |
| 230 } | |
| 231 | |
| 232 static void _testLoss() { | |
| 233 final g = new Game(TestField.getSampleField()); | |
| 234 | |
| 235 expect(g.getSquareState(0,0), equals(SquareState.hidden)); | |
| 236 var revealed = g.reveal(0, 0); | |
| 237 expect(revealed, isNull); | |
| 238 expect(g.state, equals(GameState.lost)); | |
| 239 expect(g.getSquareState(0,0), equals(SquareState.bomb)); | |
| 240 } | |
| 241 | |
| 242 static void _testWin() { | |
| 243 final f = TestField.getSampleField(); | |
| 244 final g = new Game(f); | |
| 245 | |
| 246 int bombsLleft = f.bombCount; | |
| 247 expect(g.revealsLeft, equals(f.length - 13)); | |
| 248 int revealsLeft = g.revealsLeft; | |
| 249 for(int x = 0; x < f.width; x++) { | |
| 250 for(int y = 0; y < f.height; y++) { | |
| 251 if(f.get(x,y)) { | |
| 252 g.setFlag(x, y, true); | |
| 253 bombsLleft--; | |
| 254 expect(g.bombsLeft, equals(bombsLleft)); | |
| 255 } else if(g.getSquareState(x, y) == SquareState.hidden) { | |
| 256 revealsLeft -= g.reveal(x, y).length; | |
| 257 expect(revealsLeft, equals(g.revealsLeft)); | |
| 258 } else { | |
| 259 expect(g.getSquareState(x,y), equals(SquareState.revealed)); | |
| 260 } | |
| 261 expect(g.state, isNot(equals(GameState.reset))); | |
| 262 expect(g.state, isNot(equals(GameState.lost))); | |
| 263 } | |
| 264 } | |
| 265 | |
| 266 expect(g.state, equals(GameState.won)); | |
| 267 } | |
| 268 } | |
| OLD | NEW |