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/formulas/FormulaCallerTest.ts
-rw-r--r--
8143
  1import { assert } from "chai";
  2import { it, describe } from "../testutils/TestUtils";
  3import { DivException } from "../../../main/js/errors/DivException";
  4import { F7Exception } from "../../../main/js/errors/F7Exception";
  5import { F7ExceptionName } from "../../../main/js/errors/F7ExceptionName";
  6import { NAException } from "../../../main/js/errors/NAException";
  7import { RefException } from "../../../main/js/errors/RefException";
  8import { FormulaCaller } from "../../../main/js/formulas/FormulaCaller";
  9import { FormulaName } from "../../../main/js/formulas/FormulaName";
 10import { Converters } from "../../../main/js/utils/Converters";
 11
 12describe("FormulaCaller", function () {
 13  const CALLER = new FormulaCaller(
 14    (value) => value,
 15    (origin, value) => value
 16  );
 17
 18  it("should return NAME error if formula not found", function () {
 19    assert.equal(
 20      (CALLER.call(null, "nope" as FormulaName) as F7Exception).name,
 21      F7ExceptionName.NAME
 22    );
 23  });
 24
 25  it("should run info formulas properly", function () {
 26    assert.deepEqual(CALLER.call(null, FormulaName.ERRORTYPE, new DivException()), 2);
 27    assert.deepEqual(CALLER.call(null, FormulaName.ISBLANK, null), true);
 28    assert.deepEqual(CALLER.call(null, FormulaName.ISERR, 10), false);
 29    assert.deepEqual(CALLER.call(null, FormulaName.ISERROR, new DivException()), true);
 30    assert.deepEqual(CALLER.call(null, FormulaName.ISLOGICAL, false), true);
 31    assert.deepEqual(CALLER.call(null, FormulaName.ISNA, new NAException()), true);
 32    assert.deepEqual(CALLER.call(null, FormulaName.ISNONTEXT, 9), true);
 33    assert.deepEqual(CALLER.call(null, FormulaName.ISNUMBER, 3), true);
 34    assert.deepEqual(CALLER.call(null, FormulaName.ISTEXT, 3), false);
 35    assert.deepEqual(CALLER.call(null, FormulaName.N, "Zero."), 0);
 36    assert.deepEqual(
 37      Converters.castAsF7Exception(CALLER.call(null, FormulaName.NA)).name,
 38      F7ExceptionName.NA
 39    );
 40    assert.deepEqual(CALLER.call(null, FormulaName.TYPE, 10), 1);
 41  });
 42
 43  it("should run logic formulas properly", function () {
 44    assert.deepEqual(CALLER.call(null, FormulaName.AND, true, true), true);
 45    assert.deepEqual(CALLER.call(null, FormulaName.EQ, 10, 99.2), false);
 46    assert.deepEqual(CALLER.call(null, FormulaName.EXACT, "A", "A"), true);
 47    assert.deepEqual(CALLER.call(null, FormulaName.FALSE), false);
 48    assert.deepEqual(CALLER.call(null, FormulaName.GT, 10, 5), true);
 49    assert.deepEqual(CALLER.call(null, FormulaName.GTE, 10, 0.1), true);
 50    assert.deepEqual(CALLER.call(null, FormulaName.IF, true, 10, -3872), 10);
 51    assert.deepEqual(CALLER.call(null, FormulaName.IFERROR, new DivException(), 10), 10);
 52    assert.deepEqual(CALLER.call(null, FormulaName.IFNA, new NAException(), 10), 10);
 53    assert.deepEqual(CALLER.call(null, FormulaName.LTE, 10, 2.22222), false);
 54    assert.deepEqual(CALLER.call(null, FormulaName.LT, 1, 2), true);
 55    assert.deepEqual(CALLER.call(null, FormulaName.NE, 10, 7), true);
 56    assert.deepEqual(CALLER.call(null, FormulaName.NOT, true), false);
 57    assert.deepEqual(CALLER.call(null, FormulaName.OR, true, false), true);
 58    assert.deepEqual(CALLER.call(null, FormulaName.XOR, true, false), true);
 59    assert.deepEqual(CALLER.call(null, FormulaName.TRUE), true);
 60  });
 61
 62  it("should run math formulas properly", function () {
 63    assert.deepEqual(CALLER.call(null, FormulaName.ABS, -2), 2);
 64    assert.deepEqual(CALLER.call(null, FormulaName.ACOS, 0), Math.acos(0));
 65    assert.deepEqual(CALLER.call(null, FormulaName.ACOSH, 10), 2.993222846126381);
 66    assert.deepEqual(CALLER.call(null, FormulaName.ACOT, 10), 0.09966865249116204);
 67    assert.deepEqual(CALLER.call(null, FormulaName.ACOTH, 10), 0.10033534773107562);
 68    assert.deepEqual(CALLER.call(null, FormulaName.ASIN, 0.1), Math.asin(0.1));
 69    assert.deepEqual(CALLER.call(null, FormulaName.ASINH, 10), 2.99822295029797);
 70    assert.deepEqual(CALLER.call(null, FormulaName.ATAN, 10), Math.atan(10));
 71    assert.deepEqual(CALLER.call(null, FormulaName.ATAN2, 10, 4), Math.atan2(10, 4));
 72    assert.deepEqual(CALLER.call(null, FormulaName.ATANH, 0.489733), 0.5357090350574656);
 73    assert.deepEqual(CALLER.call(null, FormulaName.COS, 0.489733), Math.cos(0.489733));
 74    assert.deepEqual(CALLER.call(null, FormulaName.COSH, 0.489733), Math["cosh"](0.489733));
 75    assert.deepEqual(CALLER.call(null, FormulaName.COT, 1), 0.6420926159343306);
 76    assert.deepEqual(CALLER.call(null, FormulaName.ADD, 2, 3), 5);
 77    assert.deepEqual(CALLER.call(null, FormulaName.DIVIDE, 10, 5), 2);
 78    assert.deepEqual(CALLER.call(null, FormulaName.EVEN, 1.1), 2);
 79    assert.deepEqual(CALLER.call(null, FormulaName.FLOOR, 1.1), 1);
 80    assert.deepEqual(CALLER.call(null, FormulaName.INT, 1.1), 1);
 81    assert.deepEqual(CALLER.call(null, FormulaName.ISEVEN, 2), true);
 82    assert.deepEqual(CALLER.call(null, FormulaName.ISODD, 2), false);
 83    assert.deepEqual(CALLER.call(null, FormulaName.LN, 2), 0.6931471805599453);
 84    assert.deepEqual(CALLER.call(null, FormulaName.LOG, 10, 3), 2.095903274289385);
 85    assert.deepEqual(CALLER.call(null, FormulaName.LOG10, 128), Math["log10"](128));
 86    assert.deepEqual(CALLER.call(null, FormulaName.MINUS, 10, 2), 8);
 87    assert.deepEqual(CALLER.call(null, FormulaName.MOD, 10, 3), 1);
 88    assert.deepEqual(CALLER.call(null, FormulaName.MULTIPLY, 10, 5), 50);
 89    assert.deepEqual(CALLER.call(null, FormulaName.ODD, 10), 11);
 90    assert.deepEqual(CALLER.call(null, FormulaName.PI), Math.PI);
 91    assert.deepEqual(CALLER.call(null, FormulaName.POW, 2, 5), 32);
 92    assert.deepEqual(CALLER.call(null, FormulaName.POWER, 2, 5), 32);
 93    assert.deepEqual(CALLER.call(null, FormulaName.PRODUCT, 2, 5, 2), 20);
 94    assert.deepEqual(CALLER.call(null, FormulaName.QUOTIENT, 10, 3), 3);
 95    assert.isNotNull(CALLER.call(null, FormulaName.RAND));
 96    assert.isNotNull(CALLER.call(null, FormulaName.RANDBETWEEN, 1, 20));
 97    assert.deepEqual(CALLER.call(null, FormulaName.ROUNDDOWN, 2.11), 2);
 98    assert.deepEqual(CALLER.call(null, FormulaName.ROUNDUP, 2.11), 3);
 99    assert.deepEqual(CALLER.call(null, FormulaName.ROUND, 2.11), 2);
100    assert.deepEqual(CALLER.call(null, FormulaName.SIGN, 100), 1);
101    assert.deepEqual(CALLER.call(null, FormulaName.SIN, 2), 0.9092974268256817);
102    assert.deepEqual(CALLER.call(null, FormulaName.SINH, 2), Math["sinh"](2));
103    assert.deepEqual(CALLER.call(null, FormulaName.SQRT, 2), Math.sqrt(2));
104    assert.deepEqual(CALLER.call(null, FormulaName.SQRTPI, 2), 2.5066282746310002);
105    assert.deepEqual(CALLER.call(null, FormulaName.TAN, 2), Math.tan(2));
106    assert.deepEqual(CALLER.call(null, FormulaName.TANH, 2), Math["tanh"](2));
107    assert.deepEqual(CALLER.call(null, FormulaName.UNARY_PERCENT, 22), 0.22);
108    assert.deepEqual(CALLER.call(null, FormulaName.UMINUS, 22), -22);
109    assert.deepEqual(CALLER.call(null, FormulaName.UPLUS, "22"), 22);
110  });
111
112  it("should run parser formulas properly", function () {
113    assert.deepEqual(CALLER.call(null, FormulaName.TO_TEXT, 2.111), "2.111");
114    assert.deepEqual(CALLER.call(null, FormulaName.TO_PERCENT, 2.111), 2.111);
115  });
116
117  it("should run engineering formulas properly", function () {
118    assert.deepEqual(CALLER.call(null, FormulaName.BIN2HEX, "1010101010"), "FFFFFFFEAA");
119    assert.deepEqual(CALLER.call(null, FormulaName.BIN2DEC, "1010101010"), -342);
120    assert.deepEqual(CALLER.call(null, FormulaName.DELTA, 10, 20), 0);
121  });
122
123  it("should run statistical formulas properly", function () {
124    assert.deepEqual(CALLER.call(null, FormulaName.AVERAGE, 1, 2, 3, 4), 2.5);
125    assert.deepEqual(CALLER.call(null, FormulaName.AVERAGEA, 1, 2, 3, 4), 2.5);
126    assert.deepEqual(CALLER.call(null, FormulaName.COUNT, 1, 2, 3, 4), 4);
127    assert.deepEqual(CALLER.call(null, FormulaName.COUNTA, 1, 2, new RefException(), 3), 3);
128    assert.deepEqual(CALLER.call(null, FormulaName.COUNTBLANK, 1, 2, 3), 0);
129    assert.deepEqual(CALLER.call(null, FormulaName.MIN, 1, 2, 3), 1);
130    assert.deepEqual(CALLER.call(null, FormulaName.MINA, 1, 2, 3), 1);
131    assert.deepEqual(CALLER.call(null, FormulaName.MAX, 1, 2, 3), 3);
132    assert.deepEqual(CALLER.call(null, FormulaName.MAXA, 1, 2, 3), 3);
133  });
134});