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