import {test} from 'node:test';
import assert from 'node:assert/strict';
import {render, screen, within} from '@testing-library/react';
import userEvent from '@testing-library/user-event';
import Game from './main.jsx';
const squares = () => screen.getAllByRole('button').slice(0, 9).map((button) => button.textContent);
const status = () => screen.getByText(/^(Next player|Winner):/).textContent;
const play = async (user, positions) => {
for (const i of positions) await user.click(screen.getAllByRole('button')[i]);
};
const moves = () => within(screen.getByRole('list')).queryAllByRole('button').map((button) => button.textContent);
const jump = async (user, name) => user.click(within(screen.getByRole('list')).getByRole('button', {name}));
test('Die Liste beginnt mit Go to game start', () => {
render(<Game />);
assert.deepEqual(moves(), ['Go to game start'], 'vor dem ersten Zug zeigt die Liste ' + JSON.stringify(moves()));
});
test('Jeder Zug fügt einen Button hinzu', async () => {
const user = userEvent.setup();
render(<Game />);
await play(user, [0, 1]);
assert.deepEqual(moves(), ['Go to game start', 'Go to move #1', 'Go to move #2'], 'nach zwei Zügen zeigt die Liste ' + JSON.stringify(moves()));
});
test('Go to game start zeigt das leere Brett', async () => {
const user = userEvent.setup();
render(<Game />);
await play(user, [0, 1]);
await jump(user, 'Go to game start');
assert.deepEqual(squares(), ['', '', '', '', '', '', '', '', ''], 'nach dem Sprung zum Anfang zeigen die Felder ' + JSON.stringify(squares()));
assert.equal(status(), 'Next player: X', 'nach dem Sprung zum Anfang zeigt der Status ' + JSON.stringify(status()));
});
test('Go to move #1 zeigt das Brett nach dem ersten Zug', async () => {
const user = userEvent.setup();
render(<Game />);
await play(user, [0, 1, 2]);
await jump(user, 'Go to move #1');
assert.deepEqual(squares().slice(0, 3), ['X', '', ''], 'nach dem Sprung zu Zug #1 zeigt die obere Reihe ' + JSON.stringify(squares().slice(0, 3)));
assert.equal(status(), 'Next player: O', 'nach dem Sprung zu Zug #1 zeigt der Status ' + JSON.stringify(status()));
});
test('Ein Zug nach einem Sprung ersetzt die späteren Züge', async () => {
const user = userEvent.setup();
render(<Game />);
await play(user, [0, 1, 2]);
await jump(user, 'Go to move #1');
await play(user, [4]);
assert.deepEqual(moves(), ['Go to game start', 'Go to move #1', 'Go to move #2'], 'nach dem Sprung zu Zug #1 und einem neuen Zug zeigt die Liste ' + JSON.stringify(moves()));
assert.deepEqual(squares().slice(0, 5), ['X', '', '', '', 'O'], 'das Brett zeigt ' + JSON.stringify(squares().slice(0, 5)) + ' in seinen ersten fünf Feldern');
});
test('React gibt keine Warnungen aus', async () => {
const warnings = [];
const original = console.error;
console.error = (...args) => warnings.push(args.join(' '));
try {
const user = userEvent.setup();
render(<Game />);
await play(user, [0, 4]);
} finally {
console.error = original;
}
assert.deepEqual(warnings, [], 'console.error beim Rendern und Spielen');
});