lobster/test/parser.test.ts
2026-05-04 01:56:15 +01:00

46 lines
1.7 KiB
TypeScript

import test from "node:test";
import assert from "node:assert/strict";
import { parsePipeline } from "../src/parser.js";
test("parsePipeline splits stages and args", () => {
const p = parsePipeline("exec echo hi | where a=1 | pick id,subject");
assert.equal(p.length, 3);
assert.equal(p[0].name, "exec");
assert.deepEqual(p[0].args._, ["echo", "hi"]);
assert.equal(p[1].name, "where");
assert.equal(p[1].args._[0], "a=1");
assert.equal(p[2].name, "pick");
assert.equal(p[2].args._[0], "id,subject");
});
test("parsePipeline keeps quoted pipes", () => {
const p = parsePipeline("exec echo 'a|b' | json");
assert.equal(p.length, 2);
assert.deepEqual(p[0].args._, ["echo", "a|b"]);
});
test("parsePipeline preserves JSON escapes in double-quoted args", () => {
const p = parsePipeline(
'openclaw.invoke --tool llm-task --action json --args-json "{\\"prompt\\":\\"line1\\\\nline2\\",\\"schema\\":{\\"type\\":\\"object\\"}}"',
);
assert.equal(p.length, 1);
const raw = p[0].args["args-json"];
const parsed = JSON.parse(raw);
assert.equal(parsed.prompt, "line1\nline2");
assert.equal(parsed.schema.type, "object");
});
test("parsePipeline keeps single-quoted args literal", () => {
const p = parsePipeline('openclaw.invoke --args-json \'{"x":"a\\\\nb"}\'');
assert.equal(p.length, 1);
assert.equal(p[0].args["args-json"], '{"x":"a\\\\nb"}');
});
test("parsePipeline preserves escaped apostrophes in single-quoted args", () => {
const p = parsePipeline('openclaw.invoke --args-json \'{"prompt":"don\\\'t"}\'');
assert.equal(p.length, 1);
const raw = p[0].args["args-json"];
const parsed = JSON.parse(raw);
assert.equal(parsed.prompt, "don't");
});