Files
xterm.js/src/CompositionHelper.test.ts
T

252 lines
8.9 KiB
TypeScript
Raw Normal View History

2017-08-06 00:57:54 -07:00
/**
2017-09-08 07:50:43 -07:00
* Copyright (c) 2016 The xterm.js authors. All rights reserved.
2017-08-06 00:57:54 -07:00
* @license MIT
*/
2016-11-22 11:50:08 -08:00
import { assert } from 'chai';
import { CompositionHelper } from './CompositionHelper';
2016-07-13 08:37:24 -07:00
2016-11-22 11:50:08 -08:00
describe('CompositionHelper', () => {
2017-01-24 13:34:45 -08:00
let terminal;
let compositionHelper;
let compositionView;
let textarea;
let handledText;
2016-07-13 08:37:24 -07:00
2016-11-22 11:50:08 -08:00
beforeEach(() => {
2016-07-13 08:37:24 -07:00
compositionView = {
classList: {
2016-11-22 11:50:08 -08:00
add: () => {},
remove: () => {},
2016-07-13 08:37:24 -07:00
},
2016-11-22 11:50:08 -08:00
getBoundingClientRect: () => {
return { width: 0 };
2016-08-12 10:27:49 -07:00
},
2016-07-13 08:37:24 -07:00
style: {
left: 0,
top: 0
},
textContent: ''
2016-08-04 18:34:04 -07:00
};
2016-07-13 08:37:24 -07:00
textarea = {
value: '',
style: {
left: 0,
top: 0
}
2016-08-04 18:34:04 -07:00
};
2016-07-13 08:37:24 -07:00
terminal = {
element: {
2016-11-22 11:50:08 -08:00
querySelector: () => {
2016-07-13 08:37:24 -07:00
return { offsetLeft: 0, offsetTop: 0 };
}
},
2017-08-05 13:56:38 -07:00
handler: (text: string) => {
2016-07-13 08:37:24 -07:00
handledText += text;
2017-09-03 14:34:50 -07:00
},
buffer: {
isCursorInViewport: true
},
charMeasure: {
height: 10,
width: 10
},
options: {
lineHeight: 1
2016-07-13 08:37:24 -07:00
}
2016-08-04 18:34:04 -07:00
};
2016-07-13 08:37:24 -07:00
handledText = '';
2016-11-22 11:50:08 -08:00
compositionHelper = new CompositionHelper(textarea, compositionView, terminal);
2016-07-13 08:37:24 -07:00
});
2016-11-22 11:50:08 -08:00
describe('Input', () => {
2017-08-05 13:56:38 -07:00
it('Should insert simple characters', (done) => {
2016-07-13 21:22:27 -07:00
// First character 'ㅇ'
2016-07-13 08:37:24 -07:00
compositionHelper.compositionstart();
compositionHelper.compositionupdate({ data: 'ㅇ' });
textarea.value = 'ㅇ';
2016-11-22 11:50:08 -08:00
setTimeout(() => { // wait for any textarea updates
2016-07-13 08:37:24 -07:00
compositionHelper.compositionend();
2016-11-22 11:50:08 -08:00
setTimeout(() => { // wait for any textarea updates
2016-07-13 08:37:24 -07:00
assert.equal(handledText, 'ㅇ');
2016-07-13 21:22:27 -07:00
// Second character 'ㅇ'
2016-07-13 08:37:24 -07:00
compositionHelper.compositionstart();
compositionHelper.compositionupdate({ data: 'ㅇ' });
textarea.value = 'ㅇㅇ';
2016-11-22 11:50:08 -08:00
setTimeout(() => { // wait for any textarea updates
2016-07-13 08:37:24 -07:00
compositionHelper.compositionend();
2016-11-22 11:50:08 -08:00
setTimeout(() => { // wait for any textarea updates
2016-07-13 08:37:24 -07:00
assert.equal(handledText, 'ㅇㅇ');
done();
}, 0);
}, 0);
}, 0);
}, 0);
});
2017-08-05 13:56:38 -07:00
it('Should insert complex characters', (done) => {
2016-07-13 21:22:27 -07:00
// First character '앙'
2016-07-13 08:37:24 -07:00
compositionHelper.compositionstart();
compositionHelper.compositionupdate({ data: 'ㅇ' });
textarea.value = 'ㅇ';
2016-11-22 11:50:08 -08:00
setTimeout(() => { // wait for any textarea updates
2016-07-13 08:37:24 -07:00
compositionHelper.compositionupdate({ data: '아' });
textarea.value = '아';
2016-11-22 11:50:08 -08:00
setTimeout(() => { // wait for any textarea updates
2016-07-13 08:37:24 -07:00
compositionHelper.compositionupdate({ data: '앙' });
textarea.value = '앙';
2016-11-22 11:50:08 -08:00
setTimeout(() => { // wait for any textarea updates
2016-07-13 08:37:24 -07:00
compositionHelper.compositionend();
2016-11-22 11:50:08 -08:00
setTimeout(() => { // wait for any textarea updates
2016-07-13 08:37:24 -07:00
assert.equal(handledText, '앙');
2016-07-13 21:22:27 -07:00
// Second character '앙'
2016-07-13 08:37:24 -07:00
compositionHelper.compositionstart();
compositionHelper.compositionupdate({ data: 'ㅇ' });
textarea.value = '앙ㅇ';
2016-11-22 11:50:08 -08:00
setTimeout(() => { // wait for any textarea updates
2016-07-13 08:37:24 -07:00
compositionHelper.compositionupdate({ data: '아' });
textarea.value = '앙아';
2016-11-22 11:50:08 -08:00
setTimeout(() => { // wait for any textarea updates
2016-07-13 08:37:24 -07:00
compositionHelper.compositionupdate({ data: '앙' });
textarea.value = '앙앙';
2016-11-22 11:50:08 -08:00
setTimeout(() => { // wait for any textarea updates
2016-07-13 08:37:24 -07:00
compositionHelper.compositionend();
2016-11-22 11:50:08 -08:00
setTimeout(() => { // wait for any textarea updates
2016-07-13 08:37:24 -07:00
assert.equal(handledText, '앙앙');
done();
}, 0);
}, 0);
}, 0);
}, 0);
}, 0);
}, 0);
}, 0);
}, 0);
});
2017-08-05 13:56:38 -07:00
it('Should insert complex characters that change with following character', (done) => {
2016-07-13 21:22:27 -07:00
// First character '아'
2016-07-13 08:37:24 -07:00
compositionHelper.compositionstart();
compositionHelper.compositionupdate({ data: 'ㅇ' });
textarea.value = 'ㅇ';
2016-11-22 11:50:08 -08:00
setTimeout(() => { // wait for any textarea updates
2016-07-13 08:37:24 -07:00
compositionHelper.compositionupdate({ data: '아' });
textarea.value = '아';
2016-11-22 11:50:08 -08:00
setTimeout(() => { // wait for any textarea updates
2016-07-13 21:22:27 -07:00
// Start second character '아' in first character
2016-07-13 08:37:24 -07:00
compositionHelper.compositionupdate({ data: '앙' });
textarea.value = '앙';
2016-11-22 11:50:08 -08:00
setTimeout(() => { // wait for any textarea updates
2016-07-13 08:37:24 -07:00
compositionHelper.compositionend();
compositionHelper.compositionstart();
compositionHelper.compositionupdate({ data: '아' });
2017-01-24 13:34:45 -08:00
textarea.value = '아아';
2016-11-22 11:50:08 -08:00
setTimeout(() => { // wait for any textarea updates
2016-07-13 08:37:24 -07:00
compositionHelper.compositionend();
2016-11-22 11:50:08 -08:00
setTimeout(() => { // wait for any textarea updates
2016-07-13 08:37:24 -07:00
assert.equal(handledText, '아아');
done();
}, 0);
}, 0);
}, 0);
}, 0);
}, 0);
});
2017-08-05 13:56:38 -07:00
it('Should insert multi-characters compositions', (done) => {
2016-07-13 21:22:27 -07:00
// First character 'だ'
compositionHelper.compositionstart();
compositionHelper.compositionupdate({ data: 'd' });
textarea.value = 'd';
2016-11-22 11:50:08 -08:00
setTimeout(() => { // wait for any textarea updates
2016-07-13 21:22:27 -07:00
compositionHelper.compositionupdate({ data: 'だ' });
textarea.value = 'だ';
2016-11-22 11:50:08 -08:00
setTimeout(() => { // wait for any textarea updates
2016-07-13 21:22:27 -07:00
// Second character 'あ'
compositionHelper.compositionupdate({ data: 'だあ' });
textarea.value = 'だあ';
2016-11-22 11:50:08 -08:00
setTimeout(() => { // wait for any textarea updates
2016-07-13 21:22:27 -07:00
compositionHelper.compositionend();
2016-11-22 11:50:08 -08:00
setTimeout(() => { // wait for any textarea updates
2016-07-13 21:22:27 -07:00
assert.equal(handledText, 'だあ');
done();
}, 0);
}, 0);
}, 0);
}, 0);
2016-07-13 08:37:24 -07:00
});
2017-08-05 13:56:38 -07:00
it('Should insert multi-character compositions that are converted to other characters with the same length', (done) => {
2016-07-13 21:22:27 -07:00
// First character 'だ'
compositionHelper.compositionstart();
compositionHelper.compositionupdate({ data: 'd' });
textarea.value = 'd';
2016-11-22 11:50:08 -08:00
setTimeout(() => { // wait for any textarea updates
2016-07-13 21:22:27 -07:00
compositionHelper.compositionupdate({ data: 'だ' });
textarea.value = 'だ';
2016-11-22 11:50:08 -08:00
setTimeout(() => { // wait for any textarea updates
2016-07-13 21:22:27 -07:00
// Second character 'ー'
compositionHelper.compositionupdate({ data: 'だー' });
textarea.value = 'だー';
2016-11-22 11:50:08 -08:00
setTimeout(() => { // wait for any textarea updates
2016-07-13 21:22:27 -07:00
// Convert to katakana 'ダー'
compositionHelper.compositionupdate({ data: 'ダー' });
textarea.value = 'ダー';
2016-11-22 11:50:08 -08:00
setTimeout(() => { // wait for any textarea updates
2016-07-13 21:22:27 -07:00
compositionHelper.compositionend();
2016-11-22 11:50:08 -08:00
setTimeout(() => { // wait for any textarea updates
2016-07-13 21:22:27 -07:00
assert.equal(handledText, 'ダー');
done();
}, 0);
}, 0);
}, 0);
}, 0);
}, 0);
2017-01-24 13:34:45 -08:00
});
2016-07-13 21:22:27 -07:00
2017-08-05 13:56:38 -07:00
it('Should insert multi-character compositions that are converted to other characters with different lengths', (done) => {
2016-07-13 21:22:27 -07:00
// First character 'い'
compositionHelper.compositionstart();
compositionHelper.compositionupdate({ data: 'い' });
textarea.value = 'い';
2016-11-22 11:50:08 -08:00
setTimeout(() => { // wait for any textarea updates
2016-07-13 21:22:27 -07:00
// Second character 'ま'
compositionHelper.compositionupdate({ data: 'いm' });
textarea.value = 'いm';
2016-11-22 11:50:08 -08:00
setTimeout(() => { // wait for any textarea updates
2016-07-13 21:22:27 -07:00
compositionHelper.compositionupdate({ data: 'いま' });
textarea.value = 'いま';
2016-11-22 11:50:08 -08:00
setTimeout(() => { // wait for any textarea updates
2016-07-13 21:22:27 -07:00
// Convert to kanji '今'
compositionHelper.compositionupdate({ data: '今' });
textarea.value = '今';
2016-11-22 11:50:08 -08:00
setTimeout(() => { // wait for any textarea updates
2016-07-13 21:22:27 -07:00
compositionHelper.compositionend();
2016-11-22 11:50:08 -08:00
setTimeout(() => { // wait for any textarea updates
2016-07-13 21:22:27 -07:00
assert.equal(handledText, '今');
done();
}, 0);
}, 0);
}, 0);
}, 0);
}, 0);
2016-07-13 08:37:24 -07:00
});
2017-08-05 13:56:38 -07:00
it('Should insert non-composition characters input immediately after composition characters', (done) => {
2016-07-13 21:22:27 -07:00
// First character 'ㅇ'
compositionHelper.compositionstart();
compositionHelper.compositionupdate({ data: 'ㅇ' });
textarea.value = 'ㅇ';
2016-11-22 11:50:08 -08:00
setTimeout(() => { // wait for any textarea updates
compositionHelper.compositionend();
2016-07-13 21:22:27 -07:00
// Second character '1' (a non-composition character)
textarea.value = 'ㅇ1';
2016-11-22 11:50:08 -08:00
setTimeout(() => { // wait for any textarea updates
assert.equal(handledText, 'ㅇ1');
done();
}, 0);
}, 0);
});
2016-07-13 08:37:24 -07:00
});
});