spreadsheet
typeScript/javascript spreadsheet parser, with formulas.
git clone https://git.vogt.world/spreadsheet.git
Log | Files | README.md
← All files
name: tests/ParsingTest.ts
-rw-r--r--
13851
  1import {
  2  assertFormulaEquals, assertFormulaEqualsArray, assertFormulaEqualsDependsOnReference,
  3  assertFormulaEqualsError,
  4  test
  5} from "./Utils/Asserts";
  6import {
  7  DIV_ZERO_ERROR,
  8  VALUE_ERROR,
  9  PARSE_ERROR, NA_ERROR, NUM_ERROR, NULL_ERROR, REF_ERROR
 10} from "../src/Errors";
 11import {Cell} from "../src/Cell";
 12
 13test("Parse but throw parse error", function(){
 14  assertFormulaEqualsError('= 10e', PARSE_ERROR);
 15  assertFormulaEqualsError('= SUM(', PARSE_ERROR);
 16});
 17
 18test("Parse & operator", function(){
 19  assertFormulaEquals('="hey"&" "&"there"', "hey there");
 20  assertFormulaEquals('=TEXT(12.3, "###.##")&"mm"', "12.3mm");
 21});
 22
 23test("Parse * operator", function(){
 24  assertFormulaEquals('= 10 * 10', 100);
 25  assertFormulaEquals('= 10 * 0', 0);
 26  assertFormulaEquals('= 1 * 1', 1);
 27});
 28
 29test("Parse / operator", function(){
 30  assertFormulaEquals('= 10 / 2', 5);
 31  assertFormulaEquals('= 10 / 1', 10);
 32  assertFormulaEquals('= 1 / 1', 1);
 33  assertFormulaEquals('= 0 / 1', 0);
 34  assertFormulaEquals('="1" / 1', 1);
 35  assertFormulaEquals('="500" / 1', 500);
 36  assertFormulaEqualsError('= 10 / 0', DIV_ZERO_ERROR);
 37  assertFormulaEqualsError('= 0 / 0', DIV_ZERO_ERROR);
 38  assertFormulaEquals('= P9 / 1', 0);
 39});
 40
 41test("Parse ^ operator", function(){
 42  assertFormulaEquals('= 10 ^ 10', 10000000000);
 43  assertFormulaEquals('= 10 ^ 0', 1);
 44  assertFormulaEquals('= 1 ^ 1', 1);
 45  assertFormulaEquals('= 2 ^ 10', 1024);
 46});
 47
 48test("Parse equality operators", function(){
 49  assertFormulaEquals('= 1 = 1', true);
 50  assertFormulaEquals('= 1 = 0', false);
 51  assertFormulaEquals('= 1 < 2', true);
 52  assertFormulaEquals('= 1 < 0', false);
 53  assertFormulaEquals('= 1 <= 1', true);
 54  assertFormulaEquals('= 1 <= 2', true);
 55  assertFormulaEquals('= 1 >= 1', true);
 56  assertFormulaEquals('= 2 >= 1', true);
 57  assertFormulaEquals('= 1 >= 0', true);
 58  assertFormulaEquals('= 1 >= 2', false);
 59  assertFormulaEquals('= 1 <> 1', false);
 60  assertFormulaEquals('= 1 <> 2', true);
 61});
 62
 63test("Parse operators, order of operations", function(){
 64  assertFormulaEquals('= 10 + -10', 0);
 65  assertFormulaEquals('= 10 + -10 = 0', true);
 66  assertFormulaEquals('= 10 + -10 = 0 & "str"', false);
 67  assertFormulaEquals('= -10%', -0.1);
 68  assertFormulaEquals('= 10 + 10%', 10.1);
 69  assertFormulaEquals('= -10 + 10%', -9.9);
 70  assertFormulaEquals('= -10 - +10%', -10.1);
 71  assertFormulaEquals('= 2^-10 + 10%', 0.1009765625);
 72  assertFormulaEquals('= 4 * 5 / 2', 10);
 73  assertFormulaEquals('= 4 / 5 * 4', 3.2);
 74  assertFormulaEquals('= 2^2*5', 20);
 75  assertFormulaEquals('= 2^(2*5)', 1024);
 76});
 77
 78test("Parse and throw error literal", function () {
 79  assertFormulaEqualsError('=#N/A', NA_ERROR);
 80  assertFormulaEqualsError('=#NUM!', NUM_ERROR);
 81  assertFormulaEqualsError('=#REF!', REF_ERROR);
 82  assertFormulaEqualsError('=#NULL!', NULL_ERROR);
 83  assertFormulaEqualsError('=#ERROR', PARSE_ERROR);
 84  assertFormulaEqualsError('=#DIV/0!', DIV_ZERO_ERROR);
 85  assertFormulaEqualsError('=#VALUE!', VALUE_ERROR);
 86  assertFormulaEquals('=ISERROR(#N/A)', true);
 87  assertFormulaEquals('=ISERROR(#NUM!)', true);
 88  assertFormulaEquals('=ISERROR(#REF!)', true);
 89  assertFormulaEquals('=ISERROR(#NULL!)', true);
 90  assertFormulaEquals('=ISERROR(#ERROR)', true);
 91  assertFormulaEquals('=ISERROR(#DIV/0!)', true);
 92  assertFormulaEquals('=ISERROR(#VALUE!)', true);
 93  assertFormulaEquals('=IFERROR(#N/A, 10)', 10);
 94  assertFormulaEquals('=IFERROR(#NUM!, 10)', 10);
 95  assertFormulaEquals('=IFERROR(#REF!, 10)', 10);
 96  assertFormulaEquals('=IFERROR(#NULL!, 10)', 10);
 97  assertFormulaEquals('=IFERROR(#ERROR, 10)', 10);
 98  assertFormulaEquals('=IFERROR(#DIV/0!, 10)', 10);
 99  assertFormulaEquals('=IFERROR(#VALUE!, 10)', 10);
100});
101
102test("Parse plain numbers", function() {
103  assertFormulaEquals('=10', 10);
104  // assertFormulaEquals('=.1', 0.1); // TODO: [ISSUE-010]
105  assertFormulaEquals('=0.1', 0.1);
106  assertFormulaEquals('=+1', 1);
107  assertFormulaEquals('=-1', -1);
108  assertFormulaEquals('=++1', 1);
109  assertFormulaEquals('=--1', 1);
110  assertFormulaEquals('=10e1', 100);
111  assertFormulaEquals('=0e1', 0);
112  // assertFormulaEquals('=0.e1', 0); // TODO: [ISSUE-010]
113  assertFormulaEquals('=-10e1', -100);
114  assertFormulaEquals('=+10e1', 100);
115  assertFormulaEquals('=++10e1', 100);
116  assertFormulaEquals('=--10e1', 100);
117});
118
119test("Parse complex numbers and math", function(){
120  assertFormulaEquals('= "10" + 10', 20);
121  assertFormulaEquals('= "10.111111" + 0', 10.111111);
122  assertFormulaEquals('= 10%', 0.1);
123  assertFormulaEquals('= 10% + 1', 1.1);
124  assertFormulaEquals('= "10e1" + 0', 100);
125  assertFormulaEquals('= 10e1', 100);
126  assertFormulaEquals('= 10e-1', 1);
127  assertFormulaEquals('= 10e+1', 100);
128  assertFormulaEquals('= 10E1', 100);
129  assertFormulaEquals('= 10E-1', 1);
130  assertFormulaEquals('= 10E+1', 100);
131  assertFormulaEquals('= "1,000,000"  + 0', 1000000);
132  assertFormulaEqualsError('= "10e" + 10', VALUE_ERROR);
133  assertFormulaEquals('= "+$10.00" + 0', 10);
134  assertFormulaEquals('= "-$10.00" + 0', -10);
135  assertFormulaEquals('= "$+10.00" + 0', 10);
136  assertFormulaEquals('= "$-10.00" + 0', -10);
137  assertFormulaEquals('= "10" + 10', 20);
138  assertFormulaEquals('= "10.111111" + 0', 10.111111);
139  assertFormulaEquals('= 10%', 0.1);
140  assertFormulaEquals('= 10% + 1', 1.1);
141  assertFormulaEquals('= "10e1" + 0', 100);
142  assertFormulaEquals('= 10e1', 100);
143  assertFormulaEquals('= 10e-1', 1);
144  assertFormulaEquals('= 10e+1', 100);
145  assertFormulaEquals('= 10E1', 100);
146  assertFormulaEquals('= 10E-1', 1);
147  assertFormulaEquals('= 10E+1', 100);
148  assertFormulaEquals('= "1,000,000"  + 0', 1000000);
149  assertFormulaEqualsError('= "10e" + 10', VALUE_ERROR);
150  assertFormulaEquals('= "+$10.00" + 0', 10);
151  assertFormulaEquals('= "-$10.00" + 0', -10);
152  assertFormulaEquals('= "$+10.00" + 0', 10);
153  assertFormulaEquals('= "$-10.00" + 0', -10);
154});
155
156test("Parse strings", function(){
157  assertFormulaEquals('="str"', "str");
158  assertFormulaEquals('="str"&"str"', "strstr");
159  assertFormulaEqualsError('="str"+"str"', VALUE_ERROR);
160  // assertFormulaEqualsError("='str'", PARSE_ERROR); // TODO: [ISSUE-011]
161
162});
163
164test("Parse boolean literals", function(){
165  assertFormulaEquals('=TRUE', true);
166  assertFormulaEquals('=true', true);
167  assertFormulaEquals('=FALSE', false);
168  assertFormulaEquals('=false', false);
169});
170
171test("Parse boolean logic", function(){
172  assertFormulaEquals('=(1=1)', true);
173  assertFormulaEquals('=(1=2)', false);
174  assertFormulaEquals('=(1=1)+2', 3);
175
176});
177
178
179test("Parse range literal", function(){
180  // assertFormulaEqualsArray('=[1, 2, 3]', [1, 2, 3]); // TODO: [ISSUE-007]
181  // assertFormulaEqualsArray('=[]', []); // TODO: [ISSUE-007]
182  // assertFormulaEqualsArray('=["str", "str"]', ["str", "str"]); // TODO: [ISSUE-007]
183  // assertFormulaEqualsArray('=["str", [1, 2, 3], [1]]', ["str", [1, 2, 3], [1]]); // TODO: [ISSUE-007]
184});
185
186test("Parse cell references", function(){
187  assertFormulaEqualsDependsOnReference("E1", "str", '=E1', Cell.BuildFrom("E1", "str"));
188  // assertFormulaEqualsArray('=E1:E2', [new Cell("E1"), new Cell("E2")]); // TODO: [ISSUE-014]
189});
190
191test("Parse range following comma", function(){
192  // assertFormulaEquals('=SERIESSUM(1, 0, 1, [4, 5, 6])', 15);
193  // assertFormulaEquals('=SERIESSUM([1], [0], [1], [4, 5, 6])', 15);
194});
195
196test("Combinations of expressions and operators", function(){
197  test("Combinations of expressions and operators, ", function(){
198    assertFormulaEquals('=10 + 10', 20);
199    assertFormulaEquals('=10 + TRUE', 11);
200    assertFormulaEquals('=10 + "10"', 20);
201    assertFormulaEquals('=10 + (2*2)', 14);
202    assertFormulaEquals('=10 + SUM(1, 2)', 13);
203    // assertFormulaEquals('=10 + [10]', 20); // TODO: [ISSUE-007]
204    // assertFormulaEqualsError('=10 + #DIV/0!', DIV_ZERO_ERROR); // TODO: [ISSUE-008]
205  });
206  test("Combinations of expressions and operators, plus operator", function(){
207    assertFormulaEquals('=10 + 10', 20);
208    assertFormulaEquals('=10 + TRUE', 11);
209    assertFormulaEquals('=10 + "10"', 20);
210    assertFormulaEquals('=10 + (2*2)', 14);
211    assertFormulaEquals('=10 + SUM(1, 2)', 13);
212    // assertFormulaEquals('=10 + [10]', 20); // TODO: [ISSUE-007]
213    // assertFormulaEqualsError('=10 + #DIV/0!', DIV_ZERO_ERROR); // TODO: [ISSUE-008]
214  });
215  test("Combinations of expressions and operators, minus operator", function(){
216    assertFormulaEquals('=10 - 10', 0);
217    assertFormulaEquals('=10 - TRUE', 9);
218    assertFormulaEquals('=10 - "10"', 0);
219    assertFormulaEquals('=10 - (2*2)', 6);
220    assertFormulaEquals('=10 - SUM(1, 2)', 7);
221    // assertFormulaEquals('=10 - [10]', 10); // TODO: [ISSUE-007]
222    // assertFormulaEqualsError('=10 - #DIV/0!', DIV_ZERO_ERROR); // TODO: [ISSUE-008]
223  });
224  test("Combinations of expressions and operators, division operator", function(){
225    assertFormulaEquals('=10 / 10', 1);
226    assertFormulaEquals('=10 / TRUE', 10);
227    assertFormulaEquals('=10 / "10"', 1);
228    assertFormulaEquals('=10 / (2*2)', 2.5);
229    assertFormulaEquals('=10 / SUM(1, 2)', 3.3333333333333335);
230    // assertFormulaEquals('=10 / [10]', 10); // TODO: [ISSUE-007]
231    // assertFormulaEqualsError('=10 / #DIV/0!', DIV_ZERO_ERROR); // TODO: [ISSUE-008]
232  });
233  test("Combinations of expressions and operators, multiplication operator", function(){
234    assertFormulaEquals('=10 * 10', 100);
235    assertFormulaEquals('=10 * TRUE', 10);
236    assertFormulaEquals('=10 * "10"', 100);
237    assertFormulaEquals('=10 * (2*2)', 40);
238    assertFormulaEquals('=10 * SUM(1, 2)', 30);
239    // assertFormulaEquals('=10 * [10]', 10); // TODO: [ISSUE-007]
240    // assertFormulaEqualsError('=10 * #DIV/0!', DIV_ZERO_ERROR); // TODO: [ISSUE-008]
241  });
242  test("Combinations of expressions and operators, power operator", function(){
243    assertFormulaEquals('=10 ^ 2', 100);
244    assertFormulaEquals('=10 ^ TRUE', 10);
245    assertFormulaEquals('=10 ^ "2"', 100);
246    assertFormulaEquals('=10 ^ (2*2)', 10000);
247    assertFormulaEquals('=10 ^ SUM(2, 2)', 10000);
248    // assertFormulaEquals('=10 ^ 1', 10); // TODO: [ISSUE-007]
249    // assertFormulaEqualsError('=10 & #DIV/0!', DIV_ZERO_ERROR); // TODO: [ISSUE-008]
250  });
251  test("Combinations of expressions and operators, concat operator", function(){
252    assertFormulaEquals('=10 & 10', "1010");
253    assertFormulaEquals('=10 & TRUE', "10TRUE");
254    assertFormulaEquals('=10 & "10"', "1010");
255    assertFormulaEquals('=10 & (2*2)', "104");
256    assertFormulaEquals('=10 & SUM(1, 2)', "103");
257    // assertFormulaEquals('=10 & [10]', 10); // TODO: [ISSUE-007]
258    // assertFormulaEqualsError('=10 & #DIV/0!', DIV_ZERO_ERROR); // TODO: [ISSUE-008]
259  });
260  test("Combinations of expressions and operators, LT operator", function(){
261    assertFormulaEquals('=10 < 10', false);
262    assertFormulaEquals('=10 < TRUE', false);
263    assertFormulaEquals('=10 < "10"', false);
264    assertFormulaEquals('=10 < (2*2)', false);
265    assertFormulaEquals('=10 < SUM(1, 2)', false);
266    // assertFormulaEquals('=10 < [10]', 10); // TODO: [ISSUE-007]
267    // assertFormulaEqualsError('=10 < #DIV/0!', DIV_ZERO_ERROR); // TODO: [ISSUE-008]
268  });
269  test("Combinations of expressions and operators, LTE operator", function(){
270    assertFormulaEquals('=10 <= 10', true);
271    assertFormulaEquals('=10 <= TRUE', false);
272    assertFormulaEquals('=10 <= "10"', true);
273    assertFormulaEquals('=10 <= (2*2)', false);
274    assertFormulaEquals('=10 <= SUM(1, 2)', false);
275    // assertFormulaEquals('=10 <= [10]', 10); // TODO: [ISSUE-007]
276    // assertFormulaEqualsError('=10 <= #DIV/0!', DIV_ZERO_ERROR); // TODO: [ISSUE-008]
277  });
278  test("Combinations of expressions and operators, GT operator", function(){
279    assertFormulaEquals('=10 > 10', false);
280    assertFormulaEquals('=10 > TRUE', true);
281    assertFormulaEquals('=10 > "10"', false);
282    assertFormulaEquals('=10 > (2*2)', true);
283    assertFormulaEquals('=10 > SUM(1, 2)', true);
284    // assertFormulaEquals('=10 > [10]', 10); // TODO: [ISSUE-007]
285    // assertFormulaEqualsError('=10 > #DIV/0!', DIV_ZERO_ERROR); // TODO: [ISSUE-008]
286  });
287  test("Combinations of expressions and operators, GTE operator", function(){
288    assertFormulaEquals('=10 >= 10', true);
289    assertFormulaEquals('=10 >= TRUE', true);
290    assertFormulaEquals('=10 >= "10"', true);
291    assertFormulaEquals('=10 >= (2*2)', true);
292    assertFormulaEquals('=10 >= SUM(1, 2)', true);
293    // assertFormulaEquals('=10 >= [10]', 10); // TODO: [ISSUE-007]
294    // assertFormulaEqualsError('=10 >= #DIV/0!', DIV_ZERO_ERROR); // TODO: [ISSUE-008]
295  });
296  test("Combinations of expressions and operators, equality operator", function(){
297    assertFormulaEquals('=10 = 10', true);
298    assertFormulaEquals('=10 = TRUE', false);
299    assertFormulaEquals('=10 = "10"', false);
300    assertFormulaEquals('=10 = (2*2)', false);
301    assertFormulaEquals('=10 = SUM(1, 2)', false);
302    // assertFormulaEquals('=10 >= [10]', 10); // TODO: [ISSUE-007]
303    // assertFormulaEqualsError('=10 >= #DIV/0!', DIV_ZERO_ERROR); // TODO: [ISSUE-008]
304  });
305  test("Combinations of expressions and operators, not-equal operator", function(){
306    assertFormulaEquals('=10 <> 10', false);
307    assertFormulaEquals('=10 <> TRUE', true);
308    assertFormulaEquals('=10 <> "10"', true);
309    assertFormulaEquals('=10 <> (2*2)', true);
310    assertFormulaEquals('=10 <> SUM(1, 2)', true);
311    // assertFormulaEquals('=10 <> [10]', 10); // TODO: [ISSUE-007]
312    // assertFormulaEqualsError('=10 <> #DIV/0!', DIV_ZERO_ERROR); // TODO: [ISSUE-008]
313  });
314  test("Combinations of expressions and operators, unary prefix operators", function(){
315    assertFormulaEquals('=10 <> -10', true);
316    assertFormulaEquals('=-10', -10);
317    assertFormulaEquals('=-(-10)', 10);
318    assertFormulaEquals('=-(-(-1*2))', -2);
319    assertFormulaEquals('=-TRUE', -1);
320    assertFormulaEquals('=-"1"', -1);
321    assertFormulaEquals('=-+"1"', -1);
322    assertFormulaEquals('=-+-"1"', 1);
323    assertFormulaEquals('=-(1=1)', -1);
324  });
325});