app.test.js 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243
  1. const calculator = require('./calculator.js');
  2. const tests = require('./test_cases.js');
  3. const {handlePrecision} = require('./utils.js');
  4. const parser = new calculator.Parser();
  5. function calc(exp, isDeg = false) {
  6. exp = exp.replace(/E/g, 'e');
  7. exp = exp.replace(/\be\b/g, 'Math.E');
  8. parser.parse(`isDeg(${isDeg * 1})`);
  9. const stack = [];
  10. let res = [];
  11. for (let i = 0; i < exp.length; i++) {
  12. const val = exp[i];
  13. if (val !== ')') {
  14. stack.push(val);
  15. } else {
  16. let v = stack.pop();
  17. while (v !== '(') {
  18. res.unshift(v);
  19. v = stack.pop();
  20. }
  21. stack.push(' ');
  22. const resNum = res.join('');
  23. if (res.length === 1 || !isNaN(resNum)) {
  24. stack.push(resNum);
  25. } else {
  26. stack.push(parser.parse(resNum) + '');
  27. }
  28. res = [];
  29. }
  30. }
  31. return handlePrecision(parser.parse(stack.join('')));
  32. }
  33. tests.forEach(v => {
  34. test(`isDeg=${v.isDeg ? 1: 0} ${v.value} = ${v.result}`, () => {
  35. expect(calc(v.value, v.isDeg)).toBe(String(v.result));
  36. });
  37. });