import { exprParser, id, identifierParser, list,
listParser, nakedListParser, numberParser } from "../../../parser/language/Language";
import { doc, loc, val } from "../../utils";
describe("language", () => {
test("parsers have descriptive names", () => {
expect(identifierParser().name).toEqual("id");
expect(numberParser().name).toEqual("num");
expect(exprParser().name).toEqual("expr");
expect(listParser(exprParser).name).toEqual("list(expr)");
});
test("parses lists", () => {
expect(
listParser(exprParser).parse(doc("(a b c d)"), loc(0, 0)))
.toEqual(val({ value: [id("a"), id("b"), id("c"), id("d")] }, loc(0, 9)));
});
test("parses nested lists", () => {
expect(
listParser(exprParser).parse(doc("(a (b c) d)"), loc(0, 0)))
.toEqual(val({ value: [id("a"), list([id("b"), id("c")]), id("d")] }, loc(0, 11)));
expect(
listParser(exprParser).parse(doc("(a ((b) c) d)"), loc(0, 0)))
.toEqual(val({ value: [id("a"), list([list([id("b")]), id("c")]), id("d")] }, loc(0, 13)));
});
test("parses naked lists", () => {
expect(
nakedListParser(exprParser).parse(doc("a"), loc(0, 0)))
.toEqual(val(list([id("a")]), loc(0, 1)));
expect(
nakedListParser(exprParser).parse(doc("a b"), loc(0, 0)))
.toEqual(val(list([id("a"), id("b")]), loc(0, 3)));
expect(
nakedListParser(exprParser).parse(doc("a (b c) d"), loc(0, 0)))
.toEqual(val(list([id("a"), list([id("b"), id("c")]), id("d")]), loc(0, 9)));
});
});