all repos — mgba @ 60ec3e0e9926da9a10771f164f5040359f077872

mGBA Game Boy Advance Emulator

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