12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697 |
- import traverse from "@babel/traverse";
- import { parse } from "@babel/parser";
- 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],
- });
- });
|