|
1 | 1 | /*
|
2 |
| - exprs_test.c - simple test code for lib_exprs.[ch]. |
| 2 | + exprs_test.h - simple test code for lib_exprs.[ch]. |
3 | 3 | Copyright (C) 2022 David Shepperd
|
4 | 4 |
|
5 | 5 | This program is free software: you can redistribute it and/or modify
|
|
15 | 15 | You should have received a copy of the GNU General Public License
|
16 | 16 | along with this program. If not, see <http://www.gnu.org/licenses/>.
|
17 | 17 | */
|
18 |
| -#include <stdio.h> |
19 |
| -#include <stdlib.h> |
20 |
| -#include <string.h> |
21 |
| -#include <unistd.h> |
22 |
| -#include <ctype.h> |
23 |
| -#include <pthread.h> |
| 18 | +#ifndef _EXPRS_TEST_H_ |
| 19 | +#define _EXPRS_TEST_H_ (1) |
24 | 20 |
|
25 |
| -#include "lib_exprs.h" |
26 |
| -#include "exprs_test.h" |
| 21 | +extern int exprsTest(int verbose); |
27 | 22 |
|
28 |
| -typedef struct |
29 |
| -{ |
30 |
| - const char *expr; /* Expression to test */ |
31 |
| - ExprsTermTypes_t expectedResultType; /* Expected type of result */ |
32 |
| - long expectedInt; /* If result type is int, then expect this value */ |
33 |
| - double expectedFloat; /* If result type is float, then expect this value */ |
34 |
| - const char *expectedString; /* If result type is string, then expect this value */ |
35 |
| -} TestExprs_t; |
36 |
| - |
37 |
| -static const TestExprs_t TestExprs[] = |
38 |
| -{ |
39 |
| - { "\"plainString\"", EXPRS_TERM_STRING, 0, 0, "plainString" }, /* Text string (text delimited with quotes) */ |
40 |
| - { "\"plain\\\"S\\\"tring\"", EXPRS_TERM_STRING, 0, 0, "plain\"S\"tring" }, /* Text string (text delimited with quotes) */ |
41 |
| - { "'plainString'", EXPRS_TERM_STRING, 0, 0, "plainString" }, /* Text string (text delimited with quotes) */ |
42 |
| - { "3.14159", EXPRS_TERM_FLOAT, 0, 3.14159, NULL }, /* floating point number */ |
43 |
| - { "100", EXPRS_TERM_INTEGER, 100, 0, NULL }, /* integer number */ |
44 |
| - { "0xFF", EXPRS_TERM_INTEGER, 0xFF, 0, NULL }, /* integer number */ |
45 |
| - { "0d1234", EXPRS_TERM_INTEGER, 1234, 0, NULL }, /* integer number */ |
46 |
| - { "0b11111111", EXPRS_TERM_INTEGER, 255, 0, NULL }, /* integer number */ |
47 |
| - { "+21", EXPRS_TERM_INTEGER, 21, 0, NULL }, // EXPRS_TERM_PLUS, /* + (unary term) */ |
48 |
| - { "+21.0", EXPRS_TERM_FLOAT, 0, 21.0, NULL }, // EXPRS_TERM_PLUS, /* + (unary term) */ |
49 |
| - { "-22", EXPRS_TERM_INTEGER, -22, 0, NULL }, // EXPRS_TERM_MINUS, /* - (unary term in this case) */ |
50 |
| - { "-22.0", EXPRS_TERM_FLOAT, 0, -22.0, NULL }, // EXPRS_TERM_MINUS, /* - (unary term in this case) */ |
51 |
| - { "~3", EXPRS_TERM_INTEGER, ~3, 0, NULL }, // EXPRS_TERM_COM, /* ~ */ |
52 |
| - { "~3.3", EXPRS_TERM_INTEGER, ~3, 0, NULL }, // EXPRS_TERM_COM, /* ~ */ |
53 |
| - { "~+3", EXPRS_TERM_INTEGER, ~3, 0, NULL }, // EXPRS_TERM_COM, /* ~ */ |
54 |
| - { "~+3.3", EXPRS_TERM_INTEGER, ~3, 0, NULL }, // EXPRS_TERM_COM, /* ~ */ |
55 |
| - { "~-3", EXPRS_TERM_INTEGER, ~-3, 0, NULL }, // EXPRS_TERM_COM, /* ~ */ |
56 |
| - { "~-3.3", EXPRS_TERM_INTEGER, ~-3, 0, NULL }, // EXPRS_TERM_COM, /* ~ */ |
57 |
| - { "!100", EXPRS_TERM_INTEGER, !100, 0, NULL }, // EXPRS_TERM_NOT, /* ! */ |
58 |
| - { "!100.100", EXPRS_TERM_INTEGER, !100, 0, NULL }, // EXPRS_TERM_NOT, /* ! */ |
59 |
| - { "2**8", EXPRS_TERM_INTEGER, 1<<8, 0, NULL }, // EXPRS_TERM_POW, /* ** */ |
60 |
| - { "2.0**8", EXPRS_TERM_FLOAT, 0, 256.0, NULL }, // EXPRS_TERM_POW, /* ** */ |
61 |
| - { "2**8.0", EXPRS_TERM_FLOAT, 0, 256.0, NULL }, // EXPRS_TERM_POW, /* ** */ |
62 |
| - { "2.0**8.0", EXPRS_TERM_FLOAT, 0, 256.0, NULL }, // EXPRS_TERM_POW, /* ** */ |
63 |
| - { "2*3", EXPRS_TERM_INTEGER, 6, 0, NULL }, // EXPRS_TERM_MUL, /* * */ |
64 |
| - { "2*3.0", EXPRS_TERM_FLOAT, 0, 6.0, NULL }, // EXPRS_TERM_MUL, /* * */ |
65 |
| - { "2.0*3", EXPRS_TERM_FLOAT, 0, 6.0, NULL }, // EXPRS_TERM_MUL, /* * */ |
66 |
| - { "2.0*3.0", EXPRS_TERM_FLOAT, 0, 6.0, NULL }, // EXPRS_TERM_MUL, /* * */ |
67 |
| - { "100/2", EXPRS_TERM_INTEGER, 50, 0, NULL }, // EXPRS_TERM_DIV, /* / */ |
68 |
| - { "100/2.0", EXPRS_TERM_FLOAT, 0, 50.0, NULL }, // EXPRS_TERM_DIV, /* / */ |
69 |
| - { "100.0/2", EXPRS_TERM_FLOAT, 0, 50.0, NULL }, // EXPRS_TERM_DIV, /* / */ |
70 |
| - { "100.0/2.0", EXPRS_TERM_FLOAT, 0, 50.0, NULL }, // EXPRS_TERM_DIV, /* / */ |
71 |
| - { "110%25", EXPRS_TERM_INTEGER, 10, 0, NULL }, // EXPRS_TERM_MOD, /* % */ |
72 |
| - { "110.0%25", EXPRS_TERM_FLOAT, 0, 10.0, NULL }, // EXPRS_TERM_MOD, /* % */ |
73 |
| - { "110%25.0", EXPRS_TERM_FLOAT, 0, 10.0, NULL }, // EXPRS_TERM_MOD, /* % */ |
74 |
| - { "110.0%25.0", EXPRS_TERM_FLOAT, 0, 10.0, NULL }, // EXPRS_TERM_MOD, /* % */ |
75 |
| - { "1+2", EXPRS_TERM_INTEGER, 3, 0, NULL }, // EXPRS_TERM_ADD, /* + (binary term in this case) */ |
76 |
| - { "1+2.1", EXPRS_TERM_FLOAT, 0, 3.1, NULL }, // EXPRS_TERM_ADD, /* + (binary term in this case) */ |
77 |
| - { "1.2+2", EXPRS_TERM_FLOAT, 0, 3.2, NULL }, // EXPRS_TERM_ADD, /* + (binary term in this case) */ |
78 |
| - { "1.2+2.3", EXPRS_TERM_FLOAT, 0, 3.5, NULL }, // EXPRS_TERM_ADD, /* + (binary term in this case) */ |
79 |
| - { "1.2+\"2.3\"", EXPRS_TERM_STRING, 0, 0, "1.22.3" }, // EXPRS_TERM_PLUS, /* + (binary term in this case) */ |
80 |
| - { "\"2.3\"+1.2", EXPRS_TERM_STRING, 0, 0, "2.31.2" }, // EXPRS_TERM_PLUS, /* + (binary term in this case) */ |
81 |
| - { "2-1", EXPRS_TERM_INTEGER, 1, 0, NULL }, // EXPRS_TERM_SUB, /* - (unary term in this case) */ |
82 |
| - { "2.0-1", EXPRS_TERM_FLOAT, 0, 1.0, NULL }, // EXPRS_TERM_SUB, /* - (unary term in this case) */ |
83 |
| - { "2-1.0", EXPRS_TERM_FLOAT, 0, 1.0, NULL }, // EXPRS_TERM_SUB, /* - (unary term in this case) */ |
84 |
| - { "2.0-1.0", EXPRS_TERM_FLOAT, 1, 1.0, NULL }, // EXPRS_TERM_SUB, /* - (unary term in this case) */ |
85 |
| - { "1<<4", EXPRS_TERM_INTEGER, 16, 0, NULL }, // EXPRS_TERM_ASL, /* << */ |
86 |
| - { "1.1<<4", EXPRS_TERM_INTEGER, 16, 0, NULL }, // EXPRS_TERM_ASL, /* << */ |
87 |
| - { "1<<4.1", EXPRS_TERM_INTEGER, 16, 0, NULL }, // EXPRS_TERM_ASL, /* << */ |
88 |
| - { "1.1<<4.1", EXPRS_TERM_INTEGER, 16, 0, NULL }, // EXPRS_TERM_ASL, /* << */ |
89 |
| - { "32>>2", EXPRS_TERM_INTEGER, 8, 0, NULL }, // EXPRS_TERM_ASR, /* >> */ |
90 |
| - { "32.1>>2", EXPRS_TERM_INTEGER, 8, 0, NULL }, // EXPRS_TERM_ASR, /* >> */ |
91 |
| - { "32>>2.1", EXPRS_TERM_INTEGER, 8, 0, NULL }, // EXPRS_TERM_ASR, /* >> */ |
92 |
| - { "32.1>>2.1", EXPRS_TERM_INTEGER, 8, 0, NULL }, // EXPRS_TERM_ASR, /* >> */ |
93 |
| - |
94 |
| - { "1>2", EXPRS_TERM_INTEGER, 0, 0, NULL }, // EXPRS_TERM_GT, /* > */ |
95 |
| - { "1.1>2", EXPRS_TERM_INTEGER, 0, 0, NULL }, // EXPRS_TERM_GT, /* > */ |
96 |
| - { "1>2.2", EXPRS_TERM_INTEGER, 0, 0, NULL }, // EXPRS_TERM_GT, /* > */ |
97 |
| - { "1.1>2.2", EXPRS_TERM_INTEGER, 0, 0, NULL }, // EXPRS_TERM_GT, /* > */ |
98 |
| - { "2>1", EXPRS_TERM_INTEGER, 1, 0, NULL }, // EXPRS_TERM_GT, /* > */ |
99 |
| - { "2.2>1", EXPRS_TERM_INTEGER, 1, 0, NULL }, // EXPRS_TERM_GT, /* > */ |
100 |
| - { "2>1.1", EXPRS_TERM_INTEGER, 1, 0, NULL }, // EXPRS_TERM_GT, /* > */ |
101 |
| - { "2.2>1.1", EXPRS_TERM_INTEGER, 1, 0, NULL }, // EXPRS_TERM_GT, /* > */ |
102 |
| - |
103 |
| - { "1>=2", EXPRS_TERM_INTEGER, 0, 0, NULL }, // EXPRS_TERM_GE, /* > */ |
104 |
| - { "1.1>=2", EXPRS_TERM_INTEGER, 0, 0, NULL }, // EXPRS_TERM_GE, /* > */ |
105 |
| - { "1>=2.2", EXPRS_TERM_INTEGER, 0, 0, NULL }, // EXPRS_TERM_GE, /* > */ |
106 |
| - { "1.1>=2.2", EXPRS_TERM_INTEGER, 0, 0, NULL }, // EXPRS_TERM_GE, /* > */ |
107 |
| - { "2>=2", EXPRS_TERM_INTEGER, 1, 0, NULL }, // EXPRS_TERM_GE, /* > */ |
108 |
| - { "2.0>=2", EXPRS_TERM_INTEGER, 1, 0, NULL }, // EXPRS_TERM_GE, /* > */ |
109 |
| - { "2>=2.0", EXPRS_TERM_INTEGER, 1, 0, NULL }, // EXPRS_TERM_GE, /* > */ |
110 |
| - { "2.2>=2.2", EXPRS_TERM_INTEGER, 1, 0, NULL }, // EXPRS_TERM_GE, /* > */ |
111 |
| - { "2>=1", EXPRS_TERM_INTEGER, 1, 0, NULL }, // EXPRS_TERM_GE, /* > */ |
112 |
| - { "2.2>=1", EXPRS_TERM_INTEGER, 1, 0, NULL }, // EXPRS_TERM_GE, /* > */ |
113 |
| - { "2>=1.1", EXPRS_TERM_INTEGER, 1, 0, NULL }, // EXPRS_TERM_GE, /* > */ |
114 |
| - { "2.2>=1.1", EXPRS_TERM_INTEGER, 1, 0, NULL }, // EXPRS_TERM_GE, /* > */ |
115 |
| - |
116 |
| - { "1<2", EXPRS_TERM_INTEGER, 1, 0, NULL }, // EXPRS_TERM_LT, /* > */ |
117 |
| - { "1.1<2", EXPRS_TERM_INTEGER, 1, 0, NULL }, // EXPRS_TERM_LT, /* > */ |
118 |
| - { "1<2.2", EXPRS_TERM_INTEGER, 1, 0, NULL }, // EXPRS_TERM_LT, /* > */ |
119 |
| - { "1.1<2.2", EXPRS_TERM_INTEGER, 1, 0, NULL }, // EXPRS_TERM_LT, /* > */ |
120 |
| - { "2<1", EXPRS_TERM_INTEGER, 0, 0, NULL }, // EXPRS_TERM_LT, /* > */ |
121 |
| - { "2.2<1", EXPRS_TERM_INTEGER, 0, 0, NULL }, // EXPRS_TERM_LT, /* > */ |
122 |
| - { "2<1.1", EXPRS_TERM_INTEGER, 0, 0, NULL }, // EXPRS_TERM_LT, /* > */ |
123 |
| - { "2.2<1.1", EXPRS_TERM_INTEGER, 0, 0, NULL }, // EXPRS_TERM_LT, /* > */ |
124 |
| - |
125 |
| - { "1<=2", EXPRS_TERM_INTEGER, 1, 0, NULL }, // EXPRS_TERM_LE, /* > */ |
126 |
| - { "1.1<=2", EXPRS_TERM_INTEGER, 1, 0, NULL }, // EXPRS_TERM_LE, /* > */ |
127 |
| - { "1<=2.2", EXPRS_TERM_INTEGER, 1, 0, NULL }, // EXPRS_TERM_LE, /* > */ |
128 |
| - { "1.1<=2.2", EXPRS_TERM_INTEGER, 1, 0, NULL }, // EXPRS_TERM_LE, /* > */ |
129 |
| - { "2<=2", EXPRS_TERM_INTEGER, 1, 0, NULL }, // EXPRS_TERM_LE, /* > */ |
130 |
| - { "2.0<=2", EXPRS_TERM_INTEGER, 1, 0, NULL }, // EXPRS_TERM_LE, /* > */ |
131 |
| - { "2<=2.0", EXPRS_TERM_INTEGER, 1, 0, NULL }, // EXPRS_TERM_LE, /* > */ |
132 |
| - { "2.2<=2.2", EXPRS_TERM_INTEGER, 1, 0, NULL }, // EXPRS_TERM_LE, /* > */ |
133 |
| - { "2<=1", EXPRS_TERM_INTEGER, 0, 0, NULL }, // EXPRS_TERM_LE, /* > */ |
134 |
| - { "2.2<=1", EXPRS_TERM_INTEGER, 0, 0, NULL }, // EXPRS_TERM_LE, /* > */ |
135 |
| - { "2<=1.1", EXPRS_TERM_INTEGER, 0, 0, NULL }, // EXPRS_TERM_LE, /* > */ |
136 |
| - { "2.2<=1.1", EXPRS_TERM_INTEGER, 0, 0, NULL }, // EXPRS_TERM_LE, /* > */ |
137 |
| - |
138 |
| - { "2==2", EXPRS_TERM_INTEGER, 1, 0, NULL }, // EXPRS_TERM_EQ, /* > */ |
139 |
| - { "2.0==2", EXPRS_TERM_INTEGER, 1, 0, NULL }, // EXPRS_TERM_EQ, /* > */ |
140 |
| - { "2==2.0", EXPRS_TERM_INTEGER, 1, 0, NULL }, // EXPRS_TERM_EQ, /* > */ |
141 |
| - { "2.2==2.2", EXPRS_TERM_INTEGER, 1, 0, NULL }, // EXPRS_TERM_EQ, /* > */ |
142 |
| - |
143 |
| - { "2==1", EXPRS_TERM_INTEGER, 0, 0, NULL }, // EXPRS_TERM_EQ, /* > */ |
144 |
| - { "2.0==1", EXPRS_TERM_INTEGER, 0, 0, NULL }, // EXPRS_TERM_EQ, /* > */ |
145 |
| - { "2==1.0", EXPRS_TERM_INTEGER, 0, 0, NULL }, // EXPRS_TERM_EQ, /* > */ |
146 |
| - { "2.2==1.1", EXPRS_TERM_INTEGER, 0, 0, NULL }, // EXPRS_TERM_EQ, /* > */ |
147 |
| - |
148 |
| - { "2!=2", EXPRS_TERM_INTEGER, 0, 0, NULL }, // EXPRS_TERM_NE, /* > */ |
149 |
| - { "2.0!=2", EXPRS_TERM_INTEGER, 0, 0, NULL }, // EXPRS_TERM_NE, /* > */ |
150 |
| - { "2!=2.0", EXPRS_TERM_INTEGER, 0, 0, NULL }, // EXPRS_TERM_NE, /* > */ |
151 |
| - { "2.2!=2.2", EXPRS_TERM_INTEGER, 0, 0, NULL }, // EXPRS_TERM_NE, /* > */ |
152 |
| - |
153 |
| - { "2!=1", EXPRS_TERM_INTEGER, 1, 0, NULL }, // EXPRS_TERM_NE, /* > */ |
154 |
| - { "2.0!=1", EXPRS_TERM_INTEGER, 1, 0, NULL }, // EXPRS_TERM_NE, /* > */ |
155 |
| - { "2!=1.0", EXPRS_TERM_INTEGER, 1, 0, NULL }, // EXPRS_TERM_NE, /* > */ |
156 |
| - { "2.2!=1.1", EXPRS_TERM_INTEGER, 1, 0, NULL }, // EXPRS_TERM_NE, /* > */ |
157 |
| - |
158 |
| - { "0xFF&0x7F", EXPRS_TERM_INTEGER, 0x7F, 0, NULL }, // EXPRS_TERM_AND, /* & */ |
159 |
| - { "255.5&0x7F", EXPRS_TERM_INTEGER, 0x7F, 0, NULL }, // EXPRS_TERM_AND, /* & */ |
160 |
| - { "255&127.0", EXPRS_TERM_INTEGER, 0x7F, 0, NULL }, // EXPRS_TERM_AND, /* & */ |
161 |
| - { "255.5&127.5", EXPRS_TERM_INTEGER, 0x7F, 0, NULL }, // EXPRS_TERM_AND, /* & */ |
162 |
| - |
163 |
| - { "0xFF^0x7F", EXPRS_TERM_INTEGER, 0x80, 0, NULL }, // EXPRS_TERM_XOR, /* ^ */ |
164 |
| - { "255.5^0x7F", EXPRS_TERM_INTEGER, 0x80, 0, NULL }, // EXPRS_TERM_XOR, /* ^ */ |
165 |
| - { "255^127.0", EXPRS_TERM_INTEGER, 0x80, 0, NULL }, // EXPRS_TERM_XOR, /* ^ */ |
166 |
| - { "255.5^127.5", EXPRS_TERM_INTEGER, 0x80, 0, NULL }, // EXPRS_TERM_XOR, /* ^ */ |
167 |
| - |
168 |
| - { "128|64", EXPRS_TERM_INTEGER, 0xC0, 0, NULL }, // EXPRS_TERM_OR, /* | */ |
169 |
| - { "128.5|64", EXPRS_TERM_INTEGER, 0xC0, 0, NULL }, // EXPRS_TERM_OR, /* | */ |
170 |
| - { "128|64.5", EXPRS_TERM_INTEGER, 0xC0, 0, NULL }, // EXPRS_TERM_OR, /* | */ |
171 |
| - { "128.9|64.9", EXPRS_TERM_INTEGER, 0xC0, 0, NULL }, // EXPRS_TERM_OR, /* | */ |
172 |
| - |
173 |
| - { "1&&2", EXPRS_TERM_INTEGER, 1, 0, NULL }, // EXPRS_TERM_LAND, /* && */ |
174 |
| - { "1.9&&2", EXPRS_TERM_INTEGER, 1, 0, NULL }, // EXPRS_TERM_LAND, /* && */ |
175 |
| - { "1&&2.9", EXPRS_TERM_INTEGER, 1, 0, NULL }, // EXPRS_TERM_LAND, /* && */ |
176 |
| - { "1.9&&2.9", EXPRS_TERM_INTEGER, 1, 0, NULL }, // EXPRS_TERM_LAND, /* && */ |
177 |
| - |
178 |
| - { "0&&0", EXPRS_TERM_INTEGER, 0, 0, NULL }, // EXPRS_TERM_LAND, /* && */ |
179 |
| - { "1&&0", EXPRS_TERM_INTEGER, 0, 0, NULL }, // EXPRS_TERM_LAND, /* && */ |
180 |
| - { "1&&0.0", EXPRS_TERM_INTEGER, 0, 0, NULL }, // EXPRS_TERM_LAND, /* && */ |
181 |
| - { "1.9&&0", EXPRS_TERM_INTEGER, 0, 0, NULL }, // EXPRS_TERM_LAND, /* && */ |
182 |
| - { "1.9&&0.0", EXPRS_TERM_INTEGER, 0, 0, NULL }, // EXPRS_TERM_LAND, /* && */ |
183 |
| - |
184 |
| - { "0&&1", EXPRS_TERM_INTEGER, 0, 0, NULL }, // EXPRS_TERM_LAND, /* && */ |
185 |
| - { "0&&1.0", EXPRS_TERM_INTEGER, 0, 0, NULL }, // EXPRS_TERM_LAND, /* && */ |
186 |
| - { "0.0&&1", EXPRS_TERM_INTEGER, 0, 0, NULL }, // EXPRS_TERM_LAND, /* && */ |
187 |
| - { "0.0&&1.9", EXPRS_TERM_INTEGER, 0, 0, NULL }, // EXPRS_TERM_LAND, /* && */ |
188 |
| - |
189 |
| - { "1||2", EXPRS_TERM_INTEGER, 1, 0, NULL }, // EXPRS_TERM_LOR, /* || */ |
190 |
| - { "1.9||2", EXPRS_TERM_INTEGER, 1, 0, NULL }, // EXPRS_TERM_LOR, /* || */ |
191 |
| - { "1||2.9", EXPRS_TERM_INTEGER, 1, 0, NULL }, // EXPRS_TERM_LOR, /* || */ |
192 |
| - { "1.9||2.9", EXPRS_TERM_INTEGER, 1, 0, NULL }, // EXPRS_TERM_LOR, /* || */ |
193 |
| - |
194 |
| - { "0||0", EXPRS_TERM_INTEGER, 0, 0, NULL }, // EXPRS_TERM_LOR, /* || */ |
195 |
| - { "1||0", EXPRS_TERM_INTEGER, 1, 0, NULL }, // EXPRS_TERM_LOR, /* || */ |
196 |
| - { "1||0.0", EXPRS_TERM_INTEGER, 1, 0, NULL }, // EXPRS_TERM_LOR, /* || */ |
197 |
| - { "1.9||0", EXPRS_TERM_INTEGER, 1, 0, NULL }, // EXPRS_TERM_LOR, /* || */ |
198 |
| - { "1.9||0.0", EXPRS_TERM_INTEGER, 1, 0, NULL }, // EXPRS_TERM_LOR, /* || */ |
199 |
| - { "0||1", EXPRS_TERM_INTEGER, 1, 0, NULL }, // EXPRS_TERM_LOR, /* || */ |
200 |
| - { "0.0||1", EXPRS_TERM_INTEGER, 1, 0, NULL }, // EXPRS_TERM_LOR, /* || */ |
201 |
| - { "0||1.9", EXPRS_TERM_INTEGER, 1, 0, NULL }, // EXPRS_TERM_LOR, /* || */ |
202 |
| - { "0.0||1.9", EXPRS_TERM_INTEGER, 1, 0, NULL }, // EXPRS_TERM_LOR, /* || */ |
203 |
| - |
204 |
| - { "1+(2+3)*4", EXPRS_TERM_INTEGER, 1+(2+3)*4, 0, NULL }, /* Test parenthesis */ |
205 |
| - { "1+2*3/4-6", EXPRS_TERM_INTEGER, 1+2*3/4-6, 0, NULL }, /* Test precedence */ |
206 |
| - { "2+2**2*4/2", EXPRS_TERM_INTEGER, 10, 0, NULL }, /* Test precedence */ |
207 |
| - |
208 |
| -}; |
209 |
| - |
210 |
| -static int getValue(char *buf, int bufLen, const char *title, const ExprsTerm_t *result, const TestExprs_t *tVal) |
211 |
| -{ |
212 |
| - int sLen; |
213 |
| - sLen = snprintf(buf,bufLen,"%s type ", title); |
214 |
| - if ( tVal ) |
215 |
| - { |
216 |
| - sLen += snprintf(buf + sLen, bufLen - sLen, "%d, value ", tVal->expectedResultType); |
217 |
| - if ( tVal->expectedResultType == EXPRS_TERM_INTEGER ) |
218 |
| - sLen += snprintf(buf + sLen, bufLen - sLen, "%ld", tVal->expectedInt); |
219 |
| - else if ( tVal->expectedResultType == EXPRS_TERM_FLOAT ) |
220 |
| - sLen += snprintf(buf + sLen, bufLen - sLen, "%g", tVal->expectedFloat); |
221 |
| - else |
222 |
| - sLen += snprintf(buf + sLen, bufLen - sLen, "\"%s\"", tVal->expectedString); |
223 |
| - } |
224 |
| - else |
225 |
| - { |
226 |
| - sLen += snprintf(buf+sLen,bufLen-sLen,"%d, value ", result->termType); |
227 |
| - if ( result->termType == EXPRS_TERM_INTEGER ) |
228 |
| - sLen += snprintf(buf+sLen,bufLen-sLen,"%ld", result->term.s64); |
229 |
| - else if ( result->termType == EXPRS_TERM_FLOAT ) |
230 |
| - sLen += snprintf(buf+sLen,bufLen-sLen,"%g", result->term.f64); |
231 |
| - else if ( result->termType == EXPRS_TERM_STRING ) |
232 |
| - { |
233 |
| - char quote, *cp = result->term.string; |
234 |
| - unsigned char cc; |
235 |
| - quote = strchr(cp,'"') ? '\'':'"'; |
236 |
| - sLen += snprintf(buf+sLen,bufLen-sLen,"%c",quote); |
237 |
| - while ( (cc = *cp) ) |
238 |
| - { |
239 |
| - if ( isprint(cc) ) |
240 |
| - sLen += snprintf(buf+sLen,bufLen-sLen,"%c",cc); |
241 |
| - else |
242 |
| - sLen += snprintf(buf+sLen,bufLen-sLen,"\\x%02X",cc); |
243 |
| - ++cp; |
244 |
| - } |
245 |
| - sLen += snprintf(buf+sLen,bufLen-sLen,"%c", quote); |
246 |
| - } |
247 |
| - else |
248 |
| - sLen += snprintf(buf+sLen,bufLen-sLen,"!! Type is not integer, float or string !!"); |
249 |
| - } |
250 |
| - return sLen; |
251 |
| -} |
252 |
| - |
253 |
| -int exprsTest(int verbose) |
254 |
| -{ |
255 |
| - ExprsDef_t *exprs; |
256 |
| - ExprsTerm_t result; |
257 |
| - const TestExprs_t *pExp; |
258 |
| - ExprsErrs_t err; |
259 |
| - int ii, retV=0, fatal=0; |
260 |
| - char buf[256]; |
261 |
| - int sLen; |
262 |
| - |
263 |
| - exprs = libExprsInit(NULL, 0, 0, 0); |
264 |
| - if ( !exprs ) |
265 |
| - { |
266 |
| - fprintf(stderr,"Out of memory doing libExprsInit()\n"); |
267 |
| - return 1; |
268 |
| - } |
269 |
| - libExprsSetVerbose(exprs,verbose); |
270 |
| - pExp = TestExprs; |
271 |
| - for (ii=0; ii < n_elts(TestExprs) && !fatal; ++ii, ++pExp) |
272 |
| - { |
273 |
| - err = libExprsEval(exprs, pExp->expr, &result, 0); |
274 |
| - if ( err ) |
275 |
| - { |
276 |
| - printf("%3d: Expression '%s' returned error %d: %s\n", ii, pExp->expr, err, libExprsGetErrorStr(err)); |
277 |
| - retV = 1; |
278 |
| - continue; |
279 |
| - } |
280 |
| - if ( result.termType != pExp->expectedResultType ) |
281 |
| - { |
282 |
| - sLen = snprintf(buf,sizeof(buf),"%3d: Type mismatch. Expression '%s' ", ii, pExp->expr); |
283 |
| - sLen += getValue(buf+sLen,sizeof(buf)-sLen, "expected",NULL,pExp); |
284 |
| - sLen += getValue(buf+sLen,sizeof(buf)-sLen, ". Got ",&result,NULL); |
285 |
| - printf("%s\n",buf); |
286 |
| - } |
287 |
| - else |
288 |
| - { |
289 |
| - int diff=0; |
290 |
| - switch (pExp->expectedResultType) |
291 |
| - { |
292 |
| - case EXPRS_TERM_INTEGER: |
293 |
| - if ( pExp->expectedInt != result.term.s64 ) |
294 |
| - diff = 1; |
295 |
| - break; |
296 |
| - case EXPRS_TERM_FLOAT: |
297 |
| - if ( pExp->expectedFloat != result.term.f64 ) |
298 |
| - diff = 1; |
299 |
| - break; |
300 |
| - case EXPRS_TERM_STRING: |
301 |
| - if ( strcmp(pExp->expectedString,result.term.string) ) |
302 |
| - diff = 1; |
303 |
| - break; |
304 |
| - default: |
305 |
| - printf("FATAL: Exprs %d '%s' has undefined expected result type %d\n", ii, pExp->expr, pExp->expectedResultType); |
306 |
| - fatal = 1; |
307 |
| - retV = 1; |
308 |
| - break; |
309 |
| - } |
310 |
| - if ( diff ) |
311 |
| - { |
312 |
| - sLen = snprintf(buf, sizeof(buf), "%3d: Value mismatch. Expression '%s' ", ii, pExp->expr); |
313 |
| - sLen += getValue(buf+sLen,sizeof(buf)-sLen, "expected",NULL,pExp); |
314 |
| - sLen += getValue(buf+sLen,sizeof(buf)-sLen, ". Got ",&result,NULL); |
315 |
| - printf("%s\n",buf); |
316 |
| - retV = 1; |
317 |
| - } |
318 |
| - } |
319 |
| - } |
320 |
| - libExprsDestroy(exprs); |
321 |
| - if ( !retV ) |
322 |
| - printf("Passed all the tests.\n"); |
323 |
| - return retV; |
324 |
| -} |
| 23 | +#endif /* _EXPRS_TEST_H_ */ |
325 | 24 |
|
0 commit comments