iohook
Version:
Node.js global keyboard and mouse hook
243 lines (208 loc) • 5.95 kB
JavaScript
const ioHook = require('../../index');
const robot = require('robotjs');
describe('Keyboard events', () => {
afterEach(() => {
ioHook.stop();
});
it('receives the text "hello world" on keyup event', (done) => {
expect.assertions(22);
const chars = [
{ keycode: 35, value: 'h' },
{ keycode: 18, value: 'e' },
{ keycode: 38, value: 'l' },
{ keycode: 38, value: 'l' },
{ keycode: 24, value: 'o' },
{ keycode: 57, value: ' ' },
{ keycode: 17, value: 'w' },
{ keycode: 24, value: 'o' },
{ keycode: 19, value: 'r' },
{ keycode: 38, value: 'l' },
{ keycode: 32, value: 'd' }
];
let i = 0;
ioHook.on('keydown', (event) => {
expect(event).toEqual({
keycode: chars[i].keycode,
type: 'keydown',
shiftKey: false,
altKey: false,
ctrlKey: false,
metaKey: false
});
});
ioHook.on('keyup', (event) => {
expect(event).toEqual({
keycode: chars[i].keycode,
type: 'keydown',
shiftKey: false,
altKey: false,
ctrlKey: false,
metaKey: false
});
if (i === chars.length - 1) {
done();
}
i += 1;
});
ioHook.start();
setTimeout(() => { // Make sure ioHook starts before anything gets typed
for (const char of chars) {
robot.keyTap(char.value);
}
}, 50);
});
it('recognizes shift key being pressed', (done) => {
expect.assertions(8);
ioHook.on('keydown', (event) => {
expect(event).toEqual({
type: 'keydown',
shiftKey: true,
altKey: false,
ctrlKey: false,
metaKey: false
});
});
ioHook.on('keyup', (event) => {
expect(event).toEqual({
type: 'keydown',
shiftKey: true,
altKey: false,
ctrlKey: false,
metaKey: false
});
});
ioHook.start();
setTimeout(() => { // Make sure ioHook starts before anything gets typed
robot.keyToggle('shift', 'down');
robot.keyTap('1');
robot.keyToggle('shift', 'up');
}, 50);
});
it('recognizes alt key being pressed', (done) => {
expect.assertions(8);
ioHook.on('keydown', (event) => {
expect(event).toEqual({
type: 'keydown',
shiftKey: false,
altKey: true,
ctrlKey: false,
metaKey: false
});
});
ioHook.on('keyup', (event) => {
expect(event).toEqual({
type: 'keydown',
shiftKey: false,
altKey: true,
ctrlKey: false,
metaKey: false
});
});
ioHook.start();
setTimeout(() => { // Make sure ioHook starts before anything gets typed
robot.keyToggle('alt', 'down');
robot.keyTap('1');
robot.keyToggle('alt', 'up');
}, 50);
});
it('recognizes ctrl key being pressed', (done) => {
expect.assertions(8);
ioHook.on('keydown', (event) => {
expect(event).toEqual({
type: 'keydown',
shiftKey: false,
altKey: false,
ctrlKey: true,
metaKey: false
});
});
ioHook.on('keyup', (event) => {
expect(event).toEqual({
type: 'keydown',
shiftKey: false,
altKey: false,
ctrlKey: true,
metaKey: false
});
});
ioHook.start();
setTimeout(() => { // Make sure ioHook starts before anything gets typed
robot.keyToggle('control', 'down');
robot.keyTap('1');
robot.keyToggle('control', 'up');
}, 50);
});
it('recognizes meta key being pressed', (done) => {
expect.assertions(8);
ioHook.on('keydown', (event) => {
expect(event).toEqual({
type: 'keydown',
shiftKey: false,
altKey: false,
ctrlKey: false,
metaKey: true
});
});
ioHook.on('keyup', (event) => {
expect(event).toEqual({
type: 'keydown',
shiftKey: false,
altKey: false,
ctrlKey: false,
metaKey: true
});
});
ioHook.start();
setTimeout(() => { // Make sure ioHook starts before anything gets typed
robot.keyToggle('command', 'down');
robot.keyTap('1');
robot.keyToggle('command', 'up');
}, 50);
});
it('runs a callback when a shortcut has been released', (done) => {
expect.assertions(2);
let shortcut = [42, 30];
ioHook.registerShortcut(shortcut, keys => {
expect(shortcut.sort()).toEqual(keys.sort());
}, keys => {
expect(shortcut.sort()).toEqual(keys.sort());
});
setTimeout(() => { // Make sure ioHook starts before anything gets typed
robot.keyToggle('shift', 'down');
robot.keyTap('a');
robot.keyToggle('shift', 'up');
}, 50);
});
it('can unregister a shortcut via its keycodes', (done) => {
expect.assertions(0);
let shortcut = [42, 30];
// Register the shortcut
ioHook.registerShortcut(shortcut, (event) => {
// We're unregistering this shortcut. It should not have been called
expect.not.toHaveBeenCalled();
});
// Unregister the shortcut
ioHook.unregisterShortcutByKeys(shortcut);
ioHook.start();
setTimeout(() => { // Make sure ioHook starts before anything gets typed
robot.keyToggle('shift', 'down');
robot.keyTap('a');
robot.keyToggle('shift', 'up');
}, 50);
});
it('can use rawcode instead of keycode when detecting events', (done) => {
expect.assertions(1);
let rawCodeShortcut = [65505, 65]; // Shift + A in rawcode
ioHook.registerShortcut(rawCodeShortcut, (event) => {
expect.toHaveBeenCalled();
});
// Check rawcode detection works
ioHook.useRawcode(true);
ioHook.start();
setTimeout(() => { // Make sure ioHook starts before anything gets typed
robot.keyToggle('shift', 'down');
robot.keyTap('a');
robot.keyToggle('shift', 'up');
}, 50);
});
});