70 lines
2.9 KiB
Go
70 lines
2.9 KiB
Go
package main
|
||
|
||
import "testing"
|
||
|
||
// TestDrawNReturnsIndependentSlice — прицельный регрессионный тест
|
||
// на реальный найденный баг: DrawN раньше возвращал подсрез самой
|
||
// колоды (out := d.cards[:n]), у которого вместимость (cap)
|
||
// простиралась до конца массива колоды. Это означало, что append к
|
||
// возвращённой "руке" писал прямо в общую с колодой (и с ранее
|
||
// розданными руками) память. Тест явно проверяет: после DrawN и
|
||
// последующего append к результату, ни оставшаяся колода, ни ранее
|
||
// выданная другая рука не должны увидеть "чужую" карту.
|
||
func TestDrawNReturnsIndependentSlice(t *testing.T) {
|
||
d := NewDeck() // 52 карты по порядку, без перемешивания — детерминированно для теста
|
||
|
||
hand1 := d.DrawN(5)
|
||
hand2 := d.DrawN(5)
|
||
hand2Before := append([]Card{}, hand2...)
|
||
deckBefore := append([]Card{}, d.cards...)
|
||
|
||
// имитируем "взятие карты" (append к руке первого игрока), как
|
||
// это происходит в реальной игре при добавлении карты с добора
|
||
hand1 = append(hand1, Card{Suit: Spades, Rank: Ace})
|
||
_ = hand1
|
||
|
||
for i := range d.cards {
|
||
if d.cards[i] != deckBefore[i] {
|
||
t.Fatalf("append к первой руке испортил оставшуюся колоду на позиции %d: было %v, стало %v",
|
||
i, deckBefore[i], d.cards[i])
|
||
}
|
||
}
|
||
for i, c := range hand2 {
|
||
if c != hand2Before[i] {
|
||
t.Fatalf("append к первой руке исказил вторую руку на позиции %d: было %v, стало %v",
|
||
i, hand2Before[i], c)
|
||
}
|
||
}
|
||
}
|
||
|
||
// TestDrawNSequentialHandsDoNotAlias — то же самое, но раскладывает
|
||
// сразу на 4 "игроков" подряд (как при реальной раздаче в newRound)
|
||
// и проверяет, что рост ЛЮБОЙ из рук через append не портит
|
||
// остальные, ещё не выросшие руки.
|
||
func TestDrawNSequentialHandsDoNotAlias(t *testing.T) {
|
||
d := NewDeck()
|
||
hands := make([][]Card, 4)
|
||
for i := range hands {
|
||
hands[i] = d.DrawN(5)
|
||
}
|
||
|
||
snapshots := make([][]Card, 4)
|
||
for i, h := range hands {
|
||
snapshots[i] = append([]Card{}, h...)
|
||
}
|
||
|
||
for i := range hands {
|
||
hands[i] = append(hands[i], Card{Suit: Hearts, Rank: Ace})
|
||
for j := range hands {
|
||
if j == i {
|
||
continue
|
||
}
|
||
for k, c := range snapshots[j] {
|
||
if hands[j][k] != c {
|
||
t.Fatalf("рост руки %d испортил руку %d на позиции %d: было %v, стало %v",
|
||
i, j, k, c, hands[j][k])
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|