name:
src/test/java/io/protobase/f7/spreadsheet/GeneralOrderOfOperationsTest.java
-rw-r--r--
4610
1package io.protobase.f7.spreadsheet;
2
3import io.protobase.f7.errors.DivException;
4import io.protobase.f7.errors.NullException;
5import io.protobase.f7.errors.RefException;
6import io.protobase.f7.testutils.TestExecution;
7import org.junit.Test;
8
9public class GeneralOrderOfOperationsTest extends TestExecution {
10 @Test
11 public void test_UnaryMinus() {
12 runner()
13 .addCell("Alpha", "A1", "= -1 + -2 + -(-3 * -4) + (-5 * -6)")
14 .addExpectedValue("Alpha", "A1", 15.0)
15 .run();
16 }
17
18 @Test
19 public void test_UnaryPercent() {
20 runner()
21 .addCell("Alpha", "A1", "= 1% + -2% + -(-3% * -4)% + (-5% * -6%)%")
22 .addExpectedValue("Alpha", "A1", -0.01117)
23 .run();
24 }
25
26 @Test
27 public void test_Parentheses() {
28 runner().addCell("Alpha", "A1", "= 1 + 2 + (3 * 4) + (5 * 6)").addExpectedValue("Alpha", "A1", 45.0).run();
29 runner().addCell("Alpha", "A1", "= 1 * 2 * (3 + 4) * (5 + 6)").addExpectedValue("Alpha", "A1", 154.0).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 @Test
36 public void test_Exponents() {
37 runner().addCell("Alpha", "A1", "= 1 + 2 * 3 ^ 4").addExpectedValue("Alpha", "A1", 163.0).run();
38 runner().addCell("Alpha", "A1", "= 1 + 2 * ((3 ^ 4) ^ 2)").addExpectedValue("Alpha", "A1", 13123.0).run();
39 // TODO:HACK: In Google Sheets we get 86093443 for this one. Google Sheets does order of operations differently... which is wild.
40 runner().addCell("Alpha", "A1", "= 1 + 2 * 3 ^ 4 ^ 2").addExpectedValue("Alpha", "A1", 13123.0).run();
41 runner().addCell("Alpha", "A1", "= 1 + 2 * 3 ^ 4 ^ 2 / 5 * 10 ^ 2").addExpectedValue("Alpha", "A1", 262441.0).run();
42 }
43
44 @Test
45 public void test_Multiplication() {
46 runner().addCell("Alpha", "A1", "= 2 * 3 ^ 4 * 2 + 1 / 4 * 2").addExpectedValue("Alpha", "A1", 324.5).run();
47 }
48
49 @Test
50 public void test_Division() {
51 runner().addCell("Alpha", "A1", "= 2 / 4 * 2 / 6").addExpectedValue("Alpha", "A1", 0.16666666666666666).run();
52 }
53
54 @Test
55 public void test_Addition() {
56 runner().addCell("Alpha", "A1", "= 2 + 2 / 4 + 45 * 2 + 22 / 6 + 1")
57 .addExpectedValue("Alpha", "A1", 97.16666666666666666).run();
58 }
59
60 @Test
61 public void test_Subtraction() {
62 runner().addCell("Alpha", "A1", "= 2 - 2 / 4 - 45 * 2 - 22 / 6 - 1")
63 .addExpectedValue("Alpha", "A1", -93.16666666666666666).run();
64 }
65
66 @Test
67 public void test_KitchenSink() {
68 runner()
69 .addCell("Alpha", "A1", "= SUM(POW(2, 6), {1, 2, 3, {66 / 2} / 2} * 1 + 440)")
70 .addExpectedValue("Alpha", "A1", 505.0)
71 .run();
72 // TODO:HACK: Different in Google Sheets vs. Excel...
73 runner()
74 .addCell("Alpha", "A1", "= (11 -- 22 -- 4 / -(-2^5*1) + 2 * 1 + 2^2^2^2)")
75 .addExpectedValue("Alpha", "A1", 291.125)
76 .run();
77 runner()
78 .addCell("Alpha", "A1", "= 2 * -3 ^ 2 + (1 / 32.571) + 2")
79 .addExpectedValue("Alpha", "A1", 20.030702158361734)
80 .run();
81 runner()
82 .addCell("Alpha", "A1", "= 10 ----3 ^ 11")
83 .addExpectedValue("Alpha", "A1", 177157.0)
84 .run();
85 runner()
86 .addCell("Alpha", "A1", "= 2 ^ 4 -(1 + 33) / 45 * 0.1111 + SUM(10, 20, 30) / DIVIDE(2, 1)")
87 .addExpectedValue("Alpha", "A1", 45.91605777777778)
88 .run();
89 runner()
90 .addCell("Alpha", "A1", "= 2 ^ 4% -(1 + 33) / 45 * 0.1111 % + SUM(10, 20, 30) / DIVIDE(2, 1)%")
91 .addExpectedValue("Alpha", "A1", 3001.0272744044337)
92 .run();
93 runner()
94 .addCell("Alpha", "A1", "= 1 * 3 / 3 -9 -19 / 2 > 8 * 1.62 / -2 ^ 2")
95 .addExpectedValue("Alpha", "A1", false)
96 .run();
97 }
98
99 @Test
100 public void test_ErrorPropagation_LeftToRightErrorCheckingAndHandling() {
101 runner()
102 .addCell("Alpha", "A1", "= (199 / 0) + #NULL!")
103 .addExpectedValue("Alpha", "A1", new DivException())
104 .run();
105 runner()
106 .addCell("Alpha", "A1", "= #NULL! + #NAME?")
107 .addExpectedValue("Alpha", "A1", new NullException())
108 .run();
109 runner()
110 .addCell("Alpha", "A1", "= #REF! / 0")
111 .addExpectedValue("Alpha", "A1", new RefException())
112 .run();
113 runner()
114 .addCell("Alpha", "A1", "= {1, 2, #REF!}")
115 .addExpectedValue("Alpha", "A1", 1.0)
116 .addExpectedValue("Alpha", "B1", 2.0)
117 .addExpectedValue("Alpha", "C1", new RefException())
118 .run();
119 }
120}