]> git.proxmox.com Git - mirror_xterm.js.git/blame - src/test/escape-sequences-test.js
Merge pull request #1 from Tyriar/typescript_build_3
[mirror_xterm.js.git] / src / test / escape-sequences-test.js
CommitLineData
d76d5067
JB
1var glob = require('glob');
2var fs = require('fs');
3var pty = require('pty.js');
4var sleep = require('sleep');
56ecc77d 5var Terminal = require('../xterm');
d76d5067
JB
6
7var CONSOLE_LOG = console.log;
8
9// expect files need terminal at 80x25!
10var COLS = 80;
11var ROWS = 25;
12
dcf30b40
JB
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
d76d5067
JB
16var primitive_pty = pty.native.open(COLS, ROWS);
17
18// fake sychronous pty write - read
dcf30b40 19// we just pipe the data from slave to master as a child program would do
d76d5067
JB
20// pty.js opens pipe fds with O_NONBLOCK
21// just wait 10ms instead of setting fds to blocking mode
dcf30b40
JB
22function 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);
d76d5067
JB
28}
29
ed1a31d1 30// make sure raw pty is at x=0 and has no pending data
dcf30b40
JB
31function 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
d76d5067 37function formatError(in_, out_, expected) {
dcf30b40
JB
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;
d76d5067 43 }
dcf30b40
JB
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;
d76d5067
JB
53}
54
55// simple debug output of terminal cells
56function terminalToString(term) {
dcf30b40
JB
57 var result = '';
58 var line_s = '';
59 for (var line=0; line<term.rows; ++line) {
60 line_s = '';
61 for (var cell=0; cell<term.cols; ++cell) {
62 line_s += term.lines[line][cell][1];
d76d5067 63 }
dcf30b40
JB
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;
d76d5067
JB
70}
71
dcf30b40
JB
72/** tests */
73describe('xterm output comparison', function() {
74 var xterm;
d76d5067 75
dcf30b40
JB
76 beforeEach(function () {
77 xterm = new Terminal(COLS, ROWS);
78 xterm.refresh = function() {};
79 });
d76d5067 80
dcf30b40
JB
81 // omit stack trace for escape sequence files
82 Error.stackTraceLimit = 0;
56ecc77d 83 var files = glob.sync('**/escape_sequence_files/*.in');
dcf30b40
JB
84 // only successful tests for now
85 var successful = [0, 2, 6, 12, 13, 18, 20, 22, 27, 28];
56ecc77d 86 console.log(files);
dcf30b40
JB
87 for (var a in successful) {
88 var i = successful[a];
89 (function(filename){
90 it(filename.split('/').slice(-1)[0], function () {
91 pty_reset();
92 var in_file = fs.readFileSync(filename, 'utf8');
93 var from_pty = pty_write_read(in_file);
94 // uncomment this to get log from terminal
95 console.log = function(){};
96 xterm.write(from_pty);
97 var from_emulator = terminalToString(xterm);
98 console.log = CONSOLE_LOG;
99 var expected = fs.readFileSync(filename.split('.')[0] + '.text', 'utf8');
100 if (from_emulator != expected) {
101 // uncomment to get noisy output
102 //throw new Error(formatError(in_file, from_emulator, expected));
103 throw new Error('mismatch');
104 }
105 });
106 })(files[i]);
107 }
d76d5067
JB
108});
109