UNPKG

@apistudio/apim-cli

Version:

CLI for API Management Products

115 lines (102 loc) 4.47 kB
const { compileExpression } = require("../dist/cjs/filtrex"); const { describe, it } = require("mocha"); const { expect } = require("chai"); const eval = (str, obj) => compileExpression(str)(obj); describe("Arithmetics", () => { it("can do simple numeric expressions", () => { expect(eval("1 + 2 * 3")).equals(7); expect(eval("2 * 3 + 1")).equals(7); expect(eval("1 + (2 * 3)")).equals(7); expect(eval("(1 + 2) * 3")).equals(9); expect(eval("((1 + 2) * 3 / 2 + 1 - 4 + 2 ^ 3) * -2")).equals(-19); expect(eval("1.4 * 1.1")).equals(1.54); expect(eval("97 mod 10")).equals(7); expect(eval("2 * 3 ^ 2")).equals(18); }); it("does math functions", () => { expect(eval("abs(-5)")).equals(5); expect(eval("abs(5)")).equals(5); expect(eval("ceil(4.1)")).equals(5); expect(eval("ceil(4.6)")).equals(5); expect(eval("floor(4.1)")).equals(4); expect(eval("floor(4.6)")).equals(4); expect(eval("round(4.1)")).equals(4); expect(eval("round(4.6)")).equals(5); expect(eval("sqrt(9)")).equals(3); }); it("supports functions with multiple args", () => { expect(eval("min()")).equals(Infinity); expect(eval("min(2)")).equals(2); expect(eval("max(2)")).equals(2); expect(eval("min(2, 5)")).equals(2); expect(eval("max(2, 5)")).equals(5); expect(eval("min(2, 5, 6)")).equals(2); expect(eval("max(2, 5, 6)")).equals(6); expect(eval("min(2, 5, 6, 1)")).equals(1); expect(eval("max(2, 5, 6, 1)")).equals(6); expect(eval("min(2, 5, 6, 1, 9)")).equals(1); expect(eval("max(2, 5, 6, 1, 9)")).equals(9); expect(eval("min(2, 5, 6, 1, 9, 12)")).equals(1); expect(eval("max(2, 5, 6, 1, 9, 12)")).equals(12); }); it("can do comparisons", () => { expect(eval("foo == 4", { foo: 4 })).equals(true); expect(eval("foo == 4", { foo: 3 })).equals(false); expect(eval("foo == 4", { foo: -4 })).equals(false); expect(eval("foo != 4", { foo: 4 })).equals(false); expect(eval("foo != 4", { foo: 3 })).equals(true); expect(eval("foo != 4", { foo: -4 })).equals(true); expect(eval("foo > 4", { foo: 3 })).equals(false); expect(eval("foo > 4", { foo: 4 })).equals(false); expect(eval("foo > 4", { foo: 5 })).equals(true); expect(eval("foo >= 4", { foo: 3 })).equals(false); expect(eval("foo >= 4", { foo: 4 })).equals(true); expect(eval("foo >= 4", { foo: 5 })).equals(true); expect(eval("foo < 4", { foo: 3 })).equals(true); expect(eval("foo < 4", { foo: 4 })).equals(false); expect(eval("foo < 4", { foo: 5 })).equals(false); expect(eval("foo <= 4", { foo: 3 })).equals(true); expect(eval("foo <= 4", { foo: 4 })).equals(true); expect(eval("foo <= 4", { foo: 5 })).equals(false); }); it("can do chained comparisons", () => { expect(eval("1 == 1 == 1")).equals(true); expect(eval("1 == 1 != 2")).equals(true); expect(eval("1 != 2 != 1")).equals(true); expect(eval("1 < 2 <= 2 < 3")).equals(true); expect(eval("1 != 1 == 1")).equals(false); expect(eval("1 <= 1 > 1")).equals(false); expect(eval('"a" == "a" != "b"')).equals(true); expect(eval('"abc" == "abc" ~= "a.c" == "a.c" != "abc"')).equals(true); }); it("can do boolean logic", () => { const obj = { T: true, F: false }; expect(eval("F and F", obj)).equals(false); expect(eval("F and T", obj)).equals(false); expect(eval("T and F", obj)).equals(false); expect(eval("T and T", obj)).equals(true); expect(eval("F or F", obj)).equals(false); expect(eval("F or T", obj)).equals(true); expect(eval("T or F", obj)).equals(true); expect(eval("T or T", obj)).equals(true); expect(eval("not F", obj)).equals(true); expect(eval("not T", obj)).equals(false); expect(eval("(F and T) or T", obj)).equals(true); expect(eval("F and (T or T)", obj)).equals(false); expect(eval("F and T or T", obj)).equals(true); expect(eval("T or T and F", obj)).equals(true); expect(eval("not T and F", obj)).equals(false); }); it("does modulo correctly", () => { expect(eval("10 mod 2")).equals(0); expect(eval("11 mod 2")).equals(1); expect(eval("-1 mod 2")).equals(1); expect(eval("-0.1 mod 5")).equals(4.9); }); it("exponentiation has precedence over unary minus", () => { expect(eval("-x^2", { x: 2 })).equals(-4); }); it("exponentiation is right-associative", () => { expect(eval("5^3^2")).equals(5 ** (3 ** 2)); }); });