-
-
Notifications
You must be signed in to change notification settings - Fork 5.6k
/
evaluation.js
98 lines (93 loc) 路 3.4 KB
/
evaluation.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
import { parse } from "@babel/parser";
import _traverse from "@babel/traverse";
const traverse = _traverse.default || _traverse;
describe("evaluation", function () {
function addTest(code, type, value, notConfident) {
it(type + ": " + code, function () {
const visitor = {};
visitor[type] = function (path) {
const evaluate = path.evaluate();
expect(evaluate.confident).toEqual(!notConfident);
expect(evaluate.value).toEqual(value);
};
traverse(
parse(code, {
plugins: ["*"],
}),
visitor,
);
});
}
addTest("void 0", "UnaryExpression", undefined);
addTest("!true", "UnaryExpression", false);
addTest("+'2'", "UnaryExpression", 2);
addTest("-'2'", "UnaryExpression", -2);
addTest("~1", "UnaryExpression", -2);
addTest("3 - 1", "BinaryExpression", 2);
addTest("5 + 5", "BinaryExpression", 10);
addTest("10 / 2", "BinaryExpression", 5);
addTest("2 * 3", "BinaryExpression", 6);
addTest("4 % 2", "BinaryExpression", 0);
addTest("2 ** 3", "BinaryExpression", 8);
addTest("1 < 2", "BinaryExpression", true);
addTest("1 > 2", "BinaryExpression", false);
addTest("1 <= 2", "BinaryExpression", true);
addTest("1 >= 2", "BinaryExpression", false);
addTest("1 == '1'", "BinaryExpression", true);
addTest("1 != 2", "BinaryExpression", true);
addTest("'str' === 'str'", "BinaryExpression", true);
addTest("'four' === 4", "BinaryExpression", false);
addTest("'four' !== '4'", "BinaryExpression", true);
addTest("'str' !== 'str'", "BinaryExpression", false);
addTest("1 | 0", "BinaryExpression", 1);
addTest("1 & 1", "BinaryExpression", 1);
addTest("1 ^ 0", "BinaryExpression", 1);
addTest("1 << 2", "BinaryExpression", 4);
addTest("1 >> 2", "BinaryExpression", 0);
addTest("1 in [1]", "BinaryExpression", undefined, true);
addTest("A instanceof B", "BinaryExpression", undefined, true);
addTest("'abc' === 'abc' && 1 === 1", "LogicalExpression", true);
addTest("'abc' === 'abc' && 1 === 10", "LogicalExpression", false);
addTest("'abc' === 'xyz' && 1 === 1", "LogicalExpression", false);
addTest("'abc' === 'xyz' && 1 === 10", "LogicalExpression", false);
addTest("'abc' === 'abc' || 1 === 1", "LogicalExpression", true);
addTest("'abc' === 'abc' || 1 === 10", "LogicalExpression", true);
addTest("'abc' === 'xyz' || 1 === 1", "LogicalExpression", true);
addTest("'abc' === 'xyz' || 1 === 10", "LogicalExpression", false);
addTest("'abc' === 'abc' || config.flag === 1", "LogicalExpression", true);
addTest(
"obj.a === 'abc' || config.flag === 1",
"LogicalExpression",
undefined,
true,
);
addTest("'abc' !== 'abc' && config.flag === 1", "LogicalExpression", false);
addTest("obj.a === 'abc' && 1 === 1", "LogicalExpression", undefined, true);
addTest(
"'abc' === 'abc' && (1 === 1 || config.flag)",
"LogicalExpression",
true,
);
addTest(
"'abc' === 'xyz' || (1 === 1 && config.flag)",
"LogicalExpression",
undefined,
true,
);
addTest(
"'abc' === 'xyz' || (1 === 1 && 'four' === 'four')",
"LogicalExpression",
true,
);
addTest(
"'abc' === 'abc' && (1 === 1 && 'four' === 'four')",
"LogicalExpression",
true,
);
addTest("({})", "ObjectExpression", {});
addTest("({a: '1'})", "ObjectExpression", { a: "1" });
addTest("({['a' + 'b']: 10 * 20, 'z': [1, 2, 3]})", "ObjectExpression", {
ab: 200,
z: [1, 2, 3],
});
});