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});