2023-08-06 06:38:52 +00:00
|
|
|
import { parse } from "./notcl";
|
|
|
|
|
|
|
|
describe("Parsing Notcl", () => {
|
|
|
|
describe("Commands", () => {
|
2023-08-06 23:52:00 +00:00
|
|
|
it("can parse an empty script", () =>
|
2023-08-06 06:38:52 +00:00
|
|
|
expect(parse("")).toEqual([true, []]));
|
2023-08-06 23:52:00 +00:00
|
|
|
|
|
|
|
it("can parse a one-word command", () =>
|
|
|
|
expect(parse("a")).toEqual([true, [[{ text: "a" }]]]));
|
|
|
|
|
|
|
|
it("can parse a multi-word command", () =>
|
|
|
|
expect(parse("a b c")).toEqual([
|
|
|
|
true,
|
|
|
|
[[{ text: "a" }, { text: "b" }, { text: "c" }]],
|
|
|
|
]));
|
|
|
|
|
|
|
|
it("accepts newlines as command separators", () =>
|
|
|
|
expect(parse("a\nb")).toEqual([
|
|
|
|
true,
|
|
|
|
[[{ text: "a" }], [{ text: "b" }]],
|
|
|
|
]));
|
|
|
|
it("does not split commands on folded newlines", () =>
|
|
|
|
expect(
|
|
|
|
parse(String.raw`a\
|
|
|
|
b`)
|
|
|
|
).toEqual([true, [[{ text: "a" }, { text: "b" }]]]));
|
2023-08-07 00:18:38 +00:00
|
|
|
it("does split words on folded newlines", () =>
|
|
|
|
expect(
|
|
|
|
parse(String.raw`a\
|
|
|
|
b`)
|
|
|
|
).toEqual([true, [[{ text: "a" }, { text: "b" }]]]));
|
|
|
|
it("does split commands on newlines with escaped backslashes", () =>
|
2023-08-06 23:52:00 +00:00
|
|
|
expect(
|
|
|
|
parse(String.raw`a\\
|
|
|
|
b`)
|
2023-08-07 00:18:38 +00:00
|
|
|
).toEqual([true, [[{ text: "a\\\\" }], [{ text: "b" }]]]));
|
2023-08-06 23:52:00 +00:00
|
|
|
it("does not split commands on folded newlines with escaped backslashes", () =>
|
|
|
|
expect(
|
|
|
|
parse(String.raw`a\\\
|
|
|
|
b`)
|
|
|
|
).toEqual([true, [[{ text: "a\\\\" }, { text: "b" }]]]));
|
|
|
|
|
|
|
|
it("accepts semicolons as command separators", () =>
|
|
|
|
expect(parse("a;b")).toEqual([true, [[{ text: "a" }], [{ text: "b" }]]]));
|
|
|
|
|
|
|
|
it("tolerates, and ignores, empty commands", () =>
|
|
|
|
expect(parse("a;;b\n\nc")).toEqual([
|
|
|
|
true,
|
|
|
|
[[{ text: "a" }], [{ text: "b" }], [{ text: "c" }]],
|
|
|
|
]));
|
|
|
|
|
|
|
|
test.each([[" a"], ["a "], ["a ;"], ["; a"]])(
|
|
|
|
"tolerates whitespace before and after commands {%s}",
|
|
|
|
(text) => expect(parse(text)).toEqual([true, [[{ text: "a" }]]])
|
|
|
|
);
|
|
|
|
});
|
|
|
|
|
|
|
|
describe("Comments", () => {
|
|
|
|
it("ignores comments", () => expect(parse("#comment")).toEqual([true, []]));
|
|
|
|
it("does not treat # in argument position as a comment", () =>
|
|
|
|
expect(parse("a #1")).toEqual([true, [[{ text: "a" }, { text: "#1" }]]]));
|
|
|
|
it("can have commands before a comment", () =>
|
|
|
|
expect(parse("a ;#comment")).toEqual([true, [[{ text: "a" }]]]));
|
|
|
|
|
|
|
|
it("ignores the whole line after a comment", () =>
|
|
|
|
expect(parse("# comment ; not a command")).toEqual([true, []]));
|
|
|
|
|
|
|
|
it("continues the comment through a folded newline", () =>
|
|
|
|
expect(
|
|
|
|
parse(String.raw`#a\
|
|
|
|
b`)
|
|
|
|
).toEqual([true, []]));
|
|
|
|
it("does not continue the comment through a newline with escaped backslashes", () =>
|
|
|
|
expect(
|
|
|
|
parse(String.raw`#a\\
|
|
|
|
b`)
|
|
|
|
).toEqual([true, [[{ text: "b" }]]]));
|
|
|
|
it("continues the comment through a folded newline with escaped backslashes", () =>
|
|
|
|
expect(
|
|
|
|
parse(String.raw`#a\\\
|
|
|
|
b`)
|
|
|
|
).toEqual([true, []]));
|
2023-08-06 06:38:52 +00:00
|
|
|
});
|
2023-08-06 23:52:00 +00:00
|
|
|
|
|
|
|
// Enchanted Words
|
|
|
|
|
|
|
|
// Braces
|
|
|
|
// nesting
|
|
|
|
// escapes
|
|
|
|
// {, }, correct newline folding
|
|
|
|
|
|
|
|
// "Quotes"
|
|
|
|
|
|
|
|
// Interpolated words
|
|
|
|
// bare
|
|
|
|
// quotes
|
|
|
|
// variables- bare, brace
|
|
|
|
// command subst
|
2023-08-06 06:38:52 +00:00
|
|
|
});
|