@inst/vscode-bin-darwin
Version:
BINARY ONLY - VSCode binary deployment for macOS
868 lines (867 loc) • 55.3 kB
JavaScript
"use strict";
var __extends = (this && this.__extends) || (function () {
var extendStatics = Object.setPrototypeOf ||
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
return function (d, b) {
extendStatics(d, b);
function __() { this.constructor = d; }
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
};
})();
Object.defineProperty(exports, "__esModule", { value: true });
var chai_1 = require("chai");
var Terminal_1 = require("./Terminal");
var TestUtils_test_1 = require("./utils/TestUtils.test");
var Buffer_1 = require("./Buffer");
var INIT_COLS = 80;
var INIT_ROWS = 24;
var TestTerminal = (function (_super) {
__extends(TestTerminal, _super);
function TestTerminal() {
return _super !== null && _super.apply(this, arguments) || this;
}
TestTerminal.prototype.evaluateKeyEscapeSequence = function (ev) { return this._evaluateKeyEscapeSequence(ev); };
TestTerminal.prototype.keyDown = function (ev) { return this._keyDown(ev); };
TestTerminal.prototype.keyPress = function (ev) { return this._keyPress(ev); };
return TestTerminal;
}(Terminal_1.Terminal));
describe('term.js addons', function () {
var term;
beforeEach(function () {
term = new TestTerminal({
cols: INIT_COLS,
rows: INIT_ROWS
});
term.refresh = function () { };
term.renderer = new TestUtils_test_1.MockRenderer();
term.viewport = new TestUtils_test_1.MockViewport();
term.compositionHelper = new TestUtils_test_1.MockCompositionHelper();
term.write = function (data) {
term.writeBuffer.push(data);
term.innerWrite();
};
term.element = {
classList: {
toggle: function () { },
remove: function () { }
}
};
});
it('should load addons with Terminal.loadAddon', function () {
Terminal_1.Terminal.loadAddon('attach');
chai_1.assert.equal(typeof Terminal_1.Terminal.prototype.attach, 'function');
});
describe('getOption', function () {
it('should retrieve the option correctly', function () {
term.options.cursorBlink = true;
chai_1.assert.equal(term.getOption('cursorBlink'), true);
delete term.options.cursorBlink;
term.options.cursorBlink = false;
chai_1.assert.equal(term.getOption('cursorBlink'), false);
});
it('should throw when retrieving a non-existant option', function () {
chai_1.assert.throws(term.getOption.bind(term, 'fake', true));
});
});
describe('attachCustomKeyEventHandler', function () {
var evKeyDown = {
preventDefault: function () { },
stopPropagation: function () { },
type: 'keydown',
keyCode: 77
};
var evKeyPress = {
preventDefault: function () { },
stopPropagation: function () { },
type: 'keypress',
keyCode: 77
};
beforeEach(function () {
term.handler = function () { };
term.showCursor = function () { };
term.clearSelection = function () { };
});
it('should process the keydown/keypress event based on what the handler returns', function () {
chai_1.assert.equal(term.keyDown(evKeyDown), true);
chai_1.assert.equal(term.keyPress(evKeyPress), true);
term.attachCustomKeyEventHandler(function (ev) { return ev.keyCode === 77; });
chai_1.assert.equal(term.keyDown(evKeyDown), true);
chai_1.assert.equal(term.keyPress(evKeyPress), true);
term.attachCustomKeyEventHandler(function (ev) { return ev.keyCode !== 77; });
chai_1.assert.equal(term.keyDown(evKeyDown), false);
chai_1.assert.equal(term.keyPress(evKeyPress), false);
});
it('should alive after reset(ESC c Full Reset (RIS))', function () {
term.attachCustomKeyEventHandler(function (ev) { return ev.keyCode !== 77; });
chai_1.assert.equal(term.keyDown(evKeyDown), false);
chai_1.assert.equal(term.keyPress(evKeyPress), false);
term.reset();
chai_1.assert.equal(term.keyDown(evKeyDown), false);
chai_1.assert.equal(term.keyPress(evKeyPress), false);
});
});
describe('setOption', function () {
it('should set the option correctly', function () {
term.setOption('cursorBlink', true);
chai_1.assert.equal(term.options.cursorBlink, true);
term.setOption('cursorBlink', false);
chai_1.assert.equal(term.options.cursorBlink, false);
});
it('should throw when setting a non-existant option', function () {
chai_1.assert.throws(term.setOption.bind(term, 'fake', true));
});
});
describe('clear', function () {
it('should clear a buffer equal to rows', function () {
var promptLine = term.buffer.lines.get(term.buffer.ybase + term.buffer.y);
term.clear();
chai_1.assert.equal(term.buffer.y, 0);
chai_1.assert.equal(term.buffer.ybase, 0);
chai_1.assert.equal(term.buffer.ydisp, 0);
chai_1.assert.equal(term.buffer.lines.length, term.rows);
chai_1.assert.deepEqual(term.buffer.lines.get(0), promptLine);
for (var i = 1; i < term.rows; i++) {
chai_1.assert.deepEqual(term.buffer.lines.get(i), term.blankLine());
}
});
it('should clear a buffer larger than rows', function () {
for (var i = 0; i < term.rows * 2; i++) {
term.write('test\n');
}
var promptLine = term.buffer.lines.get(term.buffer.ybase + term.buffer.y);
term.clear();
chai_1.assert.equal(term.buffer.y, 0);
chai_1.assert.equal(term.buffer.ybase, 0);
chai_1.assert.equal(term.buffer.ydisp, 0);
chai_1.assert.equal(term.buffer.lines.length, term.rows);
chai_1.assert.deepEqual(term.buffer.lines.get(0), promptLine);
for (var i = 1; i < term.rows; i++) {
chai_1.assert.deepEqual(term.buffer.lines.get(i), term.blankLine());
}
});
it('should not break the prompt when cleared twice', function () {
var promptLine = term.buffer.lines.get(term.buffer.ybase + term.buffer.y);
term.clear();
term.clear();
chai_1.assert.equal(term.buffer.y, 0);
chai_1.assert.equal(term.buffer.ybase, 0);
chai_1.assert.equal(term.buffer.ydisp, 0);
chai_1.assert.equal(term.buffer.lines.length, term.rows);
chai_1.assert.deepEqual(term.buffer.lines.get(0), promptLine);
for (var i = 1; i < term.rows; i++) {
chai_1.assert.deepEqual(term.buffer.lines.get(i), term.blankLine());
}
});
});
describe('scroll', function () {
describe('scrollDisp', function () {
var startYDisp;
beforeEach(function () {
for (var i = 0; i < term.rows * 2; i++) {
term.writeln('test');
}
startYDisp = term.rows + 1;
});
it('should scroll a single line', function () {
chai_1.assert.equal(term.buffer.ydisp, startYDisp);
term.scrollDisp(-1);
chai_1.assert.equal(term.buffer.ydisp, startYDisp - 1);
term.scrollDisp(1);
chai_1.assert.equal(term.buffer.ydisp, startYDisp);
});
it('should scroll multiple lines', function () {
chai_1.assert.equal(term.buffer.ydisp, startYDisp);
term.scrollDisp(-5);
chai_1.assert.equal(term.buffer.ydisp, startYDisp - 5);
term.scrollDisp(5);
chai_1.assert.equal(term.buffer.ydisp, startYDisp);
});
it('should not scroll beyond the bounds of the buffer', function () {
chai_1.assert.equal(term.buffer.ydisp, startYDisp);
term.scrollDisp(1);
chai_1.assert.equal(term.buffer.ydisp, startYDisp);
for (var i = 0; i < startYDisp; i++) {
term.scrollDisp(-1);
}
chai_1.assert.equal(term.buffer.ydisp, 0);
term.scrollDisp(-1);
chai_1.assert.equal(term.buffer.ydisp, 0);
});
});
describe('scrollPages', function () {
var startYDisp;
beforeEach(function () {
for (var i = 0; i < term.rows * 3; i++) {
term.writeln('test');
}
startYDisp = (term.rows * 2) + 1;
});
it('should scroll a single page', function () {
chai_1.assert.equal(term.buffer.ydisp, startYDisp);
term.scrollPages(-1);
chai_1.assert.equal(term.buffer.ydisp, startYDisp - (term.rows - 1));
term.scrollPages(1);
chai_1.assert.equal(term.buffer.ydisp, startYDisp);
});
it('should scroll a multiple pages', function () {
chai_1.assert.equal(term.buffer.ydisp, startYDisp);
term.scrollPages(-2);
chai_1.assert.equal(term.buffer.ydisp, startYDisp - (term.rows - 1) * 2);
term.scrollPages(2);
chai_1.assert.equal(term.buffer.ydisp, startYDisp);
});
});
describe('scrollToTop', function () {
beforeEach(function () {
for (var i = 0; i < term.rows * 3; i++) {
term.writeln('test');
}
});
it('should scroll to the top', function () {
chai_1.assert.notEqual(term.buffer.ydisp, 0);
term.scrollToTop();
chai_1.assert.equal(term.buffer.ydisp, 0);
});
});
describe('scrollToBottom', function () {
var startYDisp;
beforeEach(function () {
for (var i = 0; i < term.rows * 3; i++) {
term.writeln('test');
}
startYDisp = (term.rows * 2) + 1;
});
it('should scroll to the bottom', function () {
term.scrollDisp(-1);
term.scrollToBottom();
chai_1.assert.equal(term.buffer.ydisp, startYDisp);
term.scrollPages(-1);
term.scrollToBottom();
chai_1.assert.equal(term.buffer.ydisp, startYDisp);
term.scrollToTop();
term.scrollToBottom();
chai_1.assert.equal(term.buffer.ydisp, startYDisp);
});
});
describe('keyDown', function () {
it('should scroll down, when a key is pressed and terminal is scrolled up', function () {
term._evaluateKeyEscapeSequence = function () {
return { key: 'a' };
};
var event = {
type: 'keydown',
keyCode: 0,
preventDefault: function () { },
stopPropagation: function () { }
};
term.buffer.ydisp = 0;
term.buffer.ybase = 40;
term.keyDown(event);
chai_1.assert.equal(term.buffer.ydisp, term.buffer.ybase);
});
it('should not scroll down, when a custom keydown handler prevents the event', function () {
for (var i = 0; i < term.rows * 3; i++) {
term.writeln('test');
}
var startYDisp = (term.rows * 2) + 1;
term.attachCustomKeyEventHandler(function () {
return false;
});
chai_1.assert.equal(term.buffer.ydisp, startYDisp);
term.scrollDisp(-1);
chai_1.assert.equal(term.buffer.ydisp, startYDisp - 1);
term.keyDown({ keyCode: 0 });
chai_1.assert.equal(term.buffer.ydisp, startYDisp - 1);
});
});
describe('scroll() function', function () {
describe('when scrollback > 0', function () {
it('should create a new line and scroll', function () {
term.buffer.lines.get(0)[0][Buffer_1.CHAR_DATA_CHAR_INDEX] = 'a';
term.buffer.lines.get(INIT_ROWS - 1)[0][Buffer_1.CHAR_DATA_CHAR_INDEX] = 'b';
term.buffer.y = INIT_ROWS - 1;
term.scroll();
chai_1.assert.equal(term.buffer.lines.length, INIT_ROWS + 1);
chai_1.assert.equal(term.buffer.lines.get(0)[0][Buffer_1.CHAR_DATA_CHAR_INDEX], 'a');
chai_1.assert.equal(term.buffer.lines.get(INIT_ROWS - 1)[0][Buffer_1.CHAR_DATA_CHAR_INDEX], 'b');
chai_1.assert.equal(term.buffer.lines.get(INIT_ROWS)[0][Buffer_1.CHAR_DATA_CHAR_INDEX], ' ');
});
it('should properly scroll inside a scroll region (scrollTop set)', function () {
term.buffer.lines.get(0)[0][Buffer_1.CHAR_DATA_CHAR_INDEX] = 'a';
term.buffer.lines.get(1)[0][Buffer_1.CHAR_DATA_CHAR_INDEX] = 'b';
term.buffer.lines.get(2)[0][Buffer_1.CHAR_DATA_CHAR_INDEX] = 'c';
term.buffer.y = INIT_ROWS - 1;
term.buffer.scrollTop = 1;
term.scroll();
chai_1.assert.equal(term.buffer.lines.length, INIT_ROWS);
chai_1.assert.equal(term.buffer.lines.get(0)[0][Buffer_1.CHAR_DATA_CHAR_INDEX], 'a');
chai_1.assert.equal(term.buffer.lines.get(1)[0][Buffer_1.CHAR_DATA_CHAR_INDEX], 'c');
});
it('should properly scroll inside a scroll region (scrollBottom set)', function () {
term.buffer.lines.get(0)[0][Buffer_1.CHAR_DATA_CHAR_INDEX] = 'a';
term.buffer.lines.get(1)[0][Buffer_1.CHAR_DATA_CHAR_INDEX] = 'b';
term.buffer.lines.get(2)[0][Buffer_1.CHAR_DATA_CHAR_INDEX] = 'c';
term.buffer.lines.get(3)[0][Buffer_1.CHAR_DATA_CHAR_INDEX] = 'd';
term.buffer.lines.get(4)[0][Buffer_1.CHAR_DATA_CHAR_INDEX] = 'e';
term.buffer.y = 3;
term.buffer.scrollBottom = 3;
term.scroll();
chai_1.assert.equal(term.buffer.lines.length, INIT_ROWS + 1);
chai_1.assert.equal(term.buffer.lines.get(0)[0][Buffer_1.CHAR_DATA_CHAR_INDEX], 'a', '\'a\' should be pushed to the scrollback');
chai_1.assert.equal(term.buffer.lines.get(1)[0][Buffer_1.CHAR_DATA_CHAR_INDEX], 'b');
chai_1.assert.equal(term.buffer.lines.get(2)[0][Buffer_1.CHAR_DATA_CHAR_INDEX], 'c');
chai_1.assert.equal(term.buffer.lines.get(3)[0][Buffer_1.CHAR_DATA_CHAR_INDEX], 'd');
chai_1.assert.equal(term.buffer.lines.get(4)[0][Buffer_1.CHAR_DATA_CHAR_INDEX], ' ', 'a blank line should be added at scrollBottom\'s index');
chai_1.assert.equal(term.buffer.lines.get(5)[0][Buffer_1.CHAR_DATA_CHAR_INDEX], 'e');
});
it('should properly scroll inside a scroll region (scrollTop and scrollBottom set)', function () {
term.buffer.lines.get(0)[0][Buffer_1.CHAR_DATA_CHAR_INDEX] = 'a';
term.buffer.lines.get(1)[0][Buffer_1.CHAR_DATA_CHAR_INDEX] = 'b';
term.buffer.lines.get(2)[0][Buffer_1.CHAR_DATA_CHAR_INDEX] = 'c';
term.buffer.lines.get(3)[0][Buffer_1.CHAR_DATA_CHAR_INDEX] = 'd';
term.buffer.lines.get(4)[0][Buffer_1.CHAR_DATA_CHAR_INDEX] = 'e';
term.buffer.y = INIT_ROWS - 1;
term.buffer.scrollTop = 1;
term.buffer.scrollBottom = 3;
term.scroll();
chai_1.assert.equal(term.buffer.lines.length, INIT_ROWS);
chai_1.assert.equal(term.buffer.lines.get(0)[0][Buffer_1.CHAR_DATA_CHAR_INDEX], 'a');
chai_1.assert.equal(term.buffer.lines.get(1)[0][Buffer_1.CHAR_DATA_CHAR_INDEX], 'c', '\'b\' should be removed from the buffer');
chai_1.assert.equal(term.buffer.lines.get(2)[0][Buffer_1.CHAR_DATA_CHAR_INDEX], 'd');
chai_1.assert.equal(term.buffer.lines.get(3)[0][Buffer_1.CHAR_DATA_CHAR_INDEX], ' ', 'a blank line should be added at scrollBottom\'s index');
chai_1.assert.equal(term.buffer.lines.get(4)[0][Buffer_1.CHAR_DATA_CHAR_INDEX], 'e');
});
});
describe('when scrollback === 0', function () {
beforeEach(function () {
term.setOption('scrollback', 0);
chai_1.assert.equal(term.buffer.lines.maxLength, INIT_ROWS);
});
it('should create a new line and shift everything up', function () {
term.buffer.lines.get(0)[0][Buffer_1.CHAR_DATA_CHAR_INDEX] = 'a';
term.buffer.lines.get(1)[0][Buffer_1.CHAR_DATA_CHAR_INDEX] = 'b';
term.buffer.lines.get(INIT_ROWS - 1)[0][Buffer_1.CHAR_DATA_CHAR_INDEX] = 'c';
term.buffer.y = INIT_ROWS - 1;
chai_1.assert.equal(term.buffer.lines.length, INIT_ROWS);
term.scroll();
chai_1.assert.equal(term.buffer.lines.length, INIT_ROWS);
chai_1.assert.equal(term.buffer.lines.get(0)[0][Buffer_1.CHAR_DATA_CHAR_INDEX], 'b');
chai_1.assert.equal(term.buffer.lines.get(1)[0][Buffer_1.CHAR_DATA_CHAR_INDEX], ' ');
chai_1.assert.equal(term.buffer.lines.get(INIT_ROWS - 2)[0][Buffer_1.CHAR_DATA_CHAR_INDEX], 'c');
chai_1.assert.equal(term.buffer.lines.get(INIT_ROWS - 1)[0][Buffer_1.CHAR_DATA_CHAR_INDEX], ' ');
});
it('should properly scroll inside a scroll region (scrollTop set)', function () {
term.buffer.lines.get(0)[0][Buffer_1.CHAR_DATA_CHAR_INDEX] = 'a';
term.buffer.lines.get(1)[0][Buffer_1.CHAR_DATA_CHAR_INDEX] = 'b';
term.buffer.lines.get(2)[0][Buffer_1.CHAR_DATA_CHAR_INDEX] = 'c';
term.buffer.y = INIT_ROWS - 1;
term.buffer.scrollTop = 1;
term.scroll();
chai_1.assert.equal(term.buffer.lines.length, INIT_ROWS);
chai_1.assert.equal(term.buffer.lines.get(0)[0][Buffer_1.CHAR_DATA_CHAR_INDEX], 'a');
chai_1.assert.equal(term.buffer.lines.get(1)[0][Buffer_1.CHAR_DATA_CHAR_INDEX], 'c');
});
it('should properly scroll inside a scroll region (scrollBottom set)', function () {
term.buffer.lines.get(0)[0][Buffer_1.CHAR_DATA_CHAR_INDEX] = 'a';
term.buffer.lines.get(1)[0][Buffer_1.CHAR_DATA_CHAR_INDEX] = 'b';
term.buffer.lines.get(2)[0][Buffer_1.CHAR_DATA_CHAR_INDEX] = 'c';
term.buffer.lines.get(3)[0][Buffer_1.CHAR_DATA_CHAR_INDEX] = 'd';
term.buffer.lines.get(4)[0][Buffer_1.CHAR_DATA_CHAR_INDEX] = 'e';
term.buffer.y = 3;
term.buffer.scrollBottom = 3;
term.scroll();
chai_1.assert.equal(term.buffer.lines.length, INIT_ROWS);
chai_1.assert.equal(term.buffer.lines.get(0)[0][Buffer_1.CHAR_DATA_CHAR_INDEX], 'b');
chai_1.assert.equal(term.buffer.lines.get(1)[0][Buffer_1.CHAR_DATA_CHAR_INDEX], 'c');
chai_1.assert.equal(term.buffer.lines.get(2)[0][Buffer_1.CHAR_DATA_CHAR_INDEX], 'd');
chai_1.assert.equal(term.buffer.lines.get(3)[0][Buffer_1.CHAR_DATA_CHAR_INDEX], ' ', 'a blank line should be added at scrollBottom\'s index');
chai_1.assert.equal(term.buffer.lines.get(4)[0][Buffer_1.CHAR_DATA_CHAR_INDEX], 'e');
});
it('should properly scroll inside a scroll region (scrollTop and scrollBottom set)', function () {
term.buffer.lines.get(0)[0][Buffer_1.CHAR_DATA_CHAR_INDEX] = 'a';
term.buffer.lines.get(1)[0][Buffer_1.CHAR_DATA_CHAR_INDEX] = 'b';
term.buffer.lines.get(2)[0][Buffer_1.CHAR_DATA_CHAR_INDEX] = 'c';
term.buffer.lines.get(3)[0][Buffer_1.CHAR_DATA_CHAR_INDEX] = 'd';
term.buffer.lines.get(4)[0][Buffer_1.CHAR_DATA_CHAR_INDEX] = 'e';
term.buffer.y = INIT_ROWS - 1;
term.buffer.scrollTop = 1;
term.buffer.scrollBottom = 3;
term.scroll();
chai_1.assert.equal(term.buffer.lines.length, INIT_ROWS);
chai_1.assert.equal(term.buffer.lines.get(0)[0][Buffer_1.CHAR_DATA_CHAR_INDEX], 'a');
chai_1.assert.equal(term.buffer.lines.get(1)[0][Buffer_1.CHAR_DATA_CHAR_INDEX], 'c', '\'b\' should be removed from the buffer');
chai_1.assert.equal(term.buffer.lines.get(2)[0][Buffer_1.CHAR_DATA_CHAR_INDEX], 'd');
chai_1.assert.equal(term.buffer.lines.get(3)[0][Buffer_1.CHAR_DATA_CHAR_INDEX], ' ', 'a blank line should be added at scrollBottom\'s index');
chai_1.assert.equal(term.buffer.lines.get(4)[0][Buffer_1.CHAR_DATA_CHAR_INDEX], 'e');
});
});
});
});
describe('evaluateKeyEscapeSequence', function () {
it('should return the correct escape sequence for unmodified keys', function () {
chai_1.assert.equal(term.evaluateKeyEscapeSequence({ keyCode: 8 }).key, '\x7f');
chai_1.assert.equal(term.evaluateKeyEscapeSequence({ keyCode: 9 }).key, '\t');
chai_1.assert.equal(term.evaluateKeyEscapeSequence({ keyCode: 13 }).key, '\r');
chai_1.assert.equal(term.evaluateKeyEscapeSequence({ keyCode: 27 }).key, '\x1b');
chai_1.assert.equal(term.evaluateKeyEscapeSequence({ keyCode: 33 }).key, '\x1b[5~');
chai_1.assert.equal(term.evaluateKeyEscapeSequence({ keyCode: 34 }).key, '\x1b[6~');
chai_1.assert.equal(term.evaluateKeyEscapeSequence({ keyCode: 35 }).key, '\x1b[F');
chai_1.assert.equal(term.evaluateKeyEscapeSequence({ keyCode: 36 }).key, '\x1b[H');
chai_1.assert.equal(term.evaluateKeyEscapeSequence({ keyCode: 37 }).key, '\x1b[D');
chai_1.assert.equal(term.evaluateKeyEscapeSequence({ keyCode: 38 }).key, '\x1b[A');
chai_1.assert.equal(term.evaluateKeyEscapeSequence({ keyCode: 39 }).key, '\x1b[C');
chai_1.assert.equal(term.evaluateKeyEscapeSequence({ keyCode: 40 }).key, '\x1b[B');
chai_1.assert.equal(term.evaluateKeyEscapeSequence({ keyCode: 45 }).key, '\x1b[2~');
chai_1.assert.equal(term.evaluateKeyEscapeSequence({ keyCode: 46 }).key, '\x1b[3~');
chai_1.assert.equal(term.evaluateKeyEscapeSequence({ keyCode: 112 }).key, '\x1bOP');
chai_1.assert.equal(term.evaluateKeyEscapeSequence({ keyCode: 113 }).key, '\x1bOQ');
chai_1.assert.equal(term.evaluateKeyEscapeSequence({ keyCode: 114 }).key, '\x1bOR');
chai_1.assert.equal(term.evaluateKeyEscapeSequence({ keyCode: 115 }).key, '\x1bOS');
chai_1.assert.equal(term.evaluateKeyEscapeSequence({ keyCode: 116 }).key, '\x1b[15~');
chai_1.assert.equal(term.evaluateKeyEscapeSequence({ keyCode: 117 }).key, '\x1b[17~');
chai_1.assert.equal(term.evaluateKeyEscapeSequence({ keyCode: 118 }).key, '\x1b[18~');
chai_1.assert.equal(term.evaluateKeyEscapeSequence({ keyCode: 119 }).key, '\x1b[19~');
chai_1.assert.equal(term.evaluateKeyEscapeSequence({ keyCode: 120 }).key, '\x1b[20~');
chai_1.assert.equal(term.evaluateKeyEscapeSequence({ keyCode: 121 }).key, '\x1b[21~');
chai_1.assert.equal(term.evaluateKeyEscapeSequence({ keyCode: 122 }).key, '\x1b[23~');
chai_1.assert.equal(term.evaluateKeyEscapeSequence({ keyCode: 123 }).key, '\x1b[24~');
});
it('should return \\x1b[3;5~ for ctrl+delete', function () {
chai_1.assert.equal(term.evaluateKeyEscapeSequence({ ctrlKey: true, keyCode: 46 }).key, '\x1b[3;5~');
});
it('should return \\x1b[3;2~ for shift+delete', function () {
chai_1.assert.equal(term.evaluateKeyEscapeSequence({ shiftKey: true, keyCode: 46 }).key, '\x1b[3;2~');
});
it('should return \\x1b[3;3~ for alt+delete', function () {
chai_1.assert.equal(term.evaluateKeyEscapeSequence({ altKey: true, keyCode: 46 }).key, '\x1b[3;3~');
});
it('should return \\x1b[5D for ctrl+left', function () {
chai_1.assert.equal(term.evaluateKeyEscapeSequence({ ctrlKey: true, keyCode: 37 }).key, '\x1b[1;5D');
});
it('should return \\x1b[5C for ctrl+right', function () {
chai_1.assert.equal(term.evaluateKeyEscapeSequence({ ctrlKey: true, keyCode: 39 }).key, '\x1b[1;5C');
});
it('should return \\x1b[5A for ctrl+up', function () {
chai_1.assert.equal(term.evaluateKeyEscapeSequence({ ctrlKey: true, keyCode: 38 }).key, '\x1b[1;5A');
});
it('should return \\x1b[5B for ctrl+down', function () {
chai_1.assert.equal(term.evaluateKeyEscapeSequence({ ctrlKey: true, keyCode: 40 }).key, '\x1b[1;5B');
});
describe('On non-macOS platforms', function () {
beforeEach(function () {
term.browser.isMac = false;
});
it('should return \\x1b[5D for alt+left', function () {
chai_1.assert.equal(term.evaluateKeyEscapeSequence({ altKey: true, keyCode: 37 }).key, '\x1b[1;5D');
});
it('should return \\x1b[5C for alt+right', function () {
chai_1.assert.equal(term.evaluateKeyEscapeSequence({ altKey: true, keyCode: 39 }).key, '\x1b[1;5C');
});
});
describe('On macOS platforms', function () {
beforeEach(function () {
term.browser.isMac = true;
});
it('should return \\x1bb for alt+left', function () {
chai_1.assert.equal(term.evaluateKeyEscapeSequence({ altKey: true, keyCode: 37 }).key, '\x1bb');
});
it('should return \\x1bf for alt+right', function () {
chai_1.assert.equal(term.evaluateKeyEscapeSequence({ altKey: true, keyCode: 39 }).key, '\x1bf');
});
});
it('should return \\x1b[5A for alt+up', function () {
chai_1.assert.equal(term.evaluateKeyEscapeSequence({ altKey: true, keyCode: 38 }).key, '\x1b[1;5A');
});
it('should return \\x1b[5B for alt+down', function () {
chai_1.assert.equal(term.evaluateKeyEscapeSequence({ altKey: true, keyCode: 40 }).key, '\x1b[1;5B');
});
it('should return the correct escape sequence for modified F1-F12 keys', function () {
chai_1.assert.equal(term.evaluateKeyEscapeSequence({ shiftKey: true, keyCode: 112 }).key, '\x1b[1;2P');
chai_1.assert.equal(term.evaluateKeyEscapeSequence({ shiftKey: true, keyCode: 113 }).key, '\x1b[1;2Q');
chai_1.assert.equal(term.evaluateKeyEscapeSequence({ shiftKey: true, keyCode: 114 }).key, '\x1b[1;2R');
chai_1.assert.equal(term.evaluateKeyEscapeSequence({ shiftKey: true, keyCode: 115 }).key, '\x1b[1;2S');
chai_1.assert.equal(term.evaluateKeyEscapeSequence({ shiftKey: true, keyCode: 116 }).key, '\x1b[15;2~');
chai_1.assert.equal(term.evaluateKeyEscapeSequence({ shiftKey: true, keyCode: 117 }).key, '\x1b[17;2~');
chai_1.assert.equal(term.evaluateKeyEscapeSequence({ shiftKey: true, keyCode: 118 }).key, '\x1b[18;2~');
chai_1.assert.equal(term.evaluateKeyEscapeSequence({ shiftKey: true, keyCode: 119 }).key, '\x1b[19;2~');
chai_1.assert.equal(term.evaluateKeyEscapeSequence({ shiftKey: true, keyCode: 120 }).key, '\x1b[20;2~');
chai_1.assert.equal(term.evaluateKeyEscapeSequence({ shiftKey: true, keyCode: 121 }).key, '\x1b[21;2~');
chai_1.assert.equal(term.evaluateKeyEscapeSequence({ shiftKey: true, keyCode: 122 }).key, '\x1b[23;2~');
chai_1.assert.equal(term.evaluateKeyEscapeSequence({ shiftKey: true, keyCode: 123 }).key, '\x1b[24;2~');
chai_1.assert.equal(term.evaluateKeyEscapeSequence({ altKey: true, keyCode: 112 }).key, '\x1b[1;3P');
chai_1.assert.equal(term.evaluateKeyEscapeSequence({ altKey: true, keyCode: 113 }).key, '\x1b[1;3Q');
chai_1.assert.equal(term.evaluateKeyEscapeSequence({ altKey: true, keyCode: 114 }).key, '\x1b[1;3R');
chai_1.assert.equal(term.evaluateKeyEscapeSequence({ altKey: true, keyCode: 115 }).key, '\x1b[1;3S');
chai_1.assert.equal(term.evaluateKeyEscapeSequence({ altKey: true, keyCode: 116 }).key, '\x1b[15;3~');
chai_1.assert.equal(term.evaluateKeyEscapeSequence({ altKey: true, keyCode: 117 }).key, '\x1b[17;3~');
chai_1.assert.equal(term.evaluateKeyEscapeSequence({ altKey: true, keyCode: 118 }).key, '\x1b[18;3~');
chai_1.assert.equal(term.evaluateKeyEscapeSequence({ altKey: true, keyCode: 119 }).key, '\x1b[19;3~');
chai_1.assert.equal(term.evaluateKeyEscapeSequence({ altKey: true, keyCode: 120 }).key, '\x1b[20;3~');
chai_1.assert.equal(term.evaluateKeyEscapeSequence({ altKey: true, keyCode: 121 }).key, '\x1b[21;3~');
chai_1.assert.equal(term.evaluateKeyEscapeSequence({ altKey: true, keyCode: 122 }).key, '\x1b[23;3~');
chai_1.assert.equal(term.evaluateKeyEscapeSequence({ altKey: true, keyCode: 123 }).key, '\x1b[24;3~');
chai_1.assert.equal(term.evaluateKeyEscapeSequence({ ctrlKey: true, keyCode: 112 }).key, '\x1b[1;5P');
chai_1.assert.equal(term.evaluateKeyEscapeSequence({ ctrlKey: true, keyCode: 113 }).key, '\x1b[1;5Q');
chai_1.assert.equal(term.evaluateKeyEscapeSequence({ ctrlKey: true, keyCode: 114 }).key, '\x1b[1;5R');
chai_1.assert.equal(term.evaluateKeyEscapeSequence({ ctrlKey: true, keyCode: 115 }).key, '\x1b[1;5S');
chai_1.assert.equal(term.evaluateKeyEscapeSequence({ ctrlKey: true, keyCode: 116 }).key, '\x1b[15;5~');
chai_1.assert.equal(term.evaluateKeyEscapeSequence({ ctrlKey: true, keyCode: 117 }).key, '\x1b[17;5~');
chai_1.assert.equal(term.evaluateKeyEscapeSequence({ ctrlKey: true, keyCode: 118 }).key, '\x1b[18;5~');
chai_1.assert.equal(term.evaluateKeyEscapeSequence({ ctrlKey: true, keyCode: 119 }).key, '\x1b[19;5~');
chai_1.assert.equal(term.evaluateKeyEscapeSequence({ ctrlKey: true, keyCode: 120 }).key, '\x1b[20;5~');
chai_1.assert.equal(term.evaluateKeyEscapeSequence({ ctrlKey: true, keyCode: 121 }).key, '\x1b[21;5~');
chai_1.assert.equal(term.evaluateKeyEscapeSequence({ ctrlKey: true, keyCode: 122 }).key, '\x1b[23;5~');
chai_1.assert.equal(term.evaluateKeyEscapeSequence({ ctrlKey: true, keyCode: 123 }).key, '\x1b[24;5~');
});
});
describe('Third level shift', function () {
var evKeyDown;
var evKeyPress;
beforeEach(function () {
term.handler = function () { };
term.showCursor = function () { };
term.clearSelection = function () { };
evKeyDown = {
preventDefault: function () { },
stopPropagation: function () { },
type: 'keydown',
altKey: null,
keyCode: null
};
evKeyPress = {
preventDefault: function () { },
stopPropagation: function () { },
type: 'keypress',
altKey: null,
charCode: null,
keyCode: null
};
});
describe('On Mac OS', function () {
beforeEach(function () {
term.browser.isMac = true;
});
it('should not interfere with the alt key on keyDown', function () {
evKeyDown.altKey = true;
evKeyDown.keyCode = 81;
chai_1.assert.equal(term.keyDown(evKeyDown), true);
evKeyDown.altKey = true;
evKeyDown.keyCode = 192;
chai_1.assert.equal(term.keyDown(evKeyDown), true);
});
it('should interefere with the alt + arrow keys', function () {
evKeyDown.altKey = true;
evKeyDown.keyCode = 37;
chai_1.assert.equal(term.keyDown(evKeyDown), false);
evKeyDown.altKey = true;
evKeyDown.keyCode = 39;
chai_1.assert.equal(term.keyDown(evKeyDown), false);
});
it('should emit key with alt + key on keyPress', function (done) {
var keys = ['@', '@', '\\', '\\', '|', '|'];
term.on('keypress', function (key) {
if (key) {
var index = keys.indexOf(key);
chai_1.assert(index !== -1, 'Emitted wrong key: ' + key);
keys.splice(index, 1);
}
if (keys.length === 0)
done();
});
evKeyPress.altKey = true;
evKeyPress.charCode = null;
evKeyPress.keyCode = 64;
term.keyPress(evKeyPress);
evKeyPress.charCode = 64;
evKeyPress.keyCode = 0;
term.keyPress(evKeyPress);
evKeyPress.charCode = null;
evKeyPress.keyCode = 92;
term.keyPress(evKeyPress);
evKeyPress.charCode = 92;
evKeyPress.keyCode = 0;
term.keyPress(evKeyPress);
evKeyPress.charCode = null;
evKeyPress.keyCode = 124;
term.keyPress(evKeyPress);
evKeyPress.charCode = 124;
evKeyPress.keyCode = 0;
term.keyPress(evKeyPress);
});
});
describe('On MS Windows', function () {
beforeEach(function () {
term.browser.isMSWindows = true;
});
it('should not interfere with the alt + ctrl key on keyDown', function () {
evKeyPress.altKey = true;
evKeyPress.ctrlKey = true;
evKeyPress.keyCode = 81;
chai_1.assert.equal(term.keyDown(evKeyPress), true);
evKeyDown.altKey = true;
evKeyDown.ctrlKey = true;
evKeyDown.keyCode = 81;
chai_1.assert.equal(term.keyDown(evKeyDown), true);
});
it('should interefere with the alt + ctrl + arrow keys', function () {
evKeyDown.altKey = true;
evKeyDown.ctrlKey = true;
evKeyDown.keyCode = 37;
chai_1.assert.equal(term.keyDown(evKeyDown), false);
evKeyDown.keyCode = 39;
chai_1.assert.equal(term.keyDown(evKeyDown), false);
});
it('should emit key with alt + ctrl + key on keyPress', function (done) {
var keys = ['@', '@', '\\', '\\', '|', '|'];
term.on('keypress', function (key) {
if (key) {
var index = keys.indexOf(key);
chai_1.assert(index !== -1, 'Emitted wrong key: ' + key);
keys.splice(index, 1);
}
if (keys.length === 0)
done();
});
evKeyPress.altKey = true;
evKeyPress.ctrlKey = true;
evKeyPress.charCode = null;
evKeyPress.keyCode = 64;
term.keyPress(evKeyPress);
evKeyPress.charCode = 64;
evKeyPress.keyCode = 0;
term.keyPress(evKeyPress);
evKeyPress.charCode = null;
evKeyPress.keyCode = 92;
term.keyPress(evKeyPress);
evKeyPress.charCode = 92;
evKeyPress.keyCode = 0;
term.keyPress(evKeyPress);
evKeyPress.charCode = null;
evKeyPress.keyCode = 124;
term.keyPress(evKeyPress);
evKeyPress.charCode = 124;
evKeyPress.keyCode = 0;
term.keyPress(evKeyPress);
});
});
});
describe('unicode - surrogates', function () {
it('2 characters per cell', function () {
this.timeout(10000);
var high = String.fromCharCode(0xD800);
for (var i = 0xDC00; i <= 0xDCFF; ++i) {
term.write(high + String.fromCharCode(i));
var tchar = term.buffer.lines.get(0)[0];
chai_1.expect(tchar[Buffer_1.CHAR_DATA_CHAR_INDEX]).eql(high + String.fromCharCode(i));
chai_1.expect(tchar[Buffer_1.CHAR_DATA_CHAR_INDEX].length).eql(2);
chai_1.expect(tchar[Buffer_1.CHAR_DATA_WIDTH_INDEX]).eql(1);
chai_1.expect(term.buffer.lines.get(0)[1][Buffer_1.CHAR_DATA_CHAR_INDEX]).eql(' ');
term.reset();
}
});
it('2 characters at last cell', function () {
var high = String.fromCharCode(0xD800);
for (var i = 0xDC00; i <= 0xDCFF; ++i) {
term.buffer.x = term.cols - 1;
term.write(high + String.fromCharCode(i));
chai_1.expect(term.buffer.lines.get(0)[term.buffer.x - 1][Buffer_1.CHAR_DATA_CHAR_INDEX]).eql(high + String.fromCharCode(i));
chai_1.expect(term.buffer.lines.get(0)[term.buffer.x - 1][Buffer_1.CHAR_DATA_CHAR_INDEX].length).eql(2);
chai_1.expect(term.buffer.lines.get(1)[0][Buffer_1.CHAR_DATA_CHAR_INDEX]).eql(' ');
term.reset();
}
});
it('2 characters per cell over line end with autowrap', function () {
var high = String.fromCharCode(0xD800);
for (var i = 0xDC00; i <= 0xDCFF; ++i) {
term.buffer.x = term.cols - 1;
term.wraparoundMode = true;
term.write('a' + high + String.fromCharCode(i));
chai_1.expect(term.buffer.lines.get(0)[term.cols - 1][Buffer_1.CHAR_DATA_CHAR_INDEX]).eql('a');
chai_1.expect(term.buffer.lines.get(1)[0][Buffer_1.CHAR_DATA_CHAR_INDEX]).eql(high + String.fromCharCode(i));
chai_1.expect(term.buffer.lines.get(1)[0][Buffer_1.CHAR_DATA_CHAR_INDEX].length).eql(2);
chai_1.expect(term.buffer.lines.get(1)[1][Buffer_1.CHAR_DATA_CHAR_INDEX]).eql(' ');
term.reset();
}
});
it('2 characters per cell over line end without autowrap', function () {
var high = String.fromCharCode(0xD800);
for (var i = 0xDC00; i <= 0xDCFF; ++i) {
term.buffer.x = term.cols - 1;
term.wraparoundMode = false;
term.write('a' + high + String.fromCharCode(i));
chai_1.expect(term.buffer.lines.get(0)[term.cols - 1][Buffer_1.CHAR_DATA_CHAR_INDEX]).eql('a');
chai_1.expect(term.buffer.lines.get(0)[term.cols - 1][Buffer_1.CHAR_DATA_CHAR_INDEX].length).eql(1);
chai_1.expect(term.buffer.lines.get(1)[1][Buffer_1.CHAR_DATA_CHAR_INDEX]).eql(' ');
term.reset();
}
});
it('splitted surrogates', function () {
var high = String.fromCharCode(0xD800);
for (var i = 0xDC00; i <= 0xDCFF; ++i) {
term.write(high);
term.write(String.fromCharCode(i));
var tchar = term.buffer.lines.get(0)[0];
chai_1.expect(tchar[Buffer_1.CHAR_DATA_CHAR_INDEX]).eql(high + String.fromCharCode(i));
chai_1.expect(tchar[Buffer_1.CHAR_DATA_CHAR_INDEX].length).eql(2);
chai_1.expect(tchar[Buffer_1.CHAR_DATA_WIDTH_INDEX]).eql(1);
chai_1.expect(term.buffer.lines.get(0)[1][Buffer_1.CHAR_DATA_CHAR_INDEX]).eql(' ');
term.reset();
}
});
});
describe('unicode - combining characters', function () {
it('café', function () {
term.write('cafe\u0301');
chai_1.expect(term.buffer.lines.get(0)[3][Buffer_1.CHAR_DATA_CHAR_INDEX]).eql('e\u0301');
chai_1.expect(term.buffer.lines.get(0)[3][Buffer_1.CHAR_DATA_CHAR_INDEX].length).eql(2);
chai_1.expect(term.buffer.lines.get(0)[3][Buffer_1.CHAR_DATA_WIDTH_INDEX]).eql(1);
});
it('café - end of line', function () {
term.buffer.x = term.cols - 1 - 3;
term.write('cafe\u0301');
chai_1.expect(term.buffer.lines.get(0)[term.cols - 1][Buffer_1.CHAR_DATA_CHAR_INDEX]).eql('e\u0301');
chai_1.expect(term.buffer.lines.get(0)[term.cols - 1][Buffer_1.CHAR_DATA_CHAR_INDEX].length).eql(2);
chai_1.expect(term.buffer.lines.get(0)[term.cols - 1][Buffer_1.CHAR_DATA_WIDTH_INDEX]).eql(1);
chai_1.expect(term.buffer.lines.get(0)[1][Buffer_1.CHAR_DATA_CHAR_INDEX]).eql(' ');
chai_1.expect(term.buffer.lines.get(0)[1][Buffer_1.CHAR_DATA_CHAR_INDEX].length).eql(1);
chai_1.expect(term.buffer.lines.get(0)[1][Buffer_1.CHAR_DATA_WIDTH_INDEX]).eql(1);
});
it('multiple combined é', function () {
term.wraparoundMode = true;
term.write(Array(100).join('e\u0301'));
for (var i = 0; i < term.cols; ++i) {
var tchar_1 = term.buffer.lines.get(0)[i];
chai_1.expect(tchar_1[Buffer_1.CHAR_DATA_CHAR_INDEX]).eql('e\u0301');
chai_1.expect(tchar_1[Buffer_1.CHAR_DATA_CHAR_INDEX].length).eql(2);
chai_1.expect(tchar_1[Buffer_1.CHAR_DATA_WIDTH_INDEX]).eql(1);
}
var tchar = term.buffer.lines.get(1)[0];
chai_1.expect(tchar[Buffer_1.CHAR_DATA_CHAR_INDEX]).eql('e\u0301');
chai_1.expect(tchar[Buffer_1.CHAR_DATA_CHAR_INDEX].length).eql(2);
chai_1.expect(tchar[Buffer_1.CHAR_DATA_WIDTH_INDEX]).eql(1);
});
it('multiple surrogate with combined', function () {
term.wraparoundMode = true;
term.write(Array(100).join('\uD800\uDC00\u0301'));
for (var i = 0; i < term.cols; ++i) {
var tchar_2 = term.buffer.lines.get(0)[i];
chai_1.expect(tchar_2[Buffer_1.CHAR_DATA_CHAR_INDEX]).eql('\uD800\uDC00\u0301');
chai_1.expect(tchar_2[Buffer_1.CHAR_DATA_CHAR_INDEX].length).eql(3);
chai_1.expect(tchar_2[Buffer_1.CHAR_DATA_WIDTH_INDEX]).eql(1);
}
var tchar = term.buffer.lines.get(1)[0];
chai_1.expect(tchar[Buffer_1.CHAR_DATA_CHAR_INDEX]).eql('\uD800\uDC00\u0301');
chai_1.expect(tchar[Buffer_1.CHAR_DATA_CHAR_INDEX].length).eql(3);
chai_1.expect(tchar[Buffer_1.CHAR_DATA_WIDTH_INDEX]).eql(1);
});
});
describe('unicode - fullwidth characters', function () {
it('cursor movement even', function () {
chai_1.expect(term.buffer.x).eql(0);
term.write('¥');
chai_1.expect(term.buffer.x).eql(2);
});
it('cursor movement odd', function () {
term.buffer.x = 1;
chai_1.expect(term.buffer.x).eql(1);
term.write('¥');
chai_1.expect(term.buffer.x).eql(3);
});
it('line of ¥ even', function () {
term.wraparoundMode = true;
term.write(Array(50).join('¥'));
for (var i = 0; i < term.cols; ++i) {
var tchar_3 = term.buffer.lines.get(0)[i];
if (i % 2) {
chai_1.expect(tchar_3[Buffer_1.CHAR_DATA_CHAR_INDEX]).eql('');
chai_1.expect(tchar_3[Buffer_1.CHAR_DATA_CHAR_INDEX].length).eql(0);
chai_1.expect(tchar_3[Buffer_1.CHAR_DATA_WIDTH_INDEX]).eql(0);
}
else {
chai_1.expect(tchar_3[Buffer_1.CHAR_DATA_CHAR_INDEX]).eql('¥');
chai_1.expect(tchar_3[Buffer_1.CHAR_DATA_CHAR_INDEX].length).eql(1);
chai_1.expect(tchar_3[Buffer_1.CHAR_DATA_WIDTH_INDEX]).eql(2);
}
}
var tchar = term.buffer.lines.get(1)[0];
chai_1.expect(tchar[Buffer_1.CHAR_DATA_CHAR_INDEX]).eql('¥');
chai_1.expect(tchar[Buffer_1.CHAR_DATA_CHAR_INDEX].length).eql(1);
chai_1.expect(tchar[Buffer_1.CHAR_DATA_WIDTH_INDEX]).eql(2);
});
it('line of ¥ odd', function () {
term.wraparoundMode = true;
term.buffer.x = 1;
term.write(Array(50).join('¥'));
for (var i = 1; i < term.cols - 1; ++i) {
var tchar_4 = term.buffer.lines.get(0)[i];
if (!(i % 2)) {
chai_1.expect(tchar_4[Buffer_1.CHAR_DATA_CHAR_INDEX]).eql('');
chai_1.expect(tchar_4[Buffer_1.CHAR_DATA_CHAR_INDEX].length).eql(0);
chai_1.expect(tchar_4[Buffer_1.CHAR_DATA_WIDTH_INDEX]).eql(0);
}
else {
chai_1.expect(tchar_4[Buffer_1.CHAR_DATA_CHAR_INDEX]).eql('¥');
chai_1.expect(tchar_4[Buffer_1.CHAR_DATA_CHAR_INDEX].length).eql(1);
chai_1.expect(tchar_4[Buffer_1.CHAR_DATA_WIDTH_INDEX]).eql(2);
}
}
var tchar = term.buffer.lines.get(0)[term.cols - 1];
chai_1.expect(tchar[Buffer_1.CHAR_DATA_CHAR_INDEX]).eql(' ');
chai_1.expect(tchar[Buffer_1.CHAR_DATA_CHAR_INDEX].length).eql(1);
chai_1.expect(tchar[Buffer_1.CHAR_DATA_WIDTH_INDEX]).eql(1);
tchar = term.buffer.lines.get(1)[0];
chai_1.expect(tchar[Buffer_1.CHAR_DATA_CHAR_INDEX]).eql('¥');
chai_1.expect(tchar[Buffer_1.CHAR_DATA_CHAR_INDEX].length).eql(1);
chai_1.expect(tchar[Buffer_1.CHAR_DATA_WIDTH_INDEX]).eql(2);
});
it('line of ¥ with combining odd', function () {
term.wraparoundMode = true;
term.buffer.x = 1;
term.write(Array(50).join('¥\u0301'));
for (var i = 1; i < term.cols - 1; ++i) {
var tchar_5 = term.buffer.lines.get(0)[i];
if (!(i % 2)) {
chai_1.expect(tchar_5[Buffer_1.CHAR_DATA_CHAR_INDEX]).eql('');
chai_1.expect(tchar_5[Buffer_1.CHAR_DATA_CHAR_INDEX].length).eql(0);
chai_1.expect(tchar_5[Buffer_1.CHAR_DATA_WIDTH_INDEX]).eql(0);
}
else {
chai_1.expect(tchar_5[Buffer_1.CHAR_DATA_CHAR_INDEX]).eql('¥\u0301');
chai_1.expect(tchar_5[Buffer_1.CHAR_DATA_CHAR_INDEX].length).eql(2);
chai_1.expect(tchar_5[Buffer_1.CHAR_DATA_WIDTH_INDEX]).eql(2);
}
}
var tchar = term.buffer.lines.get(0)[term.cols - 1];
chai_1.expect(tchar[Buffer_1.CHAR_DATA_CHAR_INDEX]).eql(' ');
chai_1.expect(tchar[Buffer_1.CHAR_DATA_CHAR_INDEX].length).eql(1);
chai_1.expect(tchar[Buffer_1.CHAR_DATA_WIDTH_INDEX]).eql(1);
tchar = term.buffer.lines.get(1)[0];
chai_1.expect(tchar[Buffer_1.CHAR_DATA_CHAR_INDEX]).eql('¥\u0301');
chai_1.expect(tchar[Buffer_1.CHAR_DATA_CHAR_INDEX].length).eql(2);
chai_1.expect(tchar[Buffer_1.CHAR_DATA_WIDTH_INDEX]).eql(2);
});
it('line of ¥ with combining even', function () {
term.wraparoundMode = true;
term.write(Array(50).join('¥\u0301'));
for (var i = 0; i < term.cols; ++i) {
var tchar_6 = term.buffer.lines.get(0)[i];
if (i % 2) {
chai_1.expect(tchar_6[Buffer_1.CHAR_DATA_CHAR_INDEX]).eql('');
chai_1.expect(tchar_6[Buffer_1.CHAR_DATA_CHAR_INDEX].length).eql(0);
chai_1.expect(tchar_6[Buffer_1.CHAR_DATA_WIDTH_INDEX]).eql(0);
}
else {
chai_1.expect(tchar_6[Buffer_1.CHAR_DATA_CHAR_INDEX]).eql('¥\u0301');
chai_1.expect(tchar_6[Buffer_1.CHAR_DATA_CHAR_INDEX].length).eql(2);
chai_1.expect(tchar_6[Buffer_1.CHAR_DATA_WIDTH_INDEX]).eql(2);
}
}
var tchar = term.buffer.lines.get(1)[0];
chai_1.expect(tchar[Buffer_1.CHAR_DATA_CHAR_INDEX]).eql('¥\u0301');
chai_1.expect(tchar[Buffer_1.CHAR_DATA_CHAR_INDEX].length).eql(2);
chai_1.expect(tchar[Buffer_1.CHAR_DATA_WIDTH_INDEX]).eql(2);
});
it('line of surrogate fullwidth with combining odd', function () {
term.wraparoundMode = true;
term.buffer.x = 1;