-
Notifications
You must be signed in to change notification settings - Fork 2
/
JVMGameSpec.scala
187 lines (165 loc) · 7.27 KB
/
JVMGameSpec.scala
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
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
package com.mogproject.mogami.core
import com.mogproject.mogami._
import com.mogproject.mogami.core.state.StateCache
import org.scalatestplus.scalacheck.ScalaCheckDrivenPropertyChecks
import org.scalatest.flatspec.AnyFlatSpec
import org.scalatest.matchers.must.Matchers
class JVMGameSpec extends AnyFlatSpec with Matchers with ScalaCheckDrivenPropertyChecks {
def loadFile(path: String, encoding: String = "utf-8"): String = {
scala.io.Source.fromFile(s"jvm/src/test/resources/${path}", encoding).mkString.replace("\r", "")
}
"Game#parseCsaString" must "create games from files" in StateCache.withCache { implicit cache =>
Game.parseCsaString(loadFile("csa/game/001.csa")).trunk.moves.length mustBe 111
val g002 = Game.parseCsaString(loadFile("csa/game/002.csa"))
g002.trunk.moves.length mustBe 258
g002.trunk.status mustBe GameStatus.Jishogi
}
"Game#parseKifString" must "create games from files" in StateCache.withCache { implicit cache =>
Game.parseKifString(loadFile("kif/game/001.kif")).trunk.moves.length mustBe 111
Game.parseKifString(loadFile("kif/game/002.kif")).trunk.moves.length mustBe 193
val g003: Game = Game.parseKifString(loadFile("kif/game/003.kif", "sjis"))
g003.trunk.moves.length mustBe 117
g003.branches.map(_.offset) mustBe Seq(69, 69, 49, 33)
g003.branches.map(_.moves.length) mustBe Seq(9, 7, 13, 9)
g003.hasComment(GamePosition(0, 0)) mustBe true
g003.comments.size mustBe 27
g003.comments.keySet mustBe Set(
g003.trunk.historyHash(0),
g003.trunk.historyHash(32),
g003.trunk.historyHash(33),
g003.trunk.historyHash(46),
g003.trunk.historyHash(49),
g003.trunk.historyHash(56),
g003.trunk.historyHash(64),
g003.trunk.historyHash(69),
g003.trunk.historyHash(72),
g003.trunk.historyHash(76),
g003.trunk.historyHash(83),
g003.trunk.historyHash(100),
g003.trunk.historyHash(105),
g003.trunk.historyHash(109),
g003.trunk.historyHash(111),
g003.trunk.historyHash(113),
g003.trunk.historyHash(117),
g003.branches(0).getHistoryHash(70).get,
g003.branches(0).getHistoryHash(71).get,
g003.branches(0).getHistoryHash(78).get,
g003.branches(1).getHistoryHash(72).get,
g003.branches(1).getHistoryHash(76).get,
g003.branches(2).getHistoryHash(52).get,
g003.branches(2).getHistoryHash(53).get,
g003.branches(2).getHistoryHash(54).get,
g003.branches(2).getHistoryHash(62).get,
g003.branches(3).getHistoryHash(42).get
)
g003.comments(g003.branches(2).historyHash(3)) mustBe Seq(
"[Taichi_NAKAMURA] 次に53銀打の狙いがあります。",
"\"You are threatening Silver drop to 53 ",
"here\""
).mkString("\n")
g003.comments(g003.branches(2).historyHash(4)) mustBe "[Archon] I was worried about bishop drop 77"
g003.comments(g003.branches(2).historyHash(5)) mustBe Seq(
"[Archon] I see, and without king to defend from ",
"earliermove",
"( \"なるほど、本譜のように玉が守っていないので。 \")",
"",
"[Taichi_NAKAMURA] そうですね。実戦の進行は上手の駒の連結が良くなってしまいました。",
"\"Yes. In the game, my pieces were connected ",
"tighter.\"",
""
).mkString("\n")
g003.comments(g003.branches(2).historyHash(13)) mustBe Seq(
"[Taichi_NAKAMURA] 駒の働きや連結を意識するともっと上達すると思います。",
"\"You will improve a lot more, if you think ",
"more about pieces' connection and their efficiencies.\""
).mkString("\n")
// toKifString can change the branch order
Game.parseKifString(g003.toKifString).toUsenString.sum mustBe g003.toUsenString.sum
Game.parseKifString(g003.toKifString).toUsenString mustBe Game.parseKifString(Game.parseKifString(g003.toKifString).toKifString).toUsenString
Game.parseKifString(g003.toKifString).toKifString mustBe Game.parseKifString(Game.parseKifString(g003.toKifString).toKifString).toKifString
Game.parseKifString(loadFile("kif/game/004.kif")).trunk.moves.length mustBe 223
val g005: Game = Game.parseKifString(loadFile("kif/game/005.kif"))
g005.branches.map(_.status) mustBe Seq(GameStatus.Playing, GameStatus.Mated, GameStatus.Resigned)
Game.parseKifString(loadFile("kif/game/006.kif")).toKifString mustBe Seq(
"手合割:平手",
"先手:",
"後手:",
"",
"手数----指手----消費時間--",
" 1 3六歩(37)",
" 2 4二玉(51)",
" 3 3五歩(36)",
" 4 3二玉(42)",
" 5 3四歩(35)",
" 6 4二銀(31)",
" 7 3三歩成(34)",
" 8 同 桂(21)",
"",
"",
"変化:7手",
" 7 3三歩成(34)",
"",
"",
"変化:5手",
" 5 3四歩(35)",
"",
"",
"変化:3手",
" 3 3五歩(36)",
"",
"",
"変化:1手",
" 1 3六歩(37)",
""
).mkString("\n")
val s7 = loadFile("kif/game/007.kif")
Game.parseKifString(s7).toKifString mustBe s7
val s8 = loadFile("kif/game/008.kif")
Game.parseKifString(s8).trunk.moves.length mustBe 168
// Sennichite
val s9 = loadFile("kif/game/009.kif")
val g009 = Game.parseKifString(s9)
g009.trunk.moves.length mustBe 85
g009.trunk.status mustBe GameStatus.Drawn
// Jishogi
val s10 = loadFile("kif/game/010.kif")
val g010 = Game.parseKifString(s10)
g010.trunk.moves.length mustBe 258
g010.trunk.status mustBe GameStatus.Jishogi
val m1 = loadFile("kif/mate/001.kif")
Game.parseKifString(m1).trunk.moves.length mustBe 59
// Kif including Zenkaku spaces
val s11 = loadFile("kif/game/011.kif", "sjis")
val g011 = Game.parseKifString(s11)
g011.trunk.moves.length mustBe 114
// Pause after Resign
val s12 = loadFile("kif/game/012.kif", "sjis")
val g012 = Game.parseKifString(s12)
g012.trunk.moves.length mustBe 121
// Shogidroid format: includes short (not-Zenkaku) spaces for initial hand pieces
val s13 = loadFile("kif/game/013.kif", "sjis")
val g013 = Game.parseKifString(s13)
g013.trunk.moves.length mustBe 0
// Invalid move after mate
val s14 = loadFile("kif/game/014.kif")
val g014 = Game.parseKifString(s14)
g014.trunk.moves.length mustBe 156
// Invalid move followed by a comment
val s15 = loadFile("kif/game/015.kif")
val g015 = Game.parseKifString(s15)
g015.trunk.moves.length mustBe 82
// Including 全, 圭, and 杏
Game.parseKifString(loadFile("kif/game/016.kif")).trunk.moves.length mustBe 37
// Invalid move on Shogi Club 24
Game.parseKifString(loadFile("kif/game/017.kif")).trunk.moves.length mustBe 26
}
"Game#parseKi2String" must "create games from files" in StateCache.withCache { implicit cache =>
Game.parseKi2String(loadFile("ki2/game/001.ki2")).trunk.moves.length mustBe 111
Game.parseKi2String(loadFile("ki2/game/002.ki2")).trunk.moves.length mustBe 111
Game.parseKi2String(loadFile("ki2/game/003.ki2")).trunk.moves.length mustBe 34
Game.parseKi2String(loadFile("ki2/game/004.ki2")).trunk.moves.length mustBe 27
val g005 = Game.parseKi2String(loadFile("ki2/game/005.ki2"))
g005.trunk.moves.length mustBe 258
g005.trunk.status mustBe GameStatus.Jishogi
}
}