1 var assert
= require('chai').assert
;
2 var Terminal
= require('../src/xterm');
4 describe('CompositionHelper', function () {
11 beforeEach(function () {
15 remove: function () {},
32 querySelector: function () {
33 return { offsetLeft
: 0, offsetTop
: 0 };
36 handler: function (text
) {
41 compositionHelper
= new Terminal
.CompositionHelper(textarea
, compositionView
, terminal
);
44 describe('Public API', function () {
45 it('should define CompositionHelper.prototype.compositionstart', function () {
46 assert
.isDefined(Terminal
.CompositionHelper
.prototype.compositionstart
);
48 it('should define CompositionHelper.prototype.compositionupdate', function () {
49 assert
.isDefined(Terminal
.CompositionHelper
.prototype.compositionupdate
);
51 it('should define CompositionHelper.prototype.compositionend', function () {
52 assert
.isDefined(Terminal
.CompositionHelper
.prototype.compositionend
);
54 it('should define CompositionHelper.prototype.finalizeComposition', function () {
55 assert
.isDefined(Terminal
.CompositionHelper
.prototype.finalizeComposition
);
57 it('should define CompositionHelper.prototype.handleAnyTextareaChanges', function () {
58 assert
.isDefined(Terminal
.CompositionHelper
.prototype.handleAnyTextareaChanges
);
60 it('should define CompositionHelper.prototype.updateCompositionElements', function () {
61 assert
.isDefined(Terminal
.CompositionHelper
.prototype.updateCompositionElements
);
63 it('should define CompositionHelper.isComposing', function () {
64 assert
.isDefined(compositionHelper
.isComposing
);
66 it('should define CompositionHelper.isSendingComposition', function () {
67 assert
.isDefined(compositionHelper
.isSendingComposition
);
71 describe('Input', function () {
72 it('Should insert simple characters', function (done
) {
73 // First character 'ㅇ'
74 compositionHelper
.compositionstart();
75 compositionHelper
.compositionupdate({ data
: 'ㅇ' });
77 setTimeout(function() { // wait for any textarea updates
78 compositionHelper
.compositionend();
79 setTimeout(function() { // wait for any textarea updates
80 assert
.equal(handledText
, 'ㅇ');
81 // Second character 'ㅇ'
82 compositionHelper
.compositionstart();
83 compositionHelper
.compositionupdate({ data
: 'ㅇ' });
84 textarea
.value
= 'ㅇㅇ';
85 setTimeout(function() { // wait for any textarea updates
86 compositionHelper
.compositionend();
87 setTimeout(function() { // wait for any textarea updates
88 assert
.equal(handledText
, 'ㅇㅇ');
96 it('Should insert complex characters', function (done
) {
97 // First character '앙'
98 compositionHelper
.compositionstart();
99 compositionHelper
.compositionupdate({ data
: 'ㅇ' });
100 textarea
.value
= 'ㅇ';
101 setTimeout(function() { // wait for any textarea updates
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
.compositionend();
109 setTimeout(function() { // wait for any textarea updates
110 assert
.equal(handledText
, '앙');
111 // Second character '앙'
112 compositionHelper
.compositionstart();
113 compositionHelper
.compositionupdate({ data
: 'ㅇ' });
114 textarea
.value
= '앙ㅇ';
115 setTimeout(function() { // wait for any textarea updates
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
.compositionend();
123 setTimeout(function() { // wait for any textarea updates
124 assert
.equal(handledText
, '앙앙');
136 it('Should insert complex characters that change with following character', function (done
) {
137 // First character '아'
138 compositionHelper
.compositionstart();
139 compositionHelper
.compositionupdate({ data
: 'ㅇ' });
140 textarea
.value
= 'ㅇ';
141 setTimeout(function() { // wait for any textarea updates
142 compositionHelper
.compositionupdate({ data
: '아' });
143 textarea
.value
= '아';
144 setTimeout(function() { // wait for any textarea updates
145 // Start second character '아' in first character
146 compositionHelper
.compositionupdate({ data
: '앙' });
147 textarea
.value
= '앙';
148 setTimeout(function() { // wait for any textarea updates
149 compositionHelper
.compositionend();
150 compositionHelper
.compositionstart();
151 compositionHelper
.compositionupdate({ data
: '아' });
152 textarea
.value
= '아아'
153 setTimeout(function() { // wait for any textarea updates
154 compositionHelper
.compositionend();
155 setTimeout(function() { // wait for any textarea updates
156 assert
.equal(handledText
, '아아');
165 it('Should insert multi-characters compositions', function (done
) {
166 // First character 'だ'
167 compositionHelper
.compositionstart();
168 compositionHelper
.compositionupdate({ data
: 'd' });
169 textarea
.value
= 'd';
170 setTimeout(function() { // wait for any textarea updates
171 compositionHelper
.compositionupdate({ data
: 'だ' });
172 textarea
.value
= 'だ';
173 setTimeout(function() { // wait for any textarea updates
174 // Second character 'あ'
175 compositionHelper
.compositionupdate({ data
: 'だあ' });
176 textarea
.value
= 'だあ';
177 setTimeout(function() { // wait for any textarea updates
178 compositionHelper
.compositionend();
179 setTimeout(function() { // wait for any textarea updates
180 assert
.equal(handledText
, 'だあ');
188 it('Should insert multi-character compositions that are converted to other characters with the same length', function (done
) {
189 // First character 'だ'
190 compositionHelper
.compositionstart();
191 compositionHelper
.compositionupdate({ data
: 'd' });
192 textarea
.value
= 'd';
193 setTimeout(function() { // wait for any textarea updates
194 compositionHelper
.compositionupdate({ data
: 'だ' });
195 textarea
.value
= 'だ';
196 setTimeout(function() { // wait for any textarea updates
197 // Second character 'ー'
198 compositionHelper
.compositionupdate({ data
: 'だー' });
199 textarea
.value
= 'だー';
200 setTimeout(function() { // wait for any textarea updates
201 // Convert to katakana 'ダー'
202 compositionHelper
.compositionupdate({ data
: 'ダー' });
203 textarea
.value
= 'ダー';
204 setTimeout(function() { // wait for any textarea updates
205 compositionHelper
.compositionend();
206 setTimeout(function() { // wait for any textarea updates
207 assert
.equal(handledText
, 'ダー');
216 it('Should insert multi-character compositions that are converted to other characters with different lengths', function (done
) {
217 // First character 'い'
218 compositionHelper
.compositionstart();
219 compositionHelper
.compositionupdate({ data
: 'い' });
220 textarea
.value
= 'い';
221 setTimeout(function() { // wait for any textarea updates
222 // Second character 'ま'
223 compositionHelper
.compositionupdate({ data
: 'いm' });
224 textarea
.value
= 'いm';
225 setTimeout(function() { // wait for any textarea updates
226 compositionHelper
.compositionupdate({ data
: 'いま' });
227 textarea
.value
= 'いま';
228 setTimeout(function() { // wait for any textarea updates
229 // Convert to kanji '今'
230 compositionHelper
.compositionupdate({ data
: '今' });
231 textarea
.value
= '今';
232 setTimeout(function() { // wait for any textarea updates
233 compositionHelper
.compositionend();
234 setTimeout(function() { // wait for any textarea updates
235 assert
.equal(handledText
, '今');
244 it('Should insert non-composition characters input immediately after composition characters', function (done
) {
245 // First character 'ㅇ'
246 compositionHelper
.compositionstart();
247 compositionHelper
.compositionupdate({ data
: 'ㅇ' });
248 textarea
.value
= 'ㅇ';
249 setTimeout(function() { // wait for any textarea updates
250 compositionHelper
.compositionend();
251 // Second character '1' (a non-composition character)
252 textarea
.value
= 'ㅇ1';
253 setTimeout(function() { // wait for any textarea updates
254 assert
.equal(handledText
, 'ㅇ1');