Skip to content

Commit 9463fb8

Browse files
committed
fix(plugin25): GameState equality and xml tests through Board.equals
1 parent 2cb884f commit 9463fb8

File tree

3 files changed

+67
-19
lines changed

3 files changed

+67
-19
lines changed

plugin2025/src/main/kotlin/sc/plugin2025/Board.kt

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import com.thoughtworks.xstream.annotations.XStreamImplicit
55
import sc.api.plugins.IBoard
66

77
@XStreamAlias("board")
8-
data class Board(
8+
class Board(
99
@XStreamImplicit(itemFieldName = "field")
1010
private val track: Array<out Field> = generateTrack().toTypedArray(),
1111
): IBoard {
@@ -36,6 +36,15 @@ data class Board(
3636

3737
override fun clone(): Board = this
3838

39+
override fun equals(other: Any?): Boolean {
40+
if(this === other) return true
41+
if(other !is Board) return false
42+
return track.contentEquals(other.track)
43+
}
44+
45+
override fun hashCode(): Int =
46+
track.contentHashCode()
47+
3948
companion object {
4049

4150
private fun shuffledFields(vararg fields: Field) = fields.asList().shuffled()

plugin2025/src/main/kotlin/sc/plugin2025/Hare.kt

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@ data class Hare(
1515
@XStreamAsAttribute var salads: Int = HuIConstants.INITIAL_SALADS,
1616
@XStreamAsAttribute var carrots: Int = HuIConstants.INITIAL_CARROTS,
1717
@XStreamAsAttribute var lastAction: HuIAction? = null,
18-
@XStreamImplicit(itemFieldName = "card")
1918
private val cards: ArrayList<Card> = arrayListOf(),
2019
): PublicCloneable<Hare> {
2120
fun getCards(): List<Card> = cards
@@ -44,5 +43,5 @@ data class Hare(
4443
null
4544
}
4645

47-
override fun clone(): Hare = copy(cards = ArrayList(cards))
46+
override fun clone(): Hare = copy(cards = ArrayList(getCards()))
4847
}

plugin2025/src/test/kotlin/sc/plugin2025/GameStateTest.kt

Lines changed: 56 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package sc.plugin2025
22

33
import io.kotest.core.spec.style.WordSpec
44
import io.kotest.matchers.*
5+
import sc.api.plugins.Team
56
import sc.helpers.shouldSerializeTo
67

78
class GameStateTest: WordSpec({
@@ -13,31 +14,70 @@ class GameStateTest: WordSpec({
1314
clone.currentPlayer.addCard(Card.EAT_SALAD)
1415
state.currentPlayer.getCards().size shouldBe 0
1516
}
17+
val state = GameState(
18+
Board(arrayOf(Field.START, Field.MARKET, Field.CARROTS, Field.SALAD, Field.HARE, Field.GOAL)),
19+
lastMove = Advance(5, Card.EAT_SALAD),
20+
turn = 1,
21+
players = listOf(
22+
Hare(Team.TWO, cards = arrayListOf(Card.SWAP_CARROTS), lastAction = Advance(5)),
23+
Hare(Team.ONE, position = 3, lastAction = Card.EAT_SALAD)
24+
)
25+
)
26+
"behave properly" {
27+
state.currentTeam shouldBe Team.ONE
28+
state.currentField shouldBe Field.SALAD
29+
state.currentPlayer.team shouldBe Team.ONE
30+
state.currentPlayer.lastAction shouldBe Card.EAT_SALAD
31+
state.mayEatSalad() shouldBe true
32+
state.currentPlayer.lastAction = EatSalad
33+
state.mayEatSalad() shouldBe false
34+
}
1635
"produce nice XML" {
17-
GameState(
18-
Board(arrayOf(Field.START, Field.MARKET, Field.CARROTS, Field.HARE, Field.GOAL)),
19-
lastMove = Advance(5, Card.EAT_SALAD)
20-
).apply {
21-
players.forEachIndexed { index, hare ->
22-
hare.addCard(Card.values()[index])
23-
hare.lastAction = if(index == 0) Card.EAT_SALAD else Advance(index)
24-
}
25-
} shouldSerializeTo """
26-
<state startTeam="ONE" turn="0">
36+
Hare(Team.TWO, lastAction = EatSalad) shouldSerializeTo """
37+
<player team="TWO" position="0" salads="5" carrots="68">
38+
<lastAction class="eatsalad"/>
39+
<cards/>
40+
</player>
41+
""".trimIndent()
42+
Hare(Team.TWO, cards = arrayListOf(Card.HURRY_AHEAD)) shouldSerializeTo """
43+
<player team="TWO" position="0" salads="5" carrots="68">
44+
<cards>
45+
<card>HURRY_AHEAD</card>
46+
</cards>
47+
</player>
48+
""".trimIndent()
49+
50+
Advance(5, Card.EAT_SALAD) shouldSerializeTo """
51+
<advance distance="5">
52+
<card>EAT_SALAD</card>
53+
</advance>
54+
""".trimIndent()
55+
56+
Board(arrayOf(Field.START)) shouldSerializeTo """
57+
<board>
58+
<field>START</field>
59+
</board>
60+
""".trimIndent()
61+
62+
state shouldSerializeTo """
63+
<state startTeam="TWO" turn="1">
2764
<board>
2865
<field>START</field>
2966
<field>MARKET</field>
3067
<field>CARROTS</field>
68+
<field>SALAD</field>
3169
<field>HARE</field>
3270
<field>GOAL</field>
3371
</board>
34-
<player team="ONE" position="0" salads="5" carrots="68">
35-
<lastAction class="card">EAT_SALAD</lastAction>
36-
<card>FALL_BACK</card>
37-
</player>
3872
<player team="TWO" position="0" salads="5" carrots="68">
39-
<lastAction class="advance" distance="1"/>
40-
<card>HURRY_AHEAD</card>
73+
<lastAction class="advance" distance="5"/>
74+
<cards>
75+
<card>SWAP_CARROTS</card>
76+
</cards>
77+
</player>
78+
<player team="ONE" position="3" salads="5" carrots="68">
79+
<lastAction class="card">EAT_SALAD</lastAction>
80+
<cards/>
4181
</player>
4282
<lastMove class="advance" distance="5">
4383
<card>EAT_SALAD</card>

0 commit comments

Comments
 (0)