@launchmenu/core
Version:
An environment for visual keyboard controlled applets
113 lines • 11.2 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
const MathInterpreter_helper_1 = require("./MathInterpreter.helper");
const HighlightParser_1 = require("../HighlightParser");
const highlightTags_1 = require("../utils/highlightTags");
// The highlight parsers largely relies on correctness of chevrotain, since it's only a light wrapper
describe("HighlightParser", () => {
describe("new HighlightParser", () => {
it("Correctly creates new parsers for valid grammars", () => {
expect(() => new MathInterpreter_helper_1.MathParser()).not.toThrow();
});
it("Warns about grammar definition errors", () => {
class SomeParser extends HighlightParser_1.HighlightParser {
constructor() {
super(MathInterpreter_helper_1.tokenList);
// Expression that is left recursive, which isn't allowed
this.expression = this.RULE("expression", () => {
let result = this.SUBRULE(this.expression);
this.MANY(() => {
const { tokenType } = this.OR([
{ ALT: () => this.CONSUME(MathInterpreter_helper_1.tokens.add) },
{ ALT: () => this.CONSUME(MathInterpreter_helper_1.tokens.sub) },
]);
const value = this.SUBRULE(this.expression);
result =
tokenType == MathInterpreter_helper_1.tokens.add ? result + value : result - value;
});
return result;
});
this.performSelfAnalysis();
}
}
expect(() => new SomeParser()).toThrow();
});
});
describe("HighlightParser.highlight", () => {
let parser;
beforeEach(() => {
parser = new MathInterpreter_helper_1.MathParser();
});
it("Retrieves the data which can be used for syntax highlighting from the lexer", () => {
const { nodes, errors } = parser.highlight("3*5");
expect(nodes[0]).toEqual({
text: "3",
start: 0,
end: 1,
tags: [highlightTags_1.highlightTags.literal, highlightTags_1.highlightTags.number],
});
expect(nodes[1]).toEqual({
text: "*",
start: 1,
end: 2,
tags: [highlightTags_1.highlightTags.operator],
});
expect(nodes[2]).toEqual({
text: "5",
start: 2,
end: 3,
tags: [highlightTags_1.highlightTags.literal, highlightTags_1.highlightTags.number],
});
expect(nodes.length).toEqual(3);
expect(errors.length).toEqual(0);
});
it("Retrieves tokenization errors", () => {
const { nodes, errors } = parser.highlight("3*ye5");
expect(errors.length).toEqual(1);
expect(errors[0]).toMatchObject({
syntaxRange: { start: 2, end: 4, text: "ye" },
});
expect(typeof errors[0].message).toEqual("string");
});
it("Retrieves grammar errors", () => {
const { nodes, errors } = parser.highlight("3*)5");
expect(errors.length).toEqual(1);
expect(errors[0]).toMatchObject({
syntaxRange: { start: 2, end: 3, text: ")" },
});
expect(typeof errors[0].message).toEqual("string");
});
});
describe("HighlightParser.execute", () => {
it("Uses the first defined rule by default", () => {
const parser = new MathInterpreter_helper_1.MathParser();
const { result, errors } = parser.execute("4+4");
expect(errors === null || errors === void 0 ? void 0 : errors.length).toBe(0);
expect(result).toBe(8);
});
it("Uses the init rule if specified", () => {
class SomeParser extends HighlightParser_1.HighlightParser {
constructor() {
super(MathInterpreter_helper_1.tokenList, {
startRule: "something2",
});
// Expression that is left recursive, which isn't allowed
this.something1 = this.RULE("something1", () => {
this.CONSUME(MathInterpreter_helper_1.tokens.sub);
return 3;
});
this.something2 = this.RULE("something2", () => {
this.CONSUME(MathInterpreter_helper_1.tokens.add);
return 3;
});
this.performSelfAnalysis();
}
}
const parser = new SomeParser();
const { result, errors } = parser.execute("+");
expect(errors === null || errors === void 0 ? void 0 : errors.length).toBe(0);
expect(result).toBe(3);
});
});
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSGlnaGxpZ2h0UGFyc2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3RleHRGaWVsZHMvc3ludGF4L190ZXN0cy9IaWdobGlnaHRQYXJzZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxxRUFBdUU7QUFDdkUsd0RBQW1EO0FBQ25ELDBEQUFxRDtBQUVyRCxxR0FBcUc7QUFDckcsUUFBUSxDQUFDLGlCQUFpQixFQUFFLEdBQUcsRUFBRTtJQUM3QixRQUFRLENBQUMscUJBQXFCLEVBQUUsR0FBRyxFQUFFO1FBQ2pDLEVBQUUsQ0FBQyxrREFBa0QsRUFBRSxHQUFHLEVBQUU7WUFDeEQsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksbUNBQVUsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ2pELENBQUMsQ0FBQyxDQUFDO1FBQ0gsRUFBRSxDQUFDLHVDQUF1QyxFQUFFLEdBQUcsRUFBRTtZQUM3QyxNQUFNLFVBQVcsU0FBUSxpQ0FBdUI7Z0JBQzVDO29CQUNJLEtBQUssQ0FBQyxrQ0FBUyxDQUFDLENBQUM7b0JBR3JCLHlEQUF5RDtvQkFDL0MsZUFBVSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLEdBQUcsRUFBRTt3QkFDaEQsSUFBSSxNQUFNLEdBQVcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7d0JBQ25ELElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFOzRCQUNYLE1BQU0sRUFBQyxTQUFTLEVBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDO2dDQUN4QixFQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLCtCQUFNLENBQUMsR0FBRyxDQUFDLEVBQUM7Z0NBQ3JDLEVBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsK0JBQU0sQ0FBQyxHQUFHLENBQUMsRUFBQzs2QkFDeEMsQ0FBQyxDQUFDOzRCQUNILE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDOzRCQUM1QyxNQUFNO2dDQUNGLFNBQVMsSUFBSSwrQkFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQzt3QkFDbEUsQ0FBQyxDQUFDLENBQUM7d0JBQ0gsT0FBTyxNQUFNLENBQUM7b0JBQ2xCLENBQUMsQ0FBQyxDQUFDO29CQWZDLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO2dCQUMvQixDQUFDO2FBZUo7WUFDRCxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxVQUFVLEVBQUUsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQzdDLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQyxDQUFDLENBQUM7SUFDSCxRQUFRLENBQUMsMkJBQTJCLEVBQUUsR0FBRyxFQUFFO1FBQ3ZDLElBQUksTUFBa0IsQ0FBQztRQUN2QixVQUFVLENBQUMsR0FBRyxFQUFFO1lBQ1osTUFBTSxHQUFHLElBQUksbUNBQVUsRUFBRSxDQUFDO1FBQzlCLENBQUMsQ0FBQyxDQUFDO1FBQ0gsRUFBRSxDQUFDLDZFQUE2RSxFQUFFLEdBQUcsRUFBRTtZQUNuRixNQUFNLEVBQUMsS0FBSyxFQUFFLE1BQU0sRUFBQyxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDaEQsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQztnQkFDckIsSUFBSSxFQUFFLEdBQUc7Z0JBQ1QsS0FBSyxFQUFFLENBQUM7Z0JBQ1IsR0FBRyxFQUFFLENBQUM7Z0JBQ04sSUFBSSxFQUFFLENBQUMsNkJBQWEsQ0FBQyxPQUFPLEVBQUUsNkJBQWEsQ0FBQyxNQUFNLENBQUM7YUFDdEQsQ0FBQyxDQUFDO1lBQ0gsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQztnQkFDckIsSUFBSSxFQUFFLEdBQUc7Z0JBQ1QsS0FBSyxFQUFFLENBQUM7Z0JBQ1IsR0FBRyxFQUFFLENBQUM7Z0JBQ04sSUFBSSxFQUFFLENBQUMsNkJBQWEsQ0FBQyxRQUFRLENBQUM7YUFDakMsQ0FBQyxDQUFDO1lBQ0gsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQztnQkFDckIsSUFBSSxFQUFFLEdBQUc7Z0JBQ1QsS0FBSyxFQUFFLENBQUM7Z0JBQ1IsR0FBRyxFQUFFLENBQUM7Z0JBQ04sSUFBSSxFQUFFLENBQUMsNkJBQWEsQ0FBQyxPQUFPLEVBQUUsNkJBQWEsQ0FBQyxNQUFNLENBQUM7YUFDdEQsQ0FBQyxDQUFDO1lBQ0gsTUFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDaEMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDckMsQ0FBQyxDQUFDLENBQUM7UUFDSCxFQUFFLENBQUMsK0JBQStCLEVBQUUsR0FBRyxFQUFFO1lBQ3JDLE1BQU0sRUFBQyxLQUFLLEVBQUUsTUFBTSxFQUFDLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUNsRCxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNqQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDO2dCQUM1QixXQUFXLEVBQUUsRUFBQyxLQUFLLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBQzthQUM5QyxDQUFDLENBQUM7WUFDSCxNQUFNLENBQUMsT0FBTyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3ZELENBQUMsQ0FBQyxDQUFDO1FBQ0gsRUFBRSxDQUFDLDBCQUEwQixFQUFFLEdBQUcsRUFBRTtZQUNoQyxNQUFNLEVBQUMsS0FBSyxFQUFFLE1BQU0sRUFBQyxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDakQsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDakMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQztnQkFDNUIsV0FBVyxFQUFFLEVBQUMsS0FBSyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUM7YUFDN0MsQ0FBQyxDQUFDO1lBQ0gsTUFBTSxDQUFDLE9BQU8sTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUN2RCxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUMsQ0FBQyxDQUFDO0lBQ0gsUUFBUSxDQUFDLHlCQUF5QixFQUFFLEdBQUcsRUFBRTtRQUNyQyxFQUFFLENBQUMsd0NBQXdDLEVBQUUsR0FBRyxFQUFFO1lBQzlDLE1BQU0sTUFBTSxHQUFHLElBQUksbUNBQVUsRUFBRSxDQUFDO1lBQ2hDLE1BQU0sRUFBQyxNQUFNLEVBQUUsTUFBTSxFQUFDLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUMvQyxNQUFNLENBQUMsTUFBTSxhQUFOLE1BQU0sdUJBQU4sTUFBTSxDQUFFLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMvQixNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzNCLENBQUMsQ0FBQyxDQUFDO1FBQ0gsRUFBRSxDQUFDLGlDQUFpQyxFQUFFLEdBQUcsRUFBRTtZQUN2QyxNQUFNLFVBQVcsU0FBUSxpQ0FBdUI7Z0JBQzVDO29CQUNJLEtBQUssQ0FBQyxrQ0FBUyxFQUFFO3dCQUNiLFNBQVMsRUFBRSxZQUFZO3FCQUMxQixDQUFDLENBQUM7b0JBSVAseURBQXlEO29CQUMvQyxlQUFVLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsR0FBRyxFQUFFO3dCQUNoRCxJQUFJLENBQUMsT0FBTyxDQUFDLCtCQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7d0JBQ3pCLE9BQU8sQ0FBQyxDQUFDO29CQUNiLENBQUMsQ0FBQyxDQUFDO29CQUNPLGVBQVUsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxHQUFHLEVBQUU7d0JBQ2hELElBQUksQ0FBQyxPQUFPLENBQUMsK0JBQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQzt3QkFDekIsT0FBTyxDQUFDLENBQUM7b0JBQ2IsQ0FBQyxDQUFDLENBQUM7b0JBWEMsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7Z0JBQy9CLENBQUM7YUFXSjtZQUVELE1BQU0sTUFBTSxHQUFHLElBQUksVUFBVSxFQUFFLENBQUM7WUFDaEMsTUFBTSxFQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUMsR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQzdDLE1BQU0sQ0FBQyxNQUFNLGFBQU4sTUFBTSx1QkFBTixNQUFNLENBQUUsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQy9CLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDM0IsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDLENBQUMsQ0FBQztBQUNQLENBQUMsQ0FBQyxDQUFDIn0=
;