forked from sashin/sashinexists
77 lines
2.5 KiB
JavaScript
77 lines
2.5 KiB
JavaScript
import { ObjectTree, symbols, Tree } from "@weborigami/async-tree";
|
|
import assert from "node:assert";
|
|
import { describe, test } from "node:test";
|
|
|
|
import expressionObject from "../../src/runtime/expressionObject.js";
|
|
import { ops } from "../../src/runtime/internal.js";
|
|
|
|
describe("expressionObject", () => {
|
|
test("can instantiate an object", async () => {
|
|
const scope = new ObjectTree({
|
|
upper: (s) => s.toUpperCase(),
|
|
});
|
|
|
|
const entries = [
|
|
["hello", [[ops.scope, "upper"], "hello"]],
|
|
["world", [[ops.scope, "upper"], "world"]],
|
|
];
|
|
|
|
const object = await expressionObject(entries, scope);
|
|
assert.equal(await object.hello, "HELLO");
|
|
assert.equal(await object.world, "WORLD");
|
|
assert.equal(object[symbols.parent], scope);
|
|
});
|
|
|
|
test("can define a property getter", async () => {
|
|
let count = 0;
|
|
const increment = () => count++;
|
|
const entries = [["count", [ops.getter, [increment]]]];
|
|
const object = await expressionObject(entries, null);
|
|
assert.equal(await object.count, 0);
|
|
assert.equal(await object.count, 1);
|
|
});
|
|
|
|
test("treats a getter for a primitive value as a regular property", async () => {
|
|
const entries = [["name", [ops.getter, "world"]]];
|
|
const object = await expressionObject(entries, null);
|
|
assert.equal(object.name, "world");
|
|
});
|
|
|
|
test("can instantiate an Origami tree", async () => {
|
|
const entries = [
|
|
["name", "world"],
|
|
["message", [ops.concat, "Hello, ", [ops.scope, "name"], "!"]],
|
|
];
|
|
const parent = new ObjectTree({});
|
|
const object = await expressionObject(entries, parent);
|
|
assert.deepEqual(await Tree.plain(object), {
|
|
name: "world",
|
|
message: "Hello, world!",
|
|
});
|
|
assert.equal(object[symbols.parent], parent);
|
|
});
|
|
|
|
test("returned object values can be unpacked", async () => {
|
|
const entries = [["data.json", `{ "a": 1 }`]];
|
|
const parent = new ObjectTree({
|
|
"json.handler": {
|
|
unpack: JSON.parse,
|
|
},
|
|
});
|
|
const result = await expressionObject(entries, parent);
|
|
const dataJson = await result["data.json"];
|
|
const json = await dataJson.unpack();
|
|
assert.deepEqual(json, { a: 1 });
|
|
});
|
|
|
|
test("a key declared with parentheses is not enumerable", async () => {
|
|
const entries = [
|
|
["(hidden)", "shh"],
|
|
["visible", "hey"],
|
|
];
|
|
const object = await expressionObject(entries, null);
|
|
assert.deepEqual(Object.keys(object), ["visible"]);
|
|
assert.equal(object["hidden"], "shh");
|
|
});
|
|
});
|