99 lines
4.3 KiB
Go
99 lines
4.3 KiB
Go
package ws
|
|
|
|
import (
|
|
"testing"
|
|
|
|
"hakemsho/internal/game"
|
|
)
|
|
|
|
func card(s game.Suit, r game.Rank) game.Card { return game.Card{Suit: s, Rank: r} }
|
|
|
|
func TestBotWinsWhenOpponentLeads(t *testing.T) {
|
|
// حریف با شاهِ پیک رهبری کرده؛ بات باید با آسِ پیک (کمترین کارتِ برنده) ببرد.
|
|
hand := []game.Card{card(game.Spades, game.Ace), card(game.Spades, 3), card(game.Clubs, 5)}
|
|
trick := []game.TrickCard{{Seat: 0, Card: card(game.Spades, game.King)}}
|
|
got := botPlay(hand, trick, game.Hearts, game.Spades, [4]uint16{})
|
|
if got != card(game.Spades, game.Ace) {
|
|
t.Errorf("expected S-A to win, got %v", got)
|
|
}
|
|
}
|
|
|
|
func TestBotSavesCardWhenPartnerWins(t *testing.T) {
|
|
// شریک (صندلی۰) با آسِ پیک برنده است؛ باتِ صندلی۲ باید کمترین پیک را بریزد.
|
|
hand := []game.Card{card(game.Spades, game.King), card(game.Spades, 5)}
|
|
trick := []game.TrickCard{
|
|
{Seat: 0, Card: card(game.Spades, game.Ace)},
|
|
{Seat: 1, Card: card(game.Spades, 2)},
|
|
}
|
|
got := botPlay(hand, trick, game.Hearts, game.Spades, [4]uint16{})
|
|
if got != card(game.Spades, 5) {
|
|
t.Errorf("expected low S-5 (save the King), got %v", got)
|
|
}
|
|
}
|
|
|
|
func TestBotTrumpsOpponent(t *testing.T) {
|
|
// بات پیک ندارد و حریف با آسِ پیک میبرد ⇒ باید با کمترین حکم بِبُرد.
|
|
hand := []game.Card{card(game.Hearts, 2), card(game.Hearts, game.King), card(game.Clubs, 9)}
|
|
trick := []game.TrickCard{{Seat: 0, Card: card(game.Spades, game.Ace)}}
|
|
got := botPlay(hand, trick, game.Hearts, game.Spades, [4]uint16{})
|
|
if got != card(game.Hearts, 2) {
|
|
t.Errorf("expected lowest trump H-2, got %v", got)
|
|
}
|
|
}
|
|
|
|
func TestBotDiscardsWhenPartnerWinsAndVoid(t *testing.T) {
|
|
// شریک میبرد و بات خالِ زمینه را ندارد ⇒ حکم را هدر ندهد، کارتِ کم بریزد.
|
|
hand := []game.Card{card(game.Hearts, game.King), card(game.Clubs, 4), card(game.Clubs, 9)}
|
|
trick := []game.TrickCard{
|
|
{Seat: 0, Card: card(game.Spades, game.Ace)},
|
|
{Seat: 1, Card: card(game.Spades, 2)},
|
|
}
|
|
got := botPlay(hand, trick, game.Hearts, game.Spades, [4]uint16{})
|
|
if got != card(game.Clubs, 4) {
|
|
t.Errorf("expected low discard C-4 (keep trump), got %v", got)
|
|
}
|
|
}
|
|
|
|
func TestBotLeadsNonTrumpAce(t *testing.T) {
|
|
// در رهبری، آسِ غیرِحکم را نقد کن.
|
|
hand := []game.Card{card(game.Clubs, game.Ace), card(game.Diamonds, 7), card(game.Hearts, game.King)}
|
|
got := botPlay(hand, nil, game.Hearts, 0, [4]uint16{})
|
|
if got != card(game.Clubs, game.Ace) {
|
|
t.Errorf("expected to lead C-A, got %v", got)
|
|
}
|
|
}
|
|
|
|
func TestBotLeadsBossWhenAceGone(t *testing.T) {
|
|
// آسِ گشنیز قبلاً بازی شده ⇒ شاهِ گشنیز حالا برندهی قطعی است؛ باید آن را نقد کند
|
|
// (نه کارتِ کم). این رفتار فقط با کارتشماری ممکن است.
|
|
hand := []game.Card{card(game.Clubs, game.King), card(game.Clubs, 4), card(game.Diamonds, 2)}
|
|
var seen [4]uint16
|
|
seen[game.Clubs] |= 1 << (game.Ace - 2) // آسِ گشنیز رو شده
|
|
got := botPlay(hand, nil, game.Hearts, 0, seen)
|
|
if got != card(game.Clubs, game.King) {
|
|
t.Errorf("expected to cash boss C-K (Ace gone), got %v", got)
|
|
}
|
|
}
|
|
|
|
func TestBotCannotBeatKeepsLow(t *testing.T) {
|
|
// حریف با آسِ پیک میبرد و بات فقط پیکِ پایین دارد ⇒ کمترین را بریزد.
|
|
hand := []game.Card{card(game.Spades, 4), card(game.Spades, 9)}
|
|
trick := []game.TrickCard{{Seat: 0, Card: card(game.Spades, game.Ace)}}
|
|
got := botPlay(hand, trick, game.Hearts, game.Spades, [4]uint16{})
|
|
if got != card(game.Spades, 4) {
|
|
t.Errorf("expected low S-4, got %v", got)
|
|
}
|
|
}
|
|
|
|
func TestBotChooseTrumpPrefersStrongLongSuit(t *testing.T) {
|
|
// خشت: ۴ کارت اما ضعیف؛ گشنیز: ۳ کارت اما آس+شاه. باید گشنیز را حکم کند اگر
|
|
// امتیازش بیشتر شود — اینجا خشت ۴تایی برنده است. تستِ ساده: بلندترینِ قوی.
|
|
hand := []game.Card{
|
|
card(game.Diamonds, 2), card(game.Diamonds, 3), card(game.Diamonds, 4), card(game.Diamonds, 5),
|
|
card(game.Clubs, game.Ace),
|
|
}
|
|
if got := botChooseTrump(hand); got != game.Diamonds {
|
|
t.Errorf("expected Diamonds (longest), got %v", got)
|
|
}
|
|
}
|