-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathkeymap.test.html
More file actions
98 lines (93 loc) · 6.39 KB
/
keymap.test.html
File metadata and controls
98 lines (93 loc) · 6.39 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>keymap Testing</title>
<link rel="stylesheet" href="https://code.jquery.com/qunit/qunit-2.19.4.css">
</head>
<body>
<div id="qunit"></div>
<div id="qunit-fixture" contenteditable></div>
<script src="https://code.jquery.com/qunit/qunit-2.19.4.js"></script>
<script src=keymap.js></script>
<script>
QUnit.test('normalize', assert => {
const keys = 'ArrowDown ArrowLeft ArrowRight ArrowUp Backspace CapsLock Delete End Enter Escape Home Insert NumLock PageDown PageUp Pause ScrollLock Tab';
assert.equal(keymap.normalize(keys.toLowerCase()), keys, 'lower case keys are normalized');
assert.equal(keymap.normalize(keys.toUpperCase()), keys, 'UPPER CASE keys are normalized');
assert.equal(keymap.normalize('Down Left Right Up BS CapsLock Del End Return Esc Home Ins NumLock PGDN PGUP Break ScrollLock Tab'), keys, 'alternate forms are normalized');
assert.equal(keymap.normalize('c-a ctrl-a c+a ctrl+a ^a'), 'ctrl-a ctrl-a ctrl-a ctrl-a ctrl-a', 'control forms are normalized');
assert.equal(keymap.normalize('c-^ ctrl-+ c+% ctrl+- ^^'), 'ctrl-^ ctrl-+ ctrl-% ctrl-- ctrl-^', 'control special characters are normalized');
assert.equal(keymap.normalize('a-a alt-a a+a alt+a %a'), 'alt-a alt-a alt-a alt-a alt-a', 'alt forms are normalized');
assert.equal(keymap.normalize('s-a shift-a s+a shift+a +a'), 'A A A A A', 'shifted letters are normalized');
assert.equal(keymap.normalize('s-+ shift-+ s++ shift++ ++'), 'shift-+ shift-+ shift-+ shift-+ shift-+', 'shifted pluses are normalized');
assert.equal(keymap.normalize('s-* shift-/ s+- shift+[ +]'), 'shift-* shift-/ shift-- shift-[ shift-]', 'shifted other characters are normalized');
assert.equal(keymap.normalize('+%esc +^%enter'), 'alt-shift-Escape ctrl-alt-shift-Enter', 'modifier keys are ordered and shifted names keys retain the shift');
assert.equal(keymap.normalize('+%esc +^%esc esc'), 'alt-shift-Escape ctrl-alt-shift-Escape Escape', 'global replace key names');
assert.equal(keymap.normalize(' +%spacebar +^% '), 'alt-shift-Space ctrl-shift-%', 'Space is normalized and extra spaces are ignored');
assert.equal(keymap.normalize('^{a} <^b> +{a} <c-b> {}}'), 'ctrl-a ctrl-b A ctrl-b }', 'angle brackets and braces are normalized');
assert.equal(keymap.normalize('{up} {up} {down} {down}'), 'ArrowUp ArrowUp ArrowDown ArrowDown', 'repeated braces are normalized');
});
function syntheticKeyevents(key, code, shiftKey, ctrlKey, altKey){
return ['keydown','keyup'].map( type => keymap.addKeyDescriptor(new KeyboardEvent(type, {key, code, shiftKey, ctrlKey, altKey})) );
}
QUnit.test('addKeyDescriptor', assert => {
let keys = syntheticKeyevents('a', 'KeyA', false, false, false).map( evt => evt.keyDescriptor );
assert.deepEqual(keys, ['a', 'a'], 'a');
keys = syntheticKeyevents('A', 'KeyA', true, false, false).map( evt => evt.keyDescriptor );
assert.deepEqual(keys, ['A', 'A'], 'A');
keys = syntheticKeyevents('א', 'KeyA', false, true, false).map( evt => evt.keyDescriptor );
assert.deepEqual(keys, ['ctrl-a', 'ctrl-a'], 'ctrl-A');
keys = syntheticKeyevents('א', 'KeyA', true, true, true).map( evt => evt.keyDescriptor );
assert.deepEqual(keys, ['ctrl-alt-A', 'ctrl-alt-A'], 'ctrl-alt-A');
keys = syntheticKeyevents('\n', 'Enter', true, true, true).map( evt => evt.keyDescriptor );
assert.deepEqual(keys, ['ctrl-alt-shift-Enter', 'ctrl-alt-shift-Enter'], 'ctrl-alt-shift-Enter');
});
QUnit.test('keymap', assert => {
assert.expect(9);
const div = document.getElementById('qunit-fixture');
const handler = keymap('a B ^c %d', evt => assert.ok(true, `'a b ^c %d' triggered`));
assert.equal(handler.keymapFilter, 'a B ^c %d', 'keymapFilter set on handler');
div.addEventListener('keydown', handler);
div.dispatchEvent(syntheticKeyevents('a', 'KeyA', false, false, false)[0]); // dispatch is synchronous
div.dispatchEvent(syntheticKeyevents('B', 'KeyB', true, false, false)[0]);
div.dispatchEvent(syntheticKeyevents('c', 'KeyC', false, true, false)[0]);
div.dispatchEvent(syntheticKeyevents('d', 'KeyD', false, false, true)[0]);
// do it again
div.dispatchEvent(syntheticKeyevents('q', 'KeyQ', false, false, false)[0]);
div.dispatchEvent(syntheticKeyevents('a', 'KeyA', false, false, false)[0]);
div.dispatchEvent(syntheticKeyevents('B', 'KeyB', true, false, false)[0]);
div.dispatchEvent(syntheticKeyevents('c', 'KeyC', false, true, false)[0]);
div.dispatchEvent(syntheticKeyevents('d', 'KeyD', false, false, true)[0]);
// wrong sequence
div.dispatchEvent(syntheticKeyevents('a', 'KeyA', false, false, false)[0]);
div.dispatchEvent(syntheticKeyevents('b', 'KeyB', false, false, false)[0]);
div.dispatchEvent(syntheticKeyevents('c', 'KeyC', false, true, false)[0]);
div.dispatchEvent(syntheticKeyevents('d', 'KeyD', false, false, true)[0]);
//remove listener
div.removeEventListener('keydown', handler);
div.dispatchEvent(syntheticKeyevents('a', 'KeyA', false, false, false)[0]);
div.dispatchEvent(syntheticKeyevents('B', 'KeyB', true, false, false)[0]);
div.dispatchEvent(syntheticKeyevents('c', 'KeyC', false, true, false)[0]);
div.dispatchEvent(syntheticKeyevents('d', 'KeyD', false, false, true)[0]);
// prefixes
const handler2 = keymap('esc space enter', evt => assert.ok(true, `'Escape Spacebar Enter' triggered`), evt => assert.ok(true, `prefix '${evt.keymapSequence}' triggered`));
div.addEventListener('keydown', handler2);
div.dispatchEvent(syntheticKeyevents('Escape', 'Escape', false, false, false)[0]);
div.dispatchEvent(syntheticKeyevents(' ', 'Spacebar', false, false, false)[0]);
div.dispatchEvent(syntheticKeyevents('Enter', 'enter', false, false, false)[0]);
// currentSequence should be attached in the final handler
div.removeEventListener('keydown', handler2);
const handler3 = keymap('esc space enter', evt => assert.equal(evt.keymapSequence, 'Escape Space Enter', '.keymapSequence set'));
div.addEventListener('keydown', handler3);
div.dispatchEvent(syntheticKeyevents('Escape', 'Escape', false, false, false)[0]);
div.dispatchEvent(syntheticKeyevents(' ', 'Spacebar', false, false, false)[0]);
div.dispatchEvent(syntheticKeyevents('Enter', 'enter', false, false, false)[0]);
const handler4 = keymap(/[A-Z] [0-9]/, evt => assert.ok(evt.keymapFilter.exec(evt.keymapSequence), 'keymapFilter matches sequence'));
div.addEventListener('keydown', handler4);
div.dispatchEvent(syntheticKeyevents('A', 'KeyA', true, false, false)[0]);
div.dispatchEvent(syntheticKeyevents('1', 'Digit1', false, false, false)[0]);
});
</script>
</body>
</html>