Select Git revision
bei.test.js
Forked from
SOFT Core / SOFT 260 / Boost Board Game
5 commits behind, 1 commit ahead of the upstream repository.
-
Brady James Garvin authoredBrady James Garvin authored
bei.test.js 5.75 KiB
/* eslint-disable no-magic-numbers */
import { jest, describe, test, expect } from '@jest/globals';
import GAME_LIBRARY from '../gameLibrary.js';
import Engine from './bei.js';
function engineWithMocks(name, author, version) {
globalThis.postMessage = jest.fn().mockName('postMessage');
globalThis.addEventListener = jest.fn().mockName('addEventListener');
GAME_LIBRARY.get = jest.fn().mockName('getGame');
const result = new Engine(name, author, version);
result.onSetStrength = jest.fn().mockName('onSetStrength');
result.onPonder = jest.fn().mockName('onPonder');
result.onGo = jest.fn().mockName('onGo');
result.onStop = jest.fn().mockName('onStop');
return result;
}
describe('the engine', () => {
test('describes itself when a connection is started', () => {
const engine = engineWithMocks('abc', 'def', 'ghi');
engine.receiveMessage('bei');
expect(globalThis.postMessage.mock.calls).toEqual([
['protocol 1.0.0'],
['id name abc'],
['id author def'],
['id version ghi'],
['beiok'],
]);
});
test('omits a missing name from its self description', () => {
const engine = engineWithMocks(undefined, 'def', 'ghi');
engine.receiveMessage('bei');
expect(globalThis.postMessage.mock.calls).toEqual([
['protocol 1.0.0'],
['id author def'],
['id version ghi'],
['beiok'],
]);
});
test('omits a missing author from its self description', () => {
const engine = engineWithMocks('abc', undefined, 'ghi');
engine.receiveMessage('bei');
expect(globalThis.postMessage.mock.calls).toEqual([
['protocol 1.0.0'],
['id name abc'],
['id version ghi'],
['beiok'],
]);
});
test('omits a missing version from its self description', () => {
const engine = engineWithMocks('abc', 'def', undefined);
engine.receiveMessage('bei');
expect(globalThis.postMessage.mock.calls).toEqual([
['protocol 1.0.0'],
['id name abc'],
['id author def'],
['beiok'],
]);
});
test('responds to pings', () => {
const engine = engineWithMocks();
engine.receiveMessage('bei');
engine.receiveMessage('isready');
expect(globalThis.postMessage.mock.calls).toEqual([
['protocol 1.0.0'],
['beiok'],
['readyok'],
]);
});
test('sets and acknowledges known games', () => {
const game = {};
const engine = engineWithMocks();
engine.receiveMessage('bei');
GAME_LIBRARY.get.mockReturnValue(game);
engine.receiveMessage('newgame abc');
expect(GAME_LIBRARY.get.mock.calls).toEqual([
['abc'],
]);
expect(globalThis.postMessage.mock.calls).toEqual([
['protocol 1.0.0'],
['beiok'],
['known'],
]);
expect(engine.game).toBe(game);
});
test('acknowledges unknown games', () => {
const engine = engineWithMocks();
engine.receiveMessage('bei');
GAME_LIBRARY.get.mockReturnValue(undefined);
engine.receiveMessage('newgame abc');
expect(GAME_LIBRARY.get.mock.calls).toEqual([
['abc'],
]);
expect(globalThis.postMessage.mock.calls).toEqual([
['protocol 1.0.0'],
['beiok'],
['unknown'],
]);
expect(engine.game).toBe(undefined);
});
test('sets it strength', () => {
const engine = engineWithMocks();
engine.receiveMessage('bei');
engine.receiveMessage('setoption strength 9999');
expect(engine.onSetStrength.mock.calls).toEqual([
[9999],
]);
});
test('sets the current line', () => {
const position = {
signature: 'abc',
};
const taboo = [
{
signature: 'def',
},
{
signature: 'ghi',
},
];
const engine = engineWithMocks();
engine.receiveMessage('bei');
GAME_LIBRARY.get.mockReturnValue({
deserializePosition: jest.fn().mockName('deserializePosition').mockImplementation((serialization) => {
switch (serialization) {
case 'mno':
return position;
case 'pqr':
return taboo[0];
case 'stu':
return taboo[1];
default:
return undefined;
}
}),
});
engine.receiveMessage('newgame jkl');
engine.receiveMessage('setline mno pqr stu');
expect(engine.position).toBe(position);
expect([...engine.taboo].sort()).toEqual(['abc', 'def', 'ghi']);
});
test('ponders', () => {
const position = {
signature: 'abc',
};
const engine = engineWithMocks();
engine.receiveMessage('bei');
GAME_LIBRARY.get.mockReturnValue({
deserializePosition: jest.fn().mockName('deserializePosition').mockReturnValue(position),
});
engine.receiveMessage('newgame def');
engine.receiveMessage('setline ghi');
engine.receiveMessage('ponder 9999');
expect(engine.onPonder.mock.calls).toEqual([
[9999],
]);
});
test('starts searching', () => {
const position = {
signature: 'abc',
};
const engine = engineWithMocks();
engine.receiveMessage('bei');
GAME_LIBRARY.get.mockReturnValue({
deserializePosition: jest.fn().mockName('deserializePosition').mockReturnValue(position),
});
engine.receiveMessage('newgame def');
engine.receiveMessage('setline ghi');
engine.receiveMessage('go');
expect(engine.onGo.mock.calls).toEqual([
[],
]);
});
test('stops searching', () => {
const position = {
signature: 'abc',
};
const engine = engineWithMocks();
engine.receiveMessage('bei');
GAME_LIBRARY.get.mockReturnValue({
deserializePosition: jest.fn().mockName('deserializePosition').mockReturnValue(position),
});
engine.receiveMessage('newgame def');
engine.receiveMessage('setline ghi');
engine.receiveMessage('go');
engine.receiveMessage('stop');
expect(engine.onStop.mock.calls).toEqual([
[],
]);
});
});