Skip to content

Commit f66e26d

Browse files
committed
model (part 3) added check for win with JUnit testing
1 parent 7de124a commit f66e26d

File tree

2 files changed

+149
-2
lines changed

2 files changed

+149
-2
lines changed

app/src/main/java/com/example/tictactoemvc/TicTacToeGame.kt

Lines changed: 73 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,78 @@ class TicTacToeGame {
6666
}
6767

6868
private fun checkForWin() {
69-
//TODO
69+
if (gameState != GameState.X_TURN && gameState != GameState.O_TURN) {
70+
return
71+
}
72+
if (didPieceWin(Mark.MARK_X)) {
73+
gameState = GameState.X_WINS
74+
} else if (didPieceWin(Mark.MARK_0)) {
75+
gameState = GameState.O_WINS
76+
} else if (isBoardFull()) {
77+
gameState = GameState.TIE_GAME
78+
}
79+
}
80+
81+
private fun didPieceWin(mark: Mark): Boolean {
82+
83+
// check for each rows
84+
for (row in 0 until ROWS) {
85+
var winHere = true
86+
for (column in 0 until COLUMNS) {
87+
if (board[row][column] != mark) {
88+
winHere = false
89+
}
90+
}
91+
if (winHere) {
92+
return true
93+
}
94+
}
95+
96+
// check for columns
97+
for (column in 0 until COLUMNS) {
98+
var winHere = true
99+
for (row in 0 until ROWS) {
100+
if (board[row][column] != mark) {
101+
winHere = false
102+
}
103+
}
104+
if (winHere) {
105+
return true
106+
}
107+
}
108+
109+
// check for main diagonal
110+
var winHere = true
111+
for (row in 0 until ROWS) {
112+
if (board[row][row] != mark) {
113+
winHere = false
114+
}
115+
}
116+
if (winHere) {
117+
return true
118+
}
119+
120+
// check for off diagonal
121+
winHere = true
122+
for (row in 0 until ROWS) {
123+
if (board[row][ROWS - row - 1] != mark) {
124+
winHere = false
125+
}
126+
}
127+
if (winHere) {
128+
return true
129+
}
130+
return false
131+
}
132+
133+
private fun isBoardFull(): Boolean {
134+
for (row in 0 until ROWS) {
135+
for (column in 0 until COLUMNS) {
136+
if (board[row][column] == Mark.MARK_NONE) {
137+
return false
138+
}
139+
}
140+
}
141+
return true
70142
}
71143
}

app/src/test/java/com/example/tictactoemvc/TicTacToeGameTest.kt

Lines changed: 76 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,10 +46,85 @@ class TicTacToeGameTest {
4646
assertEquals(TicTacToeGame.GameState.X_TURN, game.gameState)
4747
game.pressButtonAt(-1, 0)
4848
assertEquals(TicTacToeGame.GameState.X_TURN, game.gameState)
49-
5049
game.pressButtonAt(0, -1)
5150
game.pressButtonAt(3, 0)
5251
game.pressButtonAt(0, 3)
5352
assertEquals(TicTacToeGame.GameState.X_TURN, game.gameState)
5453
}
54+
55+
@Test
56+
fun detectWinEasy() {
57+
val game = TicTacToeGame()
58+
assertEquals(TicTacToeGame.GameState.X_TURN, game.gameState)
59+
game.pressButtonAt(0,0)
60+
assertEquals(TicTacToeGame.GameState.O_TURN, game.gameState)
61+
game.pressButtonAt(2,0)
62+
assertEquals(TicTacToeGame.GameState.X_TURN, game.gameState)
63+
game.pressButtonAt(0,1)
64+
assertEquals(TicTacToeGame.GameState.O_TURN, game.gameState)
65+
game.pressButtonAt(2,2)
66+
assertEquals(TicTacToeGame.GameState.X_TURN, game.gameState)
67+
game.pressButtonAt(0,2)
68+
assertEquals(TicTacToeGame.GameState.X_WINS, game.gameState)
69+
}
70+
71+
@Test
72+
fun detectWinForce() {
73+
val game = TicTacToeGame()
74+
assertEquals(TicTacToeGame.GameState.X_TURN, game.gameState)
75+
game.pressButtonAt(1,1)
76+
assertEquals(TicTacToeGame.GameState.O_TURN, game.gameState)
77+
game.pressButtonAt(0,1)
78+
assertEquals(TicTacToeGame.GameState.X_TURN, game.gameState)
79+
game.pressButtonAt(0,0)
80+
assertEquals(TicTacToeGame.GameState.O_TURN, game.gameState)
81+
game.pressButtonAt(2,2)
82+
assertEquals(TicTacToeGame.GameState.X_TURN, game.gameState)
83+
game.pressButtonAt(2,0)
84+
assertEquals(TicTacToeGame.GameState.O_TURN, game.gameState)
85+
game.pressButtonAt(0,2)
86+
assertEquals(TicTacToeGame.GameState.X_TURN, game.gameState)
87+
game.pressButtonAt(1,0)
88+
assertEquals(TicTacToeGame.GameState.X_WINS, game.gameState)
89+
}
90+
91+
@Test
92+
fun detectTie() {
93+
val game = TicTacToeGame()
94+
assertEquals(TicTacToeGame.GameState.X_TURN, game.gameState)
95+
game.pressButtonAt(1,1)
96+
assertEquals(TicTacToeGame.GameState.O_TURN, game.gameState)
97+
game.pressButtonAt(0,1)
98+
assertEquals(TicTacToeGame.GameState.X_TURN, game.gameState)
99+
game.pressButtonAt(0,0)
100+
assertEquals(TicTacToeGame.GameState.O_TURN, game.gameState)
101+
game.pressButtonAt(2,2)
102+
assertEquals(TicTacToeGame.GameState.X_TURN, game.gameState)
103+
game.pressButtonAt(2,0)
104+
assertEquals(TicTacToeGame.GameState.O_TURN, game.gameState)
105+
game.pressButtonAt(0,2)
106+
assertEquals(TicTacToeGame.GameState.X_TURN, game.gameState)
107+
game.pressButtonAt(1,2)
108+
assertEquals(TicTacToeGame.GameState.O_TURN, game.gameState)
109+
game.pressButtonAt(1,0)
110+
assertEquals(TicTacToeGame.GameState.X_TURN, game.gameState)
111+
game.pressButtonAt(2,1)
112+
assertEquals(TicTacToeGame.GameState.TIE_GAME, game.gameState)
113+
}
114+
115+
@Test
116+
fun detectXWinsBottomLeftToUpperRightDiagonal() {
117+
val game = TicTacToeGame()
118+
assertEquals(TicTacToeGame.GameState.X_TURN, game.gameState)
119+
game.pressButtonAt(0,2)
120+
assertEquals(TicTacToeGame.GameState.O_TURN, game.gameState)
121+
game.pressButtonAt(0,1)
122+
assertEquals(TicTacToeGame.GameState.X_TURN, game.gameState)
123+
game.pressButtonAt(1,1)
124+
assertEquals(TicTacToeGame.GameState.O_TURN, game.gameState)
125+
game.pressButtonAt(2,2)
126+
assertEquals(TicTacToeGame.GameState.X_TURN, game.gameState)
127+
game.pressButtonAt(2,0)
128+
assertEquals(TicTacToeGame.GameState.X_WINS, game.gameState)
129+
}
55130
}

0 commit comments

Comments
 (0)