src/debugger/test/lexer.c (view raw)
1/* Copyright (c) 2013-2017 Jeffrey Pfau
2 *
3 * This Source Code Form is subject to the terms of the Mozilla Public
4 * License, v. 2.0. If a copy of the MPL was not distributed with this
5 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
6#include "util/test/suite.h"
7
8#include <mgba/internal/debugger/parser.h>
9
10#define LEX(STR) \
11 struct LexVector* lv = *state; \
12 lexFree(lv); \
13 LexVectorClear(lv); \
14 size_t adjusted = lexExpression(lv, STR, strlen(STR), ""); \
15 assert_false(adjusted > strlen(STR))
16
17M_TEST_SUITE_SETUP(Lexer) {
18 struct LexVector* lv = malloc(sizeof(struct LexVector));
19 LexVectorInit(lv, 0);
20 *state = lv;
21 return 0;
22}
23
24M_TEST_SUITE_TEARDOWN(Lexer) {
25 struct LexVector* lv = *state;
26 lexFree(lv);
27 LexVectorDeinit(lv);
28 free(lv);
29 return 0;
30}
31
32M_TEST_DEFINE(lexEmpty) {
33 LEX("");
34
35 assert_int_equal(LexVectorSize(lv), 0);
36}
37
38M_TEST_DEFINE(lexInt) {
39 LEX("0");
40
41 assert_int_equal(LexVectorSize(lv), 1);
42 assert_int_equal(LexVectorGetPointer(lv, 0)->type, TOKEN_UINT_TYPE);
43 assert_int_equal(LexVectorGetPointer(lv, 0)->uintValue, 0);
44}
45
46M_TEST_DEFINE(lexDecimal) {
47 LEX("10");
48
49 assert_int_equal(LexVectorSize(lv), 1);
50 assert_int_equal(LexVectorGetPointer(lv, 0)->type, TOKEN_UINT_TYPE);
51 assert_int_equal(LexVectorGetPointer(lv, 0)->uintValue, 10);
52}
53
54M_TEST_DEFINE(lexBinary) {
55 LEX("0b10");
56
57 assert_int_equal(LexVectorSize(lv), 1);
58 assert_int_equal(LexVectorGetPointer(lv, 0)->type, TOKEN_UINT_TYPE);
59 assert_int_equal(LexVectorGetPointer(lv, 0)->uintValue, 2);
60}
61
62M_TEST_DEFINE(lexHex) {
63 LEX("0x10");
64
65 assert_int_equal(LexVectorSize(lv), 1);
66 assert_int_equal(LexVectorGetPointer(lv, 0)->type, TOKEN_UINT_TYPE);
67 assert_int_equal(LexVectorGetPointer(lv, 0)->uintValue, 0x10);
68}
69
70M_TEST_DEFINE(lexSigilHex) {
71 LEX("$10");
72
73 assert_int_equal(LexVectorSize(lv), 1);
74 assert_int_equal(LexVectorGetPointer(lv, 0)->type, TOKEN_UINT_TYPE);
75 assert_int_equal(LexVectorGetPointer(lv, 0)->uintValue, 0x10);
76}
77
78M_TEST_DEFINE(lexInvalidDecimal) {
79 LEX("1a");
80
81 assert_int_equal(LexVectorSize(lv), 1);
82 assert_int_equal(LexVectorGetPointer(lv, 0)->type, TOKEN_ERROR_TYPE);
83}
84
85M_TEST_DEFINE(lexInvalidBinary) {
86 LEX("0b12");
87
88 assert_int_equal(LexVectorSize(lv), 1);
89 assert_int_equal(LexVectorGetPointer(lv, 0)->type, TOKEN_ERROR_TYPE);
90}
91
92M_TEST_DEFINE(lexInvalidHex) {
93 LEX("0x1g");
94
95 assert_int_equal(LexVectorSize(lv), 1);
96 assert_int_equal(LexVectorGetPointer(lv, 0)->type, TOKEN_ERROR_TYPE);
97}
98
99M_TEST_DEFINE(lexTruncatedBinary) {
100 LEX("0b");
101
102 assert_int_equal(LexVectorSize(lv), 1);
103 assert_int_equal(LexVectorGetPointer(lv, 0)->type, TOKEN_ERROR_TYPE);
104}
105
106M_TEST_DEFINE(lexTruncatedSigilHex) {
107 LEX("$");
108
109 assert_int_equal(LexVectorSize(lv), 1);
110 assert_int_equal(LexVectorGetPointer(lv, 0)->type, TOKEN_ERROR_TYPE);
111}
112
113M_TEST_DEFINE(lexTruncatedHex) {
114 LEX("0x");
115
116 assert_int_equal(LexVectorSize(lv), 1);
117 assert_int_equal(LexVectorGetPointer(lv, 0)->type, TOKEN_ERROR_TYPE);
118}
119
120M_TEST_DEFINE(lexSigilSegmentHex) {
121 LEX("$01:0010");
122
123 assert_int_equal(LexVectorSize(lv), 2);
124 assert_int_equal(LexVectorGetPointer(lv, 0)->type, TOKEN_SEGMENT_TYPE);
125 assert_int_equal(LexVectorGetPointer(lv, 0)->uintValue, 1);
126 assert_int_equal(LexVectorGetPointer(lv, 1)->type, TOKEN_UINT_TYPE);
127 assert_int_equal(LexVectorGetPointer(lv, 1)->uintValue, 0x10);
128}
129
130M_TEST_DEFINE(lexIdentifier) {
131 LEX("x");
132
133 assert_int_equal(LexVectorSize(lv), 1);
134 assert_int_equal(LexVectorGetPointer(lv, 0)->type, TOKEN_IDENTIFIER_TYPE);
135 assert_string_equal(LexVectorGetPointer(lv, 0)->identifierValue, "x");
136}
137
138M_TEST_DEFINE(lexAddOperator) {
139 LEX("1+");
140
141 assert_int_equal(LexVectorSize(lv), 2);
142 assert_int_equal(LexVectorGetPointer(lv, 0)->type, TOKEN_UINT_TYPE);
143 assert_int_equal(LexVectorGetPointer(lv, 0)->uintValue, 1);
144 assert_int_equal(LexVectorGetPointer(lv, 1)->type, TOKEN_OPERATOR_TYPE);
145 assert_int_equal(LexVectorGetPointer(lv, 1)->operatorValue, OP_ADD);
146}
147
148M_TEST_DEFINE(lexIdentifierAddOperator) {
149 LEX("x+");
150
151 assert_int_equal(LexVectorSize(lv), 2);
152 assert_int_equal(LexVectorGetPointer(lv, 0)->type, TOKEN_IDENTIFIER_TYPE);
153 assert_string_equal(LexVectorGetPointer(lv, 0)->identifierValue, "x");
154 assert_int_equal(LexVectorGetPointer(lv, 1)->type, TOKEN_OPERATOR_TYPE);
155 assert_int_equal(LexVectorGetPointer(lv, 1)->operatorValue, OP_ADD);
156}
157
158M_TEST_DEFINE(lexSubOperator) {
159 LEX("1-");
160
161 assert_int_equal(LexVectorSize(lv), 2);
162 assert_int_equal(LexVectorGetPointer(lv, 0)->type, TOKEN_UINT_TYPE);
163 assert_int_equal(LexVectorGetPointer(lv, 0)->uintValue, 1);
164 assert_int_equal(LexVectorGetPointer(lv, 1)->type, TOKEN_OPERATOR_TYPE);
165 assert_int_equal(LexVectorGetPointer(lv, 1)->operatorValue, OP_SUBTRACT);
166}
167
168M_TEST_DEFINE(lexIdentifierSubOperator) {
169 LEX("x-");
170
171 assert_int_equal(LexVectorSize(lv), 2);
172 assert_int_equal(LexVectorGetPointer(lv, 0)->type, TOKEN_IDENTIFIER_TYPE);
173 assert_string_equal(LexVectorGetPointer(lv, 0)->identifierValue, "x");
174 assert_int_equal(LexVectorGetPointer(lv, 1)->type, TOKEN_OPERATOR_TYPE);
175 assert_int_equal(LexVectorGetPointer(lv, 1)->operatorValue, OP_SUBTRACT);
176}
177
178M_TEST_DEFINE(lexMulOperator) {
179 LEX("1*");
180
181 assert_int_equal(LexVectorSize(lv), 2);
182 assert_int_equal(LexVectorGetPointer(lv, 0)->type, TOKEN_UINT_TYPE);
183 assert_int_equal(LexVectorGetPointer(lv, 0)->uintValue, 1);
184 assert_int_equal(LexVectorGetPointer(lv, 1)->type, TOKEN_OPERATOR_TYPE);
185 assert_int_equal(LexVectorGetPointer(lv, 1)->operatorValue, OP_MULTIPLY);
186}
187
188M_TEST_DEFINE(lexIdentifierMulOperator) {
189 LEX("x*");
190
191 assert_int_equal(LexVectorSize(lv), 2);
192 assert_int_equal(LexVectorGetPointer(lv, 0)->type, TOKEN_IDENTIFIER_TYPE);
193 assert_string_equal(LexVectorGetPointer(lv, 0)->identifierValue, "x");
194 assert_int_equal(LexVectorGetPointer(lv, 1)->type, TOKEN_OPERATOR_TYPE);
195 assert_int_equal(LexVectorGetPointer(lv, 1)->operatorValue, OP_MULTIPLY);
196}
197
198M_TEST_DEFINE(lexDivOperator) {
199 LEX("1/");
200
201 assert_int_equal(LexVectorSize(lv), 2);
202 assert_int_equal(LexVectorGetPointer(lv, 0)->type, TOKEN_UINT_TYPE);
203 assert_int_equal(LexVectorGetPointer(lv, 0)->uintValue, 1);
204 assert_int_equal(LexVectorGetPointer(lv, 1)->type, TOKEN_OPERATOR_TYPE);
205 assert_int_equal(LexVectorGetPointer(lv, 1)->operatorValue, OP_DIVIDE);
206}
207
208M_TEST_DEFINE(lexIdentifierDivOperator) {
209 LEX("x/");
210
211 assert_int_equal(LexVectorSize(lv), 2);
212 assert_int_equal(LexVectorGetPointer(lv, 0)->type, TOKEN_IDENTIFIER_TYPE);
213 assert_string_equal(LexVectorGetPointer(lv, 0)->identifierValue, "x");
214 assert_int_equal(LexVectorGetPointer(lv, 1)->type, TOKEN_OPERATOR_TYPE);
215 assert_int_equal(LexVectorGetPointer(lv, 1)->operatorValue, OP_DIVIDE);
216}
217
218M_TEST_DEFINE(lexModOperator) {
219 LEX("1%");
220
221 assert_int_equal(LexVectorSize(lv), 2);
222 assert_int_equal(LexVectorGetPointer(lv, 0)->type, TOKEN_UINT_TYPE);
223 assert_int_equal(LexVectorGetPointer(lv, 0)->uintValue, 1);
224 assert_int_equal(LexVectorGetPointer(lv, 1)->type, TOKEN_OPERATOR_TYPE);
225 assert_int_equal(LexVectorGetPointer(lv, 1)->operatorValue, OP_MODULO);
226}
227
228M_TEST_DEFINE(lexIdentifierModOperator) {
229 LEX("x%");
230
231 assert_int_equal(LexVectorSize(lv), 2);
232 assert_int_equal(LexVectorGetPointer(lv, 0)->type, TOKEN_IDENTIFIER_TYPE);
233 assert_string_equal(LexVectorGetPointer(lv, 0)->identifierValue, "x");
234 assert_int_equal(LexVectorGetPointer(lv, 1)->type, TOKEN_OPERATOR_TYPE);
235 assert_int_equal(LexVectorGetPointer(lv, 1)->operatorValue, OP_MODULO);
236}
237
238M_TEST_DEFINE(lexAndOperator) {
239 LEX("1&");
240
241 assert_int_equal(LexVectorSize(lv), 2);
242 assert_int_equal(LexVectorGetPointer(lv, 0)->type, TOKEN_UINT_TYPE);
243 assert_int_equal(LexVectorGetPointer(lv, 0)->uintValue, 1);
244 assert_int_equal(LexVectorGetPointer(lv, 1)->type, TOKEN_OPERATOR_TYPE);
245 assert_int_equal(LexVectorGetPointer(lv, 1)->operatorValue, OP_AND);
246}
247
248M_TEST_DEFINE(lexIdentifierAndOperator) {
249 LEX("x&");
250
251 assert_int_equal(LexVectorSize(lv), 2);
252 assert_int_equal(LexVectorGetPointer(lv, 0)->type, TOKEN_IDENTIFIER_TYPE);
253 assert_string_equal(LexVectorGetPointer(lv, 0)->identifierValue, "x");
254 assert_int_equal(LexVectorGetPointer(lv, 1)->type, TOKEN_OPERATOR_TYPE);
255 assert_int_equal(LexVectorGetPointer(lv, 1)->operatorValue, OP_AND);
256}
257
258M_TEST_DEFINE(lexOrOperator) {
259 LEX("1|");
260
261 assert_int_equal(LexVectorSize(lv), 2);
262 assert_int_equal(LexVectorGetPointer(lv, 0)->type, TOKEN_UINT_TYPE);
263 assert_int_equal(LexVectorGetPointer(lv, 0)->uintValue, 1);
264 assert_int_equal(LexVectorGetPointer(lv, 1)->type, TOKEN_OPERATOR_TYPE);
265 assert_int_equal(LexVectorGetPointer(lv, 1)->operatorValue, OP_OR);
266}
267
268M_TEST_DEFINE(lexIdentifierOrOperator) {
269 LEX("x|");
270
271 assert_int_equal(LexVectorSize(lv), 2);
272 assert_int_equal(LexVectorGetPointer(lv, 0)->type, TOKEN_IDENTIFIER_TYPE);
273 assert_string_equal(LexVectorGetPointer(lv, 0)->identifierValue, "x");
274 assert_int_equal(LexVectorGetPointer(lv, 1)->type, TOKEN_OPERATOR_TYPE);
275 assert_int_equal(LexVectorGetPointer(lv, 1)->operatorValue, OP_OR);
276}
277
278M_TEST_DEFINE(lexXorOperator) {
279 LEX("1^");
280
281 assert_int_equal(LexVectorSize(lv), 2);
282 assert_int_equal(LexVectorGetPointer(lv, 0)->type, TOKEN_UINT_TYPE);
283 assert_int_equal(LexVectorGetPointer(lv, 0)->uintValue, 1);
284 assert_int_equal(LexVectorGetPointer(lv, 1)->type, TOKEN_OPERATOR_TYPE);
285 assert_int_equal(LexVectorGetPointer(lv, 1)->operatorValue, OP_XOR);
286}
287
288M_TEST_DEFINE(lexIdentifierXorOperator) {
289 LEX("x^");
290
291 assert_int_equal(LexVectorSize(lv), 2);
292 assert_int_equal(LexVectorGetPointer(lv, 0)->type, TOKEN_IDENTIFIER_TYPE);
293 assert_string_equal(LexVectorGetPointer(lv, 0)->identifierValue, "x");
294 assert_int_equal(LexVectorGetPointer(lv, 1)->type, TOKEN_OPERATOR_TYPE);
295 assert_int_equal(LexVectorGetPointer(lv, 1)->operatorValue, OP_XOR);
296}
297
298M_TEST_DEFINE(lexLessOperator) {
299 LEX("1<");
300
301 assert_int_equal(LexVectorSize(lv), 2);
302 assert_int_equal(LexVectorGetPointer(lv, 0)->type, TOKEN_UINT_TYPE);
303 assert_int_equal(LexVectorGetPointer(lv, 0)->uintValue, 1);
304 assert_int_equal(LexVectorGetPointer(lv, 1)->type, TOKEN_OPERATOR_TYPE);
305 assert_int_equal(LexVectorGetPointer(lv, 1)->operatorValue, OP_LESS);
306}
307
308M_TEST_DEFINE(lexIdentifierLessOperator) {
309 LEX("x<");
310
311 assert_int_equal(LexVectorSize(lv), 2);
312 assert_int_equal(LexVectorGetPointer(lv, 0)->type, TOKEN_IDENTIFIER_TYPE);
313 assert_string_equal(LexVectorGetPointer(lv, 0)->identifierValue, "x");
314 assert_int_equal(LexVectorGetPointer(lv, 1)->type, TOKEN_OPERATOR_TYPE);
315 assert_int_equal(LexVectorGetPointer(lv, 1)->operatorValue, OP_LESS);
316}
317
318M_TEST_DEFINE(lexGreaterOperator) {
319 LEX("1>");
320
321 assert_int_equal(LexVectorSize(lv), 2);
322 assert_int_equal(LexVectorGetPointer(lv, 0)->type, TOKEN_UINT_TYPE);
323 assert_int_equal(LexVectorGetPointer(lv, 0)->uintValue, 1);
324 assert_int_equal(LexVectorGetPointer(lv, 1)->type, TOKEN_OPERATOR_TYPE);
325 assert_int_equal(LexVectorGetPointer(lv, 1)->operatorValue, OP_GREATER);
326}
327
328M_TEST_DEFINE(lexIdentifierGreaterOperator) {
329 LEX("x>");
330
331 assert_int_equal(LexVectorSize(lv), 2);
332 assert_int_equal(LexVectorGetPointer(lv, 0)->type, TOKEN_IDENTIFIER_TYPE);
333 assert_string_equal(LexVectorGetPointer(lv, 0)->identifierValue, "x");
334 assert_int_equal(LexVectorGetPointer(lv, 1)->type, TOKEN_OPERATOR_TYPE);
335 assert_int_equal(LexVectorGetPointer(lv, 1)->operatorValue, OP_GREATER);
336}
337
338M_TEST_DEFINE(lexNotOperator) {
339 LEX("!1");
340
341 assert_int_equal(LexVectorSize(lv), 2);
342 assert_int_equal(LexVectorGetPointer(lv, 0)->type, TOKEN_OPERATOR_TYPE);
343 assert_int_equal(LexVectorGetPointer(lv, 0)->operatorValue, OP_NOT);
344 assert_int_equal(LexVectorGetPointer(lv, 1)->type, TOKEN_UINT_TYPE);
345 assert_int_equal(LexVectorGetPointer(lv, 1)->uintValue, 1);
346}
347
348M_TEST_DEFINE(lexNotNotOperator) {
349 LEX("!!1");
350
351 assert_int_equal(LexVectorSize(lv), 3);
352 assert_int_equal(LexVectorGetPointer(lv, 0)->type, TOKEN_OPERATOR_TYPE);
353 assert_int_equal(LexVectorGetPointer(lv, 0)->operatorValue, OP_NOT);
354 assert_int_equal(LexVectorGetPointer(lv, 1)->type, TOKEN_OPERATOR_TYPE);
355 assert_int_equal(LexVectorGetPointer(lv, 1)->operatorValue, OP_NOT);
356 assert_int_equal(LexVectorGetPointer(lv, 2)->type, TOKEN_UINT_TYPE);
357 assert_int_equal(LexVectorGetPointer(lv, 2)->uintValue, 1);
358}
359
360M_TEST_DEFINE(lexFlipOperator) {
361 LEX("~1");
362
363 assert_int_equal(LexVectorSize(lv), 2);
364 assert_int_equal(LexVectorGetPointer(lv, 0)->type, TOKEN_OPERATOR_TYPE);
365 assert_int_equal(LexVectorGetPointer(lv, 0)->operatorValue, OP_FLIP);
366 assert_int_equal(LexVectorGetPointer(lv, 1)->type, TOKEN_UINT_TYPE);
367 assert_int_equal(LexVectorGetPointer(lv, 1)->uintValue, 1);
368}
369
370M_TEST_DEFINE(lexEqualsOperator) {
371 LEX("1==");
372
373 assert_int_equal(LexVectorSize(lv), 2);
374 assert_int_equal(LexVectorGetPointer(lv, 0)->type, TOKEN_UINT_TYPE);
375 assert_int_equal(LexVectorGetPointer(lv, 0)->uintValue, 1);
376 assert_int_equal(LexVectorGetPointer(lv, 1)->type, TOKEN_OPERATOR_TYPE);
377 assert_int_equal(LexVectorGetPointer(lv, 1)->operatorValue, OP_EQUAL);
378}
379
380M_TEST_DEFINE(lexIdentifierEqualsOperator) {
381 LEX("x==");
382
383 assert_int_equal(LexVectorSize(lv), 2);
384 assert_int_equal(LexVectorGetPointer(lv, 0)->type, TOKEN_IDENTIFIER_TYPE);
385 assert_string_equal(LexVectorGetPointer(lv, 0)->identifierValue, "x");
386 assert_int_equal(LexVectorGetPointer(lv, 1)->type, TOKEN_OPERATOR_TYPE);
387 assert_int_equal(LexVectorGetPointer(lv, 1)->operatorValue, OP_EQUAL);
388}
389
390M_TEST_DEFINE(lexNotEqualsOperator) {
391 LEX("1!=");
392
393 assert_int_equal(LexVectorSize(lv), 2);
394 assert_int_equal(LexVectorGetPointer(lv, 0)->type, TOKEN_UINT_TYPE);
395 assert_int_equal(LexVectorGetPointer(lv, 0)->uintValue, 1);
396 assert_int_equal(LexVectorGetPointer(lv, 1)->type, TOKEN_OPERATOR_TYPE);
397 assert_int_equal(LexVectorGetPointer(lv, 1)->operatorValue, OP_NOT_EQUAL);
398}
399
400M_TEST_DEFINE(lexIdentifierNotEqualsOperator) {
401 LEX("x!=");
402
403 assert_int_equal(LexVectorSize(lv), 2);
404 assert_int_equal(LexVectorGetPointer(lv, 0)->type, TOKEN_IDENTIFIER_TYPE);
405 assert_string_equal(LexVectorGetPointer(lv, 0)->identifierValue, "x");
406 assert_int_equal(LexVectorGetPointer(lv, 1)->type, TOKEN_OPERATOR_TYPE);
407 assert_int_equal(LexVectorGetPointer(lv, 1)->operatorValue, OP_NOT_EQUAL);
408}
409
410M_TEST_DEFINE(lexLEOperator) {
411 LEX("1<=");
412
413 assert_int_equal(LexVectorSize(lv), 2);
414 assert_int_equal(LexVectorGetPointer(lv, 0)->type, TOKEN_UINT_TYPE);
415 assert_int_equal(LexVectorGetPointer(lv, 0)->uintValue, 1);
416 assert_int_equal(LexVectorGetPointer(lv, 1)->type, TOKEN_OPERATOR_TYPE);
417 assert_int_equal(LexVectorGetPointer(lv, 1)->operatorValue, OP_LE);
418}
419
420M_TEST_DEFINE(lexIdentifierLEOperator) {
421 LEX("x<=");
422
423 assert_int_equal(LexVectorSize(lv), 2);
424 assert_int_equal(LexVectorGetPointer(lv, 0)->type, TOKEN_IDENTIFIER_TYPE);
425 assert_string_equal(LexVectorGetPointer(lv, 0)->identifierValue, "x");
426 assert_int_equal(LexVectorGetPointer(lv, 1)->type, TOKEN_OPERATOR_TYPE);
427 assert_int_equal(LexVectorGetPointer(lv, 1)->operatorValue, OP_LE);
428}
429
430M_TEST_DEFINE(lexGEOperator) {
431 LEX("1>=");
432
433 assert_int_equal(LexVectorSize(lv), 2);
434 assert_int_equal(LexVectorGetPointer(lv, 0)->type, TOKEN_UINT_TYPE);
435 assert_int_equal(LexVectorGetPointer(lv, 0)->uintValue, 1);
436 assert_int_equal(LexVectorGetPointer(lv, 1)->type, TOKEN_OPERATOR_TYPE);
437 assert_int_equal(LexVectorGetPointer(lv, 1)->operatorValue, OP_GE);
438}
439
440M_TEST_DEFINE(lexIdentifierGEOperator) {
441 LEX("x>=");
442
443 assert_int_equal(LexVectorSize(lv), 2);
444 assert_int_equal(LexVectorGetPointer(lv, 0)->type, TOKEN_IDENTIFIER_TYPE);
445 assert_string_equal(LexVectorGetPointer(lv, 0)->identifierValue, "x");
446 assert_int_equal(LexVectorGetPointer(lv, 1)->type, TOKEN_OPERATOR_TYPE);
447 assert_int_equal(LexVectorGetPointer(lv, 1)->operatorValue, OP_GE);
448}
449
450M_TEST_DEFINE(lexLAndOperator) {
451 LEX("1&&");
452
453 assert_int_equal(LexVectorSize(lv), 2);
454 assert_int_equal(LexVectorGetPointer(lv, 0)->type, TOKEN_UINT_TYPE);
455 assert_int_equal(LexVectorGetPointer(lv, 0)->uintValue, 1);
456 assert_int_equal(LexVectorGetPointer(lv, 1)->type, TOKEN_OPERATOR_TYPE);
457 assert_int_equal(LexVectorGetPointer(lv, 1)->operatorValue, OP_LOGICAL_AND);
458}
459
460M_TEST_DEFINE(lexIdentifierLAndOperator) {
461 LEX("x&&");
462
463 assert_int_equal(LexVectorSize(lv), 2);
464 assert_int_equal(LexVectorGetPointer(lv, 0)->type, TOKEN_IDENTIFIER_TYPE);
465 assert_string_equal(LexVectorGetPointer(lv, 0)->identifierValue, "x");
466 assert_int_equal(LexVectorGetPointer(lv, 1)->type, TOKEN_OPERATOR_TYPE);
467 assert_int_equal(LexVectorGetPointer(lv, 1)->operatorValue, OP_LOGICAL_AND);
468}
469
470M_TEST_DEFINE(lexLOrOperator) {
471 LEX("1||");
472
473 assert_int_equal(LexVectorSize(lv), 2);
474 assert_int_equal(LexVectorGetPointer(lv, 0)->type, TOKEN_UINT_TYPE);
475 assert_int_equal(LexVectorGetPointer(lv, 0)->uintValue, 1);
476 assert_int_equal(LexVectorGetPointer(lv, 1)->type, TOKEN_OPERATOR_TYPE);
477 assert_int_equal(LexVectorGetPointer(lv, 1)->operatorValue, OP_LOGICAL_OR);
478}
479
480M_TEST_DEFINE(lexIdentifierLOrOperator) {
481 LEX("x||");
482
483 assert_int_equal(LexVectorSize(lv), 2);
484 assert_int_equal(LexVectorGetPointer(lv, 0)->type, TOKEN_IDENTIFIER_TYPE);
485 assert_string_equal(LexVectorGetPointer(lv, 0)->identifierValue, "x");
486 assert_int_equal(LexVectorGetPointer(lv, 1)->type, TOKEN_OPERATOR_TYPE);
487 assert_int_equal(LexVectorGetPointer(lv, 1)->operatorValue, OP_LOGICAL_OR);
488}
489
490M_TEST_DEFINE(lexShiftLOperator) {
491 LEX("1<<");
492
493 assert_int_equal(LexVectorSize(lv), 2);
494 assert_int_equal(LexVectorGetPointer(lv, 0)->type, TOKEN_UINT_TYPE);
495 assert_int_equal(LexVectorGetPointer(lv, 0)->uintValue, 1);
496 assert_int_equal(LexVectorGetPointer(lv, 1)->type, TOKEN_OPERATOR_TYPE);
497 assert_int_equal(LexVectorGetPointer(lv, 1)->operatorValue, OP_SHIFT_L);
498}
499
500M_TEST_DEFINE(lexIdentifierShiftLOperator) {
501 LEX("x<<");
502
503 assert_int_equal(LexVectorSize(lv), 2);
504 assert_int_equal(LexVectorGetPointer(lv, 0)->type, TOKEN_IDENTIFIER_TYPE);
505 assert_string_equal(LexVectorGetPointer(lv, 0)->identifierValue, "x");
506 assert_int_equal(LexVectorGetPointer(lv, 1)->type, TOKEN_OPERATOR_TYPE);
507 assert_int_equal(LexVectorGetPointer(lv, 1)->operatorValue, OP_SHIFT_L);
508}
509
510M_TEST_DEFINE(lexShiftROperator) {
511 LEX("1>>");
512
513 assert_int_equal(LexVectorSize(lv), 2);
514 assert_int_equal(LexVectorGetPointer(lv, 0)->type, TOKEN_UINT_TYPE);
515 assert_int_equal(LexVectorGetPointer(lv, 0)->uintValue, 1);
516 assert_int_equal(LexVectorGetPointer(lv, 1)->type, TOKEN_OPERATOR_TYPE);
517 assert_int_equal(LexVectorGetPointer(lv, 1)->operatorValue, OP_SHIFT_R);
518}
519
520M_TEST_DEFINE(lexIdentifierShiftROperator) {
521 LEX("x>>");
522
523 assert_int_equal(LexVectorSize(lv), 2);
524 assert_int_equal(LexVectorGetPointer(lv, 0)->type, TOKEN_IDENTIFIER_TYPE);
525 assert_string_equal(LexVectorGetPointer(lv, 0)->identifierValue, "x");
526 assert_int_equal(LexVectorGetPointer(lv, 1)->type, TOKEN_OPERATOR_TYPE);
527 assert_int_equal(LexVectorGetPointer(lv, 1)->operatorValue, OP_SHIFT_R);
528}
529
530M_TEST_DEFINE(lexSimpleExpression) {
531 LEX("1+1");
532
533 assert_int_equal(LexVectorSize(lv), 3);
534 assert_int_equal(LexVectorGetPointer(lv, 0)->type, TOKEN_UINT_TYPE);
535 assert_int_equal(LexVectorGetPointer(lv, 0)->uintValue, 1);
536 assert_int_equal(LexVectorGetPointer(lv, 1)->type, TOKEN_OPERATOR_TYPE);
537 assert_int_equal(LexVectorGetPointer(lv, 1)->operatorValue, OP_ADD);
538 assert_int_equal(LexVectorGetPointer(lv, 2)->type, TOKEN_UINT_TYPE);
539 assert_int_equal(LexVectorGetPointer(lv, 2)->uintValue, 1);
540}
541
542M_TEST_DEFINE(lexOpenParen) {
543 LEX("(");
544
545 assert_int_equal(LexVectorSize(lv), 1);
546 assert_int_equal(LexVectorGetPointer(lv, 0)->type, TOKEN_OPEN_PAREN_TYPE);
547}
548
549M_TEST_DEFINE(lexCloseParen) {
550 LEX("(0)");
551
552 assert_int_equal(LexVectorSize(lv), 3);
553 assert_int_equal(LexVectorGetPointer(lv, 0)->type, TOKEN_OPEN_PAREN_TYPE);
554 assert_int_equal(LexVectorGetPointer(lv, 1)->type, TOKEN_UINT_TYPE);
555 assert_int_equal(LexVectorGetPointer(lv, 1)->uintValue, 0);
556 assert_int_equal(LexVectorGetPointer(lv, 2)->type, TOKEN_CLOSE_PAREN_TYPE);
557}
558
559M_TEST_DEFINE(lexIdentifierCloseParen) {
560 LEX("(x)");
561
562 assert_int_equal(LexVectorSize(lv), 3);
563 assert_int_equal(LexVectorGetPointer(lv, 0)->type, TOKEN_OPEN_PAREN_TYPE);
564 assert_int_equal(LexVectorGetPointer(lv, 1)->type, TOKEN_IDENTIFIER_TYPE);
565 assert_string_equal(LexVectorGetPointer(lv, 1)->identifierValue, "x");
566 assert_int_equal(LexVectorGetPointer(lv, 2)->type, TOKEN_CLOSE_PAREN_TYPE);
567}
568
569M_TEST_DEFINE(lexParentheticalExpression) {
570 LEX("(1+1)");
571
572 assert_int_equal(LexVectorSize(lv), 5);
573 assert_int_equal(LexVectorGetPointer(lv, 0)->type, TOKEN_OPEN_PAREN_TYPE);
574 assert_int_equal(LexVectorGetPointer(lv, 1)->type, TOKEN_UINT_TYPE);
575 assert_int_equal(LexVectorGetPointer(lv, 1)->uintValue, 1);
576 assert_int_equal(LexVectorGetPointer(lv, 2)->type, TOKEN_OPERATOR_TYPE);
577 assert_int_equal(LexVectorGetPointer(lv, 2)->operatorValue, OP_ADD);
578 assert_int_equal(LexVectorGetPointer(lv, 3)->type, TOKEN_UINT_TYPE);
579 assert_int_equal(LexVectorGetPointer(lv, 3)->uintValue, 1);
580 assert_int_equal(LexVectorGetPointer(lv, 4)->type, TOKEN_CLOSE_PAREN_TYPE);
581}
582
583M_TEST_DEFINE(lexNestedParentheticalExpression) {
584 LEX("(1+(2+3))");
585
586 assert_int_equal(LexVectorSize(lv), 9);
587 assert_int_equal(LexVectorGetPointer(lv, 0)->type, TOKEN_OPEN_PAREN_TYPE);
588 assert_int_equal(LexVectorGetPointer(lv, 1)->type, TOKEN_UINT_TYPE);
589 assert_int_equal(LexVectorGetPointer(lv, 1)->uintValue, 1);
590 assert_int_equal(LexVectorGetPointer(lv, 2)->type, TOKEN_OPERATOR_TYPE);
591 assert_int_equal(LexVectorGetPointer(lv, 2)->operatorValue, OP_ADD);
592 assert_int_equal(LexVectorGetPointer(lv, 3)->type, TOKEN_OPEN_PAREN_TYPE);
593 assert_int_equal(LexVectorGetPointer(lv, 4)->type, TOKEN_UINT_TYPE);
594 assert_int_equal(LexVectorGetPointer(lv, 4)->uintValue, 2);
595 assert_int_equal(LexVectorGetPointer(lv, 5)->type, TOKEN_OPERATOR_TYPE);
596 assert_int_equal(LexVectorGetPointer(lv, 5)->operatorValue, OP_ADD);
597 assert_int_equal(LexVectorGetPointer(lv, 6)->type, TOKEN_UINT_TYPE);
598 assert_int_equal(LexVectorGetPointer(lv, 6)->uintValue, 3);
599 assert_int_equal(LexVectorGetPointer(lv, 7)->type, TOKEN_CLOSE_PAREN_TYPE);
600 assert_int_equal(LexVectorGetPointer(lv, 8)->type, TOKEN_CLOSE_PAREN_TYPE);
601}
602
603M_TEST_DEFINE(lexSpaceSimple) {
604 LEX(" 1 ");
605
606 assert_int_equal(LexVectorSize(lv), 1);
607 assert_int_equal(LexVectorGetPointer(lv, 0)->type, TOKEN_UINT_TYPE);
608 assert_int_equal(LexVectorGetPointer(lv, 0)->uintValue, 1);
609}
610
611M_TEST_DEFINE(lexSpaceIdentifier) {
612 LEX(" x ");
613
614 assert_int_equal(LexVectorSize(lv), 1);
615 assert_int_equal(LexVectorGetPointer(lv, 0)->type, TOKEN_IDENTIFIER_TYPE);
616 assert_string_equal(LexVectorGetPointer(lv, 0)->identifierValue, "x");
617}
618
619M_TEST_DEFINE(lexSpaceOperator) {
620 LEX("1 + 2");
621
622 assert_int_equal(LexVectorSize(lv), 3);
623 assert_int_equal(LexVectorGetPointer(lv, 0)->type, TOKEN_UINT_TYPE);
624 assert_int_equal(LexVectorGetPointer(lv, 0)->uintValue, 1);
625 assert_int_equal(LexVectorGetPointer(lv, 1)->type, TOKEN_OPERATOR_TYPE);
626 assert_int_equal(LexVectorGetPointer(lv, 1)->operatorValue, OP_ADD);
627 assert_int_equal(LexVectorGetPointer(lv, 2)->type, TOKEN_UINT_TYPE);
628 assert_int_equal(LexVectorGetPointer(lv, 2)->uintValue, 2);
629}
630
631M_TEST_DEFINE(lexSpaceParen) {
632 LEX(" ( 1 + 2 ) ");
633
634 assert_int_equal(LexVectorSize(lv), 5);
635 assert_int_equal(LexVectorGetPointer(lv, 0)->type, TOKEN_OPEN_PAREN_TYPE);
636 assert_int_equal(LexVectorGetPointer(lv, 1)->type, TOKEN_UINT_TYPE);
637 assert_int_equal(LexVectorGetPointer(lv, 1)->uintValue, 1);
638 assert_int_equal(LexVectorGetPointer(lv, 2)->type, TOKEN_OPERATOR_TYPE);
639 assert_int_equal(LexVectorGetPointer(lv, 2)->operatorValue, OP_ADD);
640 assert_int_equal(LexVectorGetPointer(lv, 3)->type, TOKEN_UINT_TYPE);
641 assert_int_equal(LexVectorGetPointer(lv, 3)->uintValue, 2);
642 assert_int_equal(LexVectorGetPointer(lv, 4)->type, TOKEN_CLOSE_PAREN_TYPE);
643}
644
645M_TEST_DEFINE(lexSpaceParens) {
646 LEX(" ( 1 + ( 2 + 3 ) ) ");
647
648 assert_int_equal(LexVectorSize(lv), 9);
649 assert_int_equal(LexVectorGetPointer(lv, 0)->type, TOKEN_OPEN_PAREN_TYPE);
650 assert_int_equal(LexVectorGetPointer(lv, 1)->type, TOKEN_UINT_TYPE);
651 assert_int_equal(LexVectorGetPointer(lv, 1)->uintValue, 1);
652 assert_int_equal(LexVectorGetPointer(lv, 2)->type, TOKEN_OPERATOR_TYPE);
653 assert_int_equal(LexVectorGetPointer(lv, 2)->operatorValue, OP_ADD);
654 assert_int_equal(LexVectorGetPointer(lv, 3)->type, TOKEN_OPEN_PAREN_TYPE);
655 assert_int_equal(LexVectorGetPointer(lv, 4)->type, TOKEN_UINT_TYPE);
656 assert_int_equal(LexVectorGetPointer(lv, 4)->uintValue, 2);
657 assert_int_equal(LexVectorGetPointer(lv, 5)->type, TOKEN_OPERATOR_TYPE);
658 assert_int_equal(LexVectorGetPointer(lv, 5)->operatorValue, OP_ADD);
659 assert_int_equal(LexVectorGetPointer(lv, 6)->type, TOKEN_UINT_TYPE);
660 assert_int_equal(LexVectorGetPointer(lv, 6)->uintValue, 3);
661 assert_int_equal(LexVectorGetPointer(lv, 7)->type, TOKEN_CLOSE_PAREN_TYPE);
662 assert_int_equal(LexVectorGetPointer(lv, 8)->type, TOKEN_CLOSE_PAREN_TYPE);
663}
664
665M_TEST_SUITE_DEFINE_SETUP_TEARDOWN(Lexer,
666 cmocka_unit_test(lexEmpty),
667 cmocka_unit_test(lexInt),
668 cmocka_unit_test(lexDecimal),
669 cmocka_unit_test(lexBinary),
670 cmocka_unit_test(lexHex),
671 cmocka_unit_test(lexSigilHex),
672 cmocka_unit_test(lexSigilSegmentHex),
673 cmocka_unit_test(lexInvalidDecimal),
674 cmocka_unit_test(lexInvalidHex),
675 cmocka_unit_test(lexInvalidBinary),
676 cmocka_unit_test(lexTruncatedHex),
677 cmocka_unit_test(lexTruncatedSigilHex),
678 cmocka_unit_test(lexTruncatedBinary),
679 cmocka_unit_test(lexIdentifier),
680 cmocka_unit_test(lexAddOperator),
681 cmocka_unit_test(lexIdentifierAddOperator),
682 cmocka_unit_test(lexSubOperator),
683 cmocka_unit_test(lexIdentifierSubOperator),
684 cmocka_unit_test(lexMulOperator),
685 cmocka_unit_test(lexIdentifierMulOperator),
686 cmocka_unit_test(lexDivOperator),
687 cmocka_unit_test(lexIdentifierDivOperator),
688 cmocka_unit_test(lexModOperator),
689 cmocka_unit_test(lexIdentifierModOperator),
690 cmocka_unit_test(lexAndOperator),
691 cmocka_unit_test(lexIdentifierAndOperator),
692 cmocka_unit_test(lexOrOperator),
693 cmocka_unit_test(lexIdentifierOrOperator),
694 cmocka_unit_test(lexXorOperator),
695 cmocka_unit_test(lexIdentifierXorOperator),
696 cmocka_unit_test(lexLessOperator),
697 cmocka_unit_test(lexIdentifierLessOperator),
698 cmocka_unit_test(lexGreaterOperator),
699 cmocka_unit_test(lexIdentifierGreaterOperator),
700 cmocka_unit_test(lexNotOperator),
701 cmocka_unit_test(lexNotNotOperator),
702 cmocka_unit_test(lexFlipOperator),
703 cmocka_unit_test(lexEqualsOperator),
704 cmocka_unit_test(lexIdentifierEqualsOperator),
705 cmocka_unit_test(lexNotEqualsOperator),
706 cmocka_unit_test(lexIdentifierNotEqualsOperator),
707 cmocka_unit_test(lexLEOperator),
708 cmocka_unit_test(lexIdentifierLEOperator),
709 cmocka_unit_test(lexGEOperator),
710 cmocka_unit_test(lexIdentifierGEOperator),
711 cmocka_unit_test(lexLAndOperator),
712 cmocka_unit_test(lexIdentifierLAndOperator),
713 cmocka_unit_test(lexLOrOperator),
714 cmocka_unit_test(lexIdentifierLOrOperator),
715 cmocka_unit_test(lexShiftLOperator),
716 cmocka_unit_test(lexIdentifierShiftLOperator),
717 cmocka_unit_test(lexShiftROperator),
718 cmocka_unit_test(lexIdentifierShiftROperator),
719 cmocka_unit_test(lexSimpleExpression),
720 cmocka_unit_test(lexOpenParen),
721 cmocka_unit_test(lexCloseParen),
722 cmocka_unit_test(lexIdentifierCloseParen),
723 cmocka_unit_test(lexParentheticalExpression),
724 cmocka_unit_test(lexNestedParentheticalExpression),
725 cmocka_unit_test(lexSpaceSimple),
726 cmocka_unit_test(lexSpaceIdentifier),
727 cmocka_unit_test(lexSpaceOperator),
728 cmocka_unit_test(lexSpaceParen),
729 cmocka_unit_test(lexSpaceParens))