microvium
Version:
A compact, embeddable scripting engine for microcontrollers for executing small scripts written in a subset of JavaScript.
109 lines • 5.25 kB
JavaScript
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const virtual_machine_1 = require("../../lib/virtual-machine");
const chai_1 = require("chai");
const snapshot_il_1 = require("../../lib/snapshot-il");
const virtual_machine_friendly_1 = require("../../lib/virtual-machine-friendly");
const common_1 = require("../common");
const general_1 = require("../../lib/general");
const filenames_1 = require("./filenames");
const lib_1 = __importDefault(require("../../lib"));
const encode_snapshot_1 = require("../../lib/encode-snapshot");
suite(virtual_machine_1.VirtualMachine.name, function () {
test('hello-world', () => {
const testResults = new common_1.TestResults();
const outputFilenames = filenames_1.virtualMachineTestFilenames['hello-world'];
const src = `print('Hello, World!');`;
const filename = 'dummy.mvm.js';
const printLog = [];
const vm = virtual_machine_friendly_1.VirtualMachineFriendly.create();
vm.globalThis.print = (v) => printLog.push(typeof v === 'string' ? v : JSON.stringify(v));
vm.evaluateModule({ sourceText: src, debugFilename: filename });
const snapshotInfo = vm.createSnapshotIL();
chai_1.assert.deepEqual(printLog, ['Hello, World!']);
const { snapshot, html } = (0, encode_snapshot_1.encodeSnapshot)(snapshotInfo, true, false);
const outputHTML = (0, general_1.htmlPageTemplate)(html);
testResults.push((0, snapshot_il_1.stringifySnapshotIL)(snapshotInfo), outputFilenames.snapshot);
testResults.push(snapshot.data, outputFilenames.bytecode);
testResults.push(outputHTML, outputFilenames.html);
testResults.checkAll();
});
test('addition', () => {
const testResults = new common_1.TestResults();
const outputFilenames = filenames_1.virtualMachineTestFilenames['addition'];
const src = `1 + 2;`;
const filename = 'dummy.mvm.js';
const vm = virtual_machine_friendly_1.VirtualMachineFriendly.create();
vm.evaluateModule({ sourceText: src, debugFilename: filename });
const snapshotInfo = vm.createSnapshotIL();
const { snapshot, html } = (0, encode_snapshot_1.encodeSnapshot)(snapshotInfo, true, false);
const outputHTML = (0, general_1.htmlPageTemplate)(html);
testResults.push((0, snapshot_il_1.stringifySnapshotIL)(snapshotInfo), outputFilenames.snapshot);
testResults.push(snapshot.data, outputFilenames.bytecode);
testResults.push(outputHTML, outputFilenames.html);
testResults.checkAll();
});
test('simple-branching', () => {
const testResults = new common_1.TestResults();
const outputFilenames = filenames_1.virtualMachineTestFilenames['simple-branching'];
const src = `
if (5 > 4) {
1;
} else {
0;
}
`;
const filename = 'dummy.mvm.js';
const vm = virtual_machine_friendly_1.VirtualMachineFriendly.create();
vm.evaluateModule({ sourceText: src, debugFilename: filename });
const snapshotInfo = vm.createSnapshotIL();
const { snapshot, html } = (0, encode_snapshot_1.encodeSnapshot)(snapshotInfo, true, false);
const outputHTML = (0, general_1.htmlPageTemplate)(html);
testResults.push((0, snapshot_il_1.stringifySnapshotIL)(snapshotInfo), outputFilenames.snapshot);
testResults.push(snapshot.data, outputFilenames.bytecode);
testResults.push(outputHTML, outputFilenames.html);
testResults.checkAll();
});
test('ephemeral-objects', () => {
let printLog = [];
const print = (s) => printLog.push(s);
const importMap = {
1: print
};
/*
Ephemeral objects in Microvium are objects that are not captured in the
snapshot, and refer directly to values in the host. These are analogous to
proxy values whose target goes missing when the snapshot is captured.
*/
const vm = virtual_machine_friendly_1.VirtualMachineFriendly.create(importMap);
const obj = {
x: 10,
y: 20,
};
vm.globalThis.print = vm.vmImport(1);
vm.globalThis.obj = obj;
vm.globalThis.vmExport = vm.vmExport;
const src = `
vmExport(0, foo);
function foo() {
print(obj.x);
}`;
vm.evaluateModule({ sourceText: src });
const foo = vm.resolveExport(0);
foo(); // Should print 10
// Mutate the object
obj.x = 50;
foo(); // Should print 50
chai_1.assert.deepEqual(printLog, [10, 50]);
// Cut off the proxy by creating a save/restore point
printLog = [];
const vm2 = lib_1.default.restore(vm.createSnapshot(), importMap);
const foo2 = vm2.resolveExport(0);
foo2(); // Should print undefined
chai_1.assert.deepEqual(printLog, [undefined]);
});
});
//# sourceMappingURL=virtual-machine.test.js.map