f7
f7 is a spreadsheet formula execution library
git clone https://git.vogt.world/f7.git
Log | Files | README.md | LICENSE.md
← All files
name: src/test/js/execution/ExecutorOrderOfOperationsTest.ts
-rw-r--r--
5065
  1import { DivException } from "../../../main/js/errors/DivException";
  2import { NullException } from "../../../main/js/errors/NullException";
  3import { RefException } from "../../../main/js/errors/RefException";
  4import { runner, it, describe } from "../testutils/TestUtils";
  5
  6describe("Executor.execute - Order of Operations", function () {
  7  it("should perform unary minus operation in correct order", function () {
  8    runner()
  9      .addCell("Alpha", "A1", "= -1 + -2 + -(-3 * -4) + (-5 * -6)")
 10      .addExpectedValue("Alpha", "A1", 15.0)
 11      .run();
 12  });
 13
 14  it("should perform unary percent operation in correct order", function () {
 15    runner()
 16      .addCell("Alpha", "A1", "= 1% + -2% + -(-3% * -4)% + (-5% * -6%)%")
 17      .addExpectedValue("Alpha", "A1", -0.01117)
 18      .run();
 19  });
 20
 21  it("should perform parentheses operations in correct order", function () {
 22    runner()
 23      .addCell("Alpha", "A1", "= 1 + 2 + (3 * 4) + (5 * 6)")
 24      .addExpectedValue("Alpha", "A1", 45.0)
 25      .run();
 26    runner()
 27      .addCell("Alpha", "A1", "= 1 * 2 * (3 + 4) * (5 + 6)")
 28      .addExpectedValue("Alpha", "A1", 154.0)
 29      .run();
 30    runner().addCell("Alpha", "A1", "= (6 + 3) * 3").addExpectedValue("Alpha", "A1", 27.0).run();
 31    runner().addCell("Alpha", "A1", "= 7 * (5 + 8)").addExpectedValue("Alpha", "A1", 91.0).run();
 32    runner().addCell("Alpha", "A1", "= (4 + 3) * 2").addExpectedValue("Alpha", "A1", 14.0).run();
 33  });
 34
 35  it("should perform exponent operations in correct order", function () {
 36    runner().addCell("Alpha", "A1", "= 1 + 2 * 3 ^ 4").addExpectedValue("Alpha", "A1", 163.0).run();
 37    runner()
 38      .addCell("Alpha", "A1", "= 1 + 2 * ((3 ^ 4) ^ 2)")
 39      .addExpectedValue("Alpha", "A1", 13123.0)
 40      .run();
 41    // TODO:HACK: In Google Sheets we get 86093443 for this one. Google Sheets does order of operations differently... which is wild.
 42    runner()
 43      .addCell("Alpha", "A1", "= 1 + 2 * 3 ^ 4 ^ 2")
 44      .addExpectedValue("Alpha", "A1", 13123.0)
 45      .run();
 46    runner()
 47      .addCell("Alpha", "A1", "= 1 + 2 * 3 ^ 4 ^ 2 / 5 * 10 ^ 2")
 48      .addExpectedValue("Alpha", "A1", 262441.0)
 49      .run();
 50  });
 51
 52  it("should perform multiplication operations in correct order", function () {
 53    runner()
 54      .addCell("Alpha", "A1", "= 2 * 3 ^ 4 * 2 + 1 / 4 * 2")
 55      .addExpectedValue("Alpha", "A1", 324.5)
 56      .run();
 57  });
 58
 59  it("should perform division operations in correct order", function () {
 60    runner()
 61      .addCell("Alpha", "A1", "= 2 / 4 * 2 / 6")
 62      .addExpectedValue("Alpha", "A1", 0.16666666666666666)
 63      .run();
 64  });
 65
 66  it("should perform addition operations in correct order", function () {
 67    runner()
 68      .addCell("Alpha", "A1", "= 2 + 2 / 4 + 45 * 2 + 22 / 6 + 1")
 69      .addExpectedValue("Alpha", "A1", 97.1666666666666)
 70      .run();
 71  });
 72
 73  it("should perform subtraction operations in correct order", function () {
 74    runner()
 75      .addCell("Alpha", "A1", "= 2 - 2 / 4 - 45 * 2 - 22 / 6 - 1")
 76      .addExpectedValue("Alpha", "A1", -93.16666666666666)
 77      .run();
 78  });
 79
 80  it("should do all operations in correct order", function () {
 81    runner()
 82      .addCell("Alpha", "A1", "= SUM(POW(2, 6), {1, 2, 3, {66 / 2} / 2} * 1 + 440)")
 83      .addExpectedValue("Alpha", "A1", 505.0)
 84      .run();
 85    runner()
 86      .addCell("Alpha", "A1", "= (11 -- 22 -- 4 / -(-2^5*1) + 2 * 1 + 2^2^2^2)")
 87      .addExpectedValue("Alpha", "A1", 291.125)
 88      .run();
 89    runner()
 90      .addCell("Alpha", "A1", "= 2 *  -3 ^ 2  + (1 / 32.571) + 2")
 91      .addExpectedValue("Alpha", "A1", 20.030702158361734)
 92      .run();
 93    runner()
 94      .addCell("Alpha", "A1", "= 10 ----3 ^ 11")
 95      .addExpectedValue("Alpha", "A1", 177157.0)
 96      .run();
 97    runner()
 98      .addCell("Alpha", "A1", "= 2 ^ 4  -(1 + 33) / 45 * 0.1111 + SUM(10, 20, 30) / DIVIDE(2, 1)")
 99      .addExpectedValue("Alpha", "A1", 45.91605777777778)
100      .run();
101    runner()
102      .addCell(
103        "Alpha",
104        "A1",
105        "= 2 ^ 4%  -(1 + 33) / 45 * 0.1111 % + SUM(10, 20, 30) / DIVIDE(2, 1)%"
106      )
107      .addExpectedValue("Alpha", "A1", 3001.0272744044337)
108      .run();
109    runner()
110      .addCell("Alpha", "A1", "= 1 * 3 / 3 -9 -19 / 2 > 8 * 1.62 / -2 ^ 2")
111      .addExpectedValue("Alpha", "A1", false)
112      .run();
113  });
114
115  it("should handle error propagation left-to-right", function () {
116    runner()
117      .addCell("Alpha", "A1", "= (199 / 0) + #NULL!")
118      .addExpectedValue("Alpha", "A1", new DivException())
119      .run();
120    runner()
121      .addCell("Alpha", "A1", "= #NULL! + #NAME?")
122      .addExpectedValue("Alpha", "A1", new NullException())
123      .run();
124    runner()
125      .addCell("Alpha", "A1", "= #REF! / 0")
126      .addExpectedValue("Alpha", "A1", new RefException())
127      .run();
128    runner()
129      .addCell("Alpha", "A1", "= {1, 2, #REF!}")
130      .addCell("Alpha", "Z99", "Setting grid size to be large enough.")
131      .addExpectedValue("Alpha", "A1", 1.0)
132      .addExpectedValue("Alpha", "B1", 2.0)
133      .addExpectedValue("Alpha", "C1", new RefException())
134      .run();
135  });
136});