source: frontend/node_modules/static-eval/test/eval.js

Last change on this file was 9af201e, checked in by MBK <marija.karapandzova@…>, 12 days ago

Fix frontend appearance

  • Property mode set to 100644
File size: 4.7 KB
Line 
1var test = require('tape');
2var evaluate = require('../');
3var parse = require('esprima').parse;
4
5test('resolved', function (t) {
6 t.plan(1);
7
8 var src = '[1,2,3+4*10+(n||6),foo(3+5),obj[""+"x"].y]';
9 var ast = parse(src).body[0].expression;
10 var res = evaluate(ast, {
11 n: false,
12 foo: function (x) { return x * 100 },
13 obj: { x: { y: 555 } }
14 });
15 t.deepEqual(res, [ 1, 2, 49, 800, 555 ]);
16});
17
18test('unresolved', function (t) {
19 t.plan(1);
20
21 var src = '[1,2,3+4*10*z+n,foo(3+5),obj[""+"x"].y]';
22 var ast = parse(src).body[0].expression;
23 var res = evaluate(ast, {
24 n: 6,
25 foo: function (x) { return x * 100 },
26 obj: { x: { y: 555 } }
27 });
28 t.equal(res, undefined);
29});
30
31test('boolean', function (t) {
32 t.plan(1);
33
34 var src = '[ 1===2+3-16/4, [2]==2, [2]!==2, [2]!==[2] ]';
35 var ast = parse(src).body[0].expression;
36 t.deepEqual(evaluate(ast), [ true, true, true, true ]);
37});
38
39test('array methods', function(t) {
40 t.plan(1);
41
42 var src = '[1, 2, 3].map(function(n) { return n * 2 })';
43 var ast = parse(src).body[0].expression;
44 t.deepEqual(evaluate(ast), [2, 4, 6]);
45});
46
47test('array methods invocation count', function(t) {
48 t.plan(2);
49
50 var variables = {
51 values: [1, 2, 3],
52 receiver: []
53 };
54 var src = 'values.forEach(function(x) { receiver.push(x); })'
55 var ast = parse(src).body[0].expression;
56 evaluate(ast, variables);
57 t.equal(variables.receiver.length, 3);
58 t.deepEqual(variables.receiver, [1, 2, 3]);
59})
60
61test('array methods with vars', function(t) {
62 t.plan(1);
63
64 var src = '[1, 2, 3].map(function(n) { return n * x })';
65 var ast = parse(src).body[0].expression;
66 t.deepEqual(evaluate(ast, {x: 2}), [2, 4, 6]);
67});
68
69test('evaluate this', function(t) {
70 t.plan(1);
71
72 var src = 'this.x + this.y.z';
73 var ast = parse(src).body[0].expression;
74 var res = evaluate(ast, {
75 'this': { x: 1, y: { z: 100 } }
76 });
77 t.equal(res, 101);
78});
79
80test('FunctionExpression unresolved', function(t) {
81 t.plan(1);
82
83 var src = '(function(){console.log("Not Good")})';
84 var ast = parse(src).body[0].expression;
85 var res = evaluate(ast, {});
86 t.equal(res, undefined);
87});
88
89test('MemberExpressions from Functions unresolved', function(t) {
90 t.plan(1);
91
92 var src = '(function () {}).constructor';
93 var ast = parse(src).body[0].expression;
94 var res = evaluate(ast, {});
95 t.equal(res, undefined);
96});
97
98test('disallow accessing constructor or __proto__', function (t) {
99 t.plan(4)
100
101 var someValue = {};
102
103 var src = 'object.constructor';
104 var ast = parse(src).body[0].expression;
105 var res = evaluate(ast, { vars: { object: someValue } });
106 t.equal(res, undefined);
107
108 var src = 'object["constructor"]';
109 var ast = parse(src).body[0].expression;
110 var res = evaluate(ast, { vars: { object: someValue } });
111 t.equal(res, undefined);
112
113 var src = 'object.__proto__';
114 var ast = parse(src).body[0].expression;
115 var res = evaluate(ast, { vars: { object: someValue } });
116 t.equal(res, undefined);
117
118 var src = 'object["__pro"+"t\x6f__"]';
119 var ast = parse(src).body[0].expression;
120 var res = evaluate(ast, { vars: { object: someValue } });
121 t.equal(res, undefined);
122});
123
124
125test('constructor at runtime only', function(t) {
126 t.plan(2)
127
128 var src = '(function myTag(y){return ""[!y?"__proto__":"constructor"][y]})("constructor")("console.log(process.env)")()'
129 var ast = parse(src).body[0].expression;
130 var res = evaluate(ast);
131 t.equal(res, undefined);
132
133 var src = '(function(prop) { return {}[prop ? "benign" : "constructor"][prop] })("constructor")("alert(1)")()'
134 var ast = parse(src).body[0].expression;
135 var res = evaluate(ast);
136 t.equal(res, undefined);
137});
138
139test('short circuit evaluation AND', function(t) {
140 t.plan(1);
141
142 var variables = {
143 value: null
144 };
145 var src = 'value && value.func()';
146 var ast = parse(src).body[0].expression;
147 var res = evaluate(ast, variables);
148 t.equals(res, null);
149})
150
151test('short circuit evaluation OR', function(t) {
152 t.plan(1);
153
154 var fnInvoked = false;
155 var variables = {
156 value: true,
157 fn: function() { fnInvoked = true}
158 };
159 var src = 'value || fn()';
160 var ast = parse(src).body[0].expression;
161 evaluate(ast, variables);
162 t.equals(fnInvoked, false);
163})
164
165test('function declaration does not invoke CallExpressions', function(t) {
166 t.plan(1);
167
168 var invoked = false;
169 var variables = {
170 noop: function(){},
171 onInvoke: function() {invoked = true}
172 };
173 var src = 'noop(function(){ onInvoke(); })';
174 var ast = parse(src).body[0].expression;
175 evaluate(ast, variables);
176 t.equal(invoked, false);
177});
Note: See TracBrowser for help on using the repository browser.