65 lines
3.5 KiB
TypeScript
65 lines
3.5 KiB
TypeScript
import { expect, test } from 'bun:test';
|
|
import { applyAction, setupGame, usersOf } from '../help-kit.test-util';
|
|
import { GAMES } from '@bg/games';
|
|
import { helpNow } from './help';
|
|
|
|
const ids = ['A', 'B', 'C'];
|
|
const users = usersOf(ids);
|
|
const view = (s: unknown, who: string | null) => GAMES['cockroach-poker']!.view(s, who) as any;
|
|
const nickOf = (id: string) => users[id]!.nickname;
|
|
|
|
test('바퀴벌레 포커: 건네기 차례 / 기다림 / 관전', () => {
|
|
const { state } = setupGame('cockroach-poker', 3);
|
|
const starter = state.round.starter as string;
|
|
const other = ids.find((p) => p !== starter)!;
|
|
expect(helpNow(view(state, starter), starter, users)).toContain('[건네기]');
|
|
const wait = helpNow(view(state, other), other, users);
|
|
expect(wait).toContain(`${nickOf(starter)}님이 건넬 카드를 고르는 중`);
|
|
expect(wait).toContain('4장 모이면 져요');
|
|
expect(helpNow(view(state, null), null, users)).toContain(`${nickOf(starter)}님이 건넬 카드를 고르는 중`);
|
|
});
|
|
|
|
test('바퀴벌레 포커: 받은 사람의 판정 / 몰래 보고 넘기기', () => {
|
|
const { state } = setupGame('cockroach-poker', 3);
|
|
const starter = state.round.starter as string;
|
|
const [to, third] = ids.filter((p) => p !== starter) as [string, string];
|
|
const card = state.hands[starter][0] as string;
|
|
let s = applyAction('cockroach-poker', state, starter, { type: 'offer', cardId: card, to, claim: 'rat' });
|
|
const t = helpNow(view(s, to), to, users);
|
|
expect(t).toContain('"이건 쥐야!"');
|
|
expect(t).toContain('[⭕ 진짜!]');
|
|
expect(t).toContain('[👁 몰래 보고 넘기기]');
|
|
expect(helpNow(view(s, starter), starter, users)).toContain('다시 받지 않아요');
|
|
expect(helpNow(view(s, null), null, users)).toContain(`${nickOf(to)}님이 진짜인지 고민하는 중`);
|
|
|
|
s = applyAction('cockroach-poker', s, to, { type: 'peek' });
|
|
const p = helpNow(view(s, to), to, users);
|
|
expect(p).toContain('몰래 본 카드는');
|
|
expect(p).toContain('[넘기기]');
|
|
expect(helpNow(view(s, third), third, users)).toContain('나에게 넘어올 수도');
|
|
|
|
s = applyAction('cockroach-poker', s, to, { type: 'pass', to: third, claim: 'bat' });
|
|
const last = helpNow(view(s, third), third, users);
|
|
expect(last).toContain('"이건 박쥐야!"');
|
|
expect(last).toContain('넘길 사람이 없어요');
|
|
});
|
|
|
|
test('바퀴벌레 포커: 2명은 넘기기 없음, 위험 경고, 게임 끝', () => {
|
|
const { state } = setupGame('cockroach-poker', 2);
|
|
const starter = state.round.starter as string;
|
|
const to = ids.slice(0, 2).find((p) => p !== starter)!;
|
|
// 받는 사람 앞마당에 쥐 4장(2명은 5장이면 패배) → 위험 경고.
|
|
const rats = ['rat-0', 'rat-1', 'rat-2', 'rat-3', 'rat-4'];
|
|
for (const p of ['A', 'B']) state.hands[p] = state.hands[p].filter((c: string) => !rats.includes(c));
|
|
state.fronts[to] = rats.slice(0, 4);
|
|
state.hands[starter].push('rat-4');
|
|
let s = applyAction('cockroach-poker', state, starter, { type: 'offer', cardId: 'rat-4', to, claim: 'rat' });
|
|
const t = helpNow(view(s, to), to, users);
|
|
expect(t).toContain('2명이 할 때는 몰래 보고 넘기기를 할 수 없어요');
|
|
expect(t).toContain('조심! 내 앞마당의 쥐 4장');
|
|
s = applyAction('cockroach-poker', s, to, { type: 'call', call: 'false' });
|
|
expect(helpNow(view(s, to), to, users)).toContain('내가 졌어요');
|
|
expect(helpNow(view(s, starter), starter, users)).toContain('나는 이겼어요');
|
|
expect(helpNow(view(s, null), null, users)).toContain(`${nickOf(to)}님이 졌고`);
|
|
});
|