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/CodeExecutorGeneralLessThanOrEqualComparisonTest.ts
-rw-r--r--
7401
  1import { assert } from "chai";
  2import { it, describe } from "../testutils/TestUtils";
  3import { stub } from "sinon";
  4import { F7Exception } from "../../../main/js/errors/F7Exception";
  5import { F7ExceptionName } from "../../../main/js/errors/F7ExceptionName";
  6import { CommonModels } from "../testutils/CommonModels";
  7import { run, runWithLookups } from "../testutils/TestUtils";
  8
  9describe("CodeExecutor - LTE Comparison Test", function () {
 10  it("should work with numbers", function () {
 11    assert.deepEqual(run("1 <= 1"), true);
 12    assert.deepEqual(run("1 <= 2"), true);
 13    assert.deepEqual(run("-10 <= 0"), true);
 14    assert.deepEqual(run("2 <= 1"), false);
 15    assert.deepEqual(run("0 <= -10"), false);
 16    assert.deepEqual(run("1.1928731 <= 1.1928731"), true);
 17  });
 18
 19  it("should work with strings", function () {
 20    assert.deepEqual(run('"Yes" <= "Yes"'), true);
 21    assert.deepEqual(run('"Yes" <= "No"'), false);
 22    assert.deepEqual(run('"No"<= "Yes"'), true);
 23    assert.deepEqual(run('"" <= ""'), true);
 24    assert.deepEqual(run('" " <= ""'), false);
 25    assert.deepEqual(run('"" <= " "'), true);
 26  });
 27
 28  it("should work with booleans", function () {
 29    assert.deepEqual(run("TRUE <= TRUE"), true);
 30    assert.deepEqual(run("FALSE <= FALSE"), true);
 31    assert.deepEqual(run("TRUE <= FALSE"), false);
 32    assert.deepEqual(run("FALSE <= TRUE"), true);
 33  });
 34
 35  it("should work with arrays", function () {
 36    assert.deepEqual(run("{1, 2, 3} <= {1, 2, 3}"), true);
 37    assert.deepEqual(run("{1, 2, 3} <= {44}"), true);
 38    assert.deepEqual(run("{44, 2, 3} <= {1}"), false);
 39    assert.deepEqual(run("{44, #REF!} <= {44, #REF!}"), true);
 40  });
 41
 42  it("should compare numbers to booleans", function () {
 43    assert.deepEqual(run("0 <= TRUE"), true);
 44    assert.deepEqual(run("1 <= TRUE"), true); // Important.
 45    assert.deepEqual(run("1 <= FALSE"), true);
 46    assert.deepEqual(run("0 <= FALSE"), true);
 47    assert.deepEqual(run("-1 <= TRUE"), true);
 48    assert.deepEqual(run("-1 <= FALSE"), true);
 49  });
 50
 51  it("should compare numbers to strings", function () {
 52    assert.deepEqual(run('0 <= ""'), true);
 53    assert.deepEqual(run('0 <= "0"'), true);
 54    assert.deepEqual(run('1 <= "0"'), true);
 55    assert.deepEqual(run('1 <= "1"'), true);
 56    assert.deepEqual(run('-1 <= "1"'), true);
 57    assert.deepEqual(run('1000 <= "-100"'), true);
 58    assert.deepEqual(run('1000 <= "Anything in the world."'), true);
 59  });
 60
 61  it("should compare numbers to array literals", function () {
 62    assert.deepEqual(run("-1 <= {0, 1, 2}"), true);
 63    assert.deepEqual(run("0 <= {0, 1, 2}"), true);
 64    assert.deepEqual(run("1 <= {0, 1, 2}"), false);
 65    assert.deepEqual(run("0 <= {1, 1, 2}"), true);
 66    assert.deepEqual(run('0 <= {1, "Ignore me."}'), true);
 67  });
 68
 69  it("should compare numbers to blanks", function () {
 70    const lookup = stub();
 71    const collateralLookup = stub();
 72    collateralLookup.withArgs(CommonModels.A1, CommonModels.M44_RANGE).returns(null);
 73    collateralLookup.withArgs(CommonModels.A1, 0).returns(0);
 74    collateralLookup.withArgs(CommonModels.A1, 1).returns(1);
 75    collateralLookup.withArgs(CommonModels.A1, -1).returns(-1);
 76    assert.deepEqual(runWithLookups("0 <= M44", lookup, collateralLookup), true);
 77    assert.deepEqual(runWithLookups("1 <= M44", lookup, collateralLookup), false);
 78    assert.deepEqual(runWithLookups("M44 <= 0", lookup, collateralLookup), true);
 79    assert.deepEqual(runWithLookups("M44 <= 1", lookup, collateralLookup), true);
 80    assert.deepEqual(runWithLookups("-1 <= M44", lookup, collateralLookup), true);
 81    assert.deepEqual(runWithLookups("M44 <= -1", lookup, collateralLookup), false);
 82    assert.isTrue(collateralLookup.calledWith(CommonModels.A1, CommonModels.M44_RANGE));
 83    assert.isTrue(collateralLookup.calledWith(CommonModels.A1, 0));
 84    assert.isTrue(collateralLookup.calledWith(CommonModels.A1, 1));
 85    assert.isTrue(collateralLookup.calledWith(CommonModels.A1, -1));
 86    assert.isTrue(lookup.notCalled);
 87  });
 88
 89  it("should compare strings to booleans", function () {
 90    assert.deepEqual(run('"TRUE" <= TRUE'), true);
 91    assert.deepEqual(run('"FALSE" <= FALSE'), true);
 92    assert.deepEqual(run('"TRUE" <= TRUE'), true);
 93    assert.deepEqual(run('"" <= TRUE'), true);
 94    assert.deepEqual(run('"" <= FALSE'), true);
 95    assert.deepEqual(run('"Anything" <= FALSE'), true);
 96  });
 97
 98  it("should compare strings to blanks", function () {
 99    const lookup = stub();
100    const collateralLookup = stub();
101    collateralLookup.withArgs(CommonModels.A1, CommonModels.M44_RANGE).returns(null);
102    collateralLookup.withArgs(CommonModels.A1, "").returns("");
103    collateralLookup.withArgs(CommonModels.A1, "One").returns("One");
104    collateralLookup.withArgs(CommonModels.A1, " ").returns(" ");
105    assert.deepEqual(runWithLookups('"" <= M44', lookup, collateralLookup), true);
106    assert.deepEqual(runWithLookups('M44 <= ""', lookup, collateralLookup), true);
107    assert.deepEqual(runWithLookups('" " <= M44', lookup, collateralLookup), false);
108    assert.deepEqual(runWithLookups('M44 <= " "', lookup, collateralLookup), true);
109    assert.deepEqual(runWithLookups('"One" <= M44', lookup, collateralLookup), false);
110    assert.deepEqual(runWithLookups('M44 <= "One"', lookup, collateralLookup), true);
111    assert.isTrue(collateralLookup.calledWith(CommonModels.A1, CommonModels.M44_RANGE));
112    assert.isTrue(collateralLookup.calledWith(CommonModels.A1, ""));
113    assert.isTrue(collateralLookup.calledWith(CommonModels.A1, "One"));
114    assert.isTrue(collateralLookup.calledWith(CommonModels.A1, " "));
115    assert.isTrue(lookup.notCalled);
116  });
117
118  it("should compare booleans to blanks", function () {
119    const lookup = stub();
120    const collateralLookup = stub();
121    collateralLookup.withArgs(CommonModels.A1, CommonModels.M44_RANGE).returns(null);
122    collateralLookup.withArgs(CommonModels.A1, true).returns(true);
123    collateralLookup.withArgs(CommonModels.A1, false).returns(false);
124    assert.deepEqual(runWithLookups("TRUE <= M44", lookup, collateralLookup), false);
125    assert.deepEqual(runWithLookups("FALSE <= M44", lookup, collateralLookup), true);
126    assert.deepEqual(runWithLookups("M44 <= TRUE", lookup, collateralLookup), true);
127    assert.deepEqual(runWithLookups("M44 <= FALSE", lookup, collateralLookup), true);
128    assert.isTrue(collateralLookup.calledWith(CommonModels.A1, CommonModels.M44_RANGE));
129    assert.isTrue(collateralLookup.calledWith(CommonModels.A1, true));
130    assert.isTrue(collateralLookup.calledWith(CommonModels.A1, false));
131    assert.isTrue(lookup.notCalled);
132  });
133
134  it("should compare array literals to strings", function () {
135    assert.deepEqual(run('{"A", "B"} <= "A"'), true);
136    assert.deepEqual(run('{"A", "B"} <= "B"'), true);
137    assert.deepEqual(run('"A" <= {"A", "B"}'), true);
138    assert.deepEqual(run('"B" <= {"A", "B"}'), false);
139  });
140
141  it("should compare array literals to booleans", function () {
142    assert.deepEqual(run("{TRUE, FALSE} <= TRUE"), true);
143    assert.deepEqual(run("TRUE <= {TRUE, FALSE}"), true);
144    assert.deepEqual(run("{FALSE, FALSE} <= TRUE"), true);
145    assert.deepEqual(run("TRUE <= {FALSE, FALSE}"), false);
146  });
147
148  it("should not compare errors", function () {
149    assert.deepEqual((run("TRUE <= #REF!") as F7Exception).name, F7ExceptionName.REF);
150    assert.deepEqual((run("#REF! <= TRUE") as F7Exception).name, F7ExceptionName.REF);
151  });
152});