1 var assert
= require('chai').assert
;
2 var Terminal
= require('../build/xterm');
4 describe('CompositionHelper', function () {
11 beforeEach(function () {
15 remove: function () {},
17 getBoundingClientRect: function () {
35 querySelector: function () {
36 return { offsetLeft
: 0, offsetTop
: 0 };
39 handler: function (text
) {
44 compositionHelper
= new Terminal
.CompositionHelper(textarea
, compositionView
, terminal
);
47 describe('Public API', function () {
48 it('should define CompositionHelper.prototype.compositionstart', function () {
49 assert
.isDefined(Terminal
.CompositionHelper
.prototype.compositionstart
);
51 it('should define CompositionHelper.prototype.compositionupdate', function () {
52 assert
.isDefined(Terminal
.CompositionHelper
.prototype.compositionupdate
);
54 it('should define CompositionHelper.prototype.compositionend', function () {
55 assert
.isDefined(Terminal
.CompositionHelper
.prototype.compositionend
);
57 it('should define CompositionHelper.prototype.finalizeComposition', function () {
58 assert
.isDefined(Terminal
.CompositionHelper
.prototype.finalizeComposition
);
60 it('should define CompositionHelper.prototype.handleAnyTextareaChanges', function () {
61 assert
.isDefined(Terminal
.CompositionHelper
.prototype.handleAnyTextareaChanges
);
63 it('should define CompositionHelper.prototype.updateCompositionElements', function () {
64 assert
.isDefined(Terminal
.CompositionHelper
.prototype.updateCompositionElements
);
66 it('should define CompositionHelper.isComposing', function () {
67 assert
.isDefined(compositionHelper
.isComposing
);
69 it('should define CompositionHelper.isSendingComposition', function () {
70 assert
.isDefined(compositionHelper
.isSendingComposition
);
74 describe('Input', function () {
75 it('Should insert simple characters', function (done
) {
76 // First character 'ㅇ'
77 compositionHelper
.compositionstart();
78 compositionHelper
.compositionupdate({ data
: 'ㅇ' });
80 setTimeout(function() { // wait for any textarea updates
81 compositionHelper
.compositionend();
82 setTimeout(function() { // wait for any textarea updates
83 assert
.equal(handledText
, 'ㅇ');
84 // Second character 'ㅇ'
85 compositionHelper
.compositionstart();
86 compositionHelper
.compositionupdate({ data
: 'ㅇ' });
87 textarea
.value
= 'ㅇㅇ';
88 setTimeout(function() { // wait for any textarea updates
89 compositionHelper
.compositionend();
90 setTimeout(function() { // wait for any textarea updates
91 assert
.equal(handledText
, 'ㅇㅇ');
99 it('Should insert complex characters', function (done
) {
100 // First character '앙'
101 compositionHelper
.compositionstart();
102 compositionHelper
.compositionupdate({ data
: 'ㅇ' });
103 textarea
.value
= 'ㅇ';
104 setTimeout(function() { // wait for any textarea updates
105 compositionHelper
.compositionupdate({ data
: '아' });
106 textarea
.value
= '아';
107 setTimeout(function() { // wait for any textarea updates
108 compositionHelper
.compositionupdate({ data
: '앙' });
109 textarea
.value
= '앙';
110 setTimeout(function() { // wait for any textarea updates
111 compositionHelper
.compositionend();
112 setTimeout(function() { // wait for any textarea updates
113 assert
.equal(handledText
, '앙');
114 // Second character '앙'
115 compositionHelper
.compositionstart();
116 compositionHelper
.compositionupdate({ data
: 'ㅇ' });
117 textarea
.value
= '앙ㅇ';
118 setTimeout(function() { // wait for any textarea updates
119 compositionHelper
.compositionupdate({ data
: '아' });
120 textarea
.value
= '앙아';
121 setTimeout(function() { // wait for any textarea updates
122 compositionHelper
.compositionupdate({ data
: '앙' });
123 textarea
.value
= '앙앙';
124 setTimeout(function() { // wait for any textarea updates
125 compositionHelper
.compositionend();
126 setTimeout(function() { // wait for any textarea updates
127 assert
.equal(handledText
, '앙앙');
139 it('Should insert complex characters that change with following character', function (done
) {
140 // First character '아'
141 compositionHelper
.compositionstart();
142 compositionHelper
.compositionupdate({ data
: 'ㅇ' });
143 textarea
.value
= 'ㅇ';
144 setTimeout(function() { // wait for any textarea updates
145 compositionHelper
.compositionupdate({ data
: '아' });
146 textarea
.value
= '아';
147 setTimeout(function() { // wait for any textarea updates
148 // Start second character '아' in first character
149 compositionHelper
.compositionupdate({ data
: '앙' });
150 textarea
.value
= '앙';
151 setTimeout(function() { // wait for any textarea updates
152 compositionHelper
.compositionend();
153 compositionHelper
.compositionstart();
154 compositionHelper
.compositionupdate({ data
: '아' });
155 textarea
.value
= '아아'
156 setTimeout(function() { // wait for any textarea updates
157 compositionHelper
.compositionend();
158 setTimeout(function() { // wait for any textarea updates
159 assert
.equal(handledText
, '아아');
168 it('Should insert multi-characters compositions', function (done
) {
169 // First character 'だ'
170 compositionHelper
.compositionstart();
171 compositionHelper
.compositionupdate({ data
: 'd' });
172 textarea
.value
= 'd';
173 setTimeout(function() { // wait for any textarea updates
174 compositionHelper
.compositionupdate({ data
: 'だ' });
175 textarea
.value
= 'だ';
176 setTimeout(function() { // wait for any textarea updates
177 // Second character 'あ'
178 compositionHelper
.compositionupdate({ data
: 'だあ' });
179 textarea
.value
= 'だあ';
180 setTimeout(function() { // wait for any textarea updates
181 compositionHelper
.compositionend();
182 setTimeout(function() { // wait for any textarea updates
183 assert
.equal(handledText
, 'だあ');
191 it('Should insert multi-character compositions that are converted to other characters with the same length', function (done
) {
192 // First character 'だ'
193 compositionHelper
.compositionstart();
194 compositionHelper
.compositionupdate({ data
: 'd' });
195 textarea
.value
= 'd';
196 setTimeout(function() { // wait for any textarea updates
197 compositionHelper
.compositionupdate({ data
: 'だ' });
198 textarea
.value
= 'だ';
199 setTimeout(function() { // wait for any textarea updates
200 // Second character 'ー'
201 compositionHelper
.compositionupdate({ data
: 'だー' });
202 textarea
.value
= 'だー';
203 setTimeout(function() { // wait for any textarea updates
204 // Convert to katakana 'ダー'
205 compositionHelper
.compositionupdate({ data
: 'ダー' });
206 textarea
.value
= 'ダー';
207 setTimeout(function() { // wait for any textarea updates
208 compositionHelper
.compositionend();
209 setTimeout(function() { // wait for any textarea updates
210 assert
.equal(handledText
, 'ダー');
219 it('Should insert multi-character compositions that are converted to other characters with different lengths', function (done
) {
220 // First character 'い'
221 compositionHelper
.compositionstart();
222 compositionHelper
.compositionupdate({ data
: 'い' });
223 textarea
.value
= 'い';
224 setTimeout(function() { // wait for any textarea updates
225 // Second character 'ま'
226 compositionHelper
.compositionupdate({ data
: 'いm' });
227 textarea
.value
= 'いm';
228 setTimeout(function() { // wait for any textarea updates
229 compositionHelper
.compositionupdate({ data
: 'いま' });
230 textarea
.value
= 'いま';
231 setTimeout(function() { // wait for any textarea updates
232 // Convert to kanji '今'
233 compositionHelper
.compositionupdate({ data
: '今' });
234 textarea
.value
= '今';
235 setTimeout(function() { // wait for any textarea updates
236 compositionHelper
.compositionend();
237 setTimeout(function() { // wait for any textarea updates
238 assert
.equal(handledText
, '今');
247 it('Should insert non-composition characters input immediately after composition characters', function (done
) {
248 // First character 'ㅇ'
249 compositionHelper
.compositionstart();
250 compositionHelper
.compositionupdate({ data
: 'ㅇ' });
251 textarea
.value
= 'ㅇ';
252 setTimeout(function() { // wait for any textarea updates
253 compositionHelper
.compositionend();
254 // Second character '1' (a non-composition character)
255 textarea
.value
= 'ㅇ1';
256 setTimeout(function() { // wait for any textarea updates
257 assert
.equal(handledText
, 'ㅇ1');