mirror of
https://github.com/Cockatrice/Cockatrice.git
synced 2026-04-27 07:48:01 -07:00
276 lines
11 KiB
TypeScript
276 lines
11 KiB
TypeScript
vi.mock('../../WebClient', () => ({
|
|
WebClient: {
|
|
instance: {
|
|
protobuf: { sendGameCommand: vi.fn() },
|
|
response: { game: {} },
|
|
},
|
|
},
|
|
}));
|
|
|
|
import { WebClient } from '../../WebClient';
|
|
import { create, setExtension } from '@bufbuild/protobuf';
|
|
import { Data } from '@app/types';
|
|
|
|
import { attachCard } from './attachCard';
|
|
import { changeZoneProperties } from './changeZoneProperties';
|
|
import { concede } from './concede';
|
|
import { createArrow } from './createArrow';
|
|
import { createCounter } from './createCounter';
|
|
import { createToken } from './createToken';
|
|
import { deckSelect } from './deckSelect';
|
|
import { delCounter } from './delCounter';
|
|
import { deleteArrow } from './deleteArrow';
|
|
import { drawCards } from './drawCards';
|
|
import { dumpZone } from './dumpZone';
|
|
import { flipCard } from './flipCard';
|
|
import { gameSay } from './gameSay';
|
|
import { incCardCounter } from './incCardCounter';
|
|
import { incCounter } from './incCounter';
|
|
import { kickFromGame } from './kickFromGame';
|
|
import { leaveGame } from './leaveGame';
|
|
import { moveCard } from './moveCard';
|
|
import { mulligan } from './mulligan';
|
|
import { nextTurn } from './nextTurn';
|
|
import { readyStart } from './readyStart';
|
|
import { revealCards } from './revealCards';
|
|
import { reverseTurn } from './reverseTurn';
|
|
import { setActivePhase } from './setActivePhase';
|
|
import { setCardAttr } from './setCardAttr';
|
|
import { setCardCounter } from './setCardCounter';
|
|
import { setCounter } from './setCounter';
|
|
import { setSideboardLock } from './setSideboardLock';
|
|
import { setSideboardPlan } from './setSideboardPlan';
|
|
import { shuffle } from './shuffle';
|
|
import { undoDraw } from './undoDraw';
|
|
import { unconcede } from './unconcede';
|
|
import { judge } from './judge';
|
|
|
|
const gameId = 1;
|
|
|
|
describe('Game commands — delegate to WebClient.instance.protobuf.sendGameCommand', () => {
|
|
it('attachCard sends Command_AttachCard', () => {
|
|
attachCard(gameId, { cardId: 10, startZone: 'hand' });
|
|
expect(WebClient.instance.protobuf.sendGameCommand).toHaveBeenCalledWith(
|
|
gameId, Data.Command_AttachCard_ext, expect.objectContaining({ cardId: 10, startZone: 'hand' })
|
|
);
|
|
});
|
|
|
|
it('changeZoneProperties sends Command_ChangeZoneProperties', () => {
|
|
changeZoneProperties(gameId, { zoneName: 'side' });
|
|
expect(WebClient.instance.protobuf.sendGameCommand).toHaveBeenCalledWith(
|
|
gameId, Data.Command_ChangeZoneProperties_ext, expect.objectContaining({ zoneName: 'side' })
|
|
);
|
|
});
|
|
|
|
it('concede sends Command_Concede with empty object', () => {
|
|
concede(gameId);
|
|
expect(WebClient.instance.protobuf.sendGameCommand).toHaveBeenCalledWith(gameId, Data.Command_Concede_ext, expect.any(Object));
|
|
});
|
|
|
|
it('createArrow sends Command_CreateArrow', () => {
|
|
createArrow(gameId, { startPlayerId: 1, startZone: 'hand' });
|
|
expect(WebClient.instance.protobuf.sendGameCommand).toHaveBeenCalledWith(
|
|
gameId, Data.Command_CreateArrow_ext, expect.objectContaining({ startPlayerId: 1, startZone: 'hand' })
|
|
);
|
|
});
|
|
|
|
it('createCounter sends Command_CreateCounter', () => {
|
|
createCounter(gameId, { counterName: 'life' });
|
|
expect(WebClient.instance.protobuf.sendGameCommand).toHaveBeenCalledWith(
|
|
gameId, Data.Command_CreateCounter_ext, expect.objectContaining({ counterName: 'life' })
|
|
);
|
|
});
|
|
|
|
it('createToken sends Command_CreateToken', () => {
|
|
createToken(gameId, { cardName: 'Goblin', zone: 'play' });
|
|
expect(WebClient.instance.protobuf.sendGameCommand).toHaveBeenCalledWith(
|
|
gameId, Data.Command_CreateToken_ext, expect.objectContaining({ cardName: 'Goblin', zone: 'play' })
|
|
);
|
|
});
|
|
|
|
it('deckSelect sends Command_DeckSelect', () => {
|
|
deckSelect(gameId, { deckId: 5 });
|
|
expect(WebClient.instance.protobuf.sendGameCommand).toHaveBeenCalledWith(
|
|
gameId, Data.Command_DeckSelect_ext, expect.objectContaining({ deckId: 5 })
|
|
);
|
|
});
|
|
|
|
it('delCounter sends Command_DelCounter', () => {
|
|
delCounter(gameId, { counterId: 3 });
|
|
expect(WebClient.instance.protobuf.sendGameCommand).toHaveBeenCalledWith(
|
|
gameId, Data.Command_DelCounter_ext, expect.objectContaining({ counterId: 3 })
|
|
);
|
|
});
|
|
|
|
it('deleteArrow sends Command_DeleteArrow', () => {
|
|
deleteArrow(gameId, { arrowId: 2 });
|
|
expect(WebClient.instance.protobuf.sendGameCommand).toHaveBeenCalledWith(
|
|
gameId, Data.Command_DeleteArrow_ext, expect.objectContaining({ arrowId: 2 })
|
|
);
|
|
});
|
|
|
|
it('drawCards sends Command_DrawCards', () => {
|
|
drawCards(gameId, { number: 3 });
|
|
expect(WebClient.instance.protobuf.sendGameCommand).toHaveBeenCalledWith(
|
|
gameId, Data.Command_DrawCards_ext, expect.objectContaining({ number: 3 })
|
|
);
|
|
});
|
|
|
|
it('dumpZone sends Command_DumpZone', () => {
|
|
dumpZone(gameId, { playerId: 2, zoneName: 'library' });
|
|
expect(WebClient.instance.protobuf.sendGameCommand).toHaveBeenCalledWith(
|
|
gameId, Data.Command_DumpZone_ext, expect.objectContaining({ playerId: 2, zoneName: 'library' })
|
|
);
|
|
});
|
|
|
|
it('flipCard sends Command_FlipCard', () => {
|
|
flipCard(gameId, { cardId: 7, faceDown: false });
|
|
expect(WebClient.instance.protobuf.sendGameCommand).toHaveBeenCalledWith(
|
|
gameId, Data.Command_FlipCard_ext, expect.objectContaining({ cardId: 7, faceDown: false })
|
|
);
|
|
});
|
|
|
|
it('gameSay sends Command_GameSay', () => {
|
|
gameSay(gameId, { message: 'hello' });
|
|
expect(WebClient.instance.protobuf.sendGameCommand).toHaveBeenCalledWith(
|
|
gameId, Data.Command_GameSay_ext, expect.objectContaining({ message: 'hello' })
|
|
);
|
|
});
|
|
|
|
it('incCardCounter sends Command_IncCardCounter', () => {
|
|
incCardCounter(gameId, { cardId: 5, counterId: 1 });
|
|
expect(WebClient.instance.protobuf.sendGameCommand).toHaveBeenCalledWith(
|
|
gameId, Data.Command_IncCardCounter_ext, expect.objectContaining({ cardId: 5, counterId: 1 })
|
|
);
|
|
});
|
|
|
|
it('incCounter sends Command_IncCounter', () => {
|
|
incCounter(gameId, { counterId: 1, delta: 5 });
|
|
expect(WebClient.instance.protobuf.sendGameCommand).toHaveBeenCalledWith(
|
|
gameId, Data.Command_IncCounter_ext, expect.objectContaining({ counterId: 1, delta: 5 })
|
|
);
|
|
});
|
|
|
|
it('kickFromGame sends Command_KickFromGame', () => {
|
|
kickFromGame(gameId, { playerId: 2 });
|
|
expect(WebClient.instance.protobuf.sendGameCommand).toHaveBeenCalledWith(
|
|
gameId, Data.Command_KickFromGame_ext, expect.objectContaining({ playerId: 2 })
|
|
);
|
|
});
|
|
|
|
it('leaveGame sends Command_LeaveGame with empty object', () => {
|
|
leaveGame(gameId);
|
|
expect(WebClient.instance.protobuf.sendGameCommand).toHaveBeenCalledWith(gameId, Data.Command_LeaveGame_ext, expect.any(Object));
|
|
});
|
|
|
|
it('moveCard sends Command_MoveCard', () => {
|
|
moveCard(gameId, { startZone: 'hand', targetZone: 'graveyard' });
|
|
expect(WebClient.instance.protobuf.sendGameCommand).toHaveBeenCalledWith(
|
|
gameId, Data.Command_MoveCard_ext,
|
|
expect.objectContaining({ startZone: 'hand', targetZone: 'graveyard' })
|
|
);
|
|
});
|
|
|
|
it('mulligan sends Command_Mulligan', () => {
|
|
mulligan(gameId, { number: 7 });
|
|
expect(WebClient.instance.protobuf.sendGameCommand).toHaveBeenCalledWith(
|
|
gameId, Data.Command_Mulligan_ext, expect.objectContaining({ number: 7 })
|
|
);
|
|
});
|
|
|
|
it('nextTurn sends Command_NextTurn with empty object', () => {
|
|
nextTurn(gameId);
|
|
expect(WebClient.instance.protobuf.sendGameCommand).toHaveBeenCalledWith(gameId, Data.Command_NextTurn_ext, expect.any(Object));
|
|
});
|
|
|
|
it('readyStart sends Command_ReadyStart', () => {
|
|
readyStart(gameId, { ready: true });
|
|
expect(WebClient.instance.protobuf.sendGameCommand).toHaveBeenCalledWith(
|
|
gameId, Data.Command_ReadyStart_ext, expect.objectContaining({ ready: true })
|
|
);
|
|
});
|
|
|
|
it('revealCards sends Command_RevealCards', () => {
|
|
revealCards(gameId, { zoneName: 'hand', cardId: [1, 2] });
|
|
expect(WebClient.instance.protobuf.sendGameCommand).toHaveBeenCalledWith(
|
|
gameId, Data.Command_RevealCards_ext, expect.objectContaining({ zoneName: 'hand', cardId: [1, 2] })
|
|
);
|
|
});
|
|
|
|
it('reverseTurn sends Command_ReverseTurn with empty object', () => {
|
|
reverseTurn(gameId);
|
|
expect(WebClient.instance.protobuf.sendGameCommand).toHaveBeenCalledWith(gameId, Data.Command_ReverseTurn_ext, expect.any(Object));
|
|
});
|
|
|
|
it('setActivePhase sends Command_SetActivePhase', () => {
|
|
setActivePhase(gameId, { phase: 2 });
|
|
expect(WebClient.instance.protobuf.sendGameCommand).toHaveBeenCalledWith(
|
|
gameId, Data.Command_SetActivePhase_ext, expect.objectContaining({ phase: 2 })
|
|
);
|
|
});
|
|
|
|
it('setCardAttr sends Command_SetCardAttr', () => {
|
|
setCardAttr(gameId, { zone: 'play', cardId: 5, attrValue: '2' });
|
|
expect(WebClient.instance.protobuf.sendGameCommand).toHaveBeenCalledWith(
|
|
gameId, Data.Command_SetCardAttr_ext,
|
|
expect.objectContaining({ zone: 'play', cardId: 5, attrValue: '2' })
|
|
);
|
|
});
|
|
|
|
it('setCardCounter sends Command_SetCardCounter', () => {
|
|
setCardCounter(gameId, { cardId: 5, counterId: 1 });
|
|
expect(WebClient.instance.protobuf.sendGameCommand).toHaveBeenCalledWith(
|
|
gameId, Data.Command_SetCardCounter_ext, expect.objectContaining({ cardId: 5, counterId: 1 })
|
|
);
|
|
});
|
|
|
|
it('setCounter sends Command_SetCounter', () => {
|
|
setCounter(gameId, { counterId: 1, value: 10 });
|
|
expect(WebClient.instance.protobuf.sendGameCommand).toHaveBeenCalledWith(
|
|
gameId, Data.Command_SetCounter_ext, expect.objectContaining({ counterId: 1, value: 10 })
|
|
);
|
|
});
|
|
|
|
it('setSideboardLock sends Command_SetSideboardLock', () => {
|
|
setSideboardLock(gameId, { locked: true });
|
|
expect(WebClient.instance.protobuf.sendGameCommand).toHaveBeenCalledWith(
|
|
gameId, Data.Command_SetSideboardLock_ext, expect.objectContaining({ locked: true })
|
|
);
|
|
});
|
|
|
|
it('setSideboardPlan sends Command_SetSideboardPlan', () => {
|
|
setSideboardPlan(gameId, { moveList: [] });
|
|
expect(WebClient.instance.protobuf.sendGameCommand).toHaveBeenCalledWith(
|
|
gameId, Data.Command_SetSideboardPlan_ext, expect.objectContaining({ moveList: expect.any(Array) })
|
|
);
|
|
});
|
|
|
|
it('shuffle sends Command_Shuffle', () => {
|
|
shuffle(gameId, { zoneName: 'hand' });
|
|
expect(WebClient.instance.protobuf.sendGameCommand).toHaveBeenCalledWith(
|
|
gameId, Data.Command_Shuffle_ext, expect.objectContaining({ zoneName: 'hand' })
|
|
);
|
|
});
|
|
|
|
it('undoDraw sends Command_UndoDraw with empty object', () => {
|
|
undoDraw(gameId);
|
|
expect(WebClient.instance.protobuf.sendGameCommand).toHaveBeenCalledWith(gameId, Data.Command_UndoDraw_ext, expect.any(Object));
|
|
});
|
|
|
|
it('unconcede sends Command_Unconcede with empty object', () => {
|
|
unconcede(gameId);
|
|
expect(WebClient.instance.protobuf.sendGameCommand).toHaveBeenCalledWith(gameId, Data.Command_Unconcede_ext, expect.any(Object));
|
|
});
|
|
|
|
it('judge sends Command_Judge with targetId and wrapped gameCommand array', () => {
|
|
const targetId = 3;
|
|
const innerCmd = create(Data.GameCommandSchema);
|
|
setExtension(innerCmd, Data.Command_DrawCards_ext, create(Data.Command_DrawCardsSchema, { number: 2 }));
|
|
judge(gameId, targetId, innerCmd);
|
|
expect(WebClient.instance.protobuf.sendGameCommand).toHaveBeenCalledWith(
|
|
gameId,
|
|
Data.Command_Judge_ext,
|
|
expect.objectContaining({ targetId: 3, gameCommand: expect.any(Array) })
|
|
);
|
|
});
|
|
});
|