mirror of
https://github.com/Cockatrice/Cockatrice.git
synced 2026-04-27 07:48:01 -07:00
implement gameboard v1
This commit is contained in:
parent
b103db681b
commit
0d7336edc2
177 changed files with 16995 additions and 139 deletions
107
webclient/src/components/Game/StackStrip/StackStrip.spec.tsx
Normal file
107
webclient/src/components/Game/StackStrip/StackStrip.spec.tsx
Normal file
|
|
@ -0,0 +1,107 @@
|
|||
import { screen, fireEvent } from '@testing-library/react';
|
||||
import { App } from '@app/types';
|
||||
|
||||
import { makeStoreState, renderWithProviders } from '../../../__test-utils__';
|
||||
import {
|
||||
makeGameEntry,
|
||||
makePlayerEntry,
|
||||
makePlayerProperties,
|
||||
makeZoneEntry,
|
||||
} from '../../../store/game/__mocks__/fixtures';
|
||||
import StackStrip from './StackStrip';
|
||||
|
||||
function stateWithStacks(localCount: number, opponentCount: number) {
|
||||
const local = makePlayerEntry({
|
||||
properties: makePlayerProperties({ playerId: 1 }),
|
||||
zones: {
|
||||
[App.ZoneName.STACK]: makeZoneEntry({
|
||||
name: App.ZoneName.STACK,
|
||||
cardCount: localCount,
|
||||
}),
|
||||
},
|
||||
});
|
||||
const opponent = makePlayerEntry({
|
||||
properties: makePlayerProperties({ playerId: 2 }),
|
||||
zones: {
|
||||
[App.ZoneName.STACK]: makeZoneEntry({
|
||||
name: App.ZoneName.STACK,
|
||||
cardCount: opponentCount,
|
||||
}),
|
||||
},
|
||||
});
|
||||
return makeStoreState({
|
||||
games: {
|
||||
games: {
|
||||
1: makeGameEntry({ localPlayerId: 1, players: { 1: local, 2: opponent } }),
|
||||
},
|
||||
},
|
||||
});
|
||||
}
|
||||
|
||||
describe('StackStrip', () => {
|
||||
it('renders a cell per entry with the zone cardCount', () => {
|
||||
renderWithProviders(
|
||||
<StackStrip
|
||||
gameId={1}
|
||||
entries={[
|
||||
{ playerId: 2, name: 'Opp' },
|
||||
{ playerId: 1, name: 'Me' },
|
||||
]}
|
||||
/>,
|
||||
{ preloadedState: stateWithStacks(0, 3) },
|
||||
);
|
||||
|
||||
const oppCell = screen.getByTestId('stack-strip-cell-2');
|
||||
const meCell = screen.getByTestId('stack-strip-cell-1');
|
||||
expect(oppCell).toHaveTextContent('Opp');
|
||||
expect(oppCell).toHaveTextContent('3');
|
||||
expect(meCell).toHaveTextContent('Me');
|
||||
expect(meCell).toHaveTextContent('0');
|
||||
});
|
||||
|
||||
it('invokes onZoneClick(playerId, "stack") when a cell is clicked', () => {
|
||||
const onZoneClick = vi.fn();
|
||||
renderWithProviders(
|
||||
<StackStrip
|
||||
gameId={1}
|
||||
entries={[
|
||||
{ playerId: 2, name: 'Opp' },
|
||||
{ playerId: 1, name: 'Me' },
|
||||
]}
|
||||
onZoneClick={onZoneClick}
|
||||
/>,
|
||||
{ preloadedState: stateWithStacks(1, 2) },
|
||||
);
|
||||
|
||||
fireEvent.click(screen.getByTestId('stack-strip-cell-1'));
|
||||
|
||||
expect(onZoneClick).toHaveBeenCalledWith(1, App.ZoneName.STACK);
|
||||
});
|
||||
|
||||
it('activates on Enter/Space when clickable', () => {
|
||||
const onZoneClick = vi.fn();
|
||||
renderWithProviders(
|
||||
<StackStrip
|
||||
gameId={1}
|
||||
entries={[{ playerId: 1, name: 'Me' }]}
|
||||
onZoneClick={onZoneClick}
|
||||
/>,
|
||||
{ preloadedState: stateWithStacks(0, 0) },
|
||||
);
|
||||
|
||||
fireEvent.keyDown(screen.getByTestId('stack-strip-cell-1'), { key: 'Enter' });
|
||||
|
||||
expect(onZoneClick).toHaveBeenCalledWith(1, App.ZoneName.STACK);
|
||||
});
|
||||
|
||||
it('renders cells as non-interactive when onZoneClick is absent', () => {
|
||||
renderWithProviders(
|
||||
<StackStrip gameId={1} entries={[{ playerId: 1, name: 'Me' }]} />,
|
||||
{ preloadedState: stateWithStacks(0, 0) },
|
||||
);
|
||||
|
||||
const cell = screen.getByTestId('stack-strip-cell-1');
|
||||
expect(cell).not.toHaveAttribute('role', 'button');
|
||||
expect(cell).not.toHaveAttribute('tabindex');
|
||||
});
|
||||
});
|
||||
Loading…
Add table
Add a link
Reference in a new issue