import {test} from 'node:test';
import assert from 'node:assert/strict';
import {render, screen} from '@testing-library/react';
import userEvent from '@testing-library/user-event';
import Board from './main.jsx';
const labels = () => screen.getAllByRole('button').map((button) => button.textContent);
const status = () => screen.getByText(/^(Next player|Winner):/).textContent;
const play = async (user, squares) => {
for (const i of squares) await user.click(screen.getAllByRole('button')[i]);
};
test('X und O ziehen abwechselnd', async () => {
const user = userEvent.setup();
render(<Board />);
await play(user, [0, 1, 2]);
assert.deepEqual(labels().slice(0, 3), ['X', 'O', 'X'], 'nach drei Zügen zeigt die obere Reihe ' + JSON.stringify(labels().slice(0, 3)));
assert.equal(status(), 'Next player: O', 'nach drei Zügen zeigt der Status ' + JSON.stringify(status()));
});
test('Ein belegtes Feld ändert sich nicht', async () => {
const user = userEvent.setup();
render(<Board />);
await play(user, [4, 4]);
assert.equal(labels()[4], 'X', 'nach zwei Klicks auf das mittlere Feld zeigt es ' + JSON.stringify(labels()[4]));
assert.equal(status(), 'Next player: O', 'ein Klick auf ein belegtes Feld darf den Zug nicht weitergeben; der Status zeigt ' + JSON.stringify(status()));
});
test('Drei in einer Reihe zeigen den Gewinner', async () => {
const user = userEvent.setup();
render(<Board />);
await play(user, [0, 3, 1, 4, 2]);
assert.equal(status(), 'Winner: X', 'nachdem X die obere Reihe gefüllt hat, zeigt der Status ' + JSON.stringify(status()));
});
test('Nach einem Sieg keine Züge mehr', async () => {
const user = userEvent.setup();
render(<Board />);
await play(user, [0, 3, 1, 4, 2, 8]);
assert.equal(labels()[8], '', 'nach dem Sieg zeigt das letzte Feld nach einem Klick ' + JSON.stringify(labels()[8]));
});
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(<Board />);
await user.click(screen.getAllByRole('button')[0]);
} finally {
console.error = original;
}
assert.deepEqual(warnings, [], 'console.error beim Rendern und Klicken');
});