]>
git.proxmox.com Git - mirror_xterm.js.git/blob - src/test/escape-sequences-test.js
1 var glob
= require('glob');
2 var fs
= require('fs');
3 var pty
= require('node-pty');
4 var sleep
= require('sleep');
5 var Terminal
= require('../xterm');
7 var CONSOLE_LOG
= console
.log
;
9 // expect files need terminal at 80x25!
13 /** some helpers for pty interaction */
14 // we need a pty in between to get the termios decorations
15 // for the basic test cases a raw pty device is enough
16 var primitive_pty
= pty
.native.open(COLS
, ROWS
);
18 // fake sychronous pty write - read
19 // we just pipe the data from slave to master as a child program would do
20 // pty.js opens pipe fds with O_NONBLOCK
21 // just wait 10ms instead of setting fds to blocking mode
22 function pty_write_read(s
) {
23 fs
.writeSync(primitive_pty
.slave
, s
);
25 var b
= Buffer(64000);
26 var bytes
= fs
.readSync(primitive_pty
.master
, b
, 0, 64000);
27 return b
.toString('utf8', 0, bytes
);
30 // make sure raw pty is at x=0 and has no pending data
31 function pty_reset() {
32 pty_write_read('\r\n');
36 // generate colorful noisy output to compare xterm and emulator cell states
37 function formatError(in_
, out_
, expected
) {
38 function addLineNumber(start
, color
) {
39 var counter
= start
|| 0;
42 return '\x1b[33m' + (' ' + counter
).slice(-2) + color
+ s
;
45 var line80
= '12345678901234567890123456789012345678901234567890123456789012345678901234567890';
47 s
+= '\n\x1b[34m' + JSON
.stringify(in_
);
48 s
+= '\n\x1b[33m ' + line80
+ '\n';
49 s
+= out_
.split('\n').map(addLineNumber(0, '\x1b[31m')).join('\n');
50 s
+= '\n\x1b[33m ' + line80
+ '\n';
51 s
+= expected
.split('\n').map(addLineNumber(0, '\x1b[32m')).join('\n');
55 // simple debug output of terminal cells
56 function terminalToString(term
) {
59 for (var line
= term
.ybase
; line
< term
.ybase
+ term
.rows
; line
++) {
61 for (var cell
=0; cell
<term
.cols
; ++cell
) {
62 line_s
+= term
.lines
.get(line
)[cell
][1];
64 // rtrim empty cells as xterm does
65 line_s
= line_s
.replace(/\s+$/, '');
73 describe('xterm output comparison', function() {
76 beforeEach(function () {
77 xterm
= new Terminal(COLS
, ROWS
);
78 xterm
.refresh = function() {};
80 syncScrollArea: function() {}
84 // omit stack trace for escape sequence files
85 Error
.stackTraceLimit
= 0;
86 var files
= glob
.sync('**/escape_sequence_files/*.in');
87 // only successful tests for now
89 10, 16, 17, 19, 32, 33, 34, 35, 36, 39,
90 40, 42, 43, 44, 45, 46, 47, 48, 49, 50,
91 51, 52, 54, 55, 56, 57, 58, 59, 60, 61,
94 for (var i
= 0; i
< files
.length
; i
++) {
95 if (skip
.indexOf(i
) >= 0) {
99 it(filename
.split('/').slice(-1)[0], function () {
101 var in_file
= fs
.readFileSync(filename
, 'utf8');
102 var from_pty
= pty_write_read(in_file
);
103 // uncomment this to get log from terminal
104 //console.log = function(){};
106 // Perform a synchronous .write(data)
107 xterm
.writeBuffer
.push(from_pty
);
110 var from_emulator
= terminalToString(xterm
);
111 console
.log
= CONSOLE_LOG
;
112 var expected
= fs
.readFileSync(filename
.split('.')[0] + '.text', 'utf8');
113 // Some of the tests have whitespace on the right of lines, we trim all the linex
114 // from xterm.js so ignore this for now at least.
115 var expectedRightTrimmed
= expected
.split('\n').map(function (l
) {
116 return l
.replace(/\s+$/, '');
118 if (from_emulator
!= expectedRightTrimmed
) {
119 // uncomment to get noisy output
120 throw new Error(formatError(in_file
, from_emulator
, expected
));
121 // throw new Error('mismatch');