// SPDX-FileCopyrightText: 2022 Johannes Loher // // SPDX-License-Identifier: MIT import { describe, expect, it } from "vitest"; import { defaultEvaluator, Evaluator, mathEvaluator } from "../../src/expression-evaluation/evaluator"; describe("Evaluator", () => { it("evaluates expressions that only use identifiers according to the given predicate", () => { // given const expression = "typeof 'foo' === 'string' ? 42 : null"; // when const result = defaultEvaluator.evaluate(expression); // then expect(result).toEqual(42); }); it("fails to evaluate expressions that contain identifiers that are not allowed by the predicate", () => { // given const expression = "typeof 'foo' === 'string' ? 42 : function (){}"; // when const evaluate = () => defaultEvaluator.evaluate(expression); // then expect(evaluate).toThrowError("'function' is not an allowed identifier."); }); it("fails to evaluate expressions that contain invalid tokens", () => { // given const expression = "1;"; // when const evaluate = () => defaultEvaluator.evaluate(expression); // then expect(evaluate).toThrowError("Invalid or unexpected token (1)"); }); it("fails to evaluate expressions that contain arrow functions", () => { // given const expression = "(() => 1)()"; // when const evaluate = () => defaultEvaluator.evaluate(expression); // then expect(evaluate).toThrowError("Invalid or unexpected token (4)"); }); it("makes the given context available", () => { // given const context = { floor: Math.floor }; const evaluator = new Evaluator({ context }); const expression = "floor(0.5)"; // when const result = evaluator.evaluate(expression); // then expect(result).toEqual(0); }); describe("mathEvaluator", () => { it("makes the given context available", () => { // given const expression = "sqrt(sin(PI))"; // when const result = mathEvaluator.evaluate(expression); // then expect(result).toEqual(Math.sqrt(Math.sin(Math.PI))); }); it("does not give acces to the function constructor", () => { // given const expression = "sqrt.constructor"; // when const evaluate = () => mathEvaluator.evaluate(expression); // then expect(evaluate).toThrowError("'constructor' is not an allowed identifier."); }); }); });