forked from PencilCode/jquery-turtle
-
Notifications
You must be signed in to change notification settings - Fork 4
Expand file tree
/
Copy pathpressed.html
More file actions
128 lines (125 loc) · 4.03 KB
/
pressed.html
File metadata and controls
128 lines (125 loc) · 4.03 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
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
<script src="lib/qunit.js"></script>
<link href="lib/qunit.css" rel="stylesheet">
<script src="lib/jquery.js"></script>
<script src="../jquery-turtle.js"></script>
<body>
<div id="qunit"></div>
<script>
eval($.turtle());
module("Pressed api test.");
function triggerKey(name, n) {
var code = (typeof n == 'string') ? n.charCodeAt(0) : n;
var keyboardEvent = document.createEvent("KeyboardEvent");
var initMethod = typeof keyboardEvent.initKeyboardEvent !==
'undefined' ? "initKeyboardEvent" : "initKeyEvent";
keyboardEvent[initMethod](
name,
true, // bubbles
true, // cancelable
window, // viewArg: should be window
false, // ctrlKeyArg
false, // altKeyArg
false, // shiftKeyArg
false, // metaKeyArg
code, // keyCodeArg : unsigned long the virtual key code, else 0
0 // charCodeArgs : unsigned long the Unicode character
);
if (keyboardEvent.which != code) {
// For testing, the library respects the below
keyboardEvent.whichSynth = code;
}
window.dispatchEvent(keyboardEvent);
}
asyncTest("Simulates a keypresses for event handlers.", function() {
var trace = '';
keydown('A', function() { trace += 'A'; });
keydown('a', function() { trace += 'a'; });
keydown(function(e) { trace += ':' + e.key; });
triggerKey('keydown', 'B');
equal(trace, ':b');
trace = '';
triggerKey('keydown', 27);
equal(trace, ':escape');
trace = '';
triggerKey('keydown', 'A');
equal(trace, 'Aa:a');
trace = '';
start();
pressed.enable(true);
});
asyncTest("Simulates a few keypress events and polls press.", function() {
// Single key press
equal(0, pressed.list().length);
ok(!pressed('a'));
triggerKey('keydown', 'A')
ok(pressed('a')); // Lowercase works
ok(pressed('A')); // Uppercase also works
equal(1, pressed.list().length);
equal(pressed.list()[0], 'a');
triggerKey('keyup', 'A')
equal(0, pressed.list().length);
ok(!pressed('a'));
ok(!pressed('A'));
// Alt-right key press should also press 'alt'
triggerKey('keydown', 165);
ok(pressed('alt')); // Lowercase works
ok(pressed('ALT')); // Uppercase also works
ok(pressed('altright')); // Lowercase works
ok(pressed('AltRight')); // Uppercase also works
ok(!pressed('alt left')); // 165 is not alt-left
equal(2, pressed.list().length);
ok(pressed.list().indexOf('altright') >= 0);
ok(pressed.list().indexOf('alt') >= 0);
triggerKey('keyup', 165)
equal(0, pressed.list().length);
ok(!pressed('altright'));
ok(!pressed('alt'));
ok(!pressed('altleft'));
// Test chording: shift, backslash, f1
triggerKey('keydown', 16)
triggerKey('keydown', 220)
triggerKey('keydown', 112)
ok(pressed('shift'));
ok(pressed('f1'));
ok(pressed('\\'));
equal(pressed.list().length, 3);
equal(pressed.list().join(','), 'shift,\\,f1');
ok(!pressed('z'));
triggerKey('keydown', 'Z');
ok(pressed('z'));
ok(pressed('shift'));
ok(pressed('f1'));
ok(pressed('\\'));
equal(pressed.list().length, 4);
equal(pressed.list().join(','), 'shift,\\,f1,z');
triggerKey('keyup', 112)
ok(pressed('z'));
ok(pressed('shift'));
ok(pressed('\\'));
equal(pressed.list().length, 3);
equal(pressed.list().join(','), 'shift,\\,z');
// Verify that the last key pressed is always last in the list.
triggerKey('keydown', 112)
equal(pressed.list().length, 4);
equal(pressed.list().join(','), 'shift,\\,z,f1');
// Now trigger one type of blur event, and expect keys to reset.
var b = document.createEvent('Event');
b.initEvent('blur', true, true);
window.dispatchEvent(b);
equal(pressed.list().length, 0);
ok(!pressed('z'));
ok(!pressed('shift'));
ok(!pressed('f1'));
ok(!pressed('\\'));
// Now preventDefault on the contextmenu event and try again: no reset.
window.addEventListener('contextmenu', function(e) { e.preventDefault(); });
triggerKey('keydown', '5');
ok(pressed('5'));
var c = document.createEvent('Event');
c.initEvent('contextmenu', true, true);
document.body.dispatchEvent(c);
equal(pressed.list().length, 1);
ok(pressed('5'));
start();
});
</script>