1.1 --- a/minesweeper/src/main/java/org/apidesign/demo/minesweeper/MinesModel.java Thu Jul 17 08:16:25 2014 +0200
1.2 +++ b/minesweeper/src/main/java/org/apidesign/demo/minesweeper/MinesModel.java Thu Jul 17 08:23:25 2014 +0200
1.3 @@ -250,6 +250,9 @@
1.4 }
1.5 if (data.getState() == SquareType.MARKED) {
1.6 data.setState(SquareType.UNKNOWN);
1.7 + if (allMarked(model)) {
1.8 + model.setState(GameState.WON);
1.9 + }
1.10 return;
1.11 }
1.12 if (data.getState() != SquareType.UNKNOWN) {
1.13 @@ -455,7 +458,7 @@
1.14 private static boolean allMarked(Mines m) {
1.15 for (Row r : m.getRows()) {
1.16 for (Square sq : r.getColumns()) {
1.17 - if (sq.isMine() && sq.getState() != SquareType.MARKED) {
1.18 + if (sq.isMine() == (sq.getState() != SquareType.MARKED)) {
1.19 return false;
1.20 }
1.21 }
2.1 --- a/minesweeper/src/test/java/org/apidesign/demo/minesweeper/MinesModelTest.java Thu Jul 17 08:16:25 2014 +0200
2.2 +++ b/minesweeper/src/test/java/org/apidesign/demo/minesweeper/MinesModelTest.java Thu Jul 17 08:23:25 2014 +0200
2.3 @@ -76,6 +76,33 @@
2.4 assertEquals(m.getState(), MinesModel.GameState.WON, "All mines found. You have won!");
2.5 }
2.6
2.7 + @Test public void gameNotWonWhenTooMuchIsMarked() {
2.8 + Mines m = new Mines();
2.9 + m.init(10, 10, 10);
2.10 +
2.11 + Square additional = null;
2.12 + for (Row row : m.getRows()) {
2.13 + for (Square sq : row.getColumns()) {
2.14 + if (sq.isMine()) {
2.15 + MinesModel.markMine(m);
2.16 + MinesModel.click(m, sq);
2.17 + } else if (additional == null) {
2.18 + MinesModel.markMine(m);
2.19 + MinesModel.click(m, additional = sq);
2.20 + }
2.21 + }
2.22 + }
2.23 +
2.24 + assertEquals(m.getState(), MinesModel.GameState.IN_PROGRESS, "One additional mine is marked!");
2.25 +
2.26 + // remove the mark
2.27 + MinesModel.click(m, additional);
2.28 +
2.29 + assertEquals(m.getState(), MinesModel.GameState.WON, "All mines found. You have won!");
2.30 +
2.31 +
2.32 + }
2.33 +
2.34 @Test public void bombsSet() {
2.35 Mines m = new Mines();
2.36 m.init(10, 10, 0);