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/ExecutorCollateralLookupRangeTest.ts
-rw-r--r--
8722
  1import { ValueException } from "../../../main/js/errors/ValueException";
  2import { runner, it, describe } from "../testutils/TestUtils";
  3
  4/**
  5 * "Collateral Indexing" is what I call it when you're using a range inside a cell that runs parallel column-wise,
  6 * parallel row-wise, or both, but is in another grid.
  7 * <p>
  8 * Parallel Column-Wise:  C4 using A1:A10 results in a collateral index lookup of A4. The 4 is what's used here.
  9 * Parallel Row-Wise:  C4 using A1:D1 results in a collateral index lookup of C1. The C is what's used here.
 10 * Both:  C4 using OtherGrid!A1:C10 results in a collateral lookup of OtherGrid!C4. The C and the 4 are important.
 11 */
 12describe("Executor.execute - General Collateral Index Range", function () {
 13  it("should work with column-wise lookup", function () {
 14    runner()
 15      .addCell("Alpha", "A1", "= 1")
 16      .addCell("Alpha", "A2", "= 2")
 17      .addCell("Alpha", "A3", "= 3")
 18      .addCell("Alpha", "A4", "= 4")
 19      .addCell("Alpha", "B1", "= A1:A5")
 20      .addCell("Alpha", "B2", "= A1:A5")
 21      .addCell("Alpha", "B3", "= A1:A5")
 22      .addCell("Alpha", "B4", "= A1:A5")
 23      .addCell("Alpha", "B5", "= A1:A5")
 24      .addExpectedValue("Alpha", "B1", 1.0)
 25      .addExpectedValue("Alpha", "B2", 2.0)
 26      .addExpectedValue("Alpha", "B3", 3.0)
 27      .addExpectedValue("Alpha", "B4", 4.0)
 28      .addExpectedEmptyComputedValue("Alpha", "B5")
 29      .run();
 30  });
 31
 32  it("should work with row-wise lookup", function () {
 33    runner()
 34      .addCell("Alpha", "A1", "= 1")
 35      .addCell("Alpha", "B1", "= 2")
 36      .addCell("Alpha", "C1", "= 3")
 37      .addCell("Alpha", "D1", "= 4")
 38      .addCell("Alpha", "A2", "= A1:E1")
 39      .addCell("Alpha", "B2", "= A1:E1")
 40      .addCell("Alpha", "C2", "= A1:E1")
 41      .addCell("Alpha", "D2", "= A1:E1")
 42      .addCell("Alpha", "E2", "= A1:E1")
 43      .addExpectedValue("Alpha", "A2", 1.0)
 44      .addExpectedValue("Alpha", "B2", 2.0)
 45      .addExpectedValue("Alpha", "C2", 3.0)
 46      .addExpectedValue("Alpha", "D2", 4.0)
 47      .addExpectedEmptyComputedValue("Alpha", "E2")
 48      .run();
 49  });
 50
 51  it("should work with column-wise lookup with row offset first", function () {
 52    runner()
 53      .addCell("Alpha", "A1", "= 1")
 54      .addCell("Alpha", "A2", "= 2")
 55      .addCell("Alpha", "A3", "= 3")
 56      .addCell("Alpha", "A4", "= 4")
 57      .addCell("Alpha", "B1", "= A1:A")
 58      .addCell("Alpha", "B2", "= A1:A")
 59      .addCell("Alpha", "B3", "= A1:A")
 60      .addCell("Alpha", "B4", "= A1:A")
 61      .addCell("Alpha", "B5", "= A1:A")
 62      .addExpectedValue("Alpha", "B1", 1.0)
 63      .addExpectedValue("Alpha", "B2", 2.0)
 64      .addExpectedValue("Alpha", "B3", 3.0)
 65      .addExpectedValue("Alpha", "B4", 4.0)
 66      .addExpectedEmptyComputedValue("Alpha", "B5")
 67      .run();
 68  });
 69
 70  it("should work with column-wise lookup with row offset last", function () {
 71    runner()
 72      .addCell("Alpha", "A1", "= 1")
 73      .addCell("Alpha", "A2", "= 2")
 74      .addCell("Alpha", "A3", "= 3")
 75      .addCell("Alpha", "A4", "= 4")
 76      .addCell("Alpha", "B1", "= A:A1")
 77      .addCell("Alpha", "B2", "= A:A1")
 78      .addCell("Alpha", "B3", "= A:A1")
 79      .addCell("Alpha", "B4", "= A:A1")
 80      .addCell("Alpha", "B5", "= A:A1")
 81      .addExpectedValue("Alpha", "B1", 1.0)
 82      .addExpectedValue("Alpha", "B2", 2.0)
 83      .addExpectedValue("Alpha", "B3", 3.0)
 84      .addExpectedValue("Alpha", "B4", 4.0)
 85      .addExpectedEmptyComputedValue("Alpha", "B5")
 86      .run();
 87  });
 88
 89  it("should work with row-wise lookup with column offset first", function () {
 90    runner()
 91      .addCell("Alpha", "A1", "= 1")
 92      .addCell("Alpha", "B1", "= 2")
 93      .addCell("Alpha", "C1", "= 3")
 94      .addCell("Alpha", "D1", "= 4")
 95      .addCell("Alpha", "A2", "= A1:1")
 96      .addCell("Alpha", "B2", "= A1:1")
 97      .addCell("Alpha", "C2", "= A1:1")
 98      .addCell("Alpha", "D2", "= A1:1")
 99      .addCell("Alpha", "E2", "= A1:1")
100      .addExpectedValue("Alpha", "A2", 1.0)
101      .addExpectedValue("Alpha", "B2", 2.0)
102      .addExpectedValue("Alpha", "C2", 3.0)
103      .addExpectedValue("Alpha", "D2", 4.0)
104      .addExpectedEmptyComputedValue("Alpha", "E2")
105      .run();
106  });
107
108  it("should work with row-wise collateral lookup with column offset last", function () {
109    runner()
110      .addCell("Alpha", "A1", "= 1")
111      .addCell("Alpha", "B1", "= 2")
112      .addCell("Alpha", "C1", "= 3")
113      .addCell("Alpha", "D1", "= 4")
114      .addCell("Alpha", "A2", "= 1:A1")
115      .addCell("Alpha", "B2", "= 1:A1")
116      .addCell("Alpha", "C2", "= 1:A1")
117      .addCell("Alpha", "D2", "= 1:A1")
118      .addCell("Alpha", "E2", "= 1:A1")
119      .addExpectedValue("Alpha", "A2", 1.0)
120      .addExpectedValue("Alpha", "B2", 2.0)
121      .addExpectedValue("Alpha", "C2", 3.0)
122      .addExpectedValue("Alpha", "D2", 4.0)
123      .addExpectedEmptyComputedValue("Alpha", "E2")
124      .run();
125  });
126
127  it("should return error when it is multi-dimensional and we are outside the bounds", function () {
128    runner()
129      .addCell("Alpha", "A1", "= 1")
130      .addCell("Alpha", "A2", "= 2")
131      .addCell("Alpha", "B1", "= 3")
132      .addCell("Alpha", "B2", "= 4")
133      .addCell("Alpha", "K5", "= A1:B2")
134      .addExpectedValue("Alpha", "K5", new ValueException())
135      .run();
136  });
137
138  it("should work when it is multi-dimensional and referencing a *different* grid", function () {
139    runner()
140      .addCell("Alpha", "A1", "= 1")
141      .addCell("Alpha", "A2", "= 2")
142      .addCell("Alpha", "A3", "= 3")
143      .addCell("Alpha", "A4", "= 4")
144      .addCell("Alpha", "B1", "= 1.1")
145      .addCell("Alpha", "B2", "= 2.1")
146      .addCell("Alpha", "B3", "= 3.1")
147      .addCell("Alpha", "B4", "= 4.1")
148      .addCell("Beta", "A1", "=Alpha!A1:B5")
149      .addCell("Beta", "A2", "=Alpha!A1:B5")
150      .addCell("Beta", "A3", "=Alpha!A1:B5")
151      .addCell("Beta", "A4", "=Alpha!A1:B5")
152      .addCell("Beta", "A5", "=Alpha!A1:B5")
153      .addCell("Beta", "B1", "=Alpha!A1:B5")
154      .addCell("Beta", "B2", "=Alpha!A1:B5")
155      .addCell("Beta", "B3", "=Alpha!A1:B5")
156      .addCell("Beta", "B4", "=Alpha!A1:B5")
157      .addCell("Beta", "B5", "=Alpha!A1:B5")
158      .addExpectedValue("Beta", "A1", 1.0)
159      .addExpectedValue("Beta", "A2", 2.0)
160      .addExpectedValue("Beta", "A3", 3.0)
161      .addExpectedValue("Beta", "A4", 4.0)
162      .addExpectedEmptyComputedValue("Beta", "A5")
163      .addExpectedValue("Beta", "B1", 1.1)
164      .addExpectedValue("Beta", "B2", 2.1)
165      .addExpectedValue("Beta", "B3", 3.1)
166      .addExpectedValue("Beta", "B4", 4.1)
167      .addExpectedEmptyComputedValue("Beta", "B5")
168      .run();
169  });
170
171  it("should not perform collateral lookup when range is wrapped in array literal", function () {
172    runner()
173      .addCell("Alpha", "A1", "= 1")
174      .addCell("Alpha", "A2", "= 2")
175      .addCell("Alpha", "A3", "= 3")
176      .addCell("Alpha", "A4", "= 4")
177      .addCell("Alpha", "B1", "= 1.1")
178      .addCell("Alpha", "B2", "= 2.1")
179      .addCell("Alpha", "B3", "= 3.1")
180      .addCell("Alpha", "B4", "= 4.1")
181      .addCell("Beta", "A1", "= {Alpha!A1:B5}")
182      .addCell("Beta", "M99", "Push out this grid.")
183      .addExpectedValue("Beta", "A1", 1.0)
184      .addExpectedValue("Beta", "A2", 2.0)
185      .addExpectedValue("Beta", "A3", 3.0)
186      .addExpectedValue("Beta", "A4", 4.0)
187      .addExpectedEmptyComputedValue("Beta", "A5")
188      .addExpectedValue("Beta", "B1", 1.1)
189      .addExpectedValue("Beta", "B2", 2.1)
190      .addExpectedValue("Beta", "B3", 3.1)
191      .addExpectedValue("Beta", "B4", 4.1)
192      .addExpectedEmptyComputedValue("Beta", "B5")
193      .run();
194  });
195
196  it("should perform range operations with index", function () {
197    runner()
198      .addCell("Alpha", "A1", "= 10")
199      .addCell("Alpha", "A2", "= 20")
200      .addCell("Alpha", "A3", "= 30")
201      .addCell("Alpha", "B1", "= A1:A4")
202      .addCell("Alpha", "B2", "= A1:A4")
203      .addCell("Alpha", "B3", "= A1:A4")
204      .addCell("Alpha", "B4", "= A1:A4")
205      .addCell("Alpha", "B5", "= {A1:A4}")
206      .addCell("Alpha", "C10", "= {A1:A4 + 5}")
207      .addCell("Alpha", "C11", "= {A1 + 5}")
208      .addCell("Alpha", "C12", "= {A1:A1 + 5}")
209      .addExpectedValue("Alpha", "A1", 10.0)
210      .addExpectedValue("Alpha", "A2", 20.0)
211      .addExpectedValue("Alpha", "A3", 30.0)
212      .addExpectedValue("Alpha", "B1", 10.0)
213      .addExpectedValue("Alpha", "B2", 20.0)
214      .addExpectedValue("Alpha", "B3", 30.0)
215      .addExpectedEmptyComputedValue("Alpha", "B4")
216      .addExpectedValue("Alpha", "B5", 10.0)
217      .addExpectedValue("Alpha", "B6", 20.0)
218      .addExpectedValue("Alpha", "B7", 30.0)
219      .addExpectedValue("Alpha", "C10", new ValueException())
220      .addExpectedValue("Alpha", "C11", 15.0)
221      .addExpectedValue("Alpha", "C12", 15.0)
222      .run();
223  });
224});