From 29d0cb1eb14745189d3b8c174099b9dd13287c02 Mon Sep 17 00:00:00 2001 From: Joshua Horton Date: Mon, 8 Sep 2025 13:47:17 -0500 Subject: [PATCH] change(web): convert engine/main, engine/interfaces tests to TS Build-bot: skip build:web Test-bot: skip --- web/src/engine/interfaces/build.sh | 2 +- web/src/engine/interfaces/src/modelSpec.ts | 4 +- web/src/engine/main/build.sh | 2 +- ...on.tests.js => pathConfiguration.tests.ts} | 1 - ...xt.tests.js => predictionContext.tests.ts} | 24 ++-- ...essor.tests.js => inputProcessor.tests.ts} | 105 +++++++++--------- ...or.tests.js => languageProcessor.tests.ts} | 54 +++++---- 7 files changed, 103 insertions(+), 89 deletions(-) rename web/src/test/auto/headless/engine/interfaces/{pathConfiguration.tests.js => pathConfiguration.tests.ts} (99%) rename web/src/test/auto/headless/engine/interfaces/prediction/{predictionContext.tests.js => predictionContext.tests.ts} (96%) rename web/src/test/auto/headless/engine/main/{headless/inputProcessor.tests.js => inputProcessor.tests.ts} (79%) rename web/src/test/auto/headless/engine/main/{headless/languageProcessor.tests.js => languageProcessor.tests.ts} (88%) diff --git a/web/src/engine/interfaces/build.sh b/web/src/engine/interfaces/build.sh index 3ea80fdc7a..712b3e9921 100755 --- a/web/src/engine/interfaces/build.sh +++ b/web/src/engine/interfaces/build.sh @@ -44,4 +44,4 @@ do_build () { builder_run_action configure node_select_version_and_npm_ci builder_run_action clean rm -rf "${KEYMAN_ROOT}/web/build/${SUBPROJECT_NAME}" builder_run_action build do_build -builder_run_action test test-headless "${SUBPROJECT_NAME}" +builder_run_action test test-headless-typescript "${SUBPROJECT_NAME}" diff --git a/web/src/engine/interfaces/src/modelSpec.ts b/web/src/engine/interfaces/src/modelSpec.ts index 79b2ad0aa4..c67722a2fe 100644 --- a/web/src/engine/interfaces/src/modelSpec.ts +++ b/web/src/engine/interfaces/src/modelSpec.ts @@ -18,10 +18,10 @@ export interface ModelSpec { * The path/URL to the file that defines the model. If both `path` and `code` are specified, * `path` takes precedence. */ - path: string; + path?: string; /** * The raw JS script defining the model. Only used if `path` is not specified. */ - code: string; + code?: string; } \ No newline at end of file diff --git a/web/src/engine/main/build.sh b/web/src/engine/main/build.sh index 6cca867d88..9b41f70480 100755 --- a/web/src/engine/main/build.sh +++ b/web/src/engine/main/build.sh @@ -49,4 +49,4 @@ do_build () { builder_run_action configure node_select_version_and_npm_ci builder_run_action clean rm -rf "$KEYMAN_ROOT/web/build/$SUBPROJECT_NAME" builder_run_action build do_build -builder_run_action test test-headless "${SUBPROJECT_NAME}" \ No newline at end of file +builder_run_action test test-headless-typescript "${SUBPROJECT_NAME}" \ No newline at end of file diff --git a/web/src/test/auto/headless/engine/interfaces/pathConfiguration.tests.js b/web/src/test/auto/headless/engine/interfaces/pathConfiguration.tests.ts similarity index 99% rename from web/src/test/auto/headless/engine/interfaces/pathConfiguration.tests.js rename to web/src/test/auto/headless/engine/interfaces/pathConfiguration.tests.ts index 9a21248083..3421a4679e 100644 --- a/web/src/test/auto/headless/engine/interfaces/pathConfiguration.tests.js +++ b/web/src/test/auto/headless/engine/interfaces/pathConfiguration.tests.ts @@ -1,5 +1,4 @@ import { assert } from 'chai'; -import sinon from 'sinon'; import { PathOptionDefaults, PathConfiguration } from 'keyman/engine/interfaces'; diff --git a/web/src/test/auto/headless/engine/interfaces/prediction/predictionContext.tests.js b/web/src/test/auto/headless/engine/interfaces/prediction/predictionContext.tests.ts similarity index 96% rename from web/src/test/auto/headless/engine/interfaces/prediction/predictionContext.tests.js rename to web/src/test/auto/headless/engine/interfaces/prediction/predictionContext.tests.ts index 997210a00a..6fe1db22c4 100644 --- a/web/src/test/auto/headless/engine/interfaces/prediction/predictionContext.tests.js +++ b/web/src/test/auto/headless/engine/interfaces/prediction/predictionContext.tests.ts @@ -1,13 +1,16 @@ import { assert } from 'chai'; import sinon from 'sinon'; +import { LexicalModelTypes } from '@keymanapp/common-types'; +import { Worker as LMWorker } from "@keymanapp/lexical-model-layer/node"; + import { LanguageProcessor, TranscriptionCache } from 'keyman/engine/main'; import { PredictionContext } from 'keyman/engine/interfaces'; -import { Worker as LMWorker } from "@keymanapp/lexical-model-layer/node"; -import { DeviceSpec } from 'keyman/engine/keyboard'; import { Mock } from 'keyman/engine/js-processor'; -function compileDummyModel(suggestionSets) { +import Suggestion = LexicalModelTypes.Suggestion; + +function compileDummyModel(suggestionSets: Suggestion[][]) { return ` LMLayerWorker.loadModel(new models.DummyModel({ futureSuggestions: ${JSON.stringify(suggestionSets, null, 2)}, @@ -15,7 +18,7 @@ LMLayerWorker.loadModel(new models.DummyModel({ `; } -const appleDummySuggestionSets = [[ +const appleDummySuggestionSets: Suggestion[][] = [[ // Set 1: { transform: { insert: 'e', deleteLeft: 0}, @@ -64,9 +67,10 @@ function dummiedGetLayer() { } describe("PredictionContext", () => { - let langProcessor; + let langProcessor: LanguageProcessor; beforeEach(function() { + // @ts-ignore langProcessor = new LanguageProcessor(LMWorker, new TranscriptionCache()); }); @@ -91,7 +95,7 @@ describe("PredictionContext", () => { assert.isEmpty(updateFake.firstCall.args[0]); // should have no suggestions. (if convenient for testing) await promise; - let suggestions; + let suggestions: Suggestion[]; // Initialization results: our first set of dummy suggestions. assert.equal(updateFake.callCount, 2); @@ -130,7 +134,7 @@ describe("PredictionContext", () => { assert.isEmpty(updateFake.firstCall.args[0]); // should have no suggestions. (if convenient for testing) await promise; - let suggestions; + let suggestions: Suggestion[]; // Initialization results: our first set of dummy suggestions. assert.equal(updateFake.callCount, 2); @@ -205,7 +209,7 @@ describe("PredictionContext", () => { let updateFake = sinon.fake(); predictiveContext.on('update', updateFake); - let suggestions; + let suggestions: Suggestion[]; let previousTextState = Mock.from(textState); textState.insertTextBeforeCaret('e'); // appl| + e = apple @@ -281,7 +285,7 @@ describe("PredictionContext", () => { // We need to capture the suggestion we wish to apply. We could hardcode a forced // value, but that might become brittle in the long-term. - const originalSuggestionSet = suggestionCaptureFake.firstCall.args[0]; + const originalSuggestionSet: Suggestion[] = suggestionCaptureFake.firstCall.args[0]; const suggestionApply = originalSuggestionSet.find((obj) => obj.displayAs == 'apply'); assert.isOk(suggestionApply); @@ -346,7 +350,7 @@ describe("PredictionContext", () => { await postRevertSuggestions; assert.equal(updateFake.callCount, 1); - const suggestionsPostReversion = updateFake.firstCall.args[0]; + const suggestionsPostReversion: Suggestion[] = updateFake.firstCall.args[0]; assert.deepEqual(suggestionsPostReversion.map((obj) => obj.displayAs), ['reverted']); }); }); diff --git a/web/src/test/auto/headless/engine/main/headless/inputProcessor.tests.js b/web/src/test/auto/headless/engine/main/inputProcessor.tests.ts similarity index 79% rename from web/src/test/auto/headless/engine/main/headless/inputProcessor.tests.js rename to web/src/test/auto/headless/engine/main/inputProcessor.tests.ts index 39db5d8c6e..dd4856b86a 100644 --- a/web/src/test/auto/headless/engine/main/headless/inputProcessor.tests.js +++ b/web/src/test/auto/headless/engine/main/inputProcessor.tests.ts @@ -1,27 +1,38 @@ +import fs from 'node:fs'; +import { createRequire } from 'node:module'; + import { assert } from 'chai'; -import fs from 'fs'; - -import { createRequire } from 'module'; -const require = createRequire(import.meta.url); - -import { InputProcessor } from 'keyman/engine/main'; -import { KeyboardInterface, Mock } from 'keyman/engine/js-processor'; -import { MinimalKeymanGlobal } from 'keyman/engine/keyboard'; -import { NodeKeyboardLoader } from 'keyman/engine/keyboard/node-keyboard-loader'; -import { KeyboardTest } from '@keymanapp/recorder-core'; +import { KeyboardTest, RecordedPhysicalKeystroke, RecordedSequenceTestSet } from '@keymanapp/recorder-core'; import { Worker } from '@keymanapp/lexical-model-layer/node'; import * as utils from '@keymanapp/web-utils'; + +import { KeyboardInterface, Mock } from 'keyman/engine/js-processor'; +import { KeyEvent, KeyEventSpec, MinimalKeymanGlobal } from 'keyman/engine/keyboard'; +import { NodeKeyboardLoader } from 'keyman/engine/keyboard/node-keyboard-loader'; +import { InputProcessor } from 'keyman/engine/main'; + +import DeviceSpec = utils.DeviceSpec; const KMWString = utils.KMWString; -// Required initialization setup. -global.keyman = {}; // So that keyboard-based checks against the global `keyman` succeed. - // 10.0+ dependent keyboards, like khmer_angkor, will otherwise fail to load. +const require = createRequire(import.meta.url); -let device = { - formFactor: 'phone', - OS: 'ios', - browser: 'safari' +declare global { + var keyman: typeof MinimalKeymanGlobal; + var KeymanWeb: any; +} + +// Required initialization setup. +// +// So that keyboard-based checks against the global `keyman` succeed. +// 10.0+ dependent keyboards, like khmer_angkor, will otherwise fail to load. +global['keyman'] = MinimalKeymanGlobal; + +let device: DeviceSpec = { + formFactor: DeviceSpec.FormFactor.Phone, + OS: DeviceSpec.OperatingSystem.iOS, + browser: DeviceSpec.Browser.Safari, + touchable: true }; // Initialize supplementary plane string extensions @@ -31,7 +42,7 @@ KMWString.enableSupplementaryPlane(false); describe('InputProcessor', function() { describe('[[constructor]]', function () { it('should initialize without errors', function () { - let core = new InputProcessor(device); + let core = new InputProcessor(device, null); assert.isNotNull(core); }); @@ -40,6 +51,7 @@ describe('InputProcessor', function() { try { // Can construct without the second parameter; if so, the final assertion - .mayPredict // will be invalidated. (No worker, no ability to predict.) + // @ts-ignore core = new InputProcessor(device, Worker); assert.isOk(core.keyboardProcessor); @@ -60,6 +72,7 @@ describe('InputProcessor', function() { assert.isUndefined(core.languageProcessor.activeModel); assert.isFalse(core.languageProcessor.isActive); assert.isTrue(core.languageProcessor.mayPredict); + assert.isTrue(core.languageProcessor.canEnable); } finally { core?.languageProcessor?.shutdown(); } @@ -67,8 +80,7 @@ describe('InputProcessor', function() { }); describe('efficiency tests', function() { - let testDistribution = []; - let keyboardWithHarness; + let keyboardWithHarness: KeyboardInterface; let mainWebScriptURL = require.resolve('@keymanapp/lm-worker/worker-main.wrapped.js'); @@ -82,28 +94,17 @@ describe('InputProcessor', function() { } this.beforeAll(async function() { - testDistribution = []; - - for(let c = 'A'.charCodeAt(0); c <= 'Z'.charCodeAt(0); c++) { - let char = String.fromCharCode(c); - - testDistribution.push({ - keyId: "K_" + char, - p: 1 / 26 - }); - } - // Load the keyboard. let keyboardLoader = new NodeKeyboardLoader(new KeyboardInterface({}, MinimalKeymanGlobal)); const keyboard = await keyboardLoader.loadKeyboardFromPath(require.resolve('@keymanapp/common-test-resources/keyboards/test_chirality.js')); - keyboardWithHarness = keyboardLoader.harness; + keyboardWithHarness = keyboardLoader.harness as KeyboardInterface; keyboardWithHarness.activeKeyboard = keyboard; }); describe('without fat-fingering', function() { it('with minimal context (no fat-fingers)', function() { this.timeout(32); // ms - let core = new InputProcessor(device); + let core = new InputProcessor(device, null); let context = new Mock("", 0); core.keyboardProcessor.keyboardInterface = keyboardWithHarness; @@ -112,7 +113,7 @@ describe('InputProcessor', function() { let key = layout.getLayer('default').getKey('K_A'); let event = keyboard.constructKeyEvent(key, device, core.keyboardProcessor.stateKeys); - let behavior = core.processKeyEvent(event, context); + let behavior = core.processKeyEvent(event, context, null); assert.isNotNull(behavior); }); @@ -123,7 +124,7 @@ describe('InputProcessor', function() { this.timeout(500); // 500 ms, excluding text import. // These often run on VMs, so we'll be a bit generous. - let core = new InputProcessor(device); // I mean, it IS long context, and time + let core = new InputProcessor(device, null); // I mean, it IS long context, and time // thresholding is disabled within Node. core.keyboardProcessor.keyboardInterface = keyboardWithHarness; @@ -132,7 +133,7 @@ describe('InputProcessor', function() { let key = layout.getLayer('default').getKey('K_A'); let event = keyboard.constructKeyEvent(key, device, core.keyboardProcessor.stateKeys); - let behavior = core.processKeyEvent(event, context); + let behavior = core.processKeyEvent(event, context, null); assert.isNotNull(behavior); }); }); @@ -140,17 +141,16 @@ describe('InputProcessor', function() { describe('with fat-fingering', function() { it('with minimal context (with fat-fingers)', function() { this.timeout(32); // ms - let core = new InputProcessor(device); + let core = new InputProcessor(device, null); let context = new Mock("", 0); core.keyboardProcessor.keyboardInterface = keyboardWithHarness; let keyboard = keyboardWithHarness.activeKeyboard; let layout = keyboard.layout(utils.DeviceSpec.FormFactor.Phone); let key = layout.getLayer('default').getKey('K_A'); - key.keyDistribution = testDistribution; let event = keyboard.constructKeyEvent(key, device, core.keyboardProcessor.stateKeys); - let behavior = core.processKeyEvent(event, context); + let behavior = core.processKeyEvent(event, context, null); assert.isNotNull(behavior); }); @@ -164,51 +164,52 @@ describe('InputProcessor', function() { // Keep at the same 'order of magnitude' as the // 'without fat-fingers' test. - let core = new InputProcessor(device); // It IS long context, and time + let core = new InputProcessor(device, null); // It IS long context, and time // thresholding is disabled within Node. - core.keyboardProcessor.keyboardInterface = keyboardWithHarness; + core.keyboardProcessor.keyboardInterface = keyboardWithHarness as KeyboardInterface; let keyboard = keyboardWithHarness.activeKeyboard; let layout = keyboard.layout(utils.DeviceSpec.FormFactor.Phone); let key = layout.getLayer('default').getKey('K_A'); - key.keyDistribution = testDistribution; let event = keyboard.constructKeyEvent(key, device, core.keyboardProcessor.stateKeys); - let behavior = core.processKeyEvent(event, context); + let behavior = core.processKeyEvent(event, context, null); assert.isNotNull(behavior); }); }); }); describe('Deadkeys bug #8568 - backspace should not reset all deadkeys', function () { - let keyboardWithHarness; + let keyboardWithHarness: KeyboardInterface; let testJSONtext = fs.readFileSync(require.resolve('@keymanapp/common-test-resources/json/engine_tests/8568_deadkeys.json')); // For convenience we define the key sequence in a test file although we don't use the // rest of the recorder stuff since it uses only KeyboardProcessor, not InputProcessor. - let testDefinitions = new KeyboardTest(JSON.parse(testJSONtext)); + let testDefinitions = new KeyboardTest(JSON.parse(testJSONtext.toString())); before(async function () { // Load the keyboard. let keyboardLoader = new NodeKeyboardLoader(new KeyboardInterface({}, MinimalKeymanGlobal)); const keyboard = await keyboardLoader.loadKeyboardFromPath(require.resolve('@keymanapp/common-test-resources/keyboards/test_8568_deadkeys.js')); - keyboardWithHarness = keyboardLoader.harness; + keyboardWithHarness = keyboardLoader.harness as KeyboardInterface; keyboardWithHarness.activeKeyboard = keyboard; // This part provides extra assurance that the keyboard properly loaded. assert.equal(keyboard.id, "Keyboard_test_8568_deadkeys"); }); - for (let testSet of testDefinitions.inputTestSets[0]['testSet']) { + const testsToRun: RecordedSequenceTestSet = testDefinitions.inputTestSets[0] as RecordedSequenceTestSet; + for (let testSet of testsToRun.testSet) { it(testSet.msg ?? 'test', function() { this.timeout(32); // ms - let core = new InputProcessor(device); + let core = new InputProcessor(device, null); let context = new Mock("", 0); core.keyboardProcessor.keyboardInterface = keyboardWithHarness; let keyboard = keyboardWithHarness.activeKeyboard; - for (let keystroke of testSet.inputs) { - let keyEvent = { + for (let key of testSet.inputs) { + const keystroke = key as RecordedPhysicalKeystroke; + let keySpec: KeyEventSpec = { Lcode: keystroke.keyCode, Lmodifiers: keystroke.modifiers, LmodifierChange: keystroke.modifierChanged, @@ -217,10 +218,10 @@ describe('InputProcessor', function() { kName: '', device: device, isSynthetic: false, - LisVirtualKey: keyboard.definesPositionalOrMnemonic // Only false for 1.0 keyboards. + LisVirtualKey: keyboard.definesPositionalOrMnemonic // Only false for 1.0 keyboards., }; - let behavior = core.processKeyEvent(keyEvent, context); + let behavior = core.processKeyEvent(new KeyEvent(keySpec), context, null); assert.isNotNull(behavior); } assert.equal(context.getText(), testSet.output); diff --git a/web/src/test/auto/headless/engine/main/headless/languageProcessor.tests.js b/web/src/test/auto/headless/engine/main/languageProcessor.tests.ts similarity index 88% rename from web/src/test/auto/headless/engine/main/headless/languageProcessor.tests.js rename to web/src/test/auto/headless/engine/main/languageProcessor.tests.ts index a02f1b7474..cb6adffccd 100644 --- a/web/src/test/auto/headless/engine/main/headless/languageProcessor.tests.js +++ b/web/src/test/auto/headless/engine/main/languageProcessor.tests.ts @@ -1,27 +1,36 @@ +import { env } from 'node:process'; +import path from 'node:path'; + import { assert } from 'chai'; -import { LanguageProcessor, TranscriptionCache } from 'keyman/engine/main'; import { SourcemappedWorker as LMWorker } from "@keymanapp/lexical-model-layer/node"; +import { LexicalModelCompiler } from '@keymanapp/kmc-model'; +import { TestCompilerCallbacks } from '@keymanapp/developer-test-helpers'; + +import { ModelSpec } from 'keyman/engine/interfaces'; +import { LanguageProcessor, TranscriptionCache } from 'keyman/engine/main'; +import { MinimalKeymanGlobal } from 'keyman/engine/keyboard'; import { Mock } from 'keyman/engine/js-processor'; /* * Unit tests for the Dummy prediction model. */ -import { LexicalModelCompiler } from '@keymanapp/kmc-model'; -import path from 'path'; -import { TestCompilerCallbacks } from '@keymanapp/developer-test-helpers'; - -import { env } from 'node:process'; const KEYMAN_ROOT = env.KEYMAN_ROOT; +declare global { + var keyman: typeof MinimalKeymanGlobal; +} + // Required initialization setup. -global.keyman = {}; // So that keyboard-based checks against the global `keyman` succeed. - // 10.0+ dependent keyboards, like khmer_angkor, will otherwise fail to load. +// +// So that keyboard-based checks against the global `keyman` succeed. 10.0+ +// dependent keyboards, like khmer_angkor, will otherwise fail to load. +global.keyman = MinimalKeymanGlobal; // Test the KeyboardProcessor interface. describe('LanguageProcessor', function() { - let languageProcessor; + let languageProcessor: LanguageProcessor; const callbacks = new TestCompilerCallbacks(); beforeEach(function() { @@ -57,19 +66,18 @@ describe('LanguageProcessor', function() { it('has expected default values after initialization', function () { // These checks are lifted from the keyboard init checks found in // web/src/test/auto/headless/engine/js-processor/basic-init.js. - assert.isDefined(languageProcessor.lmEngine); assert.isUndefined(languageProcessor.activeModel); assert.isFalse(languageProcessor.isActive); assert.isTrue(languageProcessor.mayPredict); // Some aspects of initialization must wait until after construction and overall // load of the core. See /web/source/kmwbase.ts, in the final IIFE. - assert.isOk(languageProcessor.lmEngine); + assert.isTrue(languageProcessor.canEnable); }); }); describe('.predict', function() { - let compiler = null; + let compiler: LexicalModelCompiler = null; this.beforeAll(async function() { compiler = new LexicalModelCompiler(); @@ -82,7 +90,8 @@ describe('LanguageProcessor', function() { const PATH = path.join(`${KEYMAN_ROOT}/developer/src/kmc-model/test/fixtures`, MODEL_ID); describe('using angle brackets for quotes', function() { - let modelCode = null, modelSpec = null; + let modelCode: string = null; + let modelSpec: ModelSpec = null; this.beforeAll(function() { modelCode = compiler.generateLexicalModelCode(MODEL_ID, { format: 'trie-1.0', @@ -114,7 +123,7 @@ describe('LanguageProcessor', function() { let transcription = contextSource.buildTranscriptionFrom(contextSource, null, null); languageProcessor.loadModel(modelSpec).then(function() { - languageProcessor.predict(transcription).then(function(suggestions) { + languageProcessor.predict(transcription, 'default').then(function(suggestions) { assert.isOk(suggestions); assert.equal(suggestions[0].displayAs, '«li»'); assert.equal(suggestions[0].transform.insert, 'li'); @@ -131,7 +140,8 @@ describe('LanguageProcessor', function() { }); describe('properly cases generated suggestions', function() { - let modelCode = null, modelSpec = null; + let modelCode: string = null; + let modelSpec: ModelSpec = null; this.beforeAll(function () { modelCode = compiler.generateLexicalModelCode(MODEL_ID, { format: 'trie-1.0', @@ -153,7 +163,7 @@ describe('LanguageProcessor', function() { let transcription = contextSource.buildTranscriptionFrom(contextSource, null, null); languageProcessor.loadModel(modelSpec).then(function() { - languageProcessor.predict(transcription).then(function(suggestions) { + languageProcessor.predict(transcription, 'default').then(function(suggestions) { assert.isOk(suggestions); assert.equal(suggestions[1].displayAs, 'like'); assert.equal(suggestions[1].transform.insert, 'like'); @@ -171,7 +181,7 @@ describe('LanguageProcessor', function() { let transcription = contextSource.buildTranscriptionFrom(contextSource, null, null); languageProcessor.loadModel(modelSpec).then(function() { - languageProcessor.predict(transcription).then(function(suggestions) { + languageProcessor.predict(transcription, 'default').then(function(suggestions) { // The source suggestion is simply 'like'. assert.isOk(suggestions); assert.equal(suggestions[1].displayAs, 'like'); @@ -190,7 +200,7 @@ describe('LanguageProcessor', function() { let transcription = contextSource.buildTranscriptionFrom(contextSource, null, null); languageProcessor.loadModel(modelSpec).then(function() { - languageProcessor.predict(transcription).then(function(suggestions) { + languageProcessor.predict(transcription, 'default').then(function(suggestions) { assert.isOk(suggestions); assert.equal(suggestions[1].displayAs, 'I'); assert.equal(suggestions[1].transform.insert, 'I'); @@ -210,7 +220,7 @@ describe('LanguageProcessor', function() { let transcription = contextSource.buildTranscriptionFrom(contextSource, null, null); languageProcessor.loadModel(modelSpec).then(function() { - languageProcessor.predict(transcription).then(function(suggestions) { + languageProcessor.predict(transcription, 'default').then(function(suggestions) { // The source suggestion is simply 'like'. assert.isOk(suggestions); assert.equal(suggestions[1].displayAs, 'LIKE'); @@ -229,7 +239,7 @@ describe('LanguageProcessor', function() { let transcription = contextSource.buildTranscriptionFrom(contextSource, null, null); languageProcessor.loadModel(modelSpec).then(function() { - languageProcessor.predict(transcription).then(function(suggestions) { + languageProcessor.predict(transcription, 'default').then(function(suggestions) { assert.isOk(suggestions); assert.equal(suggestions[0].displayAs, 'I'); assert.equal(suggestions[0].transform.insert, 'I'); @@ -250,7 +260,7 @@ describe('LanguageProcessor', function() { let transcription = contextSource.buildTranscriptionFrom(contextSource, null, null); languageProcessor.loadModel(modelSpec).then(function() { - languageProcessor.predict(transcription).then(function(suggestions) { + languageProcessor.predict(transcription, 'default').then(function(suggestions) { // The source suggestion is simply 'like'. assert.isOk(suggestions); assert.equal(suggestions[1].displayAs, 'Like'); @@ -271,7 +281,7 @@ describe('LanguageProcessor', function() { let transcription = contextSource.buildTranscriptionFrom(contextSource, null, null); languageProcessor.loadModel(modelSpec).then(function() { - languageProcessor.predict(transcription).then(function(suggestions) { + languageProcessor.predict(transcription, 'default').then(function(suggestions) { // The source suggestion is simply 'like'. assert.isOk(suggestions); assert.equal(suggestions[1].displayAs, 'Like');