evaluation.js 3.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. import traverse from "@babel/traverse";
  2. import { parse } from "@babel/parser";
  3. describe("evaluation", function() {
  4. function addTest(code, type, value, notConfident) {
  5. it(type + ": " + code, function() {
  6. const visitor = {};
  7. visitor[type] = function(path) {
  8. const evaluate = path.evaluate();
  9. expect(evaluate.confident).toEqual(!notConfident);
  10. expect(evaluate.value).toEqual(value);
  11. };
  12. traverse(
  13. parse(code, {
  14. plugins: ["*"],
  15. }),
  16. visitor,
  17. );
  18. });
  19. }
  20. addTest("void 0", "UnaryExpression", undefined);
  21. addTest("!true", "UnaryExpression", false);
  22. addTest("+'2'", "UnaryExpression", 2);
  23. addTest("-'2'", "UnaryExpression", -2);
  24. addTest("~1", "UnaryExpression", -2);
  25. addTest("3 - 1", "BinaryExpression", 2);
  26. addTest("5 + 5", "BinaryExpression", 10);
  27. addTest("10 / 2", "BinaryExpression", 5);
  28. addTest("2 * 3", "BinaryExpression", 6);
  29. addTest("4 % 2", "BinaryExpression", 0);
  30. addTest("2 ** 3", "BinaryExpression", 8);
  31. addTest("1 < 2", "BinaryExpression", true);
  32. addTest("1 > 2", "BinaryExpression", false);
  33. addTest("1 <= 2", "BinaryExpression", true);
  34. addTest("1 >= 2", "BinaryExpression", false);
  35. addTest("1 == '1'", "BinaryExpression", true);
  36. addTest("1 != 2", "BinaryExpression", true);
  37. addTest("'str' === 'str'", "BinaryExpression", true);
  38. addTest("'four' === 4", "BinaryExpression", false);
  39. addTest("'four' !== '4'", "BinaryExpression", true);
  40. addTest("'str' !== 'str'", "BinaryExpression", false);
  41. addTest("1 | 0", "BinaryExpression", 1);
  42. addTest("1 & 1", "BinaryExpression", 1);
  43. addTest("1 ^ 0", "BinaryExpression", 1);
  44. addTest("1 << 2", "BinaryExpression", 4);
  45. addTest("1 >> 2", "BinaryExpression", 0);
  46. addTest("1 in [1]", "BinaryExpression", undefined, true);
  47. addTest("A instanceof B", "BinaryExpression", undefined, true);
  48. addTest("'abc' === 'abc' && 1 === 1", "LogicalExpression", true);
  49. addTest("'abc' === 'abc' && 1 === 10", "LogicalExpression", false);
  50. addTest("'abc' === 'xyz' && 1 === 1", "LogicalExpression", false);
  51. addTest("'abc' === 'xyz' && 1 === 10", "LogicalExpression", false);
  52. addTest("'abc' === 'abc' || 1 === 1", "LogicalExpression", true);
  53. addTest("'abc' === 'abc' || 1 === 10", "LogicalExpression", true);
  54. addTest("'abc' === 'xyz' || 1 === 1", "LogicalExpression", true);
  55. addTest("'abc' === 'xyz' || 1 === 10", "LogicalExpression", false);
  56. addTest("'abc' === 'abc' || config.flag === 1", "LogicalExpression", true);
  57. addTest(
  58. "obj.a === 'abc' || config.flag === 1",
  59. "LogicalExpression",
  60. undefined,
  61. true,
  62. );
  63. addTest("'abc' !== 'abc' && config.flag === 1", "LogicalExpression", false);
  64. addTest("obj.a === 'abc' && 1 === 1", "LogicalExpression", undefined, true);
  65. addTest(
  66. "'abc' === 'abc' && (1 === 1 || config.flag)",
  67. "LogicalExpression",
  68. true,
  69. );
  70. addTest(
  71. "'abc' === 'xyz' || (1 === 1 && config.flag)",
  72. "LogicalExpression",
  73. undefined,
  74. true,
  75. );
  76. addTest(
  77. "'abc' === 'xyz' || (1 === 1 && 'four' === 'four')",
  78. "LogicalExpression",
  79. true,
  80. );
  81. addTest(
  82. "'abc' === 'abc' && (1 === 1 && 'four' === 'four')",
  83. "LogicalExpression",
  84. true,
  85. );
  86. addTest("({})", "ObjectExpression", {});
  87. addTest("({a: '1'})", "ObjectExpression", { a: "1" });
  88. addTest("({['a' + 'b']: 10 * 20, 'z': [1, 2, 3]})", "ObjectExpression", {
  89. ab: 200,
  90. z: [1, 2, 3],
  91. });
  92. });