]> git.proxmox.com Git - mirror_xterm.js.git/blob - test/composition-helper-test.js
Merge pull request #218 from Tyriar/77_scroll_bar
[mirror_xterm.js.git] / test / composition-helper-test.js
1 var assert = require('chai').assert;
2 var Terminal = require('../src/xterm');
3
4 describe('CompositionHelper', function () {
5 var terminal;
6 var compositionHelper;
7 var compositionView;
8 var textarea;
9 var handledText;
10
11 beforeEach(function () {
12 compositionView = {
13 classList: {
14 add: function () {},
15 remove: function () {},
16 },
17 style: {
18 left: 0,
19 top: 0
20 },
21 textContent: ''
22 };
23 textarea = {
24 value: '',
25 style: {
26 left: 0,
27 top: 0
28 }
29 };
30 terminal = {
31 element: {
32 querySelector: function () {
33 return { offsetLeft: 0, offsetTop: 0 };
34 }
35 },
36 handler: function (text) {
37 handledText += text;
38 }
39 };
40 handledText = '';
41 compositionHelper = new Terminal.CompositionHelper(textarea, compositionView, terminal);
42 });
43
44 describe('Public API', function () {
45 it('should define CompositionHelper.prototype.compositionstart', function () {
46 assert.isDefined(Terminal.CompositionHelper.prototype.compositionstart);
47 });
48 it('should define CompositionHelper.prototype.compositionupdate', function () {
49 assert.isDefined(Terminal.CompositionHelper.prototype.compositionupdate);
50 });
51 it('should define CompositionHelper.prototype.compositionend', function () {
52 assert.isDefined(Terminal.CompositionHelper.prototype.compositionend);
53 });
54 it('should define CompositionHelper.prototype.finalizeComposition', function () {
55 assert.isDefined(Terminal.CompositionHelper.prototype.finalizeComposition);
56 });
57 it('should define CompositionHelper.prototype.handleAnyTextareaChanges', function () {
58 assert.isDefined(Terminal.CompositionHelper.prototype.handleAnyTextareaChanges);
59 });
60 it('should define CompositionHelper.prototype.updateCompositionElements', function () {
61 assert.isDefined(Terminal.CompositionHelper.prototype.updateCompositionElements);
62 });
63 it('should define CompositionHelper.isComposing', function () {
64 assert.isDefined(compositionHelper.isComposing);
65 });
66 it('should define CompositionHelper.isSendingComposition', function () {
67 assert.isDefined(compositionHelper.isSendingComposition);
68 });
69 });
70
71 describe('Input', function () {
72 it('Should insert simple characters', function (done) {
73 // First character 'ㅇ'
74 compositionHelper.compositionstart();
75 compositionHelper.compositionupdate({ data: 'ㅇ' });
76 textarea.value = 'ㅇ';
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, 'ㅇㅇ');
89 done();
90 }, 0);
91 }, 0);
92 }, 0);
93 }, 0);
94 });
95
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, '앙앙');
125 done();
126 }, 0);
127 }, 0);
128 }, 0);
129 }, 0);
130 }, 0);
131 }, 0);
132 }, 0);
133 }, 0);
134 });
135
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, '아아');
157 done();
158 }, 0);
159 }, 0);
160 }, 0);
161 }, 0);
162 }, 0);
163 });
164
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, 'だあ');
181 done();
182 }, 0);
183 }, 0);
184 }, 0);
185 }, 0);
186 });
187
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, 'ダー');
208 done();
209 }, 0);
210 }, 0);
211 }, 0);
212 }, 0);
213 }, 0);
214 })
215
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, '今');
236 done();
237 }, 0);
238 }, 0);
239 }, 0);
240 }, 0);
241 }, 0);
242 });
243
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');
255 done();
256 }, 0);
257 }, 0);
258 });
259 });
260 });