UNPKG

clarity-pattern-parser

Version:

Parsing Library for Typescript and Javascript.

225 lines (158 loc) 7.11 kB
import { Cursor } from "../../patterns/Cursor"; import { escapedCharacter } from "./escapedCharacter"; import { exponent } from "./exponent"; import { expression } from "./expression"; import { assignment } from "./assignment"; import { infixOperator } from "./infixOperator"; import { integer } from "./integer"; import { name } from "./name"; import { parameters } from "./parameters"; import { prefixOperator } from "./prefixOperator"; describe("Ecmascript 3", () => { test("Escaped Character", () => { let result = escapedCharacter.exec(`\\"`); expect(result.ast?.value).toBe(`\\"`); result = escapedCharacter.exec(`\\'`); expect(result.ast?.value).toBe(`\\'`); result = escapedCharacter.exec(`\\\\`); expect(result.ast?.value).toBe(`\\\\`); result = escapedCharacter.exec(`\\/`); expect(result.ast?.value).toBe(`\\/`); result = escapedCharacter.exec(`\\f`); expect(result.ast?.value).toBe(`\\f`); result = escapedCharacter.exec(`\\t`); expect(result.ast?.value).toBe(`\\t`); result = escapedCharacter.exec(`\\u00E9`); expect(result.ast?.value).toBe(`\\u00E9`); }); test("Exponent", () => { let result = exponent.exec("e+1"); expect(result.ast?.value).toBe("e+1"); result = exponent.exec("e-1"); expect(result.ast?.value).toBe("e-1"); result = exponent.exec("E+1"); expect(result.ast?.value).toBe("E+1"); result = exponent.exec("E-1"); expect(result.ast?.value).toBe("E-1"); result = exponent.exec("e+11"); expect(result.ast?.value).toBe("e+11"); result = exponent.exec("11"); expect(result.ast).toBeNull(); }); test("Integer", () => { let result = integer.exec("0"); expect(result.ast?.value).toBe("0"); result = integer.exec("1"); expect(result.ast?.value).toBe("1"); result = integer.exec("100"); expect(result.ast?.value).toBe("100"); result = integer.exec(".1"); expect(result.ast).toBeNull(); }); test("Infix Operator", () => { let result = infixOperator.exec("*"); expect(result.ast?.value).toBe("*"); result = infixOperator.exec("/"); expect(result.ast?.value).toBe("/"); result = infixOperator.exec("%"); expect(result.ast?.value).toBe("%"); result = infixOperator.exec("+"); expect(result.ast?.value).toBe("+"); result = infixOperator.exec("-"); expect(result.ast?.value).toBe("-"); result = infixOperator.exec(">="); expect(result.ast?.value).toBe(">="); result = infixOperator.exec("<="); expect(result.ast?.value).toBe("<="); result = infixOperator.exec(">"); expect(result.ast?.value).toBe(">"); result = infixOperator.exec("<"); expect(result.ast?.value).toBe("<"); result = infixOperator.exec("==="); expect(result.ast?.value).toBe("==="); result = infixOperator.exec("!=="); expect(result.ast?.value).toBe("!=="); result = infixOperator.exec("||"); expect(result.ast?.value).toBe("||"); result = infixOperator.exec("&&"); expect(result.ast?.value).toBe("&&"); result = infixOperator.exec("bad"); expect(result.ast).toBeNull(); }); test("Name", () => { let result = name.exec("p_0"); expect(result.ast?.value).toBe("p_0"); result = name.exec("_0"); expect(result.ast?.value).toBe("_0"); result = name.exec("0"); expect(result.ast).toBeNull(); result = name.exec("_"); expect(result.ast?.value).toBe("_"); }); test("Parameters", () => { let result = parameters.exec("(param1)"); expect(result.ast?.value).toBe("(param1)"); result = parameters.exec("(param1, param2)"); expect(result.ast?.value).toBe("(param1, param2)"); result = parameters.exec("(param1, param2,)"); expect(result.ast).toBeNull(); }); test("Prefix Operator", () => { let result = prefixOperator.exec("typeof "); expect(result.ast?.value).toBe("typeof "); result = prefixOperator.exec("+"); expect(result.ast?.value).toBe("+"); result = prefixOperator.exec("-"); expect(result.ast?.value).toBe("-"); result = prefixOperator.exec("!"); expect(result.ast?.value).toBe("!"); result = prefixOperator.exec("a"); expect(result.ast).toBeNull(); }); test("Object Literal", () => { let result = expression.exec(`{}`, true); expect(result.ast?.value).toBe("{}"); result = expression.exec(`{prop:{}}`); expect(result.ast?.value).toBe("{prop:{}}"); result = expression.exec(`{prop:"value"}`); expect(result.ast?.value).toBe(`{prop:"value"}`); result = expression.exec(`{prop:0.9}`); expect(result.ast?.value).toBe(`{prop:0.9}`); result = expression.exec(`{prop:1}`); expect(result.ast?.value).toBe(`{prop:1}`); result = expression.exec(`{"prop":1}`); expect(result.ast?.value).toBe(`{"prop":1}`); }); test("Expression", () => { let result = expression.exec("[]"); expect(result.ast?.value).toBe("[]"); result = expression.exec("[{}, 9, 0.9e-10, [1, 2]]") expect(result.ast?.value).toBe("[{}, 9, 0.9e-10, [1, 2]]"); result = expression.exec(`"John"`); expect(result.ast?.value).toBe(`"John"`); result = expression.exec(`variableName.property`); expect(result.ast?.value).toBe(`variableName.property`); result = expression.exec(`{property: ""}`); expect(result.ast?.value).toBe(`{property: ""}`); const cursor = new Cursor(`name() == name.property === name2 ? {prop: name, blah: [ 0.9e-10 ]} : name`); cursor.startRecording(); }); test("Expression Statement", () => { let result = assignment.exec(`name = "John"`); expect(result.ast?.value).toBe(`name = "John"`); result = assignment.exec(`name = othername = "John"`); expect(result.ast?.value).toBe(`name = othername = "John"`); result = assignment.exec(`name = othername.prop = "John"`); expect(result.ast?.value).toBe(`name = othername.prop = "John"`); result = assignment.exec(`name = othername.prop += 2`); expect(result.ast?.value).toBe(`name = othername.prop += 2`); result = assignment.exec(`name.prop().method(blah) = blah.prop() == ha ? first : second`) expect(result.ast?.value).toBe(`name.prop().method(blah) = blah.prop() == ha ? first : second`); }); test("Object Access", () => { let result = expression.exec("name.prop"); expect(result.ast?.value).toBe(`name.prop`); result = expression.exec(`name.prop.anotherProp["Ha"][coolYo] === 1`); expect(result.ast?.value).toBe(`name.prop.anotherProp["Ha"][coolYo] === 1`); }); });