xterm.compositionHelper = {
keydown: function(){ return true; }
};
+ // Force synchronous writes
+ xterm.write = function(data) {
+ xterm.writeBuffer.push(data);
+ xterm.innerWrite();
+ };
+ xterm.element = {
+ classList: {
+ toggle: function(){}
+ }
+ };
});
describe('getOption', function() {
describe('clear', function() {
it('should clear a buffer equal to rows', function() {
- var promptLine = xterm.lines[xterm.ybase + xterm.y];
+ var promptLine = xterm.lines.get(xterm.ybase + xterm.y);
xterm.clear();
assert.equal(xterm.y, 0);
assert.equal(xterm.ybase, 0);
assert.equal(xterm.ydisp, 0);
assert.equal(xterm.lines.length, xterm.rows);
- assert.deepEqual(xterm.lines[0], promptLine);
+ assert.deepEqual(xterm.lines.get(0), promptLine);
for (var i = 1; i < xterm.rows; i++) {
- assert.deepEqual(xterm.lines[0], xterm.blankLine());
+ assert.deepEqual(xterm.lines.get(i), xterm.blankLine());
}
});
it('should clear a buffer larger than rows', function() {
xterm.write('test\n');
}
- var promptLine = xterm.lines[xterm.ybase + xterm.y];
+ var promptLine = xterm.lines.get(xterm.ybase + xterm.y);
xterm.clear();
assert.equal(xterm.y, 0);
assert.equal(xterm.ybase, 0);
assert.equal(xterm.ydisp, 0);
assert.equal(xterm.lines.length, xterm.rows);
- assert.deepEqual(xterm.lines[0], promptLine);
+ assert.deepEqual(xterm.lines.get(0), promptLine);
for (var i = 1; i < xterm.rows; i++) {
- assert.deepEqual(xterm.lines[i], xterm.blankLine());
+ assert.deepEqual(xterm.lines.get(i), xterm.blankLine());
}
});
it('should not break the prompt when cleared twice', function() {
- var promptLine = xterm.lines[xterm.ybase + xterm.y];
+ var promptLine = xterm.lines.get(xterm.ybase + xterm.y);
xterm.clear();
xterm.clear();
assert.equal(xterm.y, 0);
assert.equal(xterm.ybase, 0);
assert.equal(xterm.ydisp, 0);
assert.equal(xterm.lines.length, xterm.rows);
- assert.deepEqual(xterm.lines[0], promptLine);
+ assert.deepEqual(xterm.lines.get(0), promptLine);
for (var i = 1; i < xterm.rows; i++) {
- assert.deepEqual(xterm.lines[i], xterm.blankLine());
+ assert.deepEqual(xterm.lines.get(i), xterm.blankLine());
}
});
});
it('should scroll down, when a key is pressed and terminal is scrolled up', function () {
// Override evaluateKeyEscapeSequence to return cancel code
xterm.evaluateKeyEscapeSequence = function() {
- return { cancel: true };
+ return { key: 'a' };
};
var event = {
type: 'keydown',
xterm.ydisp = 0;
xterm.ybase = 40;
+ assert.notEqual(xterm.ydisp, xterm.ybase);
xterm.keyDown(event);
// Ensure that now the terminal is scrolled to bottom
it('should return \\x1b[5B for ctrl+down', function() {
assert.equal(xterm.evaluateKeyEscapeSequence({ ctrlKey: true, keyCode: 40 }).key, '\x1b[1;5B'); // CSI 5 B
});
- // Evalueate alt + arrow key movement, which is a feature of terminal emulators but not VT100
- // http://unix.stackexchange.com/a/108106
- it('should return \\x1b[5D for alt+left', function() {
- assert.equal(xterm.evaluateKeyEscapeSequence({ altKey: true, keyCode: 37 }).key, '\x1b[1;5D'); // CSI 5 D
+
+ describe('On non-macOS platforms', function() {
+ beforeEach(function() {
+ xterm.browser.isMac = false;
+ });
+ // Evalueate alt + arrow key movement, which is a feature of terminal emulators but not VT100
+ // http://unix.stackexchange.com/a/108106
+ it('should return \\x1b[5D for alt+left', function() {
+ assert.equal(xterm.evaluateKeyEscapeSequence({ altKey: true, keyCode: 37 }).key, '\x1b[1;5D'); // CSI 5 D
+ });
+ it('should return \\x1b[5C for alt+right', function() {
+ assert.equal(xterm.evaluateKeyEscapeSequence({ altKey: true, keyCode: 39 }).key, '\x1b[1;5C'); // CSI 5 C
+ });
});
- it('should return \\x1b[5C for alt+right', function() {
- assert.equal(xterm.evaluateKeyEscapeSequence({ altKey: true, keyCode: 39 }).key, '\x1b[1;5C'); // CSI 5 C
+
+ describe('On macOS platforms', function() {
+ beforeEach(function() {
+ xterm.browser.isMac = true;
+ });
+ it('should return \\x1bb for alt+left', function() {
+ assert.equal(xterm.evaluateKeyEscapeSequence({ altKey: true, keyCode: 37 }).key, '\x1bb'); // CSI 5 D
+ });
+ it('should return \\x1bf for alt+right', function() {
+ assert.equal(xterm.evaluateKeyEscapeSequence({ altKey: true, keyCode: 39 }).key, '\x1bf'); // CSI 5 C
+ });
});
+
it('should return \\x1b[5A for alt+up', function() {
assert.equal(xterm.evaluateKeyEscapeSequence({ altKey: true, keyCode: 38 }).key, '\x1b[1;5A'); // CSI 5 A
});
var high = String.fromCharCode(0xD800);
for (var i=0xDC00; i<=0xDCFF; ++i) {
xterm.write(high + String.fromCharCode(i));
- var tchar = xterm.lines[0][0];
+ var tchar = xterm.lines.get(0)[0];
expect(tchar[1]).eql(high + String.fromCharCode(i));
expect(tchar[1].length).eql(2);
expect(tchar[2]).eql(1);
- expect(xterm.lines[0][1][1]).eql(' ');
+ expect(xterm.lines.get(0)[1][1]).eql(' ');
xterm.reset();
}
});
for (var i=0xDC00; i<=0xDCFF; ++i) {
xterm.x = xterm.cols - 1;
xterm.write(high + String.fromCharCode(i));
- expect(xterm.lines[0][xterm.x-1][1]).eql(high + String.fromCharCode(i));
- expect(xterm.lines[0][xterm.x-1][1].length).eql(2);
- expect(xterm.lines[1][0][1]).eql(' ');
+ expect(xterm.lines.get(0)[xterm.x-1][1]).eql(high + String.fromCharCode(i));
+ expect(xterm.lines.get(0)[xterm.x-1][1].length).eql(2);
+ expect(xterm.lines.get(1)[0][1]).eql(' ');
xterm.reset();
}
});
xterm.x = xterm.cols - 1;
xterm.wraparoundMode = true;
xterm.write('a' + high + String.fromCharCode(i));
- expect(xterm.lines[0][xterm.cols-1][1]).eql('a');
- expect(xterm.lines[1][0][1]).eql(high + String.fromCharCode(i));
- expect(xterm.lines[1][0][1].length).eql(2);
- expect(xterm.lines[1][1][1]).eql(' ');
+ expect(xterm.lines.get(0)[xterm.cols-1][1]).eql('a');
+ expect(xterm.lines.get(1)[0][1]).eql(high + String.fromCharCode(i));
+ expect(xterm.lines.get(1)[0][1].length).eql(2);
+ expect(xterm.lines.get(1)[1][1]).eql(' ');
xterm.reset();
}
});
xterm.x = xterm.cols - 1;
xterm.wraparoundMode = false;
xterm.write('a' + high + String.fromCharCode(i));
- expect(xterm.lines[0][xterm.cols-1][1]).eql(high + String.fromCharCode(i));
- expect(xterm.lines[0][xterm.cols-1][1].length).eql(2);
- expect(xterm.lines[1][1][1]).eql(' ');
+ // auto wraparound mode should cut off the rest of the line
+ expect(xterm.lines.get(0)[xterm.cols-1][1]).eql('a');
+ expect(xterm.lines.get(0)[xterm.cols-1][1].length).eql(1);
+ expect(xterm.lines.get(1)[1][1]).eql(' ');
xterm.reset();
}
});
for (var i=0xDC00; i<=0xDCFF; ++i) {
xterm.write(high);
xterm.write(String.fromCharCode(i));
- var tchar = xterm.lines[0][0];
+ var tchar = xterm.lines.get(0)[0];
expect(tchar[1]).eql(high + String.fromCharCode(i));
expect(tchar[1].length).eql(2);
expect(tchar[2]).eql(1);
- expect(xterm.lines[0][1][1]).eql(' ');
+ expect(xterm.lines.get(0)[1][1]).eql(' ');
xterm.reset();
}
});
describe('unicode - combining characters', function() {
it('café', function () {
xterm.write('cafe\u0301');
- expect(xterm.lines[0][3][1]).eql('e\u0301');
- expect(xterm.lines[0][3][1].length).eql(2);
- expect(xterm.lines[0][3][2]).eql(1);
+ expect(xterm.lines.get(0)[3][1]).eql('e\u0301');
+ expect(xterm.lines.get(0)[3][1].length).eql(2);
+ expect(xterm.lines.get(0)[3][2]).eql(1);
});
it('café - end of line', function() {
xterm.x = xterm.cols - 1 - 3;
xterm.write('cafe\u0301');
- expect(xterm.lines[0][xterm.cols-1][1]).eql('e\u0301');
- expect(xterm.lines[0][xterm.cols-1][1].length).eql(2);
- expect(xterm.lines[0][xterm.cols-1][2]).eql(1);
- expect(xterm.lines[0][1][1]).eql(' ');
- expect(xterm.lines[0][1][1].length).eql(1);
- expect(xterm.lines[0][1][2]).eql(1);
+ expect(xterm.lines.get(0)[xterm.cols-1][1]).eql('e\u0301');
+ expect(xterm.lines.get(0)[xterm.cols-1][1].length).eql(2);
+ expect(xterm.lines.get(0)[xterm.cols-1][2]).eql(1);
+ expect(xterm.lines.get(0)[1][1]).eql(' ');
+ expect(xterm.lines.get(0)[1][1].length).eql(1);
+ expect(xterm.lines.get(0)[1][2]).eql(1);
});
it('multiple combined é', function() {
xterm.wraparoundMode = true;
xterm.write(Array(100).join('e\u0301'));
for (var i=0; i<xterm.cols; ++i) {
- var tchar = xterm.lines[0][i];
+ var tchar = xterm.lines.get(0)[i];
expect(tchar[1]).eql('e\u0301');
expect(tchar[1].length).eql(2);
expect(tchar[2]).eql(1);
}
- tchar = xterm.lines[1][0];
+ tchar = xterm.lines.get(1)[0];
expect(tchar[1]).eql('e\u0301');
expect(tchar[1].length).eql(2);
expect(tchar[2]).eql(1);
xterm.wraparoundMode = true;
xterm.write(Array(100).join('\uD800\uDC00\u0301'));
for (var i=0; i<xterm.cols; ++i) {
- var tchar = xterm.lines[0][i];
+ var tchar = xterm.lines.get(0)[i];
expect(tchar[1]).eql('\uD800\uDC00\u0301');
expect(tchar[1].length).eql(3);
expect(tchar[2]).eql(1);
}
- tchar = xterm.lines[1][0];
+ tchar = xterm.lines.get(1)[0];
expect(tchar[1]).eql('\uD800\uDC00\u0301');
expect(tchar[1].length).eql(3);
expect(tchar[2]).eql(1);
xterm.wraparoundMode = true;
xterm.write(Array(50).join('¥'));
for (var i=0; i<xterm.cols; ++i) {
- var tchar = xterm.lines[0][i];
+ var tchar = xterm.lines.get(0)[i];
if (i % 2) {
expect(tchar[1]).eql('');
expect(tchar[1].length).eql(0);
expect(tchar[2]).eql(2);
}
}
- tchar = xterm.lines[1][0];
+ tchar = xterm.lines.get(1)[0];
expect(tchar[1]).eql('¥');
expect(tchar[1].length).eql(1);
expect(tchar[2]).eql(2);
xterm.x = 1;
xterm.write(Array(50).join('¥'));
for (var i=1; i<xterm.cols-1; ++i) {
- var tchar = xterm.lines[0][i];
+ var tchar = xterm.lines.get(0)[i];
if (!(i % 2)) {
expect(tchar[1]).eql('');
expect(tchar[1].length).eql(0);
expect(tchar[2]).eql(2);
}
}
- tchar = xterm.lines[0][xterm.cols-1];
+ tchar = xterm.lines.get(0)[xterm.cols-1];
expect(tchar[1]).eql(' ');
expect(tchar[1].length).eql(1);
expect(tchar[2]).eql(1);
- tchar = xterm.lines[1][0];
+ tchar = xterm.lines.get(1)[0];
expect(tchar[1]).eql('¥');
expect(tchar[1].length).eql(1);
expect(tchar[2]).eql(2);
xterm.x = 1;
xterm.write(Array(50).join('¥\u0301'));
for (var i=1; i<xterm.cols-1; ++i) {
- var tchar = xterm.lines[0][i];
+ var tchar = xterm.lines.get(0)[i];
if (!(i % 2)) {
expect(tchar[1]).eql('');
expect(tchar[1].length).eql(0);
expect(tchar[2]).eql(2);
}
}
- tchar = xterm.lines[0][xterm.cols-1];
+ tchar = xterm.lines.get(0)[xterm.cols-1];
expect(tchar[1]).eql(' ');
expect(tchar[1].length).eql(1);
expect(tchar[2]).eql(1);
- tchar = xterm.lines[1][0];
+ tchar = xterm.lines.get(1)[0];
expect(tchar[1]).eql('¥\u0301');
expect(tchar[1].length).eql(2);
expect(tchar[2]).eql(2);
xterm.wraparoundMode = true;
xterm.write(Array(50).join('¥\u0301'));
for (var i=0; i<xterm.cols; ++i) {
- var tchar = xterm.lines[0][i];
+ var tchar = xterm.lines.get(0)[i];
if (i % 2) {
expect(tchar[1]).eql('');
expect(tchar[1].length).eql(0);
expect(tchar[2]).eql(2);
}
}
- tchar = xterm.lines[1][0];
+ tchar = xterm.lines.get(1)[0];
expect(tchar[1]).eql('¥\u0301');
expect(tchar[1].length).eql(2);
expect(tchar[2]).eql(2);
xterm.x = 1;
xterm.write(Array(50).join('\ud843\ude6d\u0301'));
for (var i=1; i<xterm.cols-1; ++i) {
- var tchar = xterm.lines[0][i];
+ var tchar = xterm.lines.get(0)[i];
if (!(i % 2)) {
expect(tchar[1]).eql('');
expect(tchar[1].length).eql(0);
expect(tchar[2]).eql(2);
}
}
- tchar = xterm.lines[0][xterm.cols-1];
+ tchar = xterm.lines.get(0)[xterm.cols-1];
expect(tchar[1]).eql(' ');
expect(tchar[1].length).eql(1);
expect(tchar[2]).eql(1);
- tchar = xterm.lines[1][0];
+ tchar = xterm.lines.get(1)[0];
expect(tchar[1]).eql('\ud843\ude6d\u0301');
expect(tchar[1].length).eql(3);
expect(tchar[2]).eql(2);
xterm.wraparoundMode = true;
xterm.write(Array(50).join('\ud843\ude6d\u0301'));
for (var i=0; i<xterm.cols; ++i) {
- var tchar = xterm.lines[0][i];
+ var tchar = xterm.lines.get(0)[i];
if (i % 2) {
expect(tchar[1]).eql('');
expect(tchar[1].length).eql(0);
expect(tchar[2]).eql(2);
}
}
- tchar = xterm.lines[1][0];
+ tchar = xterm.lines.get(1)[0];
expect(tchar[1]).eql('\ud843\ude6d\u0301');
expect(tchar[1].length).eql(3);
expect(tchar[2]).eql(2);
xterm.y = 0;
xterm.insertMode = true;
xterm.write('abcde');
- expect(xterm.lines[0].length).eql(xterm.cols);
- expect(xterm.lines[0][10][1]).eql('a');
- expect(xterm.lines[0][14][1]).eql('e');
- expect(xterm.lines[0][15][1]).eql('0');
- expect(xterm.lines[0][79][1]).eql('4');
+ expect(xterm.lines.get(0).length).eql(xterm.cols);
+ expect(xterm.lines.get(0)[10][1]).eql('a');
+ expect(xterm.lines.get(0)[14][1]).eql('e');
+ expect(xterm.lines.get(0)[15][1]).eql('0');
+ expect(xterm.lines.get(0)[79][1]).eql('4');
});
it('fullwidth - insert', function() {
xterm.write(Array(9).join('0123456789').slice(-80));
xterm.y = 0;
xterm.insertMode = true;
xterm.write('¥¥¥');
- expect(xterm.lines[0].length).eql(xterm.cols);
- expect(xterm.lines[0][10][1]).eql('¥');
- expect(xterm.lines[0][11][1]).eql('');
- expect(xterm.lines[0][14][1]).eql('¥');
- expect(xterm.lines[0][15][1]).eql('');
- expect(xterm.lines[0][79][1]).eql('3');
+ expect(xterm.lines.get(0).length).eql(xterm.cols);
+ expect(xterm.lines.get(0)[10][1]).eql('¥');
+ expect(xterm.lines.get(0)[11][1]).eql('');
+ expect(xterm.lines.get(0)[14][1]).eql('¥');
+ expect(xterm.lines.get(0)[15][1]).eql('');
+ expect(xterm.lines.get(0)[79][1]).eql('3');
});
it('fullwidth - right border', function() {
xterm.write(Array(41).join('¥'));
xterm.y = 0;
xterm.insertMode = true;
xterm.write('a');
- expect(xterm.lines[0].length).eql(xterm.cols);
- expect(xterm.lines[0][10][1]).eql('a');
- expect(xterm.lines[0][11][1]).eql('¥');
- expect(xterm.lines[0][79][1]).eql(' '); // fullwidth char got replaced
+ expect(xterm.lines.get(0).length).eql(xterm.cols);
+ expect(xterm.lines.get(0)[10][1]).eql('a');
+ expect(xterm.lines.get(0)[11][1]).eql('¥');
+ expect(xterm.lines.get(0)[79][1]).eql(' '); // fullwidth char got replaced
xterm.write('b');
- expect(xterm.lines[0].length).eql(xterm.cols);
- expect(xterm.lines[0][11][1]).eql('b');
- expect(xterm.lines[0][12][1]).eql('¥');
- expect(xterm.lines[0][79][1]).eql(''); // empty cell after fullwidth
+ expect(xterm.lines.get(0).length).eql(xterm.cols);
+ expect(xterm.lines.get(0)[11][1]).eql('b');
+ expect(xterm.lines.get(0)[12][1]).eql('¥');
+ expect(xterm.lines.get(0)[79][1]).eql(''); // empty cell after fullwidth
});
});
});