Files
back-hokm/internal/ws/bot_test.go
T
2026-07-07 23:23:12 +03:30

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)
}
}