/
expressions-node.js
129 lines (119 loc) · 2.46 KB
/
expressions-node.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
var buster = require('buster'),
mask = require('../lib/mask.node.js'),
Expression = mask.Utils.Expression,
$eval = mask.Utils.Expression.eval,
template, node, attr;
function expression(expr, result, model, cntx, controller) {
if (expr instanceof Array) {
for (var i = 0, x, length = expr.length; i < length; i++) {
x = expr[i];
expression(x, result, model, cntx, controller);
}
return;
}
var ast = Expression.parse(expr),
value = Expression.eval(ast, model, cntx, controller);
assert.equals(value, result, 'Unexpected Result (' + expr + ')');
}
buster.testCase("Expressions", {
'concat': function() {
expression([ //
'5+"hello"', //
' 5 + "hello"', //
' 5 + "hello" + ""', //
'"" + 5 + "hello"', //
"'' + 5 + 'hello'", "'' + 5 + 'h' + 'e' + \"l\" + 'l' + 'o'", "'' + ('5' + 'h' + 'e') + (\"l\" + 'l' + 'o')", //
"'' + ('5' + ('h' + 'e') + (\"l\" ) + 'l' + 'o')", //
"5 + fn()", //
"5 + fn2()", //
"5 + hello", //
"1 + 2*2 + hello"], '5hello', {
hello: "hello",
fn: function() {
return "hello";
}
}, null, {
parent: {
fn2: function() {
return "hello"
}
}
});
},
'math': function() {
expression([ //
'10', //
'5+5', //
'6+1+3', //
'15-5', //
'5*2', //
'20/2', //
'2*(2+3)', //
'2+2*4', //
'3 * (2+3) - 5', //
'(5*1)*1/5+9', //
'(5 * 1) * 1 / 5 + 9 ', //
'(((5 / 1) / 1) / 5) + 9 ', //
'((((5 / 1) / 1) / 5) + 9 )', //
'(5 * 1) * 1 / 5 + 1 + (4 * 2)', //
'-(-10)',
'23%13'], 10);
expression(['a + b+b', //
'_c*c3+4+a', //
'fn(5)', //
'fn(3) + fn(2)', //
'fn(3) + fn(1) +fn(1)', //
'fn(3,4) + fn(4,3) + fn(2,-2)', //
], 20, {
a: 10,
b: 5,
_c: 2,
c3: 3,
fn: function(n, x) {
return n * (x || 4);
}
});
},
'condition': function() {
expression([ //
'5==5', //
'6!=5', //
'3>2', //
'2>=2', //
'3>=2', //
'2<3', //
'2<=3', //
'3<=3', //
'0.01 == 0.01', //
'3<=3 && "a"=="a"', //
'3<=3 && "a"!="b"', //
'3==3 && 2 != 5 || 1==0', //
'3==3 && 2 == 5 || 0.5==.5', //
'name=="A" && number == 10', //
'a == b + b', //
'a + 5 == b * 3', //
'!(false)', //
'!0', //
'a == b || !(a==5) ', //
'!!true', //
'!null', //
], true, {
name: 'A',
number: 10,
a: 10,
b: 5
})
},
'ternary': function() {
expression(['enabled?"enabled":"disabled"'], 'enabled', {
enabled: true
});
},
'OR': function(){
expression(['a || b', '."some-key" || b'], '1', {
a: 1,
b: 2,
'some-key': 1
});
}
});