UNPKG

microvium

Version:

A compact, embeddable scripting engine for microcontrollers for executing small scripts written in a subset of JavaScript.

223 lines (222 loc) 7.1 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const chai_1 = require("chai"); const lib_1 = require("../../lib"); const fs_extra_1 = __importDefault(require("fs-extra")); // TODO: These tests don't test the mutability of exported bindings suite('modules', function () { test('basic-import', () => { let printLog = []; const vm = lib_1.Microvium.create(); vm.globalThis.print = (s) => printLog.push(s); const aModule = { default: 1, b: 2, d: 3, f: 4 }; const module = vm.evaluateModule({ sourceText: ` import a from 'aModule'; import { b } from 'aModule'; import c, { d } from 'aModule'; import * as e from 'aModule'; import { f as g } from 'aModule'; print(a); // 1 print(b); // 2 print(c); // 1 print(3); // 3 print(e); // { ... } print(g); // 4 export const h = 5, i = 6; export function j() { print(h); return 7; } `, importDependency(specifier) { chai_1.assert.equal(specifier, 'aModule'); return aModule; } }); chai_1.assert.deepEqual(printLog, [ 1, 2, 1, 3, { default: 1, b: 2, d: 3, f: 4 }, 4 ]); printLog = []; chai_1.assert.equal(module.h, 5); chai_1.assert.equal(module.i, 6); chai_1.assert.equal(module.j(), 7); chai_1.assert.deepEqual(printLog, [5]); }); test('module-source-import', () => { const m1 = { sourceText: ` import { y } from './m2'; print('m1 importing'); export const x = 5; print(y); // print 6 `, importDependency: specifier => { chai_1.assert.equal(specifier, './m2'); return vm.evaluateModule(m2); } }; const m2 = { sourceText: ` import { x } from './m1' print('m2 importing'); export const y = 6; print(x); // Should print 'undefined' if the module cache is working `, importDependency: specifier => { chai_1.assert.equal(specifier, './m1'); return vm.evaluateModule(m1); } }; let printLog = []; const vm = lib_1.Microvium.create(); vm.globalThis.print = (s) => printLog.push(s); vm.evaluateModule(m1); chai_1.assert.deepEqual(printLog, [ 'm2 importing', undefined, 'm1 importing', 6 ]); }); test('shared-import', () => { const m1 = { sourceText: ` import { x } from './m3'; export function inc() { x++; } vmExport(1, inc); `, importDependency: specifier => { chai_1.assert.equal(specifier, './m3'); return vm.evaluateModule(m3); } }; const m2 = { sourceText: ` import { x } from './m3'; export function printX() { print(x); } vmExport(2, printX); `, importDependency: specifier => { chai_1.assert.equal(specifier, './m3'); return vm.evaluateModule(m3); } }; const m3 = { sourceText: ` export let x = 1; ` }; let printLog = []; const vm = lib_1.Microvium.create(); vm.globalThis.vmExport = vm.vmExport; vm.globalThis.print = (s) => printLog.push(s); const { inc } = vm.evaluateModule(m1); const { printX } = vm.evaluateModule(m2); printX(); // Prints 1 inc(); printX(); // Prints 2, showing that x is shared chai_1.assert.deepEqual(printLog, [ 1, 2, ]); }); test('class-import', () => { const m1 = { sourceText: ` import { MyClass } from './m2' vmExport(1, () => { const inst = new MyClass() print(inst.x) print(inst.myMethod()) print(inst.myMethod()) }); `, importDependency: specifier => { chai_1.assert.equal(specifier, './m2'); return vm.evaluateModule(m2); } }; const m2 = { sourceText: ` export class MyClass { constructor() { this.x = 5 } myMethod() { return ++this.x } } ` }; let printLog = []; const vm = lib_1.Microvium.create(); vm.globalThis.vmExport = vm.vmExport; vm.globalThis.print = (s) => printLog.push(s); vm.evaluateModule(m1); vm.resolveExport(1)(); chai_1.assert.deepEqual(printLog, [ 5, 6, 7, ]); }); test('default-fetcher', () => { const moduleOptions = { fileSystemAccess: 'subdir-only', basedir: 'test/modules/src', includes: ['**/*.mvm.js'], allowNodeCoreModules: true, coreModules: { 'core': './a-core-module.mvm.js' } }; let printLog = []; const vm = lib_1.Microvium.create(); const importer = (0, lib_1.nodeStyleImporter)(vm, moduleOptions); vm.globalThis.print = (s) => printLog.push(s); if (fs_extra_1.default.existsSync('test/modules/output.txt')) fs_extra_1.default.removeSync('test/modules/output.txt'); importer('./m1'); chai_1.assert.deepEqual(printLog, [ 'importing m3', 'Writing to a file', 'importing m2', 'importing m1', ]); const output = fs_extra_1.default.readFileSync('test/modules/output.txt', 'utf8'); chai_1.assert.equal(output, 'This is some output'); }); test('import-for-side-effects', () => { let printLog = []; const vm = lib_1.Microvium.create(); vm.globalThis.print = (s) => printLog.push(s); const otherModule = { sourceText: ` print('Other module side effects'); ` }; vm.evaluateModule({ sourceText: ` import 'other'; `, importDependency(specifier) { chai_1.assert.equal(specifier, 'other'); return vm.evaluateModule(otherModule); } }); chai_1.assert.deepEqual(printLog, [ 'Other module side effects' ]); }); }); //# sourceMappingURL=modules.test.js.map