Skip to content

Commit 2697358

Browse files
dvermdcmccandless
authored andcommitted
connect: add test template (#2129)
Resolves: #1938
1 parent 313bcbb commit 2697358

File tree

3 files changed

+115
-110
lines changed

3 files changed

+115
-110
lines changed

exercises/connect/.meta/template.j2

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
{%- extends "master_template.j2" -%}
2+
{% set imports = ["ConnectGame"] %}
3+
4+
{% macro test_case(case) -%}
5+
def test_{{ case["description"] | to_snake }}(self):
6+
game = ConnectGame("""{{ case["input"]["board"] | join("\n ") }}""")
7+
winner = game.get_winner()
8+
self.assertEqual(winner, "{{ case["expected"] }}")
9+
10+
{%- endmacro %}

exercises/connect/connect_test.py

Lines changed: 101 additions & 107 deletions
Original file line numberDiff line numberDiff line change
@@ -1,118 +1,112 @@
11
import unittest
22

3-
import connect
4-
3+
from connect import ConnectGame
54

65
# Tests adapted from `problem-specifications//canonical-data.json` @ v1.1.0
76

8-
testcases = [
9-
{
10-
"description": "an empty board has no winner",
11-
"board":
12-
""" . . . . .
13-
. . . . .
14-
. . . . .
15-
. . . . .
16-
. . . . .""",
17-
"winner": ""
18-
},
19-
{
20-
"description": "O can win on a 1x1 board",
21-
"board": "O",
22-
"winner": "O"
23-
},
24-
{
25-
"description": "X can win on a 1x1 board",
26-
"board": "X",
27-
"winner": "X"
28-
},
29-
{
30-
"description": "only edges does not make a winner",
31-
"board":
32-
""" O O O X
7+
8+
class ConnectTest(unittest.TestCase):
9+
def test_an_empty_board_has_no_winner(self):
10+
game = ConnectGame(
11+
""". . . . .
12+
. . . . .
13+
. . . . .
14+
. . . . .
15+
. . . . ."""
16+
)
17+
winner = game.get_winner()
18+
self.assertEqual(winner, "")
19+
20+
def test_x_can_win_on_a_1x1_board(self):
21+
game = ConnectGame("""X""")
22+
winner = game.get_winner()
23+
self.assertEqual(winner, "X")
24+
25+
def test_o_can_win_on_a_1x1_board(self):
26+
game = ConnectGame("""O""")
27+
winner = game.get_winner()
28+
self.assertEqual(winner, "O")
29+
30+
def test_only_edges_does_not_make_a_winner(self):
31+
game = ConnectGame(
32+
"""O O O X
33+
X . . X
3334
X . . X
34-
X . . X
35-
X O O O""",
36-
"winner": ""
37-
},
38-
{
39-
"description": "illegal diagonal does not make a winner",
40-
"board":
41-
""" X O . .
42-
O X X X
43-
O X O .
44-
. O X .
45-
X X O O""",
46-
"winner": ""
47-
},
48-
{
49-
"description": "nobody wins crossing adjacent angles",
50-
"board":
51-
""" X . . .
52-
. X O .
53-
O . X O
54-
. O . X
55-
. . O .""",
56-
"winner": ""
57-
},
58-
{
59-
"description": "X wins crossing from left to right",
60-
"board":
61-
""" . O . .
62-
O X X X
63-
O X O .
64-
X X O X
65-
. O X .""",
66-
"winner": "X"
67-
},
68-
{
69-
"description": "X wins using a convoluted path",
70-
"board":
71-
""" . X X . .
72-
X . X . X
73-
. X . X .
74-
. X X . .
75-
O O O O O""",
76-
"winner": "X"
77-
},
78-
{
79-
"description": "O wins crossing from top to bottom",
80-
"board":
81-
""" . O . .
82-
O X X X
83-
O O O .
84-
X X O X
85-
. O X .""",
86-
"winner": "O"
87-
},
88-
{
89-
"description": "X wins using a spiral path",
90-
"board":
91-
""" O X X X X X X X X
92-
O X O O O O O O O
93-
O X O X X X X X O
94-
O X O X O O O X O
95-
O X O X X X O X O
96-
O X O O O X O X O
97-
O X X X X X O X O
98-
O O O O O O O X O
99-
X X X X X X X X O """,
100-
"winner": "X"
101-
},
102-
]
35+
X O O O"""
36+
)
37+
winner = game.get_winner()
38+
self.assertEqual(winner, "")
10339

40+
def test_illegal_diagonal_does_not_make_a_winner(self):
41+
game = ConnectGame(
42+
"""X O . .
43+
O X X X
44+
O X O .
45+
. O X .
46+
X X O O"""
47+
)
48+
winner = game.get_winner()
49+
self.assertEqual(winner, "")
10450

105-
class ConnectTest(unittest.TestCase):
106-
def test_game(self):
107-
for testcase in testcases:
108-
game = connect.ConnectGame(testcase["board"])
109-
winner = game.get_winner()
110-
expected = testcase["winner"] if testcase["winner"] else "None"
111-
got = winner if winner else "None"
112-
self.assertEqual(winner, testcase["winner"],
113-
"Test failed: %s, expected winner: %s, got: %s"
114-
% (testcase["description"], expected, got))
51+
def test_nobody_wins_crossing_adjacent_angles(self):
52+
game = ConnectGame(
53+
"""X . . .
54+
. X O .
55+
O . X O
56+
. O . X
57+
. . O ."""
58+
)
59+
winner = game.get_winner()
60+
self.assertEqual(winner, "")
61+
62+
def test_x_wins_crossing_from_left_to_right(self):
63+
game = ConnectGame(
64+
""". O . .
65+
O X X X
66+
O X O .
67+
X X O X
68+
. O X ."""
69+
)
70+
winner = game.get_winner()
71+
self.assertEqual(winner, "X")
72+
73+
def test_o_wins_crossing_from_top_to_bottom(self):
74+
game = ConnectGame(
75+
""". O . .
76+
O X X X
77+
O O O .
78+
X X O X
79+
. O X ."""
80+
)
81+
winner = game.get_winner()
82+
self.assertEqual(winner, "O")
83+
84+
def test_x_wins_using_a_convoluted_path(self):
85+
game = ConnectGame(
86+
""". X X . .
87+
X . X . X
88+
. X . X .
89+
. X X . .
90+
O O O O O"""
91+
)
92+
winner = game.get_winner()
93+
self.assertEqual(winner, "X")
94+
95+
def test_x_wins_using_a_spiral_path(self):
96+
game = ConnectGame(
97+
"""O X X X X X X X X
98+
O X O O O O O O O
99+
O X O X X X X X O
100+
O X O X O O O X O
101+
O X O X X X O X O
102+
O X O O O X O X O
103+
O X X X X X O X O
104+
O O O O O O O X O
105+
X X X X X X X X O"""
106+
)
107+
winner = game.get_winner()
108+
self.assertEqual(winner, "X")
115109

116110

117-
if __name__ == '__main__':
111+
if __name__ == "__main__":
118112
unittest.main()

exercises/connect/example.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ class ConnectGame:
77
none = ""
88

99
def __init__(self, lines):
10-
self.board = self.make_board(lines)
10+
self.board = ConnectGame.make_board(lines)
1111
assert len(self.board) > 0
1212

1313
self.width = len(self.board[0])
@@ -18,9 +18,10 @@ def __init__(self, lines):
1818
assert len(l) == self.width
1919

2020
def valid(self, x, y):
21-
return x >= 0 and x < self.width and y >= 0 and y < self.height
21+
return 0 <= x < self.width and 0 <= y < self.height
2222

23-
def make_board(self, lines):
23+
@staticmethod
24+
def make_board(lines):
2425
return ["".join(l.split()) for l in lines.splitlines()]
2526

2627
def player_reach_dest(self, player, x, y):

0 commit comments

Comments
 (0)