spiegel-keyman/common/predictive-text/unit_tests/helpers.js
2020-01-15 12:28:05 +07:00

139 lines
3.4 KiB
JavaScript

/**
* @file helpers
*
* Globally-defined helper functions for use in in Mocha tests.
*/
var fs = require("fs");
var vm = require("vm");
// Choose the appropriate global object. Either `global` in
// Node, or `window` in browsers.
var _ = global || window;
/**
* Creates a MessageEvent (for inter-worker communication), with the given data payload.
*
* @param {*} data
*/
_.createMessageEventWithData = function createMessageEventWithData(data) {
return { data };
}
/**
* Creates a simple, default capabilities object for standard-case LMLayer init.
*/
_.capabilities = function capabilities() {
return {
maxLeftContextCodePoints: 64
}
}
/**
* Mimics a message from the outer LMLayer shell with a simple, default config object.
* Used for Worker tests.
*/
_.configWorker = function configWorker(worker) {
worker.onMessage(createMessageEventWithData({
message: 'config',
capabilities: _.capabilities()
}));
}
/**
* A valid model that suggests exactly what you want it to suggest.
*
* @returns {ModelDescription}
*/
_.dummyModel = function dummyModel(futureSuggestions) {
return {
type: 'dummy',
futureSuggestions: futureSuggestions || []
};
}
/**
* Capabilities of a keyboard that will ONLY send left-sided capabilities.
* The keyboard does not support deleting to the right.
*
* @returns {Capabilities}
*/
_.defaultCapabilities = function defaultCapabilities() {
return {
maxLeftContextCodeUnits: 64
};
}
/**
* Returns the Context of an empty buffer; no text, at both the start and
* end of the buffer.
*
* @returns {Context}
*/
_.emptyContext = function emptyContext() {
return {
left: '',
startOfBuffer: true,
endOfBuffer: true
};
}
/**
* Returns a Transform that, when applied, makes no changes to the buffer.
*
* @returns {Transform}
*/
_.zeroTransform = function zeroTransform() {
return {
insert: '',
deleteLeft: 0,
};
}
/**
* Returns a random token. NOT guaranteed to be unique.
*
* @returns {Token}
*/
_.randomToken = function randomToken() {
var range = Number.MAX_SAFE_INTEGER - Number.MIN_SAFE_INTEGER;
return Math.random() * range + Number.MIN_SAFE_INTEGER;
}
// Use fixtures used in browser tests IN NODE!
if (typeof require === 'function') {
_.iGotDistractedByHazel = function () {
return jsonFixture('future_suggestions/i_got_distracted_by_hazel');
}
/**
* Return a JSON fixture
*/
_.jsonFixture = function (name) {
// Assuming this file structure:
// .
// ├── helpers.js
// └── in_browser
// └── json
// ├── future_suggestions
// │ └── ...
// └── wordlists
// └── ...
return require('./in_browser/json/' + name);
}
// This worker-global function does not exist by default in Node!
_.importScriptsWith = function(context) {
return function() { // the constructed context's importScripts method.
/* Use of vm.createContext and script.runInContext allow us to avoid
* polluting the global scope with imports. When we throw away the
* context object, imported scripts will be automatically GC'd.
*/
for(var i=0; i < arguments.length; i++) {
context = vm.createContext(context);
var script = new vm.Script(fs.readFileSync(arguments[i]));
script.runInContext(context);
}
}
}
}