--- /dev/null
+var assert = require('chai').assert;
+var Terminal = require('../xterm');
+
+describe('CompositionHelper', function () {
+ var terminal;
+ var compositionHelper;
+ var compositionView;
+ var textarea;
+ var handledText;
+
+ beforeEach(function () {
+ compositionView = {
+ classList: {
+ add: function () {},
+ remove: function () {},
+ },
+ getBoundingClientRect: function () {
+ return { width: 0 };
+ },
+ style: {
+ left: 0,
+ top: 0
+ },
+ textContent: ''
+ };
+ textarea = {
+ value: '',
+ style: {
+ left: 0,
+ top: 0
+ }
+ };
+ terminal = {
+ element: {
+ querySelector: function () {
+ return { offsetLeft: 0, offsetTop: 0 };
+ }
+ },
+ handler: function (text) {
+ handledText += text;
+ }
+ };
+ handledText = '';
+ compositionHelper = new Terminal.CompositionHelper(textarea, compositionView, terminal);
+ });
+
+ describe('Public API', function () {
+ it('should define CompositionHelper.prototype.compositionstart', function () {
+ assert.isDefined(Terminal.CompositionHelper.prototype.compositionstart);
+ });
+ it('should define CompositionHelper.prototype.compositionupdate', function () {
+ assert.isDefined(Terminal.CompositionHelper.prototype.compositionupdate);
+ });
+ it('should define CompositionHelper.prototype.compositionend', function () {
+ assert.isDefined(Terminal.CompositionHelper.prototype.compositionend);
+ });
+ it('should define CompositionHelper.prototype.finalizeComposition', function () {
+ assert.isDefined(Terminal.CompositionHelper.prototype.finalizeComposition);
+ });
+ it('should define CompositionHelper.prototype.handleAnyTextareaChanges', function () {
+ assert.isDefined(Terminal.CompositionHelper.prototype.handleAnyTextareaChanges);
+ });
+ it('should define CompositionHelper.prototype.updateCompositionElements', function () {
+ assert.isDefined(Terminal.CompositionHelper.prototype.updateCompositionElements);
+ });
+ it('should define CompositionHelper.isComposing', function () {
+ assert.isDefined(compositionHelper.isComposing);
+ });
+ it('should define CompositionHelper.isSendingComposition', function () {
+ assert.isDefined(compositionHelper.isSendingComposition);
+ });
+ });
+
+ describe('Input', function () {
+ it('Should insert simple characters', function (done) {
+ // First character 'ㅇ'
+ compositionHelper.compositionstart();
+ compositionHelper.compositionupdate({ data: 'ㅇ' });
+ textarea.value = 'ㅇ';
+ setTimeout(function() { // wait for any textarea updates
+ compositionHelper.compositionend();
+ setTimeout(function() { // wait for any textarea updates
+ assert.equal(handledText, 'ㅇ');
+ // Second character 'ㅇ'
+ compositionHelper.compositionstart();
+ compositionHelper.compositionupdate({ data: 'ㅇ' });
+ textarea.value = 'ㅇㅇ';
+ setTimeout(function() { // wait for any textarea updates
+ compositionHelper.compositionend();
+ setTimeout(function() { // wait for any textarea updates
+ assert.equal(handledText, 'ㅇㅇ');
+ done();
+ }, 0);
+ }, 0);
+ }, 0);
+ }, 0);
+ });
+
+ it('Should insert complex characters', function (done) {
+ // First character '앙'
+ compositionHelper.compositionstart();
+ compositionHelper.compositionupdate({ data: 'ㅇ' });
+ textarea.value = 'ㅇ';
+ setTimeout(function() { // wait for any textarea updates
+ compositionHelper.compositionupdate({ data: '아' });
+ textarea.value = '아';
+ setTimeout(function() { // wait for any textarea updates
+ compositionHelper.compositionupdate({ data: '앙' });
+ textarea.value = '앙';
+ setTimeout(function() { // wait for any textarea updates
+ compositionHelper.compositionend();
+ setTimeout(function() { // wait for any textarea updates
+ assert.equal(handledText, '앙');
+ // Second character '앙'
+ compositionHelper.compositionstart();
+ compositionHelper.compositionupdate({ data: 'ㅇ' });
+ textarea.value = '앙ㅇ';
+ setTimeout(function() { // wait for any textarea updates
+ compositionHelper.compositionupdate({ data: '아' });
+ textarea.value = '앙아';
+ setTimeout(function() { // wait for any textarea updates
+ compositionHelper.compositionupdate({ data: '앙' });
+ textarea.value = '앙앙';
+ setTimeout(function() { // wait for any textarea updates
+ compositionHelper.compositionend();
+ setTimeout(function() { // wait for any textarea updates
+ assert.equal(handledText, '앙앙');
+ done();
+ }, 0);
+ }, 0);
+ }, 0);
+ }, 0);
+ }, 0);
+ }, 0);
+ }, 0);
+ }, 0);
+ });
+
+ it('Should insert complex characters that change with following character', function (done) {
+ // First character '아'
+ compositionHelper.compositionstart();
+ compositionHelper.compositionupdate({ data: 'ㅇ' });
+ textarea.value = 'ㅇ';
+ setTimeout(function() { // wait for any textarea updates
+ compositionHelper.compositionupdate({ data: '아' });
+ textarea.value = '아';
+ setTimeout(function() { // wait for any textarea updates
+ // Start second character '아' in first character
+ compositionHelper.compositionupdate({ data: '앙' });
+ textarea.value = '앙';
+ setTimeout(function() { // wait for any textarea updates
+ compositionHelper.compositionend();
+ compositionHelper.compositionstart();
+ compositionHelper.compositionupdate({ data: '아' });
+ textarea.value = '아아'
+ setTimeout(function() { // wait for any textarea updates
+ compositionHelper.compositionend();
+ setTimeout(function() { // wait for any textarea updates
+ assert.equal(handledText, '아아');
+ done();
+ }, 0);
+ }, 0);
+ }, 0);
+ }, 0);
+ }, 0);
+ });
+
+ it('Should insert multi-characters compositions', function (done) {
+ // First character 'だ'
+ compositionHelper.compositionstart();
+ compositionHelper.compositionupdate({ data: 'd' });
+ textarea.value = 'd';
+ setTimeout(function() { // wait for any textarea updates
+ compositionHelper.compositionupdate({ data: 'だ' });
+ textarea.value = 'だ';
+ setTimeout(function() { // wait for any textarea updates
+ // Second character 'あ'
+ compositionHelper.compositionupdate({ data: 'だあ' });
+ textarea.value = 'だあ';
+ setTimeout(function() { // wait for any textarea updates
+ compositionHelper.compositionend();
+ setTimeout(function() { // wait for any textarea updates
+ assert.equal(handledText, 'だあ');
+ done();
+ }, 0);
+ }, 0);
+ }, 0);
+ }, 0);
+ });
+
+ it('Should insert multi-character compositions that are converted to other characters with the same length', function (done) {
+ // First character 'だ'
+ compositionHelper.compositionstart();
+ compositionHelper.compositionupdate({ data: 'd' });
+ textarea.value = 'd';
+ setTimeout(function() { // wait for any textarea updates
+ compositionHelper.compositionupdate({ data: 'だ' });
+ textarea.value = 'だ';
+ setTimeout(function() { // wait for any textarea updates
+ // Second character 'ー'
+ compositionHelper.compositionupdate({ data: 'だー' });
+ textarea.value = 'だー';
+ setTimeout(function() { // wait for any textarea updates
+ // Convert to katakana 'ダー'
+ compositionHelper.compositionupdate({ data: 'ダー' });
+ textarea.value = 'ダー';
+ setTimeout(function() { // wait for any textarea updates
+ compositionHelper.compositionend();
+ setTimeout(function() { // wait for any textarea updates
+ assert.equal(handledText, 'ダー');
+ done();
+ }, 0);
+ }, 0);
+ }, 0);
+ }, 0);
+ }, 0);
+ })
+
+ it('Should insert multi-character compositions that are converted to other characters with different lengths', function (done) {
+ // First character 'い'
+ compositionHelper.compositionstart();
+ compositionHelper.compositionupdate({ data: 'い' });
+ textarea.value = 'い';
+ setTimeout(function() { // wait for any textarea updates
+ // Second character 'ま'
+ compositionHelper.compositionupdate({ data: 'いm' });
+ textarea.value = 'いm';
+ setTimeout(function() { // wait for any textarea updates
+ compositionHelper.compositionupdate({ data: 'いま' });
+ textarea.value = 'いま';
+ setTimeout(function() { // wait for any textarea updates
+ // Convert to kanji '今'
+ compositionHelper.compositionupdate({ data: '今' });
+ textarea.value = '今';
+ setTimeout(function() { // wait for any textarea updates
+ compositionHelper.compositionend();
+ setTimeout(function() { // wait for any textarea updates
+ assert.equal(handledText, '今');
+ done();
+ }, 0);
+ }, 0);
+ }, 0);
+ }, 0);
+ }, 0);
+ });
+
+ it('Should insert non-composition characters input immediately after composition characters', function (done) {
+ // First character 'ㅇ'
+ compositionHelper.compositionstart();
+ compositionHelper.compositionupdate({ data: 'ㅇ' });
+ textarea.value = 'ㅇ';
+ setTimeout(function() { // wait for any textarea updates
+ compositionHelper.compositionend();
+ // Second character '1' (a non-composition character)
+ textarea.value = 'ㅇ1';
+ setTimeout(function() { // wait for any textarea updates
+ assert.equal(handledText, 'ㅇ1');
+ done();
+ }, 0);
+ }, 0);
+ });
+ });
+});
+++ /dev/null
-var assert = require('chai').assert;
-var Terminal = require('../xterm');
-
-describe('CompositionHelper', function () {
- var terminal;
- var compositionHelper;
- var compositionView;
- var textarea;
- var handledText;
-
- beforeEach(function () {
- compositionView = {
- classList: {
- add: function () {},
- remove: function () {},
- },
- getBoundingClientRect: function () {
- return { width: 0 };
- },
- style: {
- left: 0,
- top: 0
- },
- textContent: ''
- };
- textarea = {
- value: '',
- style: {
- left: 0,
- top: 0
- }
- };
- terminal = {
- element: {
- querySelector: function () {
- return { offsetLeft: 0, offsetTop: 0 };
- }
- },
- handler: function (text) {
- handledText += text;
- }
- };
- handledText = '';
- compositionHelper = new Terminal.CompositionHelper(textarea, compositionView, terminal);
- });
-
- describe('Public API', function () {
- it('should define CompositionHelper.prototype.compositionstart', function () {
- assert.isDefined(Terminal.CompositionHelper.prototype.compositionstart);
- });
- it('should define CompositionHelper.prototype.compositionupdate', function () {
- assert.isDefined(Terminal.CompositionHelper.prototype.compositionupdate);
- });
- it('should define CompositionHelper.prototype.compositionend', function () {
- assert.isDefined(Terminal.CompositionHelper.prototype.compositionend);
- });
- it('should define CompositionHelper.prototype.finalizeComposition', function () {
- assert.isDefined(Terminal.CompositionHelper.prototype.finalizeComposition);
- });
- it('should define CompositionHelper.prototype.handleAnyTextareaChanges', function () {
- assert.isDefined(Terminal.CompositionHelper.prototype.handleAnyTextareaChanges);
- });
- it('should define CompositionHelper.prototype.updateCompositionElements', function () {
- assert.isDefined(Terminal.CompositionHelper.prototype.updateCompositionElements);
- });
- it('should define CompositionHelper.isComposing', function () {
- assert.isDefined(compositionHelper.isComposing);
- });
- it('should define CompositionHelper.isSendingComposition', function () {
- assert.isDefined(compositionHelper.isSendingComposition);
- });
- });
-
- describe('Input', function () {
- it('Should insert simple characters', function (done) {
- // First character 'ㅇ'
- compositionHelper.compositionstart();
- compositionHelper.compositionupdate({ data: 'ㅇ' });
- textarea.value = 'ㅇ';
- setTimeout(function() { // wait for any textarea updates
- compositionHelper.compositionend();
- setTimeout(function() { // wait for any textarea updates
- assert.equal(handledText, 'ㅇ');
- // Second character 'ㅇ'
- compositionHelper.compositionstart();
- compositionHelper.compositionupdate({ data: 'ㅇ' });
- textarea.value = 'ㅇㅇ';
- setTimeout(function() { // wait for any textarea updates
- compositionHelper.compositionend();
- setTimeout(function() { // wait for any textarea updates
- assert.equal(handledText, 'ㅇㅇ');
- done();
- }, 0);
- }, 0);
- }, 0);
- }, 0);
- });
-
- it('Should insert complex characters', function (done) {
- // First character '앙'
- compositionHelper.compositionstart();
- compositionHelper.compositionupdate({ data: 'ㅇ' });
- textarea.value = 'ㅇ';
- setTimeout(function() { // wait for any textarea updates
- compositionHelper.compositionupdate({ data: '아' });
- textarea.value = '아';
- setTimeout(function() { // wait for any textarea updates
- compositionHelper.compositionupdate({ data: '앙' });
- textarea.value = '앙';
- setTimeout(function() { // wait for any textarea updates
- compositionHelper.compositionend();
- setTimeout(function() { // wait for any textarea updates
- assert.equal(handledText, '앙');
- // Second character '앙'
- compositionHelper.compositionstart();
- compositionHelper.compositionupdate({ data: 'ㅇ' });
- textarea.value = '앙ㅇ';
- setTimeout(function() { // wait for any textarea updates
- compositionHelper.compositionupdate({ data: '아' });
- textarea.value = '앙아';
- setTimeout(function() { // wait for any textarea updates
- compositionHelper.compositionupdate({ data: '앙' });
- textarea.value = '앙앙';
- setTimeout(function() { // wait for any textarea updates
- compositionHelper.compositionend();
- setTimeout(function() { // wait for any textarea updates
- assert.equal(handledText, '앙앙');
- done();
- }, 0);
- }, 0);
- }, 0);
- }, 0);
- }, 0);
- }, 0);
- }, 0);
- }, 0);
- });
-
- it('Should insert complex characters that change with following character', function (done) {
- // First character '아'
- compositionHelper.compositionstart();
- compositionHelper.compositionupdate({ data: 'ㅇ' });
- textarea.value = 'ㅇ';
- setTimeout(function() { // wait for any textarea updates
- compositionHelper.compositionupdate({ data: '아' });
- textarea.value = '아';
- setTimeout(function() { // wait for any textarea updates
- // Start second character '아' in first character
- compositionHelper.compositionupdate({ data: '앙' });
- textarea.value = '앙';
- setTimeout(function() { // wait for any textarea updates
- compositionHelper.compositionend();
- compositionHelper.compositionstart();
- compositionHelper.compositionupdate({ data: '아' });
- textarea.value = '아아'
- setTimeout(function() { // wait for any textarea updates
- compositionHelper.compositionend();
- setTimeout(function() { // wait for any textarea updates
- assert.equal(handledText, '아아');
- done();
- }, 0);
- }, 0);
- }, 0);
- }, 0);
- }, 0);
- });
-
- it('Should insert multi-characters compositions', function (done) {
- // First character 'だ'
- compositionHelper.compositionstart();
- compositionHelper.compositionupdate({ data: 'd' });
- textarea.value = 'd';
- setTimeout(function() { // wait for any textarea updates
- compositionHelper.compositionupdate({ data: 'だ' });
- textarea.value = 'だ';
- setTimeout(function() { // wait for any textarea updates
- // Second character 'あ'
- compositionHelper.compositionupdate({ data: 'だあ' });
- textarea.value = 'だあ';
- setTimeout(function() { // wait for any textarea updates
- compositionHelper.compositionend();
- setTimeout(function() { // wait for any textarea updates
- assert.equal(handledText, 'だあ');
- done();
- }, 0);
- }, 0);
- }, 0);
- }, 0);
- });
-
- it('Should insert multi-character compositions that are converted to other characters with the same length', function (done) {
- // First character 'だ'
- compositionHelper.compositionstart();
- compositionHelper.compositionupdate({ data: 'd' });
- textarea.value = 'd';
- setTimeout(function() { // wait for any textarea updates
- compositionHelper.compositionupdate({ data: 'だ' });
- textarea.value = 'だ';
- setTimeout(function() { // wait for any textarea updates
- // Second character 'ー'
- compositionHelper.compositionupdate({ data: 'だー' });
- textarea.value = 'だー';
- setTimeout(function() { // wait for any textarea updates
- // Convert to katakana 'ダー'
- compositionHelper.compositionupdate({ data: 'ダー' });
- textarea.value = 'ダー';
- setTimeout(function() { // wait for any textarea updates
- compositionHelper.compositionend();
- setTimeout(function() { // wait for any textarea updates
- assert.equal(handledText, 'ダー');
- done();
- }, 0);
- }, 0);
- }, 0);
- }, 0);
- }, 0);
- })
-
- it('Should insert multi-character compositions that are converted to other characters with different lengths', function (done) {
- // First character 'い'
- compositionHelper.compositionstart();
- compositionHelper.compositionupdate({ data: 'い' });
- textarea.value = 'い';
- setTimeout(function() { // wait for any textarea updates
- // Second character 'ま'
- compositionHelper.compositionupdate({ data: 'いm' });
- textarea.value = 'いm';
- setTimeout(function() { // wait for any textarea updates
- compositionHelper.compositionupdate({ data: 'いま' });
- textarea.value = 'いま';
- setTimeout(function() { // wait for any textarea updates
- // Convert to kanji '今'
- compositionHelper.compositionupdate({ data: '今' });
- textarea.value = '今';
- setTimeout(function() { // wait for any textarea updates
- compositionHelper.compositionend();
- setTimeout(function() { // wait for any textarea updates
- assert.equal(handledText, '今');
- done();
- }, 0);
- }, 0);
- }, 0);
- }, 0);
- }, 0);
- });
-
- it('Should insert non-composition characters input immediately after composition characters', function (done) {
- // First character 'ㅇ'
- compositionHelper.compositionstart();
- compositionHelper.compositionupdate({ data: 'ㅇ' });
- textarea.value = 'ㅇ';
- setTimeout(function() { // wait for any textarea updates
- compositionHelper.compositionend();
- // Second character '1' (a non-composition character)
- textarea.value = 'ㅇ1';
- setTimeout(function() { // wait for any textarea updates
- assert.equal(handledText, 'ㅇ1');
- done();
- }, 0);
- }, 0);
- });
- });
-});