git.dumitru.net fructose / master src / tests / parser / language / language.test.ts
master

Tree @master (Download .tar.gz)

language.test.ts @masterraw · history · blame

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)));
  });
});