]> git.proxmox.com Git - mirror_xterm.js.git/blob - src/test/escape-sequences-test.js
Merge pull request #525 from LucianBuzzo/resize
[mirror_xterm.js.git] / 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');
6
7 var CONSOLE_LOG = console.log;
8
9 // expect files need terminal at 80x25!
10 var COLS = 80;
11 var ROWS = 25;
12
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);
17
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);
24 sleep.usleep(10000);
25 var b = Buffer(64000);
26 var bytes = fs.readSync(primitive_pty.master, b, 0, 64000);
27 return b.toString('utf8', 0, bytes);
28 }
29
30 // make sure raw pty is at x=0 and has no pending data
31 function pty_reset() {
32 pty_write_read('\r\n');
33 }
34
35 /* debug helpers */
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;
40 return function(s) {
41 counter += 1;
42 return '\x1b[33m' + (' ' + counter).slice(-2) + color + s;
43 }
44 }
45 var line80 = '12345678901234567890123456789012345678901234567890123456789012345678901234567890';
46 var s = '';
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');
52 return s;
53 }
54
55 // simple debug output of terminal cells
56 function terminalToString(term) {
57 var result = '';
58 var line_s = '';
59 for (var line = term.ybase; line < term.ybase + term.rows; line++) {
60 line_s = '';
61 for (var cell=0; cell<term.cols; ++cell) {
62 line_s += term.lines.get(line)[cell][1];
63 }
64 // rtrim empty cells as xterm does
65 line_s = line_s.replace(/\s+$/, '');
66 result += line_s;
67 result += '\n';
68 }
69 return result;
70 }
71
72 /** tests */
73 describe('xterm output comparison', function() {
74 var xterm;
75
76 beforeEach(function () {
77 xterm = new Terminal(COLS, ROWS);
78 xterm.refresh = function() {};
79 xterm.viewport = {
80 syncScrollArea: function() {}
81 };
82 });
83
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
88 var skip = [
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,
92 63, 68
93 ];
94 for (var i = 0; i < files.length; i++) {
95 if (skip.indexOf(i) >= 0) {
96 continue;
97 }
98 (function(filename) {
99 it(filename.split('/').slice(-1)[0], function () {
100 pty_reset();
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(){};
105
106 // Perform a synchronous .write(data)
107 xterm.writeBuffer.push(from_pty);
108 xterm.innerWrite();
109
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+$/, '');
117 }).join('\n');
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');
122 }
123 });
124 })(files[i]);
125 }
126 });
127