This repository has been archived by the owner on Jun 1, 2023. It is now read-only.
forked from refactoring-challenge/reversi-ios
-
Notifications
You must be signed in to change notification settings - Fork 0
/
GameStateTests.swift
121 lines (113 loc) · 5.54 KB
/
GameStateTests.swift
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
import XCTest
import MirrorDiffKit
import ReversiCore
class GameStateTests: XCTestCase {
func testPlay() throws {
struct TestCase {
let gameState: GameState
let commands: [GameCommand]
let expected: GameState
}
let testCases: [UInt: TestCase] = [
#line: TestCase(
gameState: .initial,
commands: [
.place(at: Coordinate(x: .f, y: .five)),
.place(at: Coordinate(x: .f, y: .six)),
.place(at: Coordinate(x: .c, y: .four)),
.place(at: Coordinate(x: .g, y: .five)),
.place(at: Coordinate(x: .h, y: .five)),
.place(at: Coordinate(x: .h, y: .four)),
.place(at: Coordinate(x: .f, y: .seven)),
.place(at: Coordinate(x: .h, y: .six)),
],
expected: GameState(
// SEE: Fig.6 of https://ja.wikipedia.org/wiki/%E3%82%AA%E3%82%BB%E3%83%AD_(%E3%83%9C%E3%83%BC%E3%83%89%E3%82%B2%E3%83%BC%E3%83%A0)#%E5%9F%BA%E6%9C%AC%E3%83%AB%E3%83%BC%E3%83%AB
board: Board(unsafeArray: [
[nil, nil, nil, nil, nil, nil, nil, nil],
[nil, nil, nil, nil, nil, nil, nil, nil],
[nil, nil, nil, nil, nil, nil, nil, nil],
[nil, nil, .dark, .dark, .dark, nil, nil, .light],
[nil, nil, nil, .dark, .dark, .dark, .light, .light],
[nil, nil, nil, nil, nil, .dark, nil, .light],
[nil, nil, nil, nil, nil, .dark, nil, nil],
[nil, nil, nil, nil, nil, nil, nil, nil],
]),
turn: .first
)
),
#line: TestCase(
gameState: GameState(
board: Board(unsafeArray: [
[nil, nil, nil, nil, nil, nil, nil, nil],
[nil, nil, nil, nil, nil, nil, nil, nil],
[nil, nil, nil, nil, nil, nil, nil, nil],
[nil, nil, .dark, .dark, .dark, nil, nil, .light],
[nil, nil, nil, .dark, .dark, .dark, .light, .light],
[nil, nil, nil, nil, nil, .dark, nil, .light],
[nil, nil, nil, nil, nil, .dark, nil, nil],
[nil, nil, nil, nil, nil, nil, nil, nil],
]),
turn: .first
),
commands: [.pass],
expected: GameState(
board: Board(unsafeArray: [
[nil, nil, nil, nil, nil, nil, nil, nil],
[nil, nil, nil, nil, nil, nil, nil, nil],
[nil, nil, nil, nil, nil, nil, nil, nil],
[nil, nil, .dark, .dark, .dark, nil, nil, .light],
[nil, nil, nil, .dark, .dark, .dark, .light, .light],
[nil, nil, nil, nil, nil, .dark, nil, .light],
[nil, nil, nil, nil, nil, .dark, nil, nil],
[nil, nil, nil, nil, nil, nil, nil, nil],
]),
turn: .second
)
),
#line: TestCase(
gameState: GameState(
board: Board(unsafeArray: [
// SEE: Fig.6 of https://ja.wikipedia.org/wiki/%E3%82%AA%E3%82%BB%E3%83%AD_(%E3%83%9C%E3%83%BC%E3%83%89%E3%82%B2%E3%83%BC%E3%83%A0)#%E5%9F%BA%E6%9C%AC%E3%83%AB%E3%83%BC%E3%83%AB
[nil, nil, nil, nil, nil, nil, nil, nil],
[nil, nil, nil, nil, nil, nil, nil, nil],
[nil, nil, nil, nil, nil, nil, nil, nil],
[nil, nil, .dark, .dark, .dark, nil, nil, .light],
[nil, nil, nil, .dark, .dark, .dark, .light, .light],
[nil, nil, nil, nil, nil, .dark, nil, .light],
[nil, nil, nil, nil, nil, .dark, nil, nil],
[nil, nil, nil, nil, nil, nil, nil, nil],
]),
turn: .second
),
commands: [.place(at: Coordinate(x: .e, y: .seven))],
expected: GameState(
board: Board(unsafeArray: [
[nil, nil, nil, nil, nil, nil, nil, nil],
[nil, nil, nil, nil, nil, nil, nil, nil],
[nil, nil, nil, nil, nil, nil, nil, nil],
[nil, nil, .dark, .dark, .dark, nil, nil, .light],
[nil, nil, nil, .dark, .dark, .dark, .light, .light],
[nil, nil, nil, nil, nil, .light, nil, .light],
[nil, nil, nil, nil, .light, .dark, nil, nil],
[nil, nil, nil, nil, nil, nil, nil, nil],
]),
turn: .first
)
),
]
try testCases.forEach {
let (line, testCase) = $0
let actual = try testCase.commands.reduce(testCase.gameState) { gameState, command in
do {
return try command.unsafeExecute(on: gameState).nextGameState
}
catch {
XCTFail("\(error)")
throw error
}
}
XCTAssertEqual(actual, testCase.expected, diff(between: testCase.expected, and: actual), line: line)
}
}
}