imicros-feel-interpreter
Version:
DMN decisions and FEEL language interpreter
309 lines (302 loc) • 15.6 kB
JavaScript
;
const Node = require("../lib/ast.js");
const util = require('util');
const Interpreter = require("../lib/interpreter.js");
const interpreter = new Interpreter();
let exp = "";
describe("Arithmetic Expressions", () => {
it("Expression:-.99", (exp = "-.99") => {
let success = interpreter.parse(exp);
let results = interpreter.ast;
// console.log(util.inspect(results, { showHidden: false, depth: null, colors: true }));
expect(success).toEqual(true);
expect(results).toBeDefined();
expect(results.length).toEqual(1);
expect(results[0].node).toEqual(Node.NEGATION);
expect(results[0].expression.decimals).toEqual(99);
expect(results[0].expression.float).toEqual(0.99);
});
it("Expression:-(.99)", (exp = "-(.99)") => {
let success = interpreter.parse(exp);
let results = interpreter.ast;
// console.log(util.inspect(results, { showHidden: false, depth: null, colors: true }));
expect(success).toEqual(true);
expect(results).toBeDefined();
expect(results.length).toEqual(1);
expect(results[0].node).toEqual(Node.NEGATION);
expect(results[0].expression.node).toEqual(Node.EVAL);
expect(results[0].expression.expression.decimals).toEqual(99);
});
it("Expression:-98.746", (exp = "-98.746") => {
let success = interpreter.parse(exp);
let results = interpreter.ast;
// console.log(util.inspect(results, { showHidden: false, depth: null, colors: true }));
expect(success).toEqual(true);
expect(results).toBeDefined();
expect(results.length).toEqual(1);
expect(results[0].node).toEqual(Node.NEGATION);
expect(results[0].expression.integer).toEqual(98);
expect(results[0].expression.decimals).toEqual(746);
});
it("Expression:-a", (exp = "-a") => {
let success = interpreter.parse(exp);
let results = interpreter.ast;
// console.log(util.inspect(results, { showHidden: false, depth: null, colors: true }));
expect(success).toEqual(true);
expect(results).toBeDefined();
expect(results.length).toEqual(1);
expect(results[0].node).toEqual(Node.NEGATION);
expect(results[0].expression.node).toEqual(Node.NAME);
expect(results[0].expression.value).toEqual("a");
});
it("Expression:1+2*3", (exp = "1+2*3") => {
let success = interpreter.parse(exp);
let results = interpreter.ast;
// console.log(util.inspect(results, { showHidden: false, depth: null, colors: true }));
expect(success).toEqual(true);
expect(results).toBeDefined();
expect(results.length).toEqual(1);
expect(results[0].node).toEqual(Node.SUM);
expect(results[0].operator).toEqual("+");
expect(results[0].left.integer).toEqual(1);
expect(results[0].right.node).toEqual(Node.PRODUCT);
expect(results[0].right.operator).toEqual("*");
expect(results[0].right.left.integer).toEqual(2);
expect(results[0].right.right.integer).toEqual(3);
});
it("Expression:1/2-3", (exp = "1/2-3") => {
let success = interpreter.parse(exp);
let results = interpreter.ast;
// console.log(util.inspect(results, { showHidden: false, depth: null, colors: true }));
expect(success).toEqual(true);
expect(results).toBeDefined();
expect(results.length).toEqual(1);
expect(results[0].node).toEqual(Node.SUM);
expect(results[0].operator).toEqual("-");
expect(results[0].left.node).toEqual(Node.PRODUCT);
expect(results[0].left.operator).toEqual("/");
expect(results[0].left.left.integer).toEqual(1);
expect(results[0].left.right.integer).toEqual(2);
expect(results[0].right.integer).toEqual(3);
});
it("Expression:9.5+77", (exp = "9.5+77") => {
let success = interpreter.parse(exp);
let results = interpreter.ast;
// console.log(util.inspect(results, { showHidden: false, depth: null, colors: true }));
expect(success).toEqual(true);
expect(results).toBeDefined();
expect(results.length).toEqual(1);
expect(results[0].node).toEqual(Node.SUM);
expect(results[0].operator).toEqual("+");
expect(results[0].left.integer).toEqual(9);
expect(results[0].left.decimals).toEqual(5);
expect(results[0].right.integer).toEqual(77);
});
it("Expression:(9.5-8.6)+77", (exp = "(9.5-8.6)+77") => {
let success = interpreter.parse(exp);
let results = interpreter.ast;
// console.log(util.inspect(results, { showHidden: false, depth: null, colors: true }));
expect(success).toEqual(true);
expect(results).toBeDefined();
expect(results.length).toEqual(1);
expect(results[0].node).toEqual(Node.SUM);
expect(results[0].operator).toEqual("+");
expect(results[0].left.node).toEqual(Node.EVAL);
expect(results[0].left.expression.node).toEqual(Node.SUM);
expect(results[0].left.expression.operator).toEqual("-");
expect(results[0].left.expression.left.integer).toEqual(9);
expect(results[0].left.expression.left.decimals).toEqual(5);
expect(results[0].left.expression.right.integer).toEqual(8);
expect(results[0].left.expression.right.decimals).toEqual(6);
expect(results[0].right.integer).toEqual(77);
});
it("Expression:((9.5)- 8.6 ) + 77", (exp = "((9.5)- 8.6 ) + 77") => {
let success = interpreter.parse(exp);
let results = interpreter.ast;
// console.log(util.inspect(results, { showHidden: false, depth: null, colors: true }));
expect(success).toEqual(true);
expect(results).toBeDefined();
expect(results.length).toEqual(1);
expect(results[0].node).toEqual(Node.SUM);
expect(results[0].operator).toEqual("+");
expect(results[0].left.node).toEqual(Node.EVAL);
expect(results[0].left.expression.node).toEqual(Node.SUM);
expect(results[0].left.expression.operator).toEqual("-");
expect(results[0].left.expression.left.node).toEqual(Node.EVAL);
expect(results[0].left.expression.left.expression.integer).toEqual(9);
expect(results[0].left.expression.left.expression.decimals).toEqual(5);
expect(results[0].left.expression.right.integer).toEqual(8);
expect(results[0].left.expression.right.decimals).toEqual(6);
expect(results[0].right.integer).toEqual(77);
});
it("Expression:1/2**-4-3", (exp = "1/2**-4-3") => {
let success = interpreter.parse(exp);
let results = interpreter.ast;
// console.log(util.inspect(results, { showHidden: false, depth: null, colors: true }));
expect(success).toEqual(true);
expect(results).toBeDefined();
expect(results.length).toEqual(1);
expect(results[0].node).toEqual(Node.SUM);
expect(results[0].operator).toEqual("-");
expect(results[0].left.node).toEqual(Node.PRODUCT);
expect(results[0].left.operator).toEqual("/");
expect(results[0].left.left.integer).toEqual(1);
expect(results[0].left.right.node).toEqual(Node.EXPONENTATION);
expect(results[0].left.right.left.integer).toEqual(2);
expect(results[0].left.right.right.node).toEqual(Node.NEGATION);
expect(results[0].left.right.right.expression.integer).toEqual(4);
expect(results[0].right.integer).toEqual(3);
});
it("Expression:a+b-c", (exp = "a+b-c") => {
let success = interpreter.parse(exp);
let results = interpreter.ast;
// console.log(util.inspect(results, { showHidden: false, depth: null, colors: true }));
expect(success).toEqual(true);
expect(results).toBeDefined();
expect(results.length).toEqual(1);
expect(results[0].node).toEqual(Node.SUM);
expect(results[0].operator).toEqual("-");
expect(results[0].left.node).toEqual(Node.SUM);
expect(results[0].left.operator).toEqual("+");
expect(results[0].left.left.value).toEqual("a");
expect(results[0].left.right.value).toEqual("b");
expect(results[0].right.node).toEqual(Node.NAME);
expect(results[0].right.value).toEqual("c");
});
it("Expression:a*b*c", (exp = "a*b*c") => {
let success = interpreter.parse(exp);
let results = interpreter.ast;
// console.log(util.inspect(results, { showHidden: false, depth: null, colors: true }));
expect(success).toEqual(true);
expect(results).toBeDefined();
expect(results.length).toEqual(1);
expect(results[0].node).toEqual(Node.PRODUCT);
expect(results[0].operator).toEqual("*");
expect(results[0].left.node).toEqual(Node.PRODUCT);
expect(results[0].left.operator).toEqual("*");
expect(results[0].left.left.value).toEqual("a");
expect(results[0].left.right.value).toEqual("b");
expect(results[0].right.node).toEqual(Node.NAME);
expect(results[0].right.value).toEqual("c");
});
it("Expression:a + b/2 *6", (exp = "a + b/2 *6") => {
let success = interpreter.parse(exp);
let results = interpreter.ast;
// console.log(util.inspect(results, { showHidden: false, depth: null, colors: true }));
expect(success).toEqual(true);
expect(results).toBeDefined();
expect(results.length).toEqual(1);
expect(results[0].node).toEqual(Node.SUM);
expect(results[0].operator).toEqual("+");
expect(results[0].left.node).toEqual(Node.NAME);
expect(results[0].right.node).toEqual(Node.PRODUCT);
});
it("Expression:x*(a + b)", (exp = "x*(a + b)") => {
let success = interpreter.parse(exp);
let results = interpreter.ast;
// console.log(util.inspect(results, { showHidden: false, depth: null, colors: true }));
expect(success).toEqual(true);
expect(results).toBeDefined();
expect(results.length).toEqual(1);
expect(results[0].node).toEqual(Node.PRODUCT);
expect(results[0].operator).toEqual("*");
expect(results[0].left.node).toEqual(Node.NAME);
expect(results[0].right.node).toEqual(Node.EVAL);
});
it("Expression:(a + b)-(c+d)", (exp = "(a + b)-(c+d)") => {
let success = interpreter.parse(exp);
let results = interpreter.ast;
// console.log(util.inspect(results, { showHidden: false, depth: null, colors: true }));
expect(success).toEqual(true);
expect(results).toBeDefined();
expect(results.length).toEqual(1);
expect(results[0].node).toEqual(Node.SUM);
expect(results[0].operator).toEqual("-");
expect(results[0].left.node).toEqual(Node.EVAL);
expect(results[0].right.node).toEqual(Node.EVAL);
});
it("Expression:((a + b)*2)-(c+d)", (exp = "((a + b)*2)-(c+d)") => {
let success = interpreter.parse(exp);
let results = interpreter.ast;
// console.log(util.inspect(results, { showHidden: false, depth: null, colors: true }));
expect(success).toEqual(true);
expect(results).toBeDefined();
expect(results.length).toEqual(1);
expect(results[0].node).toEqual(Node.SUM);
expect(results[0].operator).toEqual("-");
expect(results[0].left.node).toEqual(Node.EVAL);
expect(results[0].right.node).toEqual(Node.EVAL);
});
it("Expression:a+b", (exp = "a+b") => {
let success = interpreter.parse(exp);
let results = interpreter.ast;
// console.log(util.inspect(results, { showHidden: false, depth: null, colors: true }));
expect(success).toEqual(true);
expect(results).toBeDefined();
expect(results.length).toEqual(1);
expect(results[0].node).toEqual(Node.SUM);
expect(results[0].operator).toEqual("+");
expect(results[0].left.node).toEqual(Node.NAME);
expect(results[0].left.value).toEqual("a");
expect(results[0].right.node).toEqual(Node.NAME);
expect(results[0].right.value).toEqual("b");
});
it("Expression:x0 + y", (exp = "x0 + y") => {
let success = interpreter.parse(exp);
let results = interpreter.ast;
// console.log(util.inspect(results, { showHidden: false, depth: null, colors: true }));
expect(success).toEqual(true);
expect(results).toBeDefined();
expect(results.length).toEqual(1);
expect(results[0].node).toEqual(Node.SUM);
expect(results[0].operator).toEqual("+");
expect(results[0].left.node).toEqual(Node.NAME);
expect(results[0].left.value).toEqual("x0");
expect(results[0].right.node).toEqual(Node.NAME);
expect(results[0].right.value).toEqual("y");
});
it("Expression:name with white space + other expression", (exp = "name with white space + other expression") => {
let success = interpreter.parse(exp);
let results = interpreter.ast;
// console.log(util.inspect(results, { showHidden: false, depth: null, colors: true }));
expect(success).toEqual(true);
expect(results).toBeDefined();
expect(results.length).toEqual(1);
expect(results[0].node).toEqual(Node.SUM);
expect(results[0].operator).toEqual("+");
expect(results[0].left.node).toEqual(Node.NAME);
expect(results[0].left.value).toEqual("name with white space");
expect(results[0].right.node).toEqual(Node.NAME);
expect(results[0].right.value).toEqual("other expression");
});
it("Expression:deep.a + deep.b.c", (exp = "deep.a + deep.b.c") => {
let success = interpreter.parse(exp);
let results = interpreter.ast;
// console.log(util.inspect(results, { showHidden: false, depth: null, colors: true }));
expect(success).toEqual(true);
expect(results).toBeDefined();
expect(results.length).toEqual(1);
expect(results[0].node).toEqual(Node.SUM);
expect(results[0].operator).toEqual("+");
expect(results[0].left.node).toEqual(Node.PATH);
expect(results[0].left.object.value).toEqual("deep");
expect(results[0].left.property.value).toEqual("a");
expect(results[0].right.node).toEqual(Node.PATH);
expect(results[0].right.object.object.value).toEqual("deep");
expect(results[0].right.object.property.value).toEqual("b");
expect(results[0].right.property.value).toEqual("c");
});
it("Expression:(a+b)", (exp = "(a+b)") => {
let success = interpreter.parse(exp);
let results = interpreter.ast;
// console.log(util.inspect(results, { showHidden: false, depth: null, colors: true }));
expect(success).toEqual(true);
expect(results).toBeDefined();
expect(results.length).toEqual(1);
expect(results[0].node).toEqual(Node.EVAL);
expect(results[0].expression.node).toEqual(Node.SUM);
expect(results[0].expression.operator).toEqual("+");
expect(results[0].expression.left.value).toEqual("a");
expect(results[0].expression.right.value).toEqual("b");
});
});