2025-12-18 13:35:48 -06:00
|
|
|
import * as data from "./data/index.js";
|
|
|
|
|
import {ExpressionEvaluationError} from "./errors.js";
|
|
|
|
|
import {Evaluator} from "./evaluator.js";
|
|
|
|
|
import {Lexer} from "./lexer.js";
|
|
|
|
|
import {Parser} from "./parser.js";
|
2023-01-06 15:54:31 -08:00
|
|
|
|
2023-01-18 14:50:51 -08:00
|
|
|
describe("evaluator", () => {
|
|
|
|
|
const lexAndParse = (input: string) => {
|
|
|
|
|
const lexer = new Lexer(input);
|
|
|
|
|
const result = lexer.lex();
|
2023-01-06 15:54:31 -08:00
|
|
|
|
2023-01-18 14:50:51 -08:00
|
|
|
// Parse
|
|
|
|
|
const parser = new Parser(result.tokens, ["foo"], []);
|
|
|
|
|
const expr = parser.parse();
|
|
|
|
|
return expr;
|
|
|
|
|
};
|
2023-01-06 15:54:31 -08:00
|
|
|
|
2023-01-18 14:50:51 -08:00
|
|
|
it("basic evaluation", () => {
|
|
|
|
|
const expr = lexAndParse("foo['']");
|
2023-01-06 15:54:31 -08:00
|
|
|
|
2023-01-18 14:50:51 -08:00
|
|
|
// Evaluate expression
|
|
|
|
|
const evaluator = new Evaluator(
|
|
|
|
|
expr,
|
|
|
|
|
new data.Dictionary({
|
|
|
|
|
key: "foo",
|
|
|
|
|
value: new data.Dictionary({key: "bar", value: new data.NumberData(42)})
|
|
|
|
|
})
|
|
|
|
|
);
|
|
|
|
|
const eresult = evaluator.evaluate();
|
2023-01-06 15:54:31 -08:00
|
|
|
|
2023-01-18 14:50:51 -08:00
|
|
|
expect(eresult.kind).toBe(data.Kind.Null);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
it("handle runtime errors", () => {
|
|
|
|
|
const expr = lexAndParse("fromJson('test') == 123");
|
|
|
|
|
const evaluator = new Evaluator(expr, new data.Dictionary());
|
|
|
|
|
|
|
|
|
|
expect(() => evaluator.evaluate()).toThrowError(
|
|
|
|
|
new ExpressionEvaluationError("Error parsing JSON when evaluating fromJson")
|
|
|
|
|
);
|
|
|
|
|
});
|
2023-01-06 15:54:31 -08:00
|
|
|
});
|