spreadsheet
typeScript/javascript spreadsheet parser, with formulas.
git clone https://git.vogt.world/spreadsheet.git
Log | Files | README.md
← All files
name: tests/SheetBasicTests.ts
-rw-r--r--
7969
  1import {
  2  DIV_ZERO_ERROR,
  3  NA_ERROR,
  4  NULL_ERROR,
  5  NUM_ERROR,
  6  PARSE_ERROR,
  7  REF_ERROR,
  8  VALUE_ERROR
  9} from "../src/Errors";
 10import {
 11  assertFormulaEquals, assertFormulaEqualsDependsOnReference, assertFormulaEqualsError,
 12  test
 13} from "./Utils/Asserts";
 14
 15test("Sheet, declare number", function () {
 16  assertFormulaEquals('=5', 5);
 17});
 18
 19test("Sheet, declare string", function () {
 20  assertFormulaEquals('="str"', "str");
 21});
 22
 23test("Sheet, number multiplication", function () {
 24  assertFormulaEquals('=5*5', 25);
 25});
 26
 27test("Sheet, parse but throw parse error", function(){
 28  assertFormulaEqualsError('=10e', PARSE_ERROR);
 29  assertFormulaEqualsError('= SUM(', PARSE_ERROR);
 30});
 31
 32test("Sheet, parse & operator", function(){
 33  assertFormulaEquals('="hey"&" "&"there"', "hey there");
 34});
 35
 36test("Sheet,  parse * operator", function(){
 37  assertFormulaEquals('=10 * 10', 100);
 38  assertFormulaEquals('=10 * 0', 0);
 39  assertFormulaEquals('=1 * 1', 1);
 40  assertFormulaEquals('=1 * 0', 0);
 41  assertFormulaEquals('=0 * 0', 0);
 42});
 43
 44test("Sheet, parse / operator", function(){
 45  assertFormulaEquals('=10 / 2', 5);
 46  assertFormulaEquals('=10 / 1', 10);
 47  assertFormulaEquals('=1 / 1', 1);
 48  assertFormulaEquals('=0 / 1', 0);
 49  assertFormulaEquals('="1" / 1', 1);
 50  assertFormulaEquals('="500" / 1', 500);
 51  assertFormulaEqualsError('=10 / 0', DIV_ZERO_ERROR);
 52  assertFormulaEqualsError('=0 / 0', DIV_ZERO_ERROR);
 53  assertFormulaEquals('=P9 / 1', 0);
 54});
 55
 56test("Sheet, parse ^ operator", function(){
 57  assertFormulaEquals('=10 ^ 10', 10000000000);
 58  assertFormulaEquals('=10 ^ 0', 1);
 59  assertFormulaEquals('=1 ^ 1', 1);
 60  assertFormulaEquals('=2 ^ 10', 1024);
 61});
 62
 63test("Sheet, parse comparison operators on numbers", function(){
 64  assertFormulaEquals('=1 = 1', true);
 65  assertFormulaEquals('=1 = 0', false);
 66  assertFormulaEquals('=1 < 2', true);
 67  assertFormulaEquals('=1 < 0', false);
 68  assertFormulaEquals('=1 < 1', false);
 69  assertFormulaEquals('=1 <= 0', false);
 70  assertFormulaEquals('=1 <= 1', true);
 71  assertFormulaEquals('=1 <= 2', true);
 72  assertFormulaEquals('=1 >= 1', true);
 73  assertFormulaEquals('=2 >= 1', true);
 74  assertFormulaEquals('=1 >= 0', true);
 75  assertFormulaEquals('=1 >= 2', false);
 76  assertFormulaEquals('=1 <> 1', false);
 77  assertFormulaEquals('=1 <> 2', true);
 78});
 79
 80test("Sheet, parse comparison operators on strings", function(){
 81  assertFormulaEquals('="abc" = "abc"', true);
 82  assertFormulaEquals('="abc" = "xyz"', false);
 83  assertFormulaEquals('="abc" < "abc"', false);
 84  assertFormulaEquals('="abc" < "xyz"', true);
 85  assertFormulaEquals('="abc" <= "abc"', true);
 86  assertFormulaEquals('="abc" <= "xyz"', true);
 87  assertFormulaEquals('="xyz" <= "abc"', false);
 88  assertFormulaEquals('="abc" >= "abc"', true);
 89  assertFormulaEquals('="abc" >= "zyx"', false);
 90  assertFormulaEquals('="xyz" >= "abc"', true);
 91  assertFormulaEquals('="abc" <> "abc"', false);
 92  assertFormulaEquals('="abc" <> "zyz"', true);
 93});
 94
 95test("Sheet, parse comparison operators on boolean", function(){
 96  assertFormulaEquals('=TRUE = TRUE', true);
 97  assertFormulaEquals('=TRUE = FALSE', false);
 98  assertFormulaEquals('=FALSE = FALSE', true);
 99  assertFormulaEquals('=TRUE > TRUE', false);
100  assertFormulaEquals('=TRUE > FALSE', true);
101  assertFormulaEquals('=FALSE > FALSE', false);
102  assertFormulaEquals('=TRUE <= TRUE', true);
103  assertFormulaEquals('=TRUE <= FALSE', false);
104  assertFormulaEquals('=FALSE <= TRUE', true);
105  assertFormulaEquals('=TRUE >= TRUE', true);
106  assertFormulaEquals('=TRUE >= FALSE', true);
107  assertFormulaEquals('=FALSE >= TRUE', false);
108  assertFormulaEquals('=TRUE <> TRUE', false);
109  assertFormulaEquals('=FALSE <> FALSE', false);
110  assertFormulaEquals('=TRUE <> FALSE', true);
111  assertFormulaEquals('=FALSE <> TRUE', true);
112});
113
114test("Sheet, parse operators, order of operations", function(){
115  assertFormulaEquals('=10 + -10', 0);
116  assertFormulaEquals('=10 + -10 = 0', true);
117  assertFormulaEquals('=10 + -10 = 0 & "str"', false);
118  assertFormulaEquals('=-10%', -0.1);
119  assertFormulaEquals('=10 + 10%', 10.1);
120  assertFormulaEquals('=-10 + 10%', -9.9);
121  assertFormulaEquals('=-10 - +10%', -10.1);
122  assertFormulaEquals('=2^-10 + 10%', 0.1009765625);
123  assertFormulaEquals('=4 * 5 / 2', 10);
124  assertFormulaEquals('=4 / 5 * 4', 3.2);
125  assertFormulaEquals('=2^2*5', 20);
126  assertFormulaEquals('=2^(2*5)', 1024);
127});
128
129test("Sheet, parse and throw error literal", function () {
130  assertFormulaEqualsError('=#N/A', NA_ERROR);
131  assertFormulaEqualsError('=#NUM!', NUM_ERROR);
132  assertFormulaEqualsError('=#REF!', REF_ERROR);
133  assertFormulaEqualsError('=#NULL!', NULL_ERROR);
134  assertFormulaEqualsError('=#ERROR', PARSE_ERROR);
135  assertFormulaEqualsError('=#DIV/0!', DIV_ZERO_ERROR);
136  assertFormulaEqualsError('=#VALUE!', VALUE_ERROR);
137});
138
139test("Sheet, parse plain numbers", function() {
140  assertFormulaEquals('=10', 10);
141  // assertFormulaEquals('=.1', 0.1); // TODO: [ISSUE-010]
142  assertFormulaEquals('=+1', 1);
143  assertFormulaEquals('=-1', -1);
144  assertFormulaEquals('=++1', 1);
145  assertFormulaEquals('=--1', 1);
146  assertFormulaEquals('=10e1', 100);
147  assertFormulaEquals('=0e1', 0);
148  // assertFormulaEquals('=0.e1', 0); // TODO: [ISSUE-011]
149  assertFormulaEquals('=-10e1', -100);
150  assertFormulaEquals('=+10e1', 100);
151  assertFormulaEquals('=++10e1', 100);
152  assertFormulaEquals('=--10e1', 100);
153});
154
155test("Sheet, parse complex numbers and math", function(){
156  assertFormulaEquals('="10" + 10', 20);
157  assertFormulaEquals('="10.111111" + 0', 10.111111);
158  assertFormulaEquals('=10%', 0.1);
159  assertFormulaEquals('=10% + 1', 1.1);
160  assertFormulaEquals('="10e1" + 0', 100);
161  assertFormulaEquals('=10e1', 100);
162  assertFormulaEquals('=10e-1', 1);
163  assertFormulaEquals('=10e+1', 100);
164  assertFormulaEquals('=10E1', 100);
165  assertFormulaEquals('=10E-1', 1);
166  assertFormulaEquals('=10E+1', 100);
167  assertFormulaEquals('="1,000,000"  + 0', 1000000);
168  assertFormulaEquals('="+$10.00" + 0', 10);
169  assertFormulaEquals('="-$10.00" + 0', -10);
170  assertFormulaEquals('="$+10.00" + 0', 10);
171  assertFormulaEquals('="$-10.00" + 0', -10);
172  assertFormulaEquals('="10" + 10', 20);
173  assertFormulaEquals('="10.111111" + 0', 10.111111);
174  assertFormulaEquals('=10%', 0.1);
175  assertFormulaEquals('=10% + 1', 1.1);
176  assertFormulaEquals('="10e1" + 0', 100);
177  assertFormulaEquals('=10e1', 100);
178  assertFormulaEquals('=10e-1', 1);
179  assertFormulaEquals('=10e+1', 100);
180  assertFormulaEquals('=10E1', 100);
181  assertFormulaEquals('=10E-1', 1);
182  assertFormulaEquals('=10E+1', 100);
183  assertFormulaEquals('="1,000,000"  + 0', 1000000);
184  assertFormulaEqualsError('="10e" + 10', VALUE_ERROR);
185  assertFormulaEquals('="+$10.00" + 0', 10);
186  assertFormulaEquals('="-$10.00" + 0', -10);
187  assertFormulaEquals('="$+10.00" + 0', 10);
188  assertFormulaEquals('="$-10.00" + 0', -10);
189});
190
191test("Sheet, parse strings", function(){
192  assertFormulaEquals('="str"', "str");
193  assertFormulaEquals('="str"&"str"', "strstr");
194  assertFormulaEqualsError('="str"+"str"', VALUE_ERROR);
195  // assertFormulaEqualsError("='str'", PARSE_ERROR); // TODO: [ISSUE-012]
196});
197
198test("Sheet, parse boolean literals", function(){
199  assertFormulaEquals('=TRUE', true);
200  assertFormulaEquals('=true', true);
201  assertFormulaEquals('=FALSE', false);
202  assertFormulaEquals('=false', false);
203});
204
205test("Sheet, parse comparison logic inside parentheses", function(){
206  assertFormulaEquals('=(1=1)', true);
207  assertFormulaEquals('=(1=2)', false);
208  assertFormulaEquals('=(1=1)+2', 3);
209});
210
211test("Sheet, parse range literal", function(){
212  // assertEqualsArray('=[1, 2, 3]', [1, 2, 3]); // TODO: [ISSUE-007]
213  // assertEqualsArray('=[]', []);
214  // assertEqualsArray('=["str", "str"]', ["str", "str"]);
215  // assertEqualsArray('=["str", [1, 2, 3], [1]]', ["str", [1, 2, 3], [1]]);
216});
217
218test("Sheet state sequence: (number, ampersand, expression)", function(){
219  assertFormulaEquals('=10&10', "1010");
220  assertFormulaEquals('=10&"str"', "10str");
221  assertFormulaEquals('=10 & TRUE', "10TRUE");
222});