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