mirror of
https://github.com/keymanapp/keyman.git
synced 2026-08-06 17:05:34 +00:00
113 lines
No EOL
3.8 KiB
JavaScript
113 lines
No EOL
3.8 KiB
JavaScript
const assert = require('chai').assert;
|
|
const fs = require('fs');
|
|
const vm = require('vm');
|
|
|
|
let KeyboardProcessor = require('../../../build/index.bundled.js');
|
|
|
|
// Required initialization setup.
|
|
global.com = KeyboardProcessor.com; // exports all keyboard-processor namespacing.
|
|
global.keyman = {}; // So that keyboard-based checks against the global `keyman` succeed.
|
|
// 10.0+ dependent keyboards, like khmer_angkor, will otherwise fail to load.
|
|
|
|
let KMWRecorder = require('../../../../recorder/build/nodeProctor');
|
|
|
|
// Initialize supplementary plane string extensions
|
|
String.kmwEnableSupplementaryPlane(false);
|
|
|
|
const device = {
|
|
formFactor: 'desktop',
|
|
OS: 'windows',
|
|
browser: 'native'
|
|
}
|
|
|
|
let keyboard;
|
|
|
|
function runEngineRuleSet(ruleSet) {
|
|
for(let ruleDef of ruleSet) {
|
|
// Prepare the context!
|
|
const ruleSeq = new KMWRecorder.RecordedKeystrokeSequence(ruleDef);
|
|
const proctor = new KMWRecorder.NodeProctor(keyboard, device, assert.equal);
|
|
const target = new com.keyman.text.Mock();
|
|
ruleSeq.test(proctor, target);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Wrapper to simplify running tests -- supports either virtual key codes as string (e.g. 'A' is VK_A)
|
|
* or an array of integers. Does not currently support modifiers (not needed here).
|
|
* @param {String|Array} input Virtual key codes of each character (as string or array)
|
|
* @param {String} output Expected output
|
|
*/
|
|
|
|
function runStringRuleSet(input, output) {
|
|
const rule = {
|
|
"inputs":
|
|
typeof input == 'string'
|
|
? input.split("").map(ch =>
|
|
{ return { "type": "key", "keyCode": ch.charCodeAt(0), "states": 10752, "modifiers": 0, "modifierChanged": false, "isVirtualKey": true } })
|
|
: input.map(ch =>
|
|
{ return { "type": "key", "keyCode": ch, "states": 10752, "modifiers": 0, "modifierChanged": false, "isVirtualKey": true } }),
|
|
"output": output
|
|
};
|
|
return runEngineRuleSet([rule]);
|
|
}
|
|
|
|
// -----------
|
|
|
|
describe('Engine - notany() and context()', function() {
|
|
before(function() {
|
|
const kp = new KeyboardProcessor();
|
|
|
|
// These two lines will load a keyboard from its file; headless-mode `registerKeyboard` will
|
|
// automatically set the keyboard as active.
|
|
const script = new vm.Script(fs.readFileSync('../../test/resources/keyboards/test_917.js'));
|
|
script.runInThisContext();
|
|
|
|
keyboard = kp.activeKeyboard;
|
|
});
|
|
|
|
/*
|
|
* Isolated rule tests for validity of `context()` and `notany()` statements.
|
|
*/
|
|
|
|
describe('First set -- notany() in first context position', function() {
|
|
it("baseline: rule with nomatch is not executed", function() {
|
|
runStringRuleSet('ABC', 'abc');
|
|
});
|
|
|
|
it("rule with nomatch is executed with a plain char matched", function() {
|
|
runStringRuleSet('XBC', 'xBC');
|
|
});
|
|
|
|
it("rule with nomatch is executed with a deadkey matched", function() {
|
|
runStringRuleSet('DBC1', 'pass!');
|
|
});
|
|
});
|
|
|
|
describe('Second set -- notany() in second context position', function() {
|
|
it("rule with nomatch is executed with a plain char matched", function() {
|
|
runStringRuleSet('AXCD1', 'axXX1');
|
|
});
|
|
|
|
it("rule with nomatch is executed with a deadkey matched", function() {
|
|
runStringRuleSet('ADCD1', 'pass!');
|
|
});
|
|
});
|
|
|
|
describe('Third set -- notany() in third context position with initial if() testing AdjustIndex', function() {
|
|
it("rule with nomatch is executed with a plain char matched", function() {
|
|
runStringRuleSet('FGHI1', 'fgXX1');
|
|
});
|
|
|
|
it("rule with nomatch is executed with a deadkey matched", function() {
|
|
runStringRuleSet('FDHI1', 'pass!');
|
|
});
|
|
});
|
|
|
|
// This is actually a separate issue that was corrected in the same PR
|
|
// so we placed the test here for conciseness.
|
|
|
|
it('verify notany comparison flip correction from #3817', function() {
|
|
runStringRuleSet('YZ', 'pass!');
|
|
});
|
|
}); |