]>
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('../build/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
);
186 describe('evaluateKeyEscapeSequence', function() {
187 it('should return the correct escape sequence for unmodified keys', function() {
189 assert
.equal(xterm
.evaluateKeyEscapeSequence({ keyCode
: 8 }).key
, '\x7f'); // ^?
191 assert
.equal(xterm
.evaluateKeyEscapeSequence({ keyCode
: 9 }).key
, '\t');
193 assert
.equal(xterm
.evaluateKeyEscapeSequence({ keyCode
: 13 }).key
, '\r'); // CR
195 assert
.equal(xterm
.evaluateKeyEscapeSequence({ keyCode
: 27 }).key
, '\x1b');
196 // Page up, page down
197 assert
.equal(xterm
.evaluateKeyEscapeSequence({ keyCode
: 33 }).key
, '\x1b[5~'); // CSI 5 ~
198 assert
.equal(xterm
.evaluateKeyEscapeSequence({ keyCode
: 34 }).key
, '\x1b[6~'); // CSI 6 ~
200 assert
.equal(xterm
.evaluateKeyEscapeSequence({ keyCode
: 35 }).key
, '\x1b[F'); // SS3 F
201 assert
.equal(xterm
.evaluateKeyEscapeSequence({ keyCode
: 36 }).key
, '\x1b[H'); // SS3 H
202 // Left, up, right, down arrows
203 assert
.equal(xterm
.evaluateKeyEscapeSequence({ keyCode
: 37 }).key
, '\x1b[D'); // CSI D
204 assert
.equal(xterm
.evaluateKeyEscapeSequence({ keyCode
: 38 }).key
, '\x1b[A'); // CSI A
205 assert
.equal(xterm
.evaluateKeyEscapeSequence({ keyCode
: 39 }).key
, '\x1b[C'); // CSI C
206 assert
.equal(xterm
.evaluateKeyEscapeSequence({ keyCode
: 40 }).key
, '\x1b[B'); // CSI B
208 assert
.equal(xterm
.evaluateKeyEscapeSequence({ keyCode
: 45 }).key
, '\x1b[2~'); // CSI 2 ~
210 assert
.equal(xterm
.evaluateKeyEscapeSequence({ keyCode
: 46 }).key
, '\x1b[3~'); // CSI 3 ~
212 assert
.equal(xterm
.evaluateKeyEscapeSequence({ keyCode
: 112 }).key
, '\x1bOP'); // SS3 P
213 assert
.equal(xterm
.evaluateKeyEscapeSequence({ keyCode
: 113 }).key
, '\x1bOQ'); // SS3 Q
214 assert
.equal(xterm
.evaluateKeyEscapeSequence({ keyCode
: 114 }).key
, '\x1bOR'); // SS3 R
215 assert
.equal(xterm
.evaluateKeyEscapeSequence({ keyCode
: 115 }).key
, '\x1bOS'); // SS3 S
216 assert
.equal(xterm
.evaluateKeyEscapeSequence({ keyCode
: 116 }).key
, '\x1b[15~'); // CSI 1 5 ~
217 assert
.equal(xterm
.evaluateKeyEscapeSequence({ keyCode
: 117 }).key
, '\x1b[17~'); // CSI 1 7 ~
218 assert
.equal(xterm
.evaluateKeyEscapeSequence({ keyCode
: 118 }).key
, '\x1b[18~'); // CSI 1 8 ~
219 assert
.equal(xterm
.evaluateKeyEscapeSequence({ keyCode
: 119 }).key
, '\x1b[19~'); // CSI 1 9 ~
220 assert
.equal(xterm
.evaluateKeyEscapeSequence({ keyCode
: 120 }).key
, '\x1b[20~'); // CSI 2 0 ~
221 assert
.equal(xterm
.evaluateKeyEscapeSequence({ keyCode
: 121 }).key
, '\x1b[21~'); // CSI 2 1 ~
222 assert
.equal(xterm
.evaluateKeyEscapeSequence({ keyCode
: 122 }).key
, '\x1b[23~'); // CSI 2 3 ~
223 assert
.equal(xterm
.evaluateKeyEscapeSequence({ keyCode
: 123 }).key
, '\x1b[24~'); // CSI 2 4 ~
225 it('should return \\x1b[3;5~ for ctrl+delete', function() {
226 assert
.equal(xterm
.evaluateKeyEscapeSequence({ ctrlKey
: true, keyCode
: 46 }).key
, '\x1b[3;5~');
228 it('should return \\x1b[3;2~ for shift+delete', function() {
229 assert
.equal(xterm
.evaluateKeyEscapeSequence({ shiftKey
: true, keyCode
: 46 }).key
, '\x1b[3;2~');
231 it('should return \\x1b[3;3~ for alt+delete', function() {
232 assert
.equal(xterm
.evaluateKeyEscapeSequence({ altKey
: true, keyCode
: 46 }).key
, '\x1b[3;3~');
234 it('should return \\x1b[5D for ctrl+left', function() {
235 assert
.equal(xterm
.evaluateKeyEscapeSequence({ ctrlKey
: true, keyCode
: 37 }).key
, '\x1b[1;5D'); // CSI 5 D
237 it('should return \\x1b[5C for ctrl+right', function() {
238 assert
.equal(xterm
.evaluateKeyEscapeSequence({ ctrlKey
: true, keyCode
: 39 }).key
, '\x1b[1;5C'); // CSI 5 C
240 it('should return \\x1b[5A for ctrl+up', function() {
241 assert
.equal(xterm
.evaluateKeyEscapeSequence({ ctrlKey
: true, keyCode
: 38 }).key
, '\x1b[1;5A'); // CSI 5 A
243 it('should return \\x1b[5B for ctrl+down', function() {
244 assert
.equal(xterm
.evaluateKeyEscapeSequence({ ctrlKey
: true, keyCode
: 40 }).key
, '\x1b[1;5B'); // CSI 5 B
246 // Evalueate alt + arrow key movement, which is a feature of terminal emulators but not VT100
247 // http://unix.stackexchange.com/a/108106
248 it('should return \\x1b[5D for alt+left', function() {
249 assert
.equal(xterm
.evaluateKeyEscapeSequence({ altKey
: true, keyCode
: 37 }).key
, '\x1b[1;5D'); // CSI 5 D
251 it('should return \\x1b[5C for alt+right', function() {
252 assert
.equal(xterm
.evaluateKeyEscapeSequence({ altKey
: true, keyCode
: 39 }).key
, '\x1b[1;5C'); // CSI 5 C
254 it('should return \\x1b[5A for alt+up', function() {
255 assert
.equal(xterm
.evaluateKeyEscapeSequence({ altKey
: true, keyCode
: 38 }).key
, '\x1b[1;5A'); // CSI 5 A
257 it('should return \\x1b[5B for alt+down', function() {
258 assert
.equal(xterm
.evaluateKeyEscapeSequence({ altKey
: true, keyCode
: 40 }).key
, '\x1b[1;5B'); // CSI 5 B
260 it('should return the correct escape sequence for modified F1-F12 keys', function() {
261 assert
.equal(xterm
.evaluateKeyEscapeSequence({ shiftKey
: true, keyCode
: 112 }).key
, '\x1b[1;2P');
262 assert
.equal(xterm
.evaluateKeyEscapeSequence({ shiftKey
: true, keyCode
: 113 }).key
, '\x1b[1;2Q');
263 assert
.equal(xterm
.evaluateKeyEscapeSequence({ shiftKey
: true, keyCode
: 114 }).key
, '\x1b[1;2R');
264 assert
.equal(xterm
.evaluateKeyEscapeSequence({ shiftKey
: true, keyCode
: 115 }).key
, '\x1b[1;2S');
265 assert
.equal(xterm
.evaluateKeyEscapeSequence({ shiftKey
: true, keyCode
: 116 }).key
, '\x1b[15;2~');
266 assert
.equal(xterm
.evaluateKeyEscapeSequence({ shiftKey
: true, keyCode
: 117 }).key
, '\x1b[17;2~');
267 assert
.equal(xterm
.evaluateKeyEscapeSequence({ shiftKey
: true, keyCode
: 118 }).key
, '\x1b[18;2~');
268 assert
.equal(xterm
.evaluateKeyEscapeSequence({ shiftKey
: true, keyCode
: 119 }).key
, '\x1b[19;2~');
269 assert
.equal(xterm
.evaluateKeyEscapeSequence({ shiftKey
: true, keyCode
: 120 }).key
, '\x1b[20;2~');
270 assert
.equal(xterm
.evaluateKeyEscapeSequence({ shiftKey
: true, keyCode
: 121 }).key
, '\x1b[21;2~');
271 assert
.equal(xterm
.evaluateKeyEscapeSequence({ shiftKey
: true, keyCode
: 122 }).key
, '\x1b[23;2~');
272 assert
.equal(xterm
.evaluateKeyEscapeSequence({ shiftKey
: true, keyCode
: 123 }).key
, '\x1b[24;2~');
273 assert
.equal(xterm
.evaluateKeyEscapeSequence({ altKey
: true, keyCode
: 112 }).key
, '\x1b[1;3P');
274 assert
.equal(xterm
.evaluateKeyEscapeSequence({ altKey
: true, keyCode
: 113 }).key
, '\x1b[1;3Q');
275 assert
.equal(xterm
.evaluateKeyEscapeSequence({ altKey
: true, keyCode
: 114 }).key
, '\x1b[1;3R');
276 assert
.equal(xterm
.evaluateKeyEscapeSequence({ altKey
: true, keyCode
: 115 }).key
, '\x1b[1;3S');
277 assert
.equal(xterm
.evaluateKeyEscapeSequence({ altKey
: true, keyCode
: 116 }).key
, '\x1b[15;3~');
278 assert
.equal(xterm
.evaluateKeyEscapeSequence({ altKey
: true, keyCode
: 117 }).key
, '\x1b[17;3~');
279 assert
.equal(xterm
.evaluateKeyEscapeSequence({ altKey
: true, keyCode
: 118 }).key
, '\x1b[18;3~');
280 assert
.equal(xterm
.evaluateKeyEscapeSequence({ altKey
: true, keyCode
: 119 }).key
, '\x1b[19;3~');
281 assert
.equal(xterm
.evaluateKeyEscapeSequence({ altKey
: true, keyCode
: 120 }).key
, '\x1b[20;3~');
282 assert
.equal(xterm
.evaluateKeyEscapeSequence({ altKey
: true, keyCode
: 121 }).key
, '\x1b[21;3~');
283 assert
.equal(xterm
.evaluateKeyEscapeSequence({ altKey
: true, keyCode
: 122 }).key
, '\x1b[23;3~');
284 assert
.equal(xterm
.evaluateKeyEscapeSequence({ altKey
: true, keyCode
: 123 }).key
, '\x1b[24;3~');
286 assert
.equal(xterm
.evaluateKeyEscapeSequence({ ctrlKey
: true, keyCode
: 112 }).key
, '\x1b[1;5P');
287 assert
.equal(xterm
.evaluateKeyEscapeSequence({ ctrlKey
: true, keyCode
: 113 }).key
, '\x1b[1;5Q');
288 assert
.equal(xterm
.evaluateKeyEscapeSequence({ ctrlKey
: true, keyCode
: 114 }).key
, '\x1b[1;5R');
289 assert
.equal(xterm
.evaluateKeyEscapeSequence({ ctrlKey
: true, keyCode
: 115 }).key
, '\x1b[1;5S');
290 assert
.equal(xterm
.evaluateKeyEscapeSequence({ ctrlKey
: true, keyCode
: 116 }).key
, '\x1b[15;5~');
291 assert
.equal(xterm
.evaluateKeyEscapeSequence({ ctrlKey
: true, keyCode
: 117 }).key
, '\x1b[17;5~');
292 assert
.equal(xterm
.evaluateKeyEscapeSequence({ ctrlKey
: true, keyCode
: 118 }).key
, '\x1b[18;5~');
293 assert
.equal(xterm
.evaluateKeyEscapeSequence({ ctrlKey
: true, keyCode
: 119 }).key
, '\x1b[19;5~');
294 assert
.equal(xterm
.evaluateKeyEscapeSequence({ ctrlKey
: true, keyCode
: 120 }).key
, '\x1b[20;5~');
295 assert
.equal(xterm
.evaluateKeyEscapeSequence({ ctrlKey
: true, keyCode
: 121 }).key
, '\x1b[21;5~');
296 assert
.equal(xterm
.evaluateKeyEscapeSequence({ ctrlKey
: true, keyCode
: 122 }).key
, '\x1b[23;5~');
297 assert
.equal(xterm
.evaluateKeyEscapeSequence({ ctrlKey
: true, keyCode
: 123 }).key
, '\x1b[24;5~');
301 describe('attachCustomEventHandler', function () {
303 preventDefault: function() {},
304 stopPropagation: function() {},
308 beforeEach(function() {
309 xterm
.handler = function() {};
310 xterm
.showCursor = function() {};
311 xterm
.clearSelection = function() {};
312 xterm
.compositionHelper
= {
315 return function () { return true; }
321 it('should process the keydown event based on what the handler returns', function () {
322 assert
.equal(xterm
.keyDown(Object
.assign({}, evKeyDown
, { keyCode
: 77 })), true);
323 xterm
.attachCustomKeydownHandler(function (ev
) {
324 return ev
.keyCode
=== 77;
326 assert
.equal(xterm
.keyDown(Object
.assign({}, evKeyDown
, { keyCode
: 77 })), true);
327 xterm
.attachCustomKeydownHandler(function (ev
) {
328 return ev
.keyCode
!== 77;
330 assert
.equal(xterm
.keyDown(Object
.assign({}, evKeyDown
, { keyCode
: 77 })), false);
333 it('should alive after reset(ESC c Full Reset (RIS))', function () {
334 xterm
.attachCustomKeydownHandler(function (ev
) {
335 return ev
.keyCode
!== 77;
337 assert
.equal(xterm
.keyDown(Object
.assign({}, evKeyDown
, { keyCode
: 77 })), false);
339 assert
.equal(xterm
.keyDown(Object
.assign({}, evKeyDown
, { keyCode
: 77 })), false);
343 describe('Third level shift', function() {
345 preventDefault: function() {},
346 stopPropagation: function() {},
350 preventDefault: function() {},
351 stopPropagation: function() {},
355 beforeEach(function() {
356 xterm
.handler = function() {};
357 xterm
.showCursor = function() {};
358 xterm
.clearSelection = function() {};
359 xterm
.compositionHelper
= {
363 return function() { return true; };
369 describe('On Mac OS', function() {
370 beforeEach(function() {
374 it('should not interfere with the alt key on keyDown', function() {
376 xterm
.keyDown(Object
.assign({}, evKeyDown
, { altKey
: true, keyCode
: 81 })),
380 xterm
.keyDown(Object
.assign({}, evKeyDown
, { altKey
: true, keyCode
: 192 })),
385 it('should interefere with the alt + arrow keys', function() {
387 xterm
.keyDown(Object
.assign({}, evKeyDown
, { altKey
: true, keyCode
: 37 })),
391 xterm
.keyDown(Object
.assign({}, evKeyDown
, { altKey
: true, keyCode
: 39 })),
396 it('should emit key with alt + key on keyPress', function(done
) {
397 var keys
= ['@', '@', '\\', '\\', '|', '|'];
399 xterm
.on('keypress', function(key
) {
401 var index
= keys
.indexOf(key
);
402 assert(index
!== -1, "Emitted wrong key: " + key
);
403 keys
.splice(index
, 1);
405 if (keys
.length
=== 0) done();
408 xterm
.keyPress(Object
.assign({}, evKeyPress
, { altKey
: true, keyCode
: 64 })); // @
410 xterm
.keyPress(Object
.assign({}, evKeyPress
, { altKey
: true, charCode
: 64, keyCode
: 0 }));
411 xterm
.keyPress(Object
.assign({}, evKeyPress
, { altKey
: true, keyCode
: 92 })); // \
412 xterm
.keyPress(Object
.assign({}, evKeyPress
, { altKey
: true, charCode
: 92, keyCode
: 0 }));
413 xterm
.keyPress(Object
.assign({}, evKeyPress
, { altKey
: true, keyCode
: 124 })); // |
414 xterm
.keyPress(Object
.assign({}, evKeyPress
, { altKey
: true, charCode
: 124, keyCode
: 0 }));
418 describe('On MS Windows', function() {
419 beforeEach(function() {
420 xterm
.isMSWindows
= true;
423 it('should not interfere with the alt + ctrl key on keyDown', function() {
425 xterm
.keyDown(Object
.assign({}, evKeyDown
, { altKey
: true, ctrlKey
: true, keyCode
: 81 })),
429 xterm
.keyDown(Object
.assign({}, evKeyDown
, { altKey
: true, ctrlKey
: true, keyCode
: 192 })),
434 it('should interefere with the alt + ctrl + arrow keys', function() {
436 xterm
.keyDown(Object
.assign({}, evKeyDown
, { altKey
: true, ctrlKey
: true, keyCode
: 37 })),
440 xterm
.keyDown(Object
.assign({}, evKeyDown
, { altKey
: true, ctrlKey
: true, keyCode
: 39 })),
445 it('should emit key with alt + ctrl + key on keyPress', function(done
) {
446 var keys
= ['@', '@', '\\', '\\', '|', '|'];
448 xterm
.on('keypress', function(key
) {
450 var index
= keys
.indexOf(key
);
451 assert(index
!== -1, "Emitted wrong key: " + key
);
452 keys
.splice(index
, 1);
454 if (keys
.length
=== 0) done();
458 Object
.assign({}, evKeyPress
, { altKey
: true, ctrlKey
: true, keyCode
: 64 })
461 Object
.assign({}, evKeyPress
, { altKey
: true, ctrlKey
: true, charCode
: 64, keyCode
: 0 })
464 Object
.assign({}, evKeyPress
, { altKey
: true, ctrlKey
: true, keyCode
: 92 })
467 Object
.assign({}, evKeyPress
, { altKey
: true, ctrlKey
: true, charCode
: 92, keyCode
: 0 })
470 Object
.assign({}, evKeyPress
, { altKey
: true, ctrlKey
: true, keyCode
: 124 })
473 Object
.assign({}, evKeyPress
, { altKey
: true, ctrlKey
: true, charCode
: 124, keyCode
: 0 })
479 describe('unicode - surrogates', function() {
480 it('2 characters per cell', function () {
481 var high
= String
.fromCharCode(0xD800);
482 for (var i
=0xDC00; i
<=0xDCFF; ++i
) {
483 xterm
.write(high
+ String
.fromCharCode(i
));
484 var tchar
= xterm
.lines
[0][0];
485 expect(tchar
[1]).eql(high
+ String
.fromCharCode(i
));
486 expect(tchar
[1].length
).eql(2);
487 expect(tchar
[2]).eql(1);
488 expect(xterm
.lines
[0][1][1]).eql(' ');
492 it('2 characters at last cell', function() {
493 var high
= String
.fromCharCode(0xD800);
494 for (var i
=0xDC00; i
<=0xDCFF; ++i
) {
495 xterm
.x
= xterm
.cols
- 1;
496 xterm
.write(high
+ String
.fromCharCode(i
));
497 expect(xterm
.lines
[0][xterm
.x
-1][1]).eql(high
+ String
.fromCharCode(i
));
498 expect(xterm
.lines
[0][xterm
.x
-1][1].length
).eql(2);
499 expect(xterm
.lines
[1][0][1]).eql(' ');
503 it('2 characters per cell over line end with autowrap', function() {
504 var high
= String
.fromCharCode(0xD800);
505 for (var i
=0xDC00; i
<=0xDCFF; ++i
) {
506 xterm
.x
= xterm
.cols
- 1;
507 xterm
.wraparoundMode
= true;
508 xterm
.write('a' + high
+ String
.fromCharCode(i
));
509 expect(xterm
.lines
[0][xterm
.cols
-1][1]).eql('a');
510 expect(xterm
.lines
[1][0][1]).eql(high
+ String
.fromCharCode(i
));
511 expect(xterm
.lines
[1][0][1].length
).eql(2);
512 expect(xterm
.lines
[1][1][1]).eql(' ');
516 it('2 characters per cell over line end without autowrap', function() {
517 var high
= String
.fromCharCode(0xD800);
518 for (var i
=0xDC00; i
<=0xDCFF; ++i
) {
519 xterm
.x
= xterm
.cols
- 1;
520 xterm
.wraparoundMode
= false;
521 xterm
.write('a' + high
+ String
.fromCharCode(i
));
522 expect(xterm
.lines
[0][xterm
.cols
-1][1]).eql(high
+ String
.fromCharCode(i
));
523 expect(xterm
.lines
[0][xterm
.cols
-1][1].length
).eql(2);
524 expect(xterm
.lines
[1][1][1]).eql(' ');
528 it('splitted surrogates', function() {
529 var high
= String
.fromCharCode(0xD800);
530 for (var i
=0xDC00; i
<=0xDCFF; ++i
) {
532 xterm
.write(String
.fromCharCode(i
));
533 var tchar
= xterm
.lines
[0][0];
534 expect(tchar
[1]).eql(high
+ String
.fromCharCode(i
));
535 expect(tchar
[1].length
).eql(2);
536 expect(tchar
[2]).eql(1);
537 expect(xterm
.lines
[0][1][1]).eql(' ');
543 describe('unicode - combining characters', function() {
544 it('café', function () {
545 xterm
.write('cafe\u0301');
546 expect(xterm
.lines
[0][3][1]).eql('e\u0301');
547 expect(xterm
.lines
[0][3][1].length
).eql(2);
548 expect(xterm
.lines
[0][3][2]).eql(1);
550 it('café - end of line', function() {
551 xterm
.x
= xterm
.cols
- 1 - 3;
552 xterm
.write('cafe\u0301');
553 expect(xterm
.lines
[0][xterm
.cols
-1][1]).eql('e\u0301');
554 expect(xterm
.lines
[0][xterm
.cols
-1][1].length
).eql(2);
555 expect(xterm
.lines
[0][xterm
.cols
-1][2]).eql(1);
556 expect(xterm
.lines
[0][1][1]).eql(' ');
557 expect(xterm
.lines
[0][1][1].length
).eql(1);
558 expect(xterm
.lines
[0][1][2]).eql(1);
560 it('multiple combined é', function() {
561 xterm
.wraparoundMode
= true;
562 xterm
.write(Array(100).join('e\u0301'));
563 for (var i
=0; i
<xterm
.cols
; ++i
) {
564 var tchar
= xterm
.lines
[0][i
];
565 expect(tchar
[1]).eql('e\u0301');
566 expect(tchar
[1].length
).eql(2);
567 expect(tchar
[2]).eql(1);
569 tchar
= xterm
.lines
[1][0];
570 expect(tchar
[1]).eql('e\u0301');
571 expect(tchar
[1].length
).eql(2);
572 expect(tchar
[2]).eql(1);
574 it('multiple surrogate with combined', function() {
575 xterm
.wraparoundMode
= true;
576 xterm
.write(Array(100).join('\uD800\uDC00\u0301'));
577 for (var i
=0; i
<xterm
.cols
; ++i
) {
578 var tchar
= xterm
.lines
[0][i
];
579 expect(tchar
[1]).eql('\uD800\uDC00\u0301');
580 expect(tchar
[1].length
).eql(3);
581 expect(tchar
[2]).eql(1);
583 tchar
= xterm
.lines
[1][0];
584 expect(tchar
[1]).eql('\uD800\uDC00\u0301');
585 expect(tchar
[1].length
).eql(3);
586 expect(tchar
[2]).eql(1);
590 describe('unicode - fullwidth characters', function() {
591 it('cursor movement even', function() {
592 expect(xterm
.x
).eql(0);
594 expect(xterm
.x
).eql(2);
596 it('cursor movement odd', function() {
598 expect(xterm
.x
).eql(1);
600 expect(xterm
.x
).eql(3);
602 it('line of ¥ even', function() {
603 xterm
.wraparoundMode
= true;
604 xterm
.write(Array(50).join('¥'));
605 for (var i
=0; i
<xterm
.cols
; ++i
) {
606 var tchar
= xterm
.lines
[0][i
];
608 expect(tchar
[1]).eql('');
609 expect(tchar
[1].length
).eql(0);
610 expect(tchar
[2]).eql(0);
612 expect(tchar
[1]).eql('¥');
613 expect(tchar
[1].length
).eql(1);
614 expect(tchar
[2]).eql(2);
617 tchar
= xterm
.lines
[1][0];
618 expect(tchar
[1]).eql('¥');
619 expect(tchar
[1].length
).eql(1);
620 expect(tchar
[2]).eql(2);
622 it('line of ¥ odd', function() {
623 xterm
.wraparoundMode
= true;
625 xterm
.write(Array(50).join('¥'));
626 for (var i
=1; i
<xterm
.cols
-1; ++i
) {
627 var tchar
= xterm
.lines
[0][i
];
629 expect(tchar
[1]).eql('');
630 expect(tchar
[1].length
).eql(0);
631 expect(tchar
[2]).eql(0);
633 expect(tchar
[1]).eql('¥');
634 expect(tchar
[1].length
).eql(1);
635 expect(tchar
[2]).eql(2);
638 tchar
= xterm
.lines
[0][xterm
.cols
-1];
639 expect(tchar
[1]).eql(' ');
640 expect(tchar
[1].length
).eql(1);
641 expect(tchar
[2]).eql(1);
642 tchar
= xterm
.lines
[1][0];
643 expect(tchar
[1]).eql('¥');
644 expect(tchar
[1].length
).eql(1);
645 expect(tchar
[2]).eql(2);
647 it('line of ¥ with combining odd', function() {
648 xterm
.wraparoundMode
= true;
650 xterm
.write(Array(50).join('¥\u0301'));
651 for (var i
=1; i
<xterm
.cols
-1; ++i
) {
652 var tchar
= xterm
.lines
[0][i
];
654 expect(tchar
[1]).eql('');
655 expect(tchar
[1].length
).eql(0);
656 expect(tchar
[2]).eql(0);
658 expect(tchar
[1]).eql('¥\u0301');
659 expect(tchar
[1].length
).eql(2);
660 expect(tchar
[2]).eql(2);
663 tchar
= xterm
.lines
[0][xterm
.cols
-1];
664 expect(tchar
[1]).eql(' ');
665 expect(tchar
[1].length
).eql(1);
666 expect(tchar
[2]).eql(1);
667 tchar
= xterm
.lines
[1][0];
668 expect(tchar
[1]).eql('¥\u0301');
669 expect(tchar
[1].length
).eql(2);
670 expect(tchar
[2]).eql(2);
672 it('line of ¥ with combining even', function() {
673 xterm
.wraparoundMode
= true;
674 xterm
.write(Array(50).join('¥\u0301'));
675 for (var i
=0; i
<xterm
.cols
; ++i
) {
676 var tchar
= xterm
.lines
[0][i
];
678 expect(tchar
[1]).eql('');
679 expect(tchar
[1].length
).eql(0);
680 expect(tchar
[2]).eql(0);
682 expect(tchar
[1]).eql('¥\u0301');
683 expect(tchar
[1].length
).eql(2);
684 expect(tchar
[2]).eql(2);
687 tchar
= xterm
.lines
[1][0];
688 expect(tchar
[1]).eql('¥\u0301');
689 expect(tchar
[1].length
).eql(2);
690 expect(tchar
[2]).eql(2);
692 it('line of surrogate fullwidth with combining odd', function() {
693 xterm
.wraparoundMode
= true;
695 xterm
.write(Array(50).join('\ud843\ude6d\u0301'));
696 for (var i
=1; i
<xterm
.cols
-1; ++i
) {
697 var tchar
= xterm
.lines
[0][i
];
699 expect(tchar
[1]).eql('');
700 expect(tchar
[1].length
).eql(0);
701 expect(tchar
[2]).eql(0);
703 expect(tchar
[1]).eql('\ud843\ude6d\u0301');
704 expect(tchar
[1].length
).eql(3);
705 expect(tchar
[2]).eql(2);
708 tchar
= xterm
.lines
[0][xterm
.cols
-1];
709 expect(tchar
[1]).eql(' ');
710 expect(tchar
[1].length
).eql(1);
711 expect(tchar
[2]).eql(1);
712 tchar
= xterm
.lines
[1][0];
713 expect(tchar
[1]).eql('\ud843\ude6d\u0301');
714 expect(tchar
[1].length
).eql(3);
715 expect(tchar
[2]).eql(2);
717 it('line of surrogate fullwidth with combining even', function() {
718 xterm
.wraparoundMode
= true;
719 xterm
.write(Array(50).join('\ud843\ude6d\u0301'));
720 for (var i
=0; i
<xterm
.cols
; ++i
) {
721 var tchar
= xterm
.lines
[0][i
];
723 expect(tchar
[1]).eql('');
724 expect(tchar
[1].length
).eql(0);
725 expect(tchar
[2]).eql(0);
727 expect(tchar
[1]).eql('\ud843\ude6d\u0301');
728 expect(tchar
[1].length
).eql(3);
729 expect(tchar
[2]).eql(2);
732 tchar
= xterm
.lines
[1][0];
733 expect(tchar
[1]).eql('\ud843\ude6d\u0301');
734 expect(tchar
[1].length
).eql(3);
735 expect(tchar
[2]).eql(2);
739 describe('insert mode', function() {
740 it('halfwidth - all', function () {
741 xterm
.write(Array(9).join('0123456789').slice(-80));
744 xterm
.insertMode
= true;
745 xterm
.write('abcde');
746 expect(xterm
.lines
[0].length
).eql(xterm
.cols
);
747 expect(xterm
.lines
[0][10][1]).eql('a');
748 expect(xterm
.lines
[0][14][1]).eql('e');
749 expect(xterm
.lines
[0][15][1]).eql('0');
750 expect(xterm
.lines
[0][79][1]).eql('4');
752 it('fullwidth - insert', function() {
753 xterm
.write(Array(9).join('0123456789').slice(-80));
756 xterm
.insertMode
= true;
758 expect(xterm
.lines
[0].length
).eql(xterm
.cols
);
759 expect(xterm
.lines
[0][10][1]).eql('¥');
760 expect(xterm
.lines
[0][11][1]).eql('');
761 expect(xterm
.lines
[0][14][1]).eql('¥');
762 expect(xterm
.lines
[0][15][1]).eql('');
763 expect(xterm
.lines
[0][79][1]).eql('3');
765 it('fullwidth - right border', function() {
766 xterm
.write(Array(41).join('¥'));
769 xterm
.insertMode
= true;
771 expect(xterm
.lines
[0].length
).eql(xterm
.cols
);
772 expect(xterm
.lines
[0][10][1]).eql('a');
773 expect(xterm
.lines
[0][11][1]).eql('¥');
774 expect(xterm
.lines
[0][79][1]).eql(' '); // fullwidth char got replaced
776 expect(xterm
.lines
[0].length
).eql(xterm
.cols
);
777 expect(xterm
.lines
[0][11][1]).eql('b');
778 expect(xterm
.lines
[0][12][1]).eql('¥');
779 expect(xterm
.lines
[0][79][1]).eql(''); // empty cell after fullwidth