Replace the old Lisp-like array expression representation (["AND", ["PARAM", ...], ...]) with a class hierarchy rooted in an abstract Expression class (Literal, Parameter, Binary, Unary, FunctionCall, Conditional). This gives compile-time type safety to expression construction, evaluation, and pattern matching. Key changes: - New lib/common/expression.ts defines the class hierarchy with map/evaluate/toString methods - Rewrite parser as hand-rolled recursive descent, removing the parsimmon dependency - Extend Path with a colon separator to unify parameter identity and attributes into a single address space (e.g. "Device.WiFi.SSID.1.Name:writable"). The colon field tracks how many trailing segments are attribute qualifiers. PathSet rewritten with separate param/attr segment indexes - Flatten device attribute representation in the UI to colon-delimited keys mirroring the new path syntax
66 lines
1.5 KiB
TypeScript
66 lines
1.5 KiB
TypeScript
import test from "node:test";
|
|
import assert from "node:assert";
|
|
import Path from "../lib/common/path.ts";
|
|
import PathSet from "../lib/common/path-set.ts";
|
|
|
|
void test("add", () => {
|
|
const pathSet = new PathSet();
|
|
pathSet.add("a");
|
|
pathSet.add("a");
|
|
assert.strictEqual(
|
|
pathSet.findCompat(Path.parse("a"), true, true, 99).length,
|
|
1,
|
|
);
|
|
});
|
|
|
|
void test("get", () => {
|
|
const pathSet = new PathSet();
|
|
pathSet.add("a.*");
|
|
pathSet.add("a.a");
|
|
pathSet.add("*.*");
|
|
|
|
assert.strictEqual(pathSet.get("a.*").toString(), "a.*");
|
|
assert.equal(pathSet.get("*.a"), null);
|
|
});
|
|
|
|
void test("find", () => {
|
|
const pathSet = new PathSet();
|
|
pathSet.add("a");
|
|
pathSet.add("a.*");
|
|
pathSet.add("a.a");
|
|
pathSet.add("*.a");
|
|
pathSet.add("*.*");
|
|
|
|
assert.deepStrictEqual(
|
|
pathSet.findCompat(Path.root, true, true, 1).map((p) => p.toString()),
|
|
["a"],
|
|
);
|
|
|
|
assert.deepStrictEqual(
|
|
pathSet.findCompat(Path.root, false, false, 2).map((p) => p.toString()),
|
|
["a", "a.*", "a.a", "*.a", "*.*"],
|
|
);
|
|
|
|
assert.deepStrictEqual(
|
|
pathSet
|
|
.findCompat(Path.parse("a.*"), false, false)
|
|
.map((p) => p.toString()),
|
|
["a.*"],
|
|
);
|
|
|
|
assert.deepStrictEqual(
|
|
pathSet.findCompat(Path.parse("a.*"), false, true).map((p) => p.toString()),
|
|
["a.*", "a.a"],
|
|
);
|
|
|
|
assert.deepStrictEqual(
|
|
pathSet.findCompat(Path.parse("a.*"), true, false).map((p) => p.toString()),
|
|
["a.*", "*.*"],
|
|
);
|
|
|
|
assert.deepStrictEqual(
|
|
pathSet.findCompat(Path.parse("a.*"), true, true).map((p) => p.toString()),
|
|
["a.*", "a.a", "*.a", "*.*"],
|
|
);
|
|
});
|