jsexpr
Version:
String and JSON expression interpolator and evaluator. Interpolates or evaluates a string against a json object, or transforms an object into another based on a json template
87 lines (79 loc) • 2.6 kB
JavaScript
const
expression = require("../"),
assert = require('assert');
const MODES = ["eval","iteval","ceval"];
MODES.forEach(mode=>{
describe(`Expression parser (${mode})`, function() {
it('Should parse expression', function() {
try {
let fn1 = expression.fn('(${a} + ${b}) / ${c} + ${d.e}',mode);
assert.ok("Expression parsed");
}catch(err) {
assert.fail("Error thrown");
}
});
it('Should throw error', function() {
try {
var error = null;
let fn2 = expression.fn('(${a} < ${d.e}',mode);
}catch(err) {
error = err;
}
assert(error!=null);
});
});
describe(`String evaluation (${mode})`, function() {
let fn1 = expression.fn('(${a} + ${b}) / ${c} + ${d.e}',mode);
let fn2 = expression.fn('(${a[1]} + ${b[2]}) / ${c[this.d.e]}',mode);
let fn3 = expression.fn('${a} < ${d.e}',mode);
let fn4 = expression.fn('${$a} < ${$d.e}',mode);
it('Should perform operation', function() {
let res = fn1({a:5,b:10,c:3,d:{e:30}});
assert.equal(35,res);
});
it('Should perform operation with missing value', function() {
let res = fn1({b:10,c:2,d:{e:30}});
assert.equal(35,res);
});
if(mode!='iteval') {
it('Should perform operation with arrays and `this`', function() {
let res = fn2({a:[1,5],b:[2,5,10,20],c:[4,3,4],d:{e:1}});
assert.equal(5,res);
});
}
it('Should fail operation with missing values', function() {
let res = fn1({d:{e:30}});
assert(isNaN(res));
});
it('Should evaluate condition (true)', function() {
let res = fn3({a:5,d:{e:30}});
assert.equal(true,res);
});
it('Should evaluate condition (false)', function() {
let res = fn3({a:30,d:{e:30}});
assert.equal(false,res);
});
it('Should evaluate condition with $ (true)', function() {
let res = fn4({$a:5,$d:{e:30}});
assert.equal(true,res);
});
});
describe(`String interpolation (${mode})`, function() {
debugger;
let fn1 = expression.expr('(${a} + ${b}) / ${c} + ${d.e}',mode);
let fn2 = expression.expr('${a} < ${d.e}',mode);
let fn3 = expression.expr('${$a} < ${$d.e}',mode);
it('Should interpolate operation', function() {
let res = fn1({a:5,b:10,c:3,d:{e:30}});
assert.equal('(5 + 10) / 3 + 30',res);
});
it('Should interpolate operation', function() {
let res = fn3({$a:5,b:10,c:3,$d:{e:30}});
assert.equal('5 < 30',res);
});
it('Should interpolate with missing values', function() {
let res = fn1({b:10,c:2,d:{e:30}});
assert.equal('( + 10) / 2 + 30',res);
});
});
});