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