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/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}