Skip to content
Snippets Groups Projects
Select Git revision
  • ef9d58bd7c6a041f077d3500f92bb433de41ebbd
  • master default protected
2 results

bei.test.js

Blame
  • 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([
          [],
        ]);
      });
    });