mirror of
				https://git.proxmox.com/git/mirror_xterm.js
				synced 2025-10-31 20:55:13 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			261 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			261 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| var assert = require('chai').assert;
 | |
| var Terminal = require('../src/xterm');
 | |
| 
 | |
| describe('CompositionHelper', function () {
 | |
|   var terminal;
 | |
|   var compositionHelper;
 | |
|   var compositionView;
 | |
|   var textarea;
 | |
|   var handledText;
 | |
| 
 | |
|   beforeEach(function () {
 | |
|     compositionView = {
 | |
|       classList: {
 | |
|         add: function () {},
 | |
|         remove: function () {},
 | |
|       },
 | |
|       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);
 | |
|     });
 | |
|   });
 | |
| });
 | 
