]>
git.proxmox.com Git - mirror_novnc.git/blob - tests/test.helper.js
1 // requires local modules: keysym, keysymdef, keyboard
3 var assert
= chai
.assert
;
4 var expect
= chai
.expect
;
6 describe('Helpers', function() {
8 describe('keysymFromKeyCode', function() {
9 it('should map known keycodes to keysyms', function() {
10 expect(KeyboardUtil
.keysymFromKeyCode(0x41, false), 'a').to
.be
.equal(0x61);
11 expect(KeyboardUtil
.keysymFromKeyCode(0x41, true), 'A').to
.be
.equal(0x41);
12 expect(KeyboardUtil
.keysymFromKeyCode(0xd, false), 'enter').to
.be
.equal(0xFF0D);
13 expect(KeyboardUtil
.keysymFromKeyCode(0x11, false), 'ctrl').to
.be
.equal(0xFFE3);
14 expect(KeyboardUtil
.keysymFromKeyCode(0x12, false), 'alt').to
.be
.equal(0xFFE9);
15 expect(KeyboardUtil
.keysymFromKeyCode(0xe1, false), 'altgr').to
.be
.equal(0xFE03);
16 expect(KeyboardUtil
.keysymFromKeyCode(0x1b, false), 'esc').to
.be
.equal(0xFF1B);
17 expect(KeyboardUtil
.keysymFromKeyCode(0x26, false), 'up').to
.be
.equal(0xFF52);
19 it('should return null for unknown keycodes', function() {
20 expect(KeyboardUtil
.keysymFromKeyCode(0xc0, false), 'DK æ').to
.be
.null;
21 expect(KeyboardUtil
.keysymFromKeyCode(0xde, false), 'DK ø').to
.be
.null;
25 describe('keysyms.fromUnicode', function() {
26 it('should map ASCII characters to keysyms', function() {
27 expect(keysyms
.fromUnicode('a'.charCodeAt())).to
.have
.property('keysym', 0x61);
28 expect(keysyms
.fromUnicode('A'.charCodeAt())).to
.have
.property('keysym', 0x41);
30 it('should map Latin-1 characters to keysyms', function() {
31 expect(keysyms
.fromUnicode('ø'.charCodeAt())).to
.have
.property('keysym', 0xf8);
33 expect(keysyms
.fromUnicode('é'.charCodeAt())).to
.have
.property('keysym', 0xe9);
35 it('should map characters that are in Windows-1252 but not in Latin-1 to keysyms', function() {
36 expect(keysyms
.fromUnicode('Š'.charCodeAt())).to
.have
.property('keysym', 0x01a9);
38 it('should map characters which aren\'t in Latin1 *or* Windows-1252 to keysyms', function() {
39 expect(keysyms
.fromUnicode('ŵ'.charCodeAt())).to
.have
.property('keysym', 0x1000175);
41 it('should return undefined for unknown codepoints', function() {
42 expect(keysyms
.fromUnicode('\n'.charCodeAt())).to
.be
.undefined;
43 expect(keysyms
.fromUnicode('\u1F686'.charCodeAt())).to
.be
.undefined;
47 describe('substituteCodepoint', function() {
48 it('should replace characters which don\'t have a keysym', function() {
49 expect(KeyboardUtil
.substituteCodepoint('Ș'.charCodeAt())).to
.equal('Ş'.charCodeAt());
50 expect(KeyboardUtil
.substituteCodepoint('ș'.charCodeAt())).to
.equal('ş'.charCodeAt());
51 expect(KeyboardUtil
.substituteCodepoint('Ț'.charCodeAt())).to
.equal('Ţ'.charCodeAt());
52 expect(KeyboardUtil
.substituteCodepoint('ț'.charCodeAt())).to
.equal('ţ'.charCodeAt());
54 it('should pass other characters through unchanged', function() {
55 expect(KeyboardUtil
.substituteCodepoint('T'.charCodeAt())).to
.equal('T'.charCodeAt());
59 describe('nonCharacterKey', function() {
60 it('should recognize the right keys', function() {
61 expect(KeyboardUtil
.nonCharacterKey({keyCode
: 0xd}), 'enter').to
.be
.defined
;
62 expect(KeyboardUtil
.nonCharacterKey({keyCode
: 0x08}), 'backspace').to
.be
.defined
;
63 expect(KeyboardUtil
.nonCharacterKey({keyCode
: 0x09}), 'tab').to
.be
.defined
;
64 expect(KeyboardUtil
.nonCharacterKey({keyCode
: 0x10}), 'shift').to
.be
.defined
;
65 expect(KeyboardUtil
.nonCharacterKey({keyCode
: 0x11}), 'ctrl').to
.be
.defined
;
66 expect(KeyboardUtil
.nonCharacterKey({keyCode
: 0x12}), 'alt').to
.be
.defined
;
67 expect(KeyboardUtil
.nonCharacterKey({keyCode
: 0xe0}), 'meta').to
.be
.defined
;
69 it('should not recognize character keys', function() {
70 expect(KeyboardUtil
.nonCharacterKey({keyCode
: 'A'}), 'A').to
.be
.null;
71 expect(KeyboardUtil
.nonCharacterKey({keyCode
: '1'}), '1').to
.be
.null;
72 expect(KeyboardUtil
.nonCharacterKey({keyCode
: '.'}), '.').to
.be
.null;
73 expect(KeyboardUtil
.nonCharacterKey({keyCode
: ' '}), 'space').to
.be
.null;
77 describe('getKeysym', function() {
78 it('should prefer char', function() {
79 expect(KeyboardUtil
.getKeysym({char : 'a', charCode
: 'Š'.charCodeAt(), keyCode
: 0x42, which
: 0x43})).to
.have
.property('keysym', 0x61);
81 it('should use charCode if no char', function() {
82 expect(KeyboardUtil
.getKeysym({char : '', charCode
: 'Š'.charCodeAt(), keyCode
: 0x42, which
: 0x43})).to
.have
.property('keysym', 0x01a9);
83 expect(KeyboardUtil
.getKeysym({charCode
: 'Š'.charCodeAt(), keyCode
: 0x42, which
: 0x43})).to
.have
.property('keysym', 0x01a9);
84 expect(KeyboardUtil
.getKeysym({char : 'hello', charCode
: 'Š'.charCodeAt(), keyCode
: 0x42, which
: 0x43})).to
.have
.property('keysym', 0x01a9);
86 it('should use keyCode if no charCode', function() {
87 expect(KeyboardUtil
.getKeysym({keyCode
: 0x42, which
: 0x43, shiftKey
: false})).to
.have
.property('keysym', 0x62);
88 expect(KeyboardUtil
.getKeysym({keyCode
: 0x42, which
: 0x43, shiftKey
: true})).to
.have
.property('keysym', 0x42);
90 it('should use which if no keyCode', function() {
91 expect(KeyboardUtil
.getKeysym({which
: 0x43, shiftKey
: false})).to
.have
.property('keysym', 0x63);
92 expect(KeyboardUtil
.getKeysym({which
: 0x43, shiftKey
: true})).to
.have
.property('keysym', 0x43);
94 it('should substitute where applicable', function() {
95 expect(KeyboardUtil
.getKeysym({char : 'Ș'})).to
.have
.property('keysym', 0x1aa);
99 describe('Modifier Sync', function() { // return a list of fake events necessary to fix modifier state
100 describe('Toggle all modifiers', function() {
101 var sync
= KeyboardUtil
.ModifierSync();
102 it ('should do nothing if all modifiers are up as expected', function() {
103 expect(sync
.keydown({
110 ).to
.have
.lengthOf(0);
112 it ('should synthesize events if all keys are unexpectedly down', function() {
113 var result
= sync
.keydown({
121 expect(result
).to
.have
.lengthOf(5);
123 for (var i
= 0; i
< result
.length
; ++i
) {
124 keysyms
[result
[i
].keysym
] = (result
[i
].type
== 'keydown');
126 expect(keysyms
[0xffe3]);
127 expect(keysyms
[0xffe9]);
128 expect(keysyms
[0xfe03]);
129 expect(keysyms
[0xffe1]);
130 expect(keysyms
[0xffe7]);
132 it ('should do nothing if all modifiers are down as expected', function() {
133 expect(sync
.keydown({
140 })).to
.have
.lengthOf(0);
143 describe('Toggle Ctrl', function() {
144 var sync
= KeyboardUtil
.ModifierSync();
145 it('should sync if modifier is suddenly down', function() {
146 expect(sync
.keydown({
149 })).to
.be
.deep
.equal([{keysym
: keysyms
.lookup(0xffe3), type
: 'keydown'}]);
151 it('should sync if modifier is suddenly up', function() {
152 expect(sync
.keydown({
155 })).to
.be
.deep
.equal([{keysym
: keysyms
.lookup(0xffe3), type
: 'keyup'}]);
158 describe('Toggle Alt', function() {
159 var sync
= KeyboardUtil
.ModifierSync();
160 it('should sync if modifier is suddenly down', function() {
161 expect(sync
.keydown({
164 })).to
.be
.deep
.equal([{keysym
: keysyms
.lookup(0xffe9), type
: 'keydown'}]);
166 it('should sync if modifier is suddenly up', function() {
167 expect(sync
.keydown({
170 })).to
.be
.deep
.equal([{keysym
: keysyms
.lookup(0xffe9), type
: 'keyup'}]);
173 describe('Toggle AltGr', function() {
174 var sync
= KeyboardUtil
.ModifierSync();
175 it('should sync if modifier is suddenly down', function() {
176 expect(sync
.keydown({
179 })).to
.be
.deep
.equal([{keysym
: keysyms
.lookup(0xfe03), type
: 'keydown'}]);
181 it('should sync if modifier is suddenly up', function() {
182 expect(sync
.keydown({
185 })).to
.be
.deep
.equal([{keysym
: keysyms
.lookup(0xfe03), type
: 'keyup'}]);
188 describe('Toggle Shift', function() {
189 var sync
= KeyboardUtil
.ModifierSync();
190 it('should sync if modifier is suddenly down', function() {
191 expect(sync
.keydown({
194 })).to
.be
.deep
.equal([{keysym
: keysyms
.lookup(0xffe1), type
: 'keydown'}]);
196 it('should sync if modifier is suddenly up', function() {
197 expect(sync
.keydown({
200 })).to
.be
.deep
.equal([{keysym
: keysyms
.lookup(0xffe1), type
: 'keyup'}]);
203 describe('Toggle Meta', function() {
204 var sync
= KeyboardUtil
.ModifierSync();
205 it('should sync if modifier is suddenly down', function() {
206 expect(sync
.keydown({
209 })).to
.be
.deep
.equal([{keysym
: keysyms
.lookup(0xffe7), type
: 'keydown'}]);
211 it('should sync if modifier is suddenly up', function() {
212 expect(sync
.keydown({
215 })).to
.be
.deep
.equal([{keysym
: keysyms
.lookup(0xffe7), type
: 'keyup'}]);
218 describe('Modifier keyevents', function() {
219 it('should not sync a modifier on its own events', function() {
220 expect(KeyboardUtil
.ModifierSync().keydown({
223 })).to
.be
.deep
.equal([]);
224 expect(KeyboardUtil
.ModifierSync().keydown({
227 }), 'B').to
.be
.deep
.equal([]);
229 it('should update state on modifier keyevents', function() {
230 var sync
= KeyboardUtil
.ModifierSync();
234 expect(sync
.keydown({
237 })).to
.be
.deep
.equal([]);
239 it('should sync other modifiers on ctrl events', function() {
240 expect(KeyboardUtil
.ModifierSync().keydown({
243 })).to
.be
.deep
.equal([{keysym
: keysyms
.lookup(0xffe9), type
: 'keydown'}]);
246 describe('sync modifiers on non-key events', function() {
247 it('should generate sync events when receiving non-keyboard events', function() {
248 expect(KeyboardUtil
.ModifierSync().syncAny({
250 })).to
.be
.deep
.equal([{keysym
: keysyms
.lookup(0xffe9), type
: 'keydown'}]);
253 describe('do not treat shift as a modifier key', function() {
254 it('should not treat shift as a shortcut modifier', function() {
255 expect(KeyboardUtil
.hasShortcutModifier([], {0xffe1 : true})).to
.be
.false;
257 it('should not treat shift as a char modifier', function() {
258 expect(KeyboardUtil
.hasCharModifier([], {0xffe1 : true})).to
.be
.false;