ohif-viewer/platform/core/src/classes/HotkeysManager.test.js
2021-07-21 13:38:00 +02:00

213 lines
6.2 KiB
JavaScript

import CommandsManager from './CommandsManager.js';
import HotkeysManager from './HotkeysManager.js';
import hotkeys from './../utils/hotkeys';
import log from './../log.js';
import objectHash from 'object-hash';
jest.mock('./CommandsManager.js');
jest.mock('./../utils/hotkeys');
jest.mock('./../log.js');
describe('HotkeysManager', () => {
let hotkeysManager, commandsManager;
beforeAll(() => {
hotkeys.initialize();
});
beforeEach(() => {
commandsManager = new CommandsManager();
hotkeysManager = new HotkeysManager(commandsManager);
CommandsManager.mockClear();
hotkeys.mockClear();
log.warn.mockClear();
jest.clearAllMocks();
});
it('has expected properties', () => {
const allProperties = Object.keys(hotkeysManager);
const expectedProprties = [
'hotkeyDefinitions',
'hotkeyDefaults',
'isEnabled',
];
const containsAllExpectedProperties = expectedProprties.every(expected =>
allProperties.includes(expected)
);
expect(containsAllExpectedProperties).toBe(true);
});
it('throws Error if instantiated without a commandsManager', () => {
expect(() => {
new HotkeysManager();
}).toThrow(
'HotkeysManager instantiated without a commandsManager. Hotkeys will be unable to find and run commands.'
);
});
describe('disable()', () => {
beforeEach(() => hotkeys.pause.mockClear());
it('sets isEnabled property to false', () => {
hotkeysManager.disable();
expect(hotkeysManager.isEnabled).toBe(false);
});
it('calls hotkeys.pause()', () => {
hotkeysManager.disable();
expect(hotkeys.pause.mock.calls.length).toBe(1);
});
});
describe('enable()', () => {
beforeEach(() => {
hotkeys.unpause = jest.fn();
hotkeys.unpause.mockClear();
});
it('sets isEnabled property to true', () => {
hotkeysManager.disable();
hotkeysManager.enable();
expect(hotkeysManager.isEnabled).toBe(true);
});
it('calls hotkeys.unpause()', () => {
hotkeysManager.enable();
expect(hotkeys.unpause.mock.calls.length).toBe(1);
});
});
describe('setHotkeys()', () => {
it('calls registerHotkeys for each hotkeyDefinition', () => {
const hotkeyDefinitions = [
{ commandName: 'dance', label: 'dance dance', keys: '+' },
{ commandName: 'celebrate', label: 'celebrate everything', keys: 'q' },
];
hotkeysManager.registerHotkeys = jest.fn();
hotkeysManager.setHotkeys(hotkeyDefinitions);
const numberOfCalls = hotkeysManager.registerHotkeys.mock.calls.length;
const firstCallArgs = hotkeysManager.registerHotkeys.mock.calls[0][0];
const secondCallArgs = hotkeysManager.registerHotkeys.mock.calls[1][0];
expect(numberOfCalls).toBe(2);
expect(firstCallArgs).toEqual(hotkeyDefinitions[0]);
expect(secondCallArgs).toEqual(hotkeyDefinitions[1]);
});
it('does not set this.hotkeyDefaults when calling setHotKeys', () => {
const hotkeyDefinitions = [{ commandName: 'dance', keys: '+' }];
hotkeysManager.setHotkeys(hotkeyDefinitions);
expect(hotkeysManager.hotkeyDefaults).toEqual([]);
});
});
describe('setDefaultHotKeys()', () => {
it('it sets default hotkeys', () => {
const hotkeyDefinitions = [{ commandName: 'dance', keys: '+' }];
hotkeysManager.setDefaultHotKeys(hotkeyDefinitions);
expect(hotkeysManager.hotkeyDefaults).toEqual(hotkeyDefinitions);
});
});
describe('registerHotkeys()', () => {
it('throws an Error if a commandName is not provided', () => {
const definition = { commandName: undefined, keys: '+' };
expect(() => {
hotkeysManager.registerHotkeys(definition);
}).toThrow();
});
it('updates hotkeyDefinitions property with registered keys', () => {
const definition = {
commandName: 'dance',
commandOptions: {},
label: 'hello',
keys: '+',
};
hotkeysManager.registerHotkeys(definition);
const numOfHotkeyDefinitions = Object.keys(
hotkeysManager.hotkeyDefinitions
).length;
const commandHash = objectHash({
commandName: definition.commandName,
commandOptions: definition.commandOptions,
});
const hotkeyDefinitionForRegisteredCommand =
hotkeysManager.hotkeyDefinitions[commandHash];
expect(numOfHotkeyDefinitions).toBe(1);
expect(Object.keys(hotkeysManager.hotkeyDefinitions)[0]).toEqual(
commandHash
);
expect(hotkeyDefinitionForRegisteredCommand).toEqual(definition);
});
it('calls hotkeys.bind for the group of keys', () => {
const definition = { commandName: 'dance', keys: ['shift', 'e'] };
hotkeysManager.registerHotkeys(definition);
expect(hotkeys.bind.mock.calls.length).toBe(1);
expect(hotkeys.bind.mock.calls[0][0]).toBe('shift+e');
});
it('calls hotkeys.unbind if commandName was previously registered, for each previously registered set of keys', () => {
const firstDefinition = {
commandName: 'dance',
keys: ['alt', 'e'],
};
const secondDefinition = { commandName: 'dance', keys: 'a' };
// First call
hotkeysManager.registerHotkeys(firstDefinition);
// Second call
hotkeysManager.registerHotkeys(secondDefinition);
expect(hotkeys.unbind.mock.calls.length).toBe(1);
expect(hotkeys.unbind.mock.calls[0][0]).toBe('alt+e');
});
});
describe('restoreDefaults()', () => {
it('calls setHotkeys with hotkey defaults', () => {
hotkeysManager.setHotkeys = jest.fn();
hotkeysManager.restoreDefaultBindings();
expect(hotkeysManager.setHotkeys.mock.calls[0][0]).toEqual(
hotkeysManager.hotkeyDefaults
);
});
});
describe('destroy()', () => {
it('clears default and definition properties', () => {
hotkeysManager.hotkeyDefaults = ['hotdog', 'jeremy', 'qasar'];
hotkeysManager.hotkeyDefinitions = {
hello: 'world',
};
hotkeysManager.destroy();
expect(hotkeysManager.hotkeyDefaults).toEqual([]);
expect(hotkeysManager.hotkeyDefinitions).toEqual({});
});
it('resets all hotkey bindings', () => {
hotkeysManager.destroy();
expect(hotkeys.reset.mock.calls.length).toEqual(1);
});
});
});