]>
git.proxmox.com Git - mirror_xterm.js.git/blob - test/test.js
1 var assert
= require('chai').assert
;
2 var expect
= require('chai').expect
;
3 var Terminal
= require('../src/xterm');
5 describe('xterm.js', function() {
8 beforeEach(function () {
9 xterm
= new Terminal();
10 xterm
.refresh = function(){};
12 syncScrollArea: function(){}
16 describe('getOption', function() {
17 it('should retrieve the option correctly', function() {
18 // In the `options` namespace.
19 xterm
.options
.cursorBlink
= true;
20 assert
.equal(xterm
.getOption('cursorBlink'), true);
22 // On the Terminal instance
23 delete xterm
.options
.cursorBlink
;
24 xterm
.cursorBlink
= false;
25 assert
.equal(xterm
.getOption('cursorBlink'), false);
27 it('should throw when retrieving a non-existant option', function() {
28 assert
.throws(xterm
.getOption
.bind(xterm
, 'fake', true));
32 describe('setOption', function() {
33 it('should set the option correctly', function() {
34 xterm
.setOption('cursorBlink', true);
35 assert
.equal(xterm
.cursorBlink
, true);
36 assert
.equal(xterm
.options
.cursorBlink
, true);
37 xterm
.setOption('cursorBlink', false);
38 assert
.equal(xterm
.cursorBlink
, false);
39 assert
.equal(xterm
.options
.cursorBlink
, false);
41 it('should throw when setting a non-existant option', function() {
42 assert
.throws(xterm
.setOption
.bind(xterm
, 'fake', true));
46 describe('clear', function() {
47 it('should clear a buffer equal to rows', function() {
48 var promptLine
= xterm
.lines
[xterm
.ybase
+ xterm
.y
];
50 assert
.equal(xterm
.y
, 0);
51 assert
.equal(xterm
.ybase
, 0);
52 assert
.equal(xterm
.ydisp
, 0);
53 assert
.equal(xterm
.lines
.length
, xterm
.rows
);
54 assert
.deepEqual(xterm
.lines
[0], promptLine
);
55 for (var i
= 1; i
< xterm
.rows
; i
++) {
56 assert
.deepEqual(xterm
.lines
[0], xterm
.blankLine());
59 it('should clear a buffer larger than rows', function() {
60 // Fill the buffer with dummy rows
61 for (var i
= 0; i
< xterm
.rows
* 2; i
++) {
62 xterm
.write('test\n');
65 var promptLine
= xterm
.lines
[xterm
.ybase
+ xterm
.y
];
67 assert
.equal(xterm
.y
, 0);
68 assert
.equal(xterm
.ybase
, 0);
69 assert
.equal(xterm
.ydisp
, 0);
70 assert
.equal(xterm
.lines
.length
, xterm
.rows
);
71 assert
.deepEqual(xterm
.lines
[0], promptLine
);
72 for (var i
= 1; i
< xterm
.rows
; i
++) {
73 assert
.deepEqual(xterm
.lines
[i
], xterm
.blankLine());
76 it('should not break the prompt when cleared twice', function() {
77 var promptLine
= xterm
.lines
[xterm
.ybase
+ xterm
.y
];
80 assert
.equal(xterm
.y
, 0);
81 assert
.equal(xterm
.ybase
, 0);
82 assert
.equal(xterm
.ydisp
, 0);
83 assert
.equal(xterm
.lines
.length
, xterm
.rows
);
84 assert
.deepEqual(xterm
.lines
[0], promptLine
);
85 for (var i
= 1; i
< xterm
.rows
; i
++) {
86 assert
.deepEqual(xterm
.lines
[i
], xterm
.blankLine());
91 describe('scroll', function() {
92 describe('scrollDisp', function() {
94 beforeEach(function() {
95 for (var i
= 0; i
< xterm
.rows
* 2; i
++) {
96 xterm
.writeln('test');
98 startYDisp
= xterm
.rows
+ 1;
100 it('should scroll a single line', function() {
101 assert
.equal(xterm
.ydisp
, startYDisp
);
102 xterm
.scrollDisp(-1);
103 assert
.equal(xterm
.ydisp
, startYDisp
- 1);
105 assert
.equal(xterm
.ydisp
, startYDisp
);
107 it('should scroll multiple lines', function() {
108 assert
.equal(xterm
.ydisp
, startYDisp
);
109 xterm
.scrollDisp(-5);
110 assert
.equal(xterm
.ydisp
, startYDisp
- 5);
112 assert
.equal(xterm
.ydisp
, startYDisp
);
114 it('should not scroll beyond the bounds of the buffer', function() {
115 assert
.equal(xterm
.ydisp
, startYDisp
);
117 assert
.equal(xterm
.ydisp
, startYDisp
);
118 for (var i
= 0; i
< startYDisp
; i
++) {
119 xterm
.scrollDisp(-1);
121 assert
.equal(xterm
.ydisp
, 0);
122 xterm
.scrollDisp(-1);
123 assert
.equal(xterm
.ydisp
, 0);
127 describe('scrollPages', function() {
129 beforeEach(function() {
130 for (var i
= 0; i
< xterm
.rows
* 3; i
++) {
131 xterm
.writeln('test');
133 startYDisp
= (xterm
.rows
* 2) + 1;
135 it('should scroll a single page', function() {
136 assert
.equal(xterm
.ydisp
, startYDisp
);
137 xterm
.scrollPages(-1);
138 assert
.equal(xterm
.ydisp
, startYDisp
- (xterm
.rows
- 1));
139 xterm
.scrollPages(1);
140 assert
.equal(xterm
.ydisp
, startYDisp
);
142 it('should scroll a multiple pages', function() {
143 assert
.equal(xterm
.ydisp
, startYDisp
);
144 xterm
.scrollPages(-2);
145 assert
.equal(xterm
.ydisp
, startYDisp
- (xterm
.rows
- 1) * 2);
146 xterm
.scrollPages(2);
147 assert
.equal(xterm
.ydisp
, startYDisp
);
151 describe('scrollToTop', function() {
152 beforeEach(function() {
153 for (var i
= 0; i
< xterm
.rows
* 3; i
++) {
154 xterm
.writeln('test');
157 it('should scroll to the top', function() {
158 assert
.notEqual(xterm
.ydisp
, 0);
160 assert
.equal(xterm
.ydisp
, 0);
164 describe('scrollToBottom', function() {
166 beforeEach(function() {
167 for (var i
= 0; i
< xterm
.rows
* 3; i
++) {
168 xterm
.writeln('test');
170 startYDisp
= (xterm
.rows
* 2) + 1;
172 it('should scroll to the bottom', function() {
173 xterm
.scrollDisp(-1);
174 xterm
.scrollToBottom();
175 assert
.equal(xterm
.ydisp
, startYDisp
);
176 xterm
.scrollPages(-1);
177 xterm
.scrollToBottom();
178 assert
.equal(xterm
.ydisp
, startYDisp
);
180 xterm
.scrollToBottom();
181 assert
.equal(xterm
.ydisp
, startYDisp
);
185 describe('keyDown', function () {
186 it('should scroll down, when a key is pressed and terminal is scrolled up', function () {
187 var terminal
= new Terminal();
189 // Do not process the keyDown event, to avoid side-effects
190 terminal
.attachCustomKeydownHandler(function () {
199 // Ensure that now the terminal is scrolled to bottom
200 assert
.equal(terminal
.ydisp
, terminal
.ybase
);
205 describe('evaluateKeyEscapeSequence', function() {
206 it('should return the correct escape sequence for unmodified keys', function() {
208 assert
.equal(xterm
.evaluateKeyEscapeSequence({ keyCode
: 8 }).key
, '\x7f'); // ^?
210 assert
.equal(xterm
.evaluateKeyEscapeSequence({ keyCode
: 9 }).key
, '\t');
212 assert
.equal(xterm
.evaluateKeyEscapeSequence({ keyCode
: 13 }).key
, '\r'); // CR
214 assert
.equal(xterm
.evaluateKeyEscapeSequence({ keyCode
: 27 }).key
, '\x1b');
215 // Page up, page down
216 assert
.equal(xterm
.evaluateKeyEscapeSequence({ keyCode
: 33 }).key
, '\x1b[5~'); // CSI 5 ~
217 assert
.equal(xterm
.evaluateKeyEscapeSequence({ keyCode
: 34 }).key
, '\x1b[6~'); // CSI 6 ~
219 assert
.equal(xterm
.evaluateKeyEscapeSequence({ keyCode
: 35 }).key
, '\x1b[F'); // SS3 F
220 assert
.equal(xterm
.evaluateKeyEscapeSequence({ keyCode
: 36 }).key
, '\x1b[H'); // SS3 H
221 // Left, up, right, down arrows
222 assert
.equal(xterm
.evaluateKeyEscapeSequence({ keyCode
: 37 }).key
, '\x1b[D'); // CSI D
223 assert
.equal(xterm
.evaluateKeyEscapeSequence({ keyCode
: 38 }).key
, '\x1b[A'); // CSI A
224 assert
.equal(xterm
.evaluateKeyEscapeSequence({ keyCode
: 39 }).key
, '\x1b[C'); // CSI C
225 assert
.equal(xterm
.evaluateKeyEscapeSequence({ keyCode
: 40 }).key
, '\x1b[B'); // CSI B
227 assert
.equal(xterm
.evaluateKeyEscapeSequence({ keyCode
: 45 }).key
, '\x1b[2~'); // CSI 2 ~
229 assert
.equal(xterm
.evaluateKeyEscapeSequence({ keyCode
: 46 }).key
, '\x1b[3~'); // CSI 3 ~
231 assert
.equal(xterm
.evaluateKeyEscapeSequence({ keyCode
: 112 }).key
, '\x1bOP'); // SS3 P
232 assert
.equal(xterm
.evaluateKeyEscapeSequence({ keyCode
: 113 }).key
, '\x1bOQ'); // SS3 Q
233 assert
.equal(xterm
.evaluateKeyEscapeSequence({ keyCode
: 114 }).key
, '\x1bOR'); // SS3 R
234 assert
.equal(xterm
.evaluateKeyEscapeSequence({ keyCode
: 115 }).key
, '\x1bOS'); // SS3 S
235 assert
.equal(xterm
.evaluateKeyEscapeSequence({ keyCode
: 116 }).key
, '\x1b[15~'); // CSI 1 5 ~
236 assert
.equal(xterm
.evaluateKeyEscapeSequence({ keyCode
: 117 }).key
, '\x1b[17~'); // CSI 1 7 ~
237 assert
.equal(xterm
.evaluateKeyEscapeSequence({ keyCode
: 118 }).key
, '\x1b[18~'); // CSI 1 8 ~
238 assert
.equal(xterm
.evaluateKeyEscapeSequence({ keyCode
: 119 }).key
, '\x1b[19~'); // CSI 1 9 ~
239 assert
.equal(xterm
.evaluateKeyEscapeSequence({ keyCode
: 120 }).key
, '\x1b[20~'); // CSI 2 0 ~
240 assert
.equal(xterm
.evaluateKeyEscapeSequence({ keyCode
: 121 }).key
, '\x1b[21~'); // CSI 2 1 ~
241 assert
.equal(xterm
.evaluateKeyEscapeSequence({ keyCode
: 122 }).key
, '\x1b[23~'); // CSI 2 3 ~
242 assert
.equal(xterm
.evaluateKeyEscapeSequence({ keyCode
: 123 }).key
, '\x1b[24~'); // CSI 2 4 ~
244 it('should return \\x1b[3;5~ for ctrl+delete', function() {
245 assert
.equal(xterm
.evaluateKeyEscapeSequence({ ctrlKey
: true, keyCode
: 46 }).key
, '\x1b[3;5~');
247 it('should return \\x1b[3;2~ for shift+delete', function() {
248 assert
.equal(xterm
.evaluateKeyEscapeSequence({ shiftKey
: true, keyCode
: 46 }).key
, '\x1b[3;2~');
250 it('should return \\x1b[3;3~ for alt+delete', function() {
251 assert
.equal(xterm
.evaluateKeyEscapeSequence({ altKey
: true, keyCode
: 46 }).key
, '\x1b[3;3~');
253 it('should return \\x1b[5D for ctrl+left', function() {
254 assert
.equal(xterm
.evaluateKeyEscapeSequence({ ctrlKey
: true, keyCode
: 37 }).key
, '\x1b[1;5D'); // CSI 5 D
256 it('should return \\x1b[5C for ctrl+right', function() {
257 assert
.equal(xterm
.evaluateKeyEscapeSequence({ ctrlKey
: true, keyCode
: 39 }).key
, '\x1b[1;5C'); // CSI 5 C
259 it('should return \\x1b[5A for ctrl+up', function() {
260 assert
.equal(xterm
.evaluateKeyEscapeSequence({ ctrlKey
: true, keyCode
: 38 }).key
, '\x1b[1;5A'); // CSI 5 A
262 it('should return \\x1b[5B for ctrl+down', function() {
263 assert
.equal(xterm
.evaluateKeyEscapeSequence({ ctrlKey
: true, keyCode
: 40 }).key
, '\x1b[1;5B'); // CSI 5 B
265 // Evalueate alt + arrow key movement, which is a feature of terminal emulators but not VT100
266 // http://unix.stackexchange.com/a/108106
267 it('should return \\x1b[5D for alt+left', function() {
268 assert
.equal(xterm
.evaluateKeyEscapeSequence({ altKey
: true, keyCode
: 37 }).key
, '\x1b[1;5D'); // CSI 5 D
270 it('should return \\x1b[5C for alt+right', function() {
271 assert
.equal(xterm
.evaluateKeyEscapeSequence({ altKey
: true, keyCode
: 39 }).key
, '\x1b[1;5C'); // CSI 5 C
273 it('should return \\x1b[5A for alt+up', function() {
274 assert
.equal(xterm
.evaluateKeyEscapeSequence({ altKey
: true, keyCode
: 38 }).key
, '\x1b[1;5A'); // CSI 5 A
276 it('should return \\x1b[5B for alt+down', function() {
277 assert
.equal(xterm
.evaluateKeyEscapeSequence({ altKey
: true, keyCode
: 40 }).key
, '\x1b[1;5B'); // CSI 5 B
279 it('should return the correct escape sequence for modified F1-F12 keys', function() {
280 assert
.equal(xterm
.evaluateKeyEscapeSequence({ shiftKey
: true, keyCode
: 112 }).key
, '\x1b[1;2P');
281 assert
.equal(xterm
.evaluateKeyEscapeSequence({ shiftKey
: true, keyCode
: 113 }).key
, '\x1b[1;2Q');
282 assert
.equal(xterm
.evaluateKeyEscapeSequence({ shiftKey
: true, keyCode
: 114 }).key
, '\x1b[1;2R');
283 assert
.equal(xterm
.evaluateKeyEscapeSequence({ shiftKey
: true, keyCode
: 115 }).key
, '\x1b[1;2S');
284 assert
.equal(xterm
.evaluateKeyEscapeSequence({ shiftKey
: true, keyCode
: 116 }).key
, '\x1b[15;2~');
285 assert
.equal(xterm
.evaluateKeyEscapeSequence({ shiftKey
: true, keyCode
: 117 }).key
, '\x1b[17;2~');
286 assert
.equal(xterm
.evaluateKeyEscapeSequence({ shiftKey
: true, keyCode
: 118 }).key
, '\x1b[18;2~');
287 assert
.equal(xterm
.evaluateKeyEscapeSequence({ shiftKey
: true, keyCode
: 119 }).key
, '\x1b[19;2~');
288 assert
.equal(xterm
.evaluateKeyEscapeSequence({ shiftKey
: true, keyCode
: 120 }).key
, '\x1b[20;2~');
289 assert
.equal(xterm
.evaluateKeyEscapeSequence({ shiftKey
: true, keyCode
: 121 }).key
, '\x1b[21;2~');
290 assert
.equal(xterm
.evaluateKeyEscapeSequence({ shiftKey
: true, keyCode
: 122 }).key
, '\x1b[23;2~');
291 assert
.equal(xterm
.evaluateKeyEscapeSequence({ shiftKey
: true, keyCode
: 123 }).key
, '\x1b[24;2~');
292 assert
.equal(xterm
.evaluateKeyEscapeSequence({ altKey
: true, keyCode
: 112 }).key
, '\x1b[1;3P');
293 assert
.equal(xterm
.evaluateKeyEscapeSequence({ altKey
: true, keyCode
: 113 }).key
, '\x1b[1;3Q');
294 assert
.equal(xterm
.evaluateKeyEscapeSequence({ altKey
: true, keyCode
: 114 }).key
, '\x1b[1;3R');
295 assert
.equal(xterm
.evaluateKeyEscapeSequence({ altKey
: true, keyCode
: 115 }).key
, '\x1b[1;3S');
296 assert
.equal(xterm
.evaluateKeyEscapeSequence({ altKey
: true, keyCode
: 116 }).key
, '\x1b[15;3~');
297 assert
.equal(xterm
.evaluateKeyEscapeSequence({ altKey
: true, keyCode
: 117 }).key
, '\x1b[17;3~');
298 assert
.equal(xterm
.evaluateKeyEscapeSequence({ altKey
: true, keyCode
: 118 }).key
, '\x1b[18;3~');
299 assert
.equal(xterm
.evaluateKeyEscapeSequence({ altKey
: true, keyCode
: 119 }).key
, '\x1b[19;3~');
300 assert
.equal(xterm
.evaluateKeyEscapeSequence({ altKey
: true, keyCode
: 120 }).key
, '\x1b[20;3~');
301 assert
.equal(xterm
.evaluateKeyEscapeSequence({ altKey
: true, keyCode
: 121 }).key
, '\x1b[21;3~');
302 assert
.equal(xterm
.evaluateKeyEscapeSequence({ altKey
: true, keyCode
: 122 }).key
, '\x1b[23;3~');
303 assert
.equal(xterm
.evaluateKeyEscapeSequence({ altKey
: true, keyCode
: 123 }).key
, '\x1b[24;3~');
305 assert
.equal(xterm
.evaluateKeyEscapeSequence({ ctrlKey
: true, keyCode
: 112 }).key
, '\x1b[1;5P');
306 assert
.equal(xterm
.evaluateKeyEscapeSequence({ ctrlKey
: true, keyCode
: 113 }).key
, '\x1b[1;5Q');
307 assert
.equal(xterm
.evaluateKeyEscapeSequence({ ctrlKey
: true, keyCode
: 114 }).key
, '\x1b[1;5R');
308 assert
.equal(xterm
.evaluateKeyEscapeSequence({ ctrlKey
: true, keyCode
: 115 }).key
, '\x1b[1;5S');
309 assert
.equal(xterm
.evaluateKeyEscapeSequence({ ctrlKey
: true, keyCode
: 116 }).key
, '\x1b[15;5~');
310 assert
.equal(xterm
.evaluateKeyEscapeSequence({ ctrlKey
: true, keyCode
: 117 }).key
, '\x1b[17;5~');
311 assert
.equal(xterm
.evaluateKeyEscapeSequence({ ctrlKey
: true, keyCode
: 118 }).key
, '\x1b[18;5~');
312 assert
.equal(xterm
.evaluateKeyEscapeSequence({ ctrlKey
: true, keyCode
: 119 }).key
, '\x1b[19;5~');
313 assert
.equal(xterm
.evaluateKeyEscapeSequence({ ctrlKey
: true, keyCode
: 120 }).key
, '\x1b[20;5~');
314 assert
.equal(xterm
.evaluateKeyEscapeSequence({ ctrlKey
: true, keyCode
: 121 }).key
, '\x1b[21;5~');
315 assert
.equal(xterm
.evaluateKeyEscapeSequence({ ctrlKey
: true, keyCode
: 122 }).key
, '\x1b[23;5~');
316 assert
.equal(xterm
.evaluateKeyEscapeSequence({ ctrlKey
: true, keyCode
: 123 }).key
, '\x1b[24;5~');
320 describe('attachCustomEventHandler', function () {
322 preventDefault: function() {},
323 stopPropagation: function() {},
327 beforeEach(function() {
328 xterm
.handler = function() {};
329 xterm
.showCursor = function() {};
330 xterm
.clearSelection = function() {};
331 xterm
.compositionHelper
= {
334 return function () { return true; }
340 it('should process the keydown event based on what the handler returns', function () {
341 assert
.equal(xterm
.keyDown(Object
.assign({}, evKeyDown
, { keyCode
: 77 })), true);
342 xterm
.attachCustomKeydownHandler(function (ev
) {
343 return ev
.keyCode
=== 77;
345 assert
.equal(xterm
.keyDown(Object
.assign({}, evKeyDown
, { keyCode
: 77 })), true);
346 xterm
.attachCustomKeydownHandler(function (ev
) {
347 return ev
.keyCode
!== 77;
349 assert
.equal(xterm
.keyDown(Object
.assign({}, evKeyDown
, { keyCode
: 77 })), false);
352 it('should alive after reset(ESC c Full Reset (RIS))', function () {
353 xterm
.attachCustomKeydownHandler(function (ev
) {
354 return ev
.keyCode
!== 77;
356 assert
.equal(xterm
.keyDown(Object
.assign({}, evKeyDown
, { keyCode
: 77 })), false);
358 assert
.equal(xterm
.keyDown(Object
.assign({}, evKeyDown
, { keyCode
: 77 })), false);
362 describe('Third level shift', function() {
364 preventDefault: function() {},
365 stopPropagation: function() {},
369 preventDefault: function() {},
370 stopPropagation: function() {},
374 beforeEach(function() {
375 xterm
.handler = function() {};
376 xterm
.showCursor = function() {};
377 xterm
.clearSelection = function() {};
378 xterm
.compositionHelper
= {
382 return function() { return true; };
388 describe('On Mac OS', function() {
389 beforeEach(function() {
390 xterm
.browser
.isMac
= true;
393 it('should not interfere with the alt key on keyDown', function() {
395 xterm
.keyDown(Object
.assign({}, evKeyDown
, { altKey
: true, keyCode
: 81 })),
399 xterm
.keyDown(Object
.assign({}, evKeyDown
, { altKey
: true, keyCode
: 192 })),
404 it('should interefere with the alt + arrow keys', function() {
406 xterm
.keyDown(Object
.assign({}, evKeyDown
, { altKey
: true, keyCode
: 37 })),
410 xterm
.keyDown(Object
.assign({}, evKeyDown
, { altKey
: true, keyCode
: 39 })),
415 it('should emit key with alt + key on keyPress', function(done
) {
416 var keys
= ['@', '@', '\\', '\\', '|', '|'];
418 xterm
.on('keypress', function(key
) {
420 var index
= keys
.indexOf(key
);
421 assert(index
!== -1, "Emitted wrong key: " + key
);
422 keys
.splice(index
, 1);
424 if (keys
.length
=== 0) done();
427 xterm
.keyPress(Object
.assign({}, evKeyPress
, { altKey
: true, keyCode
: 64 })); // @
429 xterm
.keyPress(Object
.assign({}, evKeyPress
, { altKey
: true, charCode
: 64, keyCode
: 0 }));
430 xterm
.keyPress(Object
.assign({}, evKeyPress
, { altKey
: true, keyCode
: 92 })); // \
431 xterm
.keyPress(Object
.assign({}, evKeyPress
, { altKey
: true, charCode
: 92, keyCode
: 0 }));
432 xterm
.keyPress(Object
.assign({}, evKeyPress
, { altKey
: true, keyCode
: 124 })); // |
433 xterm
.keyPress(Object
.assign({}, evKeyPress
, { altKey
: true, charCode
: 124, keyCode
: 0 }));
437 describe('On MS Windows', function() {
438 beforeEach(function() {
439 xterm
.browser
.isMSWindows
= true;
442 it('should not interfere with the alt + ctrl key on keyDown', function() {
444 xterm
.keyDown(Object
.assign({}, evKeyDown
, { altKey
: true, ctrlKey
: true, keyCode
: 81 })),
448 xterm
.keyDown(Object
.assign({}, evKeyDown
, { altKey
: true, ctrlKey
: true, keyCode
: 192 })),
453 it('should interefere with the alt + ctrl + arrow keys', function() {
455 xterm
.keyDown(Object
.assign({}, evKeyDown
, { altKey
: true, ctrlKey
: true, keyCode
: 37 })),
459 xterm
.keyDown(Object
.assign({}, evKeyDown
, { altKey
: true, ctrlKey
: true, keyCode
: 39 })),
464 it('should emit key with alt + ctrl + key on keyPress', function(done
) {
465 var keys
= ['@', '@', '\\', '\\', '|', '|'];
467 xterm
.on('keypress', function(key
) {
469 var index
= keys
.indexOf(key
);
470 assert(index
!== -1, "Emitted wrong key: " + key
);
471 keys
.splice(index
, 1);
473 if (keys
.length
=== 0) done();
477 Object
.assign({}, evKeyPress
, { altKey
: true, ctrlKey
: true, keyCode
: 64 })
480 Object
.assign({}, evKeyPress
, { altKey
: true, ctrlKey
: true, charCode
: 64, keyCode
: 0 })
483 Object
.assign({}, evKeyPress
, { altKey
: true, ctrlKey
: true, keyCode
: 92 })
486 Object
.assign({}, evKeyPress
, { altKey
: true, ctrlKey
: true, charCode
: 92, keyCode
: 0 })
489 Object
.assign({}, evKeyPress
, { altKey
: true, ctrlKey
: true, keyCode
: 124 })
492 Object
.assign({}, evKeyPress
, { altKey
: true, ctrlKey
: true, charCode
: 124, keyCode
: 0 })
498 describe('unicode - surrogates', function() {
499 it('2 characters per cell', function () {
500 var high
= String
.fromCharCode(0xD800);
501 for (var i
=0xDC00; i
<=0xDCFF; ++i
) {
502 xterm
.write(high
+ String
.fromCharCode(i
));
503 var tchar
= xterm
.lines
[0][0];
504 expect(tchar
[1]).eql(high
+ String
.fromCharCode(i
));
505 expect(tchar
[1].length
).eql(2);
506 expect(tchar
[2]).eql(1);
507 expect(xterm
.lines
[0][1][1]).eql(' ');
511 it('2 characters at last cell', function() {
512 var high
= String
.fromCharCode(0xD800);
513 for (var i
=0xDC00; i
<=0xDCFF; ++i
) {
514 xterm
.x
= xterm
.cols
- 1;
515 xterm
.write(high
+ String
.fromCharCode(i
));
516 expect(xterm
.lines
[0][xterm
.x
-1][1]).eql(high
+ String
.fromCharCode(i
));
517 expect(xterm
.lines
[0][xterm
.x
-1][1].length
).eql(2);
518 expect(xterm
.lines
[1][0][1]).eql(' ');
522 it('2 characters per cell over line end with autowrap', function() {
523 var high
= String
.fromCharCode(0xD800);
524 for (var i
=0xDC00; i
<=0xDCFF; ++i
) {
525 xterm
.x
= xterm
.cols
- 1;
526 xterm
.wraparoundMode
= true;
527 xterm
.write('a' + high
+ String
.fromCharCode(i
));
528 expect(xterm
.lines
[0][xterm
.cols
-1][1]).eql('a');
529 expect(xterm
.lines
[1][0][1]).eql(high
+ String
.fromCharCode(i
));
530 expect(xterm
.lines
[1][0][1].length
).eql(2);
531 expect(xterm
.lines
[1][1][1]).eql(' ');
535 it('2 characters per cell over line end without autowrap', function() {
536 var high
= String
.fromCharCode(0xD800);
537 for (var i
=0xDC00; i
<=0xDCFF; ++i
) {
538 xterm
.x
= xterm
.cols
- 1;
539 xterm
.wraparoundMode
= false;
540 xterm
.write('a' + high
+ String
.fromCharCode(i
));
541 expect(xterm
.lines
[0][xterm
.cols
-1][1]).eql(high
+ String
.fromCharCode(i
));
542 expect(xterm
.lines
[0][xterm
.cols
-1][1].length
).eql(2);
543 expect(xterm
.lines
[1][1][1]).eql(' ');
547 it('splitted surrogates', function() {
548 var high
= String
.fromCharCode(0xD800);
549 for (var i
=0xDC00; i
<=0xDCFF; ++i
) {
551 xterm
.write(String
.fromCharCode(i
));
552 var tchar
= xterm
.lines
[0][0];
553 expect(tchar
[1]).eql(high
+ String
.fromCharCode(i
));
554 expect(tchar
[1].length
).eql(2);
555 expect(tchar
[2]).eql(1);
556 expect(xterm
.lines
[0][1][1]).eql(' ');
562 describe('unicode - combining characters', function() {
563 it('café', function () {
564 xterm
.write('cafe\u0301');
565 expect(xterm
.lines
[0][3][1]).eql('e\u0301');
566 expect(xterm
.lines
[0][3][1].length
).eql(2);
567 expect(xterm
.lines
[0][3][2]).eql(1);
569 it('café - end of line', function() {
570 xterm
.x
= xterm
.cols
- 1 - 3;
571 xterm
.write('cafe\u0301');
572 expect(xterm
.lines
[0][xterm
.cols
-1][1]).eql('e\u0301');
573 expect(xterm
.lines
[0][xterm
.cols
-1][1].length
).eql(2);
574 expect(xterm
.lines
[0][xterm
.cols
-1][2]).eql(1);
575 expect(xterm
.lines
[0][1][1]).eql(' ');
576 expect(xterm
.lines
[0][1][1].length
).eql(1);
577 expect(xterm
.lines
[0][1][2]).eql(1);
579 it('multiple combined é', function() {
580 xterm
.wraparoundMode
= true;
581 xterm
.write(Array(100).join('e\u0301'));
582 for (var i
=0; i
<xterm
.cols
; ++i
) {
583 var tchar
= xterm
.lines
[0][i
];
584 expect(tchar
[1]).eql('e\u0301');
585 expect(tchar
[1].length
).eql(2);
586 expect(tchar
[2]).eql(1);
588 tchar
= xterm
.lines
[1][0];
589 expect(tchar
[1]).eql('e\u0301');
590 expect(tchar
[1].length
).eql(2);
591 expect(tchar
[2]).eql(1);
593 it('multiple surrogate with combined', function() {
594 xterm
.wraparoundMode
= true;
595 xterm
.write(Array(100).join('\uD800\uDC00\u0301'));
596 for (var i
=0; i
<xterm
.cols
; ++i
) {
597 var tchar
= xterm
.lines
[0][i
];
598 expect(tchar
[1]).eql('\uD800\uDC00\u0301');
599 expect(tchar
[1].length
).eql(3);
600 expect(tchar
[2]).eql(1);
602 tchar
= xterm
.lines
[1][0];
603 expect(tchar
[1]).eql('\uD800\uDC00\u0301');
604 expect(tchar
[1].length
).eql(3);
605 expect(tchar
[2]).eql(1);
609 describe('unicode - fullwidth characters', function() {
610 it('cursor movement even', function() {
611 expect(xterm
.x
).eql(0);
613 expect(xterm
.x
).eql(2);
615 it('cursor movement odd', function() {
617 expect(xterm
.x
).eql(1);
619 expect(xterm
.x
).eql(3);
621 it('line of ¥ even', function() {
622 xterm
.wraparoundMode
= true;
623 xterm
.write(Array(50).join('¥'));
624 for (var i
=0; i
<xterm
.cols
; ++i
) {
625 var tchar
= xterm
.lines
[0][i
];
627 expect(tchar
[1]).eql('');
628 expect(tchar
[1].length
).eql(0);
629 expect(tchar
[2]).eql(0);
631 expect(tchar
[1]).eql('¥');
632 expect(tchar
[1].length
).eql(1);
633 expect(tchar
[2]).eql(2);
636 tchar
= xterm
.lines
[1][0];
637 expect(tchar
[1]).eql('¥');
638 expect(tchar
[1].length
).eql(1);
639 expect(tchar
[2]).eql(2);
641 it('line of ¥ odd', function() {
642 xterm
.wraparoundMode
= true;
644 xterm
.write(Array(50).join('¥'));
645 for (var i
=1; i
<xterm
.cols
-1; ++i
) {
646 var tchar
= xterm
.lines
[0][i
];
648 expect(tchar
[1]).eql('');
649 expect(tchar
[1].length
).eql(0);
650 expect(tchar
[2]).eql(0);
652 expect(tchar
[1]).eql('¥');
653 expect(tchar
[1].length
).eql(1);
654 expect(tchar
[2]).eql(2);
657 tchar
= xterm
.lines
[0][xterm
.cols
-1];
658 expect(tchar
[1]).eql(' ');
659 expect(tchar
[1].length
).eql(1);
660 expect(tchar
[2]).eql(1);
661 tchar
= xterm
.lines
[1][0];
662 expect(tchar
[1]).eql('¥');
663 expect(tchar
[1].length
).eql(1);
664 expect(tchar
[2]).eql(2);
666 it('line of ¥ with combining odd', function() {
667 xterm
.wraparoundMode
= true;
669 xterm
.write(Array(50).join('¥\u0301'));
670 for (var i
=1; i
<xterm
.cols
-1; ++i
) {
671 var tchar
= xterm
.lines
[0][i
];
673 expect(tchar
[1]).eql('');
674 expect(tchar
[1].length
).eql(0);
675 expect(tchar
[2]).eql(0);
677 expect(tchar
[1]).eql('¥\u0301');
678 expect(tchar
[1].length
).eql(2);
679 expect(tchar
[2]).eql(2);
682 tchar
= xterm
.lines
[0][xterm
.cols
-1];
683 expect(tchar
[1]).eql(' ');
684 expect(tchar
[1].length
).eql(1);
685 expect(tchar
[2]).eql(1);
686 tchar
= xterm
.lines
[1][0];
687 expect(tchar
[1]).eql('¥\u0301');
688 expect(tchar
[1].length
).eql(2);
689 expect(tchar
[2]).eql(2);
691 it('line of ¥ with combining even', function() {
692 xterm
.wraparoundMode
= true;
693 xterm
.write(Array(50).join('¥\u0301'));
694 for (var i
=0; i
<xterm
.cols
; ++i
) {
695 var tchar
= xterm
.lines
[0][i
];
697 expect(tchar
[1]).eql('');
698 expect(tchar
[1].length
).eql(0);
699 expect(tchar
[2]).eql(0);
701 expect(tchar
[1]).eql('¥\u0301');
702 expect(tchar
[1].length
).eql(2);
703 expect(tchar
[2]).eql(2);
706 tchar
= xterm
.lines
[1][0];
707 expect(tchar
[1]).eql('¥\u0301');
708 expect(tchar
[1].length
).eql(2);
709 expect(tchar
[2]).eql(2);
711 it('line of surrogate fullwidth with combining odd', function() {
712 xterm
.wraparoundMode
= true;
714 xterm
.write(Array(50).join('\ud843\ude6d\u0301'));
715 for (var i
=1; i
<xterm
.cols
-1; ++i
) {
716 var tchar
= xterm
.lines
[0][i
];
718 expect(tchar
[1]).eql('');
719 expect(tchar
[1].length
).eql(0);
720 expect(tchar
[2]).eql(0);
722 expect(tchar
[1]).eql('\ud843\ude6d\u0301');
723 expect(tchar
[1].length
).eql(3);
724 expect(tchar
[2]).eql(2);
727 tchar
= xterm
.lines
[0][xterm
.cols
-1];
728 expect(tchar
[1]).eql(' ');
729 expect(tchar
[1].length
).eql(1);
730 expect(tchar
[2]).eql(1);
731 tchar
= xterm
.lines
[1][0];
732 expect(tchar
[1]).eql('\ud843\ude6d\u0301');
733 expect(tchar
[1].length
).eql(3);
734 expect(tchar
[2]).eql(2);
736 it('line of surrogate fullwidth with combining even', function() {
737 xterm
.wraparoundMode
= true;
738 xterm
.write(Array(50).join('\ud843\ude6d\u0301'));
739 for (var i
=0; i
<xterm
.cols
; ++i
) {
740 var tchar
= xterm
.lines
[0][i
];
742 expect(tchar
[1]).eql('');
743 expect(tchar
[1].length
).eql(0);
744 expect(tchar
[2]).eql(0);
746 expect(tchar
[1]).eql('\ud843\ude6d\u0301');
747 expect(tchar
[1].length
).eql(3);
748 expect(tchar
[2]).eql(2);
751 tchar
= xterm
.lines
[1][0];
752 expect(tchar
[1]).eql('\ud843\ude6d\u0301');
753 expect(tchar
[1].length
).eql(3);
754 expect(tchar
[2]).eql(2);
758 describe('insert mode', function() {
759 it('halfwidth - all', function () {
760 xterm
.write(Array(9).join('0123456789').slice(-80));
763 xterm
.insertMode
= true;
764 xterm
.write('abcde');
765 expect(xterm
.lines
[0].length
).eql(xterm
.cols
);
766 expect(xterm
.lines
[0][10][1]).eql('a');
767 expect(xterm
.lines
[0][14][1]).eql('e');
768 expect(xterm
.lines
[0][15][1]).eql('0');
769 expect(xterm
.lines
[0][79][1]).eql('4');
771 it('fullwidth - insert', function() {
772 xterm
.write(Array(9).join('0123456789').slice(-80));
775 xterm
.insertMode
= true;
777 expect(xterm
.lines
[0].length
).eql(xterm
.cols
);
778 expect(xterm
.lines
[0][10][1]).eql('¥');
779 expect(xterm
.lines
[0][11][1]).eql('');
780 expect(xterm
.lines
[0][14][1]).eql('¥');
781 expect(xterm
.lines
[0][15][1]).eql('');
782 expect(xterm
.lines
[0][79][1]).eql('3');
784 it('fullwidth - right border', function() {
785 xterm
.write(Array(41).join('¥'));
788 xterm
.insertMode
= true;
790 expect(xterm
.lines
[0].length
).eql(xterm
.cols
);
791 expect(xterm
.lines
[0][10][1]).eql('a');
792 expect(xterm
.lines
[0][11][1]).eql('¥');
793 expect(xterm
.lines
[0][79][1]).eql(' '); // fullwidth char got replaced
795 expect(xterm
.lines
[0].length
).eql(xterm
.cols
);
796 expect(xterm
.lines
[0][11][1]).eql('b');
797 expect(xterm
.lines
[0][12][1]).eql('¥');
798 expect(xterm
.lines
[0][79][1]).eql(''); // empty cell after fullwidth