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});