test.js 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. const Expression = require('./index');
  2. test('parse normal', () => {
  3. let expr = new Expression('"\\u2605haha"').parse();
  4. expect(expr({})).toBe('★haha');
  5. expr = new Expression('"\\n\\r\\f\\t\\v\\s"').parse();
  6. expect(expr({})).toBe('\n\r\f\t\v\s');
  7. expr = new Expression('2e3').parse();
  8. expect(expr({})).toBe(2000);
  9. expr = new Expression('2e-3').parse();
  10. expect(expr({})).toBe(0.002);
  11. expr = new Expression('+"123"').parse();
  12. expect(expr({})).toBe('123');
  13. expr = new Expression('-123').parse();
  14. expect(expr({})).toBe(-123);
  15. expr = new Expression('a.b.c.d').parse();
  16. expect(expr({ a: { b: null } })).toBe(null);
  17. expr = new Expression('{ a: {}, b: [] }').parse();
  18. expect(expr({})).toEqual({ a: {}, b: [] });
  19. expr = new Expression(']123').parse();
  20. expect(expr({})).toBe(undefined);
  21. });
  22. test('parse constants', () => {
  23. let expr = new Expression('a === null').parse();
  24. expect(expr({ a: null })).toBe(true);
  25. expect(expr({ a: 1 })).toBe(false);
  26. expr = new Expression('a === undefined').parse();
  27. expect(expr({ a: undefined })).toBe(true);
  28. expect(expr({ a: 1 })).toBe(false);
  29. expr = new Expression('a === true').parse();
  30. expect(expr({ a: true })).toBe(true);
  31. expect(expr({ a: 1 })).toBe(false);
  32. expr = new Expression('a === false').parse();
  33. expect(expr({ a: false })).toBe(true);
  34. expect(expr({ a: 1 })).toBe(false);
  35. });
  36. test('parse operators', () => {
  37. let expr = new Expression('a.value + 12 - (2 * 14 / 4)').parse();
  38. expect(expr({ a: { value: 1 } })).toBe(6);
  39. expect(expr({ a: { value: 3 } })).toBe(8);
  40. expr = new Expression('a && b || c && ( d || e )').parse();
  41. expect(expr({ a: true, b: false, c: true, d: false, e: true })).toBe(true);
  42. expect(expr({ a: false, b: true, c: false, d: true, e: false })).toBe(false);
  43. expr = new Expression('a.value + 12 - (2 * 14 / 4)').parse();
  44. expect(expr({ a: { value: 1 } })).toBe(6);
  45. expect(expr({ a: { value: 3 } })).toBe(8);
  46. expr = new Expression('a === b && a !== c').parse();
  47. expect(expr({ a: 1, b: 1, c: '1' })).toBe(true);
  48. expect(expr({ a: 1, b: 1, c: 1 })).toBe(false);
  49. expr = new Expression('a > 3 && b < 10').parse();
  50. expect(expr({ a: 4, b: 5 })).toBe(true);
  51. expect(expr({ a: 3, b: 5 })).toBe(false);
  52. expect(expr({ a: 4, b: 11 })).toBe(false);
  53. expr = new Expression('a.list[i + 1]').parse();
  54. expect(expr({ a: { list: [0, 5, 10] }, i: 1 })).toBe(10);
  55. expect(expr({ a: { list: [0, 5, 10] }, i: 0 })).toBe(5);
  56. expr = new Expression('a > b ? b : a').parse();
  57. expect(expr({ a: 2, b: 1 })).toBe(1);
  58. expect(expr({ a: 2, b: 3 })).toBe(2);
  59. expr = new Expression('a % b == 1 && c % d == 2 && e % f != 1').parse();
  60. expect(expr({ a: 21, b: 2, c: 8, d: 3, e: 3, f: 3 })).toBe(true);
  61. expr = new Expression('a == b').parse();
  62. expect(expr({ a: 10, b: 10 })).toBe(true);
  63. expect(expr({ a: 10, b: '10' })).toBe(true);
  64. expect(expr({ a: 10, b: '110' })).toBe(false);
  65. expr = new Expression('a != b').parse();
  66. expect(expr({ a: 10, b: 10 })).toBe(false);
  67. expect(expr({ a: 10, b: '10' })).toBe(false);
  68. expect(expr({ a: 10, b: '110' })).toBe(true);
  69. expr = new Expression('a >= b && c <= d').parse();
  70. expect(expr({ a: 2, b: 2, c: 3, d: 3 })).toBe(true);
  71. expect(expr({ a: 3, b: 2, c: 3, d: 4 })).toBe(true);
  72. expect(expr({ a: 2, b: 2, c: 3, d: 2 })).toBe(false);
  73. expect(expr({ a: 1, b: 2, c: 3, d: 3 })).toBe(false);
  74. expr = new Expression('!a').parse();
  75. expect(expr({ a: 1 })).toBe(false);
  76. expect(expr({ a: 0 })).toBe(true);
  77. });
  78. test('parse object/array/function', () => {
  79. let expr = new Expression('a["b"].c + a.d["e"]').parse();
  80. expect(expr({ a: { b: { c: 1 }, d: { e: 2 } } })).toBe(3);
  81. expr = new Expression('{ a: { b: { "c": null }, d: { e: 2 }, } }').parse();
  82. expect(expr({})).toEqual({ a: { b: { c: null }, d: { e: 2 } } });
  83. expr = new Expression('a(1, 2)').parse();
  84. expect(expr({ a: (num1, num2) => num1 + num2 })).toBe(3);
  85. expr = new Expression('a.b()').parse();
  86. expect(expr({ a: { b: function () { return this.c + this.d; }, c: 2, d: 3 } })).toBe(5);
  87. expr = new Expression('[1, 2, 3, ][2]').parse();
  88. expect(expr({})).toBe(3);
  89. });
  90. test('error', () => {
  91. function getErr(str) {
  92. let catchErr = null;
  93. try {
  94. new Expression(str).parse();
  95. } catch (err) {
  96. catchErr = err;
  97. }
  98. return catchErr && catchErr.message || '';
  99. }
  100. expect(getErr()).toBe('invalid expression');
  101. expect(getErr('{ ;a: 123 }')).toBe('parse expression error: { ;a: 123 }');
  102. expect(getErr(';')).toBe('parse expression error: ;');
  103. expect(getErr('\\')).toBe('invalid expression: \\');
  104. expect(getErr('"" || "\\uzzzz"')).toBe('invalid expression: "" || "\\uzzzz", invalid unicode escape [\\uzzzz]');
  105. expect(getErr('"')).toBe('invalid expression: "');
  106. expect(getErr('2e-a')).toBe('invalid expression: 2e-a');
  107. expect(getErr('1 === 1 ? true')).toBe('parse expression error: 1 === 1 ? true');
  108. expect(getErr('1 === 1 ? true ;')).toBe('parse expression error: 1 === 1 ? true ;');
  109. })