46 int ParserTester::c_iCount = 0;
49 ParserTester::ParserTester()
52 AddTest(&ParserTester::TestNames);
53 AddTest(&ParserTester::TestSyntax);
54 AddTest(&ParserTester::TestPostFix);
55 AddTest(&ParserTester::TestInfixOprt);
56 AddTest(&ParserTester::TestVarConst);
57 AddTest(&ParserTester::TestMultiArg);
58 AddTest(&ParserTester::TestExpression);
59 AddTest(&ParserTester::TestIfThenElse);
60 AddTest(&ParserTester::TestInterface);
61 AddTest(&ParserTester::TestBinOprt);
62 AddTest(&ParserTester::TestException);
63 AddTest(&ParserTester::TestStrArg);
64 AddTest(&ParserTester::TestBulkMode);
65 AddTest(&ParserTester::TestOptimizer);
67 ParserTester::c_iCount = 0;
73 if (a_szExpr[1] == 0 || (a_szExpr[0] !=
'0' || a_szExpr[1] !=
'x'))
79 stringstream_type::pos_type nPos(0);
81 ss >> std::hex >> iVal;
84 if (nPos == (stringstream_type::pos_type)0)
87 *a_iPos += (int)(2 + nPos);
93 int ParserTester::TestInterface()
129 mu::console() <<
_T(
"\n failed with ") << iStat <<
_T(
" errors") << endl;
135 int ParserTester::TestOptimizer()
153 const SToken* tok = bc.GetBase();
154 if (bc.GetSize() != 2 && tok[1].Cmd !=
cmFUNC)
156 mu::console() <<
_T(
"#93 an unoptimizable expression was optimized!") << endl;
168 const SToken* tok = bc.GetBase();
169 if (bc.GetSize() != 1 && tok[0].Cmd !=
cmVAL)
184 mu::console() <<
_T(
"\n failed with ") << iStat <<
_T(
" errors") << endl;
190 int ParserTester::TestStrArg()
196 iStat += ThrowTest(
_T(R
"(6 - 6 ? 4 : "", ? 4 : "", ? 4 : "")"), ecUNEXPECTED_STR, true);
207 iStat += ThrowTest(
_T(R
"("","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","",8)"), ecSTR_RESULT);
221 iStat += EqnTest(_T("valueof(\"\")"), 123,
true);
222 iStat += EqnTest(
_T(
"valueof(\"aaa\")+valueof(\"bbb\") "), 246,
true);
223 iStat += EqnTest(
_T(
"2*(valueof(\"aaa\")-23)+valueof(\"bbb\")"), 323,
true);
226 iStat += EqnTest(
_T(
"a*(atof(\"10\")-b)"), 8,
true);
227 iStat += EqnTest(
_T(
"a-(atof(\"10\")*b)"), -19,
true);
230 iStat += EqnTest(
_T(
"strfun1(\"100\")"), 100,
true);
231 iStat += EqnTest(
_T(
"strfun2(\"100\",1)"), 101,
true);
232 iStat += EqnTest(
_T(
"strfun3(\"99\",1,2)"), 102,
true);
233 iStat += EqnTest(
_T(
"strfun4(\"99\",1,2,3)"), 105,
true);
234 iStat += EqnTest(
_T(
"strfun5(\"99\",1,2,3,4)"), 109,
true);
235 iStat += EqnTest(
_T(
"strfun6(\"99\",1,2,3,4,5)"), 114,
true);
238 iStat += EqnTest(
_T(
"atof(str1)+atof(str2)"), 3.33,
true);
241 iStat += EqnTest(
_T(
"strfunud3_10(\"99\",1,2)"), 112,
true);
246 mu::console() <<
_T(
"\n failed with ") << iStat <<
_T(
" errors") << endl;
252 int ParserTester::TestBulkMode()
257 #define EQN_TEST_BULK(EXPR, R1, R2, R3, R4, PASS) \
259 double res[] = { R1, R2, R3, R4 }; \
260 iStat += EqnTestBulk(_T(EXPR), res, (PASS)); \
268 EQN_TEST_BULK(
"a", 1, 1, 1, 1,
false)
269 EQN_TEST_BULK(
"a", 1, 2, 3, 4,
true)
270 EQN_TEST_BULK(
"b=a", 1, 2, 3, 4,
true)
271 EQN_TEST_BULK(
"b=a, b*10", 10, 20, 30, 40,
true)
272 EQN_TEST_BULK(
"b=a, b*10, a", 1, 2, 3, 4,
true)
273 EQN_TEST_BULK(
"a+b", 3, 4, 5, 6,
true)
274 EQN_TEST_BULK(
"c*(a+b)", 9, 12, 15, 18,
true)
280 mu::console() <<
_T(
"\n failed with ") << iStat <<
_T(
" errors") << endl;
286 int ParserTester::TestBinOprt()
294 iStat += EqnTest(
_T(
"a++b"), 3,
true);
295 iStat += EqnTest(
_T(
"a ++ b"), 3,
true);
296 iStat += EqnTest(
_T(
"1++2"), 3,
true);
297 iStat += EqnTest(
_T(
"1 ++ 2"), 3,
true);
298 iStat += EqnTest(
_T(
"a add b"), 3,
true);
299 iStat += EqnTest(
_T(
"1 add 2"), 3,
true);
300 iStat += EqnTest(
_T(
"a<b"), 1,
true);
301 iStat += EqnTest(
_T(
"b>a"), 1,
true);
302 iStat += EqnTest(
_T(
"a>a"), 0,
true);
303 iStat += EqnTest(
_T(
"a<a"), 0,
true);
304 iStat += EqnTest(
_T(
"a>a"), 0,
true);
305 iStat += EqnTest(
_T(
"a<=a"), 1,
true);
306 iStat += EqnTest(
_T(
"a<=b"), 1,
true);
307 iStat += EqnTest(
_T(
"b<=a"), 0,
true);
308 iStat += EqnTest(
_T(
"a>=a"), 1,
true);
309 iStat += EqnTest(
_T(
"b>=a"), 1,
true);
310 iStat += EqnTest(
_T(
"a>=b"), 0,
true);
313 iStat += EqnTest(
_T(
"1 && 1"), 1,
true);
314 iStat += EqnTest(
_T(
"1 && 0"), 0,
true);
315 iStat += EqnTest(
_T(
"(a<b) && (b>a)"), 1,
true);
316 iStat += EqnTest(
_T(
"(a<b) && (a>b)"), 0,
true);
319 iStat += EqnTest(
_T(
"12 & 255"), 12,
true);
320 iStat += EqnTest(
_T(
"12 & 0"), 0,
true);
321 iStat += EqnTest(
_T(
"12&255"), 12,
true);
322 iStat += EqnTest(
_T(
"12&0"), 0,
true);
325 iStat += EqnTest(
_T(
"a = b"), 2,
true);
326 iStat += EqnTest(
_T(
"a = sin(b)"), 0.909297,
true);
327 iStat += EqnTest(
_T(
"a = 1+sin(b)"), 1.909297,
true);
328 iStat += EqnTest(
_T(
"(a=b)*2"), 4,
true);
329 iStat += EqnTest(
_T(
"2*(a=b)"), 4,
true);
330 iStat += EqnTest(
_T(
"2*(a=b+1)"), 6,
true);
331 iStat += EqnTest(
_T(
"(a=b+1)*2"), 6,
true);
332 iStat += EqnTest(
_T(
"a=c, a*10"), 30,
true);
334 iStat += EqnTest(
_T(
"2^2^3"), 256,
true);
335 iStat += EqnTest(
_T(
"1/2/3"), 1.0 / 6.0,
true);
338 iStat += EqnTest(
_T(
"3+4*2/(1-5)^2^3"), 3.0001220703125,
true);
341 iStat += EqnTestInt(
_T(
"1 | 2"), 3,
true);
342 iStat += EqnTestInt(
_T(
"1 || 2"), 1,
true);
343 iStat += EqnTestInt(
_T(
"123 & 456"), 72,
true);
344 iStat += EqnTestInt(
_T(
"(123 & 456) % 10"), 2,
true);
345 iStat += EqnTestInt(
_T(
"1 && 0"), 0,
true);
346 iStat += EqnTestInt(
_T(
"123 && 456"), 1,
true);
347 iStat += EqnTestInt(
_T(
"1 << 3"), 8,
true);
348 iStat += EqnTestInt(
_T(
"8 >> 3"), 1,
true);
349 iStat += EqnTestInt(
_T(
"9 / 4"), 2,
true);
350 iStat += EqnTestInt(
_T(
"9 % 4"), 1,
true);
351 iStat += EqnTestInt(
_T(
"if(5%2,1,0)"), 1,
true);
352 iStat += EqnTestInt(
_T(
"if(4%2,1,0)"), 0,
true);
353 iStat += EqnTestInt(
_T(
"-10+1"), -9,
true);
354 iStat += EqnTestInt(
_T(
"1+2*3"), 7,
true);
355 iStat += EqnTestInt(
_T(
"const1 != const2"), 1,
true);
356 iStat += EqnTestInt(
_T(
"const1 != const2"), 0,
false);
357 iStat += EqnTestInt(
_T(
"const1 == const2"), 0,
true);
358 iStat += EqnTestInt(
_T(
"const1 == 1"), 1,
true);
359 iStat += EqnTestInt(
_T(
"10*(const1 == 1)"), 10,
true);
360 iStat += EqnTestInt(
_T(
"2*(const1 | const2)"), 6,
true);
361 iStat += EqnTestInt(
_T(
"2*(const1 | const2)"), 7,
false);
362 iStat += EqnTestInt(
_T(
"const1 < const2"), 1,
true);
363 iStat += EqnTestInt(
_T(
"const2 > const1"), 1,
true);
364 iStat += EqnTestInt(
_T(
"const1 <= 1"), 1,
true);
365 iStat += EqnTestInt(
_T(
"const2 >= 2"), 1,
true);
366 iStat += EqnTestInt(
_T(
"2*(const1 + const2)"), 6,
true);
367 iStat += EqnTestInt(
_T(
"2*(const1 - const2)"), -2,
true);
368 iStat += EqnTestInt(
_T(
"a != b"), 1,
true);
369 iStat += EqnTestInt(
_T(
"a != b"), 0,
false);
370 iStat += EqnTestInt(
_T(
"a == b"), 0,
true);
371 iStat += EqnTestInt(
_T(
"a == 1"), 1,
true);
372 iStat += EqnTestInt(
_T(
"10*(a == 1)"), 10,
true);
373 iStat += EqnTestInt(
_T(
"2*(a | b)"), 6,
true);
374 iStat += EqnTestInt(
_T(
"2*(a | b)"), 7,
false);
375 iStat += EqnTestInt(
_T(
"a < b"), 1,
true);
376 iStat += EqnTestInt(
_T(
"b > a"), 1,
true);
377 iStat += EqnTestInt(
_T(
"a <= 1"), 1,
true);
378 iStat += EqnTestInt(
_T(
"b >= 2"), 1,
true);
379 iStat += EqnTestInt(
_T(
"2*(a + b)"), 6,
true);
380 iStat += EqnTestInt(
_T(
"2*(a - b)"), -2,
true);
381 iStat += EqnTestInt(
_T(
"a + (a << b)"), 5,
true);
382 iStat += EqnTestInt(
_T(
"-2^2"), -4,
true);
383 iStat += EqnTestInt(
_T(
"3--a"), 4,
true);
384 iStat += EqnTestInt(
_T(
"3+-3^2"), -6,
true);
387 iStat += EqnTestInt(
_T(
"0xff"), 255,
true);
388 iStat += EqnTestInt(
_T(
"10+0xff"), 265,
true);
389 iStat += EqnTestInt(
_T(
"0xff+10"), 265,
true);
390 iStat += EqnTestInt(
_T(
"10*0xff"), 2550,
true);
391 iStat += EqnTestInt(
_T(
"0xff*10"), 2550,
true);
392 iStat += EqnTestInt(
_T(
"10+0xff+1"), 266,
true);
393 iStat += EqnTestInt(
_T(
"1+0xff+10"), 266,
true);
401 iStat += EqnTestInt(
_T(
"a + b * c"), 7,
true);
402 iStat += EqnTestInt(
_T(
"a * b + c"), 5,
true);
403 iStat += EqnTestInt(
_T(
"a<b && b>10"), 0,
true);
404 iStat += EqnTestInt(
_T(
"a<b && b<10"), 1,
true);
406 iStat += EqnTestInt(
_T(
"a + b << c"), 17,
true);
407 iStat += EqnTestInt(
_T(
"a << b + c"), 7,
true);
408 iStat += EqnTestInt(
_T(
"c * b < a"), 0,
true);
409 iStat += EqnTestInt(
_T(
"c * b == 6 * a"), 1,
true);
410 iStat += EqnTestInt(
_T(
"2^2^3"), 256,
true);
416 mu::console() <<
_T(
"\n failed with ") << iStat <<
_T(
" errors") << endl;
423 int ParserTester::TestNames()
428 mu::console() <<
"testing name restriction enforcement...";
432 #define PARSER_THROWCHECK(DOMAIN, FAIL, EXPR, ARG) \
434 ParserTester::c_iCount++; \
437 p.Define##DOMAIN(EXPR, ARG); \
438 iErr = (FAIL) ? 0 : 1; \
442 iErr = (!FAIL) ? 0 : 1; \
447 PARSER_THROWCHECK(Const,
false,
_T(
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"), 1)
448 PARSER_THROWCHECK(Const,
false,
_T(
"0a"), 1)
449 PARSER_THROWCHECK(Const,
false,
_T(
"9a"), 1)
450 PARSER_THROWCHECK(Const,
false,
_T(
"+a"), 1)
451 PARSER_THROWCHECK(Const,
false,
_T(
"-a"), 1)
452 PARSER_THROWCHECK(Const,
false,
_T(
"a-"), 1)
453 PARSER_THROWCHECK(Const,
false,
_T(
"a*"), 1)
454 PARSER_THROWCHECK(Const,
false,
_T(
"a?"), 1)
455 PARSER_THROWCHECK(Const,
true,
_T(
"a"), 1)
456 PARSER_THROWCHECK(Const,
true,
_T(
"a_min"), 1)
457 PARSER_THROWCHECK(Const,
true,
_T(
"a_min0"), 1)
458 PARSER_THROWCHECK(Const,
true,
_T(
"a_min9"), 1)
463 PARSER_THROWCHECK(Var,
false,
_T(
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"), &a);
464 PARSER_THROWCHECK(Var,
false,
_T(
"123abc"), &a)
465 PARSER_THROWCHECK(Var,
false,
_T(
"9a"), &a)
466 PARSER_THROWCHECK(Var,
false,
_T(
"0a"), &a)
467 PARSER_THROWCHECK(Var,
false,
_T(
"+a"), &a)
468 PARSER_THROWCHECK(Var,
false,
_T(
"-a"), &a)
469 PARSER_THROWCHECK(Var,
false,
_T(
"?a"), &a)
470 PARSER_THROWCHECK(Var,
false,
_T(
"!a"), &a)
471 PARSER_THROWCHECK(Var,
false,
_T(
"a+"), &a)
472 PARSER_THROWCHECK(Var,
false,
_T(
"a-"), &a)
473 PARSER_THROWCHECK(Var,
false,
_T(
"a*"), &a)
474 PARSER_THROWCHECK(Var,
false,
_T(
"a?"), &a)
475 PARSER_THROWCHECK(Var,
true,
_T(
"a"), &a)
476 PARSER_THROWCHECK(Var,
true,
_T(
"a_min"), &a)
477 PARSER_THROWCHECK(Var,
true,
_T(
"a_min0"), &a)
478 PARSER_THROWCHECK(Var,
true,
_T(
"a_min9"), &a)
479 PARSER_THROWCHECK(Var,
false,
_T(
"a_min9"), 0)
483 PARSER_THROWCHECK(PostfixOprt,
false,
_T(
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"), f1of1);
484 PARSER_THROWCHECK(PostfixOprt,
false,
_T(
"(k"), f1of1)
485 PARSER_THROWCHECK(PostfixOprt,
false,
_T(
"9+"), f1of1)
486 PARSER_THROWCHECK(PostfixOprt,
false,
_T(
"+"), 0)
488 PARSER_THROWCHECK(PostfixOprt,
true,
_T(
"-a"), f1of1)
489 PARSER_THROWCHECK(PostfixOprt,
true,
_T(
"?a"), f1of1)
490 PARSER_THROWCHECK(PostfixOprt,
true,
_T(
"_"), f1of1)
491 PARSER_THROWCHECK(PostfixOprt,
true,
_T(
"#"), f1of1)
492 PARSER_THROWCHECK(PostfixOprt,
true,
_T(
"&&"), f1of1)
493 PARSER_THROWCHECK(PostfixOprt,
true,
_T(
"||"), f1of1)
494 PARSER_THROWCHECK(PostfixOprt,
true,
_T(
"&"), f1of1)
495 PARSER_THROWCHECK(PostfixOprt,
true,
_T(
"|"), f1of1)
496 PARSER_THROWCHECK(PostfixOprt,
true,
_T(
"++"), f1of1)
497 PARSER_THROWCHECK(PostfixOprt,
true,
_T(
"--"), f1of1)
498 PARSER_THROWCHECK(PostfixOprt,
true,
_T(
"?>"), f1of1)
499 PARSER_THROWCHECK(PostfixOprt,
true,
_T(
"?<"), f1of1)
500 PARSER_THROWCHECK(PostfixOprt,
true,
_T(
"**"), f1of1)
501 PARSER_THROWCHECK(PostfixOprt,
true,
_T(
"xor"), f1of1)
502 PARSER_THROWCHECK(PostfixOprt,
true,
_T(
"and"), f1of1)
503 PARSER_THROWCHECK(PostfixOprt,
true,
_T(
"or"), f1of1)
504 PARSER_THROWCHECK(PostfixOprt,
true,
_T(
"not"), f1of1)
505 PARSER_THROWCHECK(PostfixOprt,
true,
_T(
"!"), f1of1)
511 PARSER_THROWCHECK(Oprt,
false,
_T(
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"), f1of2);
512 PARSER_THROWCHECK(Oprt,
false,
_T(
"+"), f1of2)
513 PARSER_THROWCHECK(Oprt,
false,
_T(
"-"), f1of2)
514 PARSER_THROWCHECK(Oprt,
false,
_T(
"*"), f1of2)
515 PARSER_THROWCHECK(Oprt,
false,
_T(
"/"), f1of2)
516 PARSER_THROWCHECK(Oprt,
false,
_T(
"^"), f1of2)
517 PARSER_THROWCHECK(Oprt,
false,
_T(
"&&"), f1of2)
518 PARSER_THROWCHECK(Oprt,
false,
_T(
"||"), f1of2)
522 PARSER_THROWCHECK(Oprt,
true,
_T(
"+"), f1of2)
523 PARSER_THROWCHECK(Oprt,
true,
_T(
"-"), f1of2)
524 PARSER_THROWCHECK(Oprt,
true,
_T(
"*"), f1of2)
525 PARSER_THROWCHECK(Oprt,
true,
_T(
"/"), f1of2)
526 PARSER_THROWCHECK(Oprt,
true,
_T(
"^"), f1of2)
527 PARSER_THROWCHECK(Oprt,
true,
_T(
"&&"), f1of2)
528 PARSER_THROWCHECK(Oprt,
true,
_T(
"||"), f1of2)
529 #undef PARSER_THROWCHECK
534 mu::console() <<
_T(
"\n failed with ") << iStat <<
_T(
" errors") << endl;
540 int ParserTester::TestSyntax()
551 iStat += EqnTest(
_T(
"(1+ 2*a)"), 3,
true);
552 iStat += EqnTest(
_T(
"sqrt((4))"), 2,
true);
553 iStat += EqnTest(
_T(
"sqrt((2)+2)"), 2,
true);
554 iStat += EqnTest(
_T(
"sqrt(2+(2))"), 2,
true);
555 iStat += EqnTest(
_T(
"sqrt(a+(3))"), 2,
true);
556 iStat += EqnTest(
_T(
"sqrt((3)+a)"), 2,
true);
557 iStat += EqnTest(
_T(
"order(1,2)"), 1,
true);
558 iStat += EqnTest(
_T(
"(2+"), 0,
false);
559 iStat += EqnTest(
_T(
"2++4"), 0,
false);
560 iStat += EqnTest(
_T(
"2+-4"), 0,
false);
561 iStat += EqnTest(
_T(
"(2+)"), 0,
false);
562 iStat += EqnTest(
_T(
"--2"), 0,
false);
563 iStat += EqnTest(
_T(
"ksdfj"), 0,
false);
564 iStat += EqnTest(
_T(
"()"), 0,
false);
565 iStat += EqnTest(
_T(
"5+()"), 0,
false);
566 iStat += EqnTest(
_T(
"sin(cos)"), 0,
false);
567 iStat += EqnTest(
_T(
"5t6"), 0,
false);
568 iStat += EqnTest(
_T(
"5 t 6"), 0,
false);
569 iStat += EqnTest(
_T(
"8*"), 0,
false);
570 iStat += EqnTest(
_T(
",3"), 0,
false);
571 iStat += EqnTest(
_T(
"3,5"), 0,
false);
572 iStat += EqnTest(
_T(
"sin(8,8)"), 0,
false);
573 iStat += EqnTest(
_T(
"(7,8)"), 0,
false);
574 iStat += EqnTest(
_T(
"sin)"), 0,
false);
575 iStat += EqnTest(
_T(
"a)"), 0,
false);
576 iStat += EqnTest(
_T(
"pi)"), 0,
false);
577 iStat += EqnTest(
_T(
"sin(())"), 0,
false);
578 iStat += EqnTest(
_T(
"sin()"), 0,
false);
583 mu::console() <<
_T(
"\n failed with ") << iStat <<
_T(
" errors") << endl;
589 int ParserTester::TestVarConst()
592 mu::console() <<
_T(
"testing variable/constant detection...");
595 iStat += EqnTestWithVarChange(
_T(
"a"), 1, 1, 2, 2);
596 iStat += EqnTestWithVarChange(
_T(
"2*a"), 2, 4, 3, 6);
599 iStat += EqnTest(
_T(
"const"), 1,
true);
600 iStat += EqnTest(
_T(
"const1"), 2,
true);
601 iStat += EqnTest(
_T(
"const2"), 3,
true);
602 iStat += EqnTest(
_T(
"2*const"), 2,
true);
603 iStat += EqnTest(
_T(
"2*const1"), 4,
true);
604 iStat += EqnTest(
_T(
"2*const2"), 6,
true);
605 iStat += EqnTest(
_T(
"2*const+1"), 3,
true);
606 iStat += EqnTest(
_T(
"2*const1+1"), 5,
true);
607 iStat += EqnTest(
_T(
"2*const2+1"), 7,
true);
608 iStat += EqnTest(
_T(
"const"), 0,
false);
609 iStat += EqnTest(
_T(
"const1"), 0,
false);
610 iStat += EqnTest(
_T(
"const2"), 0,
false);
613 iStat += EqnTest(
_T(
"a"), 1,
true);
614 iStat += EqnTest(
_T(
"aa"), 2,
true);
615 iStat += EqnTest(
_T(
"2*a"), 2,
true);
616 iStat += EqnTest(
_T(
"2*aa"), 4,
true);
617 iStat += EqnTest(
_T(
"2*a-1"), 1,
true);
618 iStat += EqnTest(
_T(
"2*aa-1"), 3,
true);
621 iStat += EqnTest(
_T(
"0xff"), 255,
true);
622 iStat += EqnTest(
_T(
"0x97 + 0xff"), 406,
true);
640 int iCount = (int)UsedVar.size();
646 if (p.
GetVar().size() != 5)
649 mu::varmap_type::const_iterator item = UsedVar.begin();
650 for (idx = 0; item != UsedVar.end(); ++item)
652 if (&vVarVal[idx++] != item->second)
659 iCount = (int)UsedVar.size();
665 if (p.
GetVar().size() != 5)
668 for (item = UsedVar.begin(); item != UsedVar.end(); ++item)
670 if (item->second != 0)
677 iCount = (int)UsedVar.size();
678 if (iCount != 2)
throw false;
679 item = UsedVar.begin();
680 for (idx = 0; item != UsedVar.end(); ++item)
681 if (&vVarVal[idx++] != item->second)
throw false;
692 mu::console() <<
_T(
"\n failed with ") << iStat <<
_T(
" errors") << endl;
698 int ParserTester::TestMultiArg()
704 iStat += ThrowTest(
_T(
"6, +, +, +, +, +, +, +, +, +, +, +, +, +, +, 1, +, +, +, +, +, +, +, +, +, +, +, +, +, +, +, +, +, +, +, +, +, +, +, +, +, +, +, +, +, +, +, +"),
ecUNEXPECTED_ARG_SEP,
true);
711 iStat += EqnTest(
_T(
"1,2,3"), 3,
true);
712 iStat += EqnTest(
_T(
"a,b,c"), 3,
true);
713 iStat += EqnTest(
_T(
"a=10,b=20,c=a*b"), 200,
true);
714 iStat += EqnTest(
_T(
"1,\n2,\n3"), 3,
true);
715 iStat += EqnTest(
_T(
"a,\nb,\nc"), 3,
true);
716 iStat += EqnTest(
_T(
"a=10,\nb=20,\nc=a*b"), 200,
true);
717 iStat += EqnTest(
_T(
"1,\r\n2,\r\n3"), 3,
true);
718 iStat += EqnTest(
_T(
"a,\r\nb,\r\nc"), 3,
true);
719 iStat += EqnTest(
_T(
"a=10,\r\nb=20,\r\nc=a*b"), 200,
true);
722 iStat += EqnTest(
_T(
"f1of1(1)"), 1,
true);
723 iStat += EqnTest(
_T(
"f1of2(1, 2)"), 1,
true);
724 iStat += EqnTest(
_T(
"f2of2(1, 2)"), 2,
true);
725 iStat += EqnTest(
_T(
"f1of3(1, 2, 3)"), 1,
true);
726 iStat += EqnTest(
_T(
"f2of3(1, 2, 3)"), 2,
true);
727 iStat += EqnTest(
_T(
"f3of3(1, 2, 3)"), 3,
true);
728 iStat += EqnTest(
_T(
"f1of4(1, 2, 3, 4)"), 1,
true);
729 iStat += EqnTest(
_T(
"f2of4(1, 2, 3, 4)"), 2,
true);
730 iStat += EqnTest(
_T(
"f3of4(1, 2, 3, 4)"), 3,
true);
731 iStat += EqnTest(
_T(
"f4of4(1, 2, 3, 4)"), 4,
true);
732 iStat += EqnTest(
_T(
"f1of5(1, 2, 3, 4, 5)"), 1,
true);
733 iStat += EqnTest(
_T(
"f2of5(1, 2, 3, 4, 5)"), 2,
true);
734 iStat += EqnTest(
_T(
"f3of5(1, 2, 3, 4, 5)"), 3,
true);
735 iStat += EqnTest(
_T(
"f4of5(1, 2, 3, 4, 5)"), 4,
true);
736 iStat += EqnTest(
_T(
"f5of5(1, 2, 3, 4, 5)"), 5,
true);
738 iStat += EqnTest(
_T(
"1+ping()"), 11,
true);
739 iStat += EqnTest(
_T(
"ping()+1"), 11,
true);
740 iStat += EqnTest(
_T(
"2*ping()"), 20,
true);
741 iStat += EqnTest(
_T(
"ping()*2"), 20,
true);
742 iStat += EqnTest(
_T(
"ping(1,2)"), 0,
false);
743 iStat += EqnTest(
_T(
"1+ping(1,2)"), 0,
false);
744 iStat += EqnTest(
_T(
"f1of1(1,2)"), 0,
false);
745 iStat += EqnTest(
_T(
"f1of1()"), 0,
false);
746 iStat += EqnTest(
_T(
"f1of2(1, 2, 3)"), 0,
false);
747 iStat += EqnTest(
_T(
"f1of2(1)"), 0,
false);
748 iStat += EqnTest(
_T(
"f1of3(1, 2, 3, 4)"), 0,
false);
749 iStat += EqnTest(
_T(
"f1of3(1)"), 0,
false);
750 iStat += EqnTest(
_T(
"f1of4(1, 2, 3, 4, 5)"), 0,
false);
751 iStat += EqnTest(
_T(
"f1of4(1)"), 0,
false);
752 iStat += EqnTest(
_T(
"(1,2,3)"), 0,
false);
753 iStat += EqnTest(
_T(
"1,2,3"), 0,
false);
754 iStat += EqnTest(
_T(
"(1*a,2,3)"), 0,
false);
755 iStat += EqnTest(
_T(
"1,2*a,3"), 0,
false);
758 iStat += EqnTest(
_T(
"min(a, 1)"), 1,
true);
759 iStat += EqnTest(
_T(
"min(3*2, 1)"), 1,
true);
760 iStat += EqnTest(
_T(
"min(3*2, 1)"), 6,
false);
761 iStat += EqnTest(
_T(
"firstArg(2,3,4)"), 2,
true);
762 iStat += EqnTest(
_T(
"lastArg(2,3,4)"), 4,
true);
763 iStat += EqnTest(
_T(
"min(3*a+1, 1)"), 1,
true);
764 iStat += EqnTest(
_T(
"max(3*a+1, 1)"), 4,
true);
765 iStat += EqnTest(
_T(
"max(3*a+1, 1)*2"), 8,
true);
766 iStat += EqnTest(
_T(
"2*max(3*a+1, 1)+2"), 10,
true);
769 iStat += EqnTest(
_T(
"sum(a)"), 1,
true);
770 iStat += EqnTest(
_T(
"sum(1,2,3)"), 6,
true);
771 iStat += EqnTest(
_T(
"sum(a,b,c)"), 6,
true);
772 iStat += EqnTest(
_T(
"sum(1,-max(1,2),3)*2"), 4,
true);
773 iStat += EqnTest(
_T(
"2*sum(1,2,3)"), 12,
true);
774 iStat += EqnTest(
_T(
"2*sum(1,2,3)+2"), 14,
true);
775 iStat += EqnTest(
_T(
"2*sum(-1,2,3)+2"), 10,
true);
776 iStat += EqnTest(
_T(
"2*sum(-1,2,-(-a))+2"), 6,
true);
777 iStat += EqnTest(
_T(
"2*sum(-1,10,-a)+2"), 18,
true);
778 iStat += EqnTest(
_T(
"2*sum(1,2,3)*2"), 24,
true);
779 iStat += EqnTest(
_T(
"sum(1,-max(1,2),3)*2"), 4,
true);
780 iStat += EqnTest(
_T(
"sum(1*3, 4, a+2)"), 10,
true);
781 iStat += EqnTest(
_T(
"sum(1*3, 2*sum(1,2,2), a+2)"), 16,
true);
782 iStat += EqnTest(
_T(
"sum(1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2)"), 24,
true);
785 iStat += EqnTest(
_T(
"sum()"), 0,
false);
786 iStat += EqnTest(
_T(
"sum(,)"), 0,
false);
787 iStat += EqnTest(
_T(
"sum(1,2,)"), 0,
false);
788 iStat += EqnTest(
_T(
"sum(,1,2)"), 0,
false);
791 iStat += EqnTest(
_T(
"funud0_8()"), 8,
true);
792 iStat += EqnTest(
_T(
"funud1_16(10)"), 26,
true);
793 iStat += EqnTest(
_T(
"funud2_24(10, 100)"), 134,
true);
794 iStat += EqnTest(
_T(
"funud10_32(1,2,3,4,5,6,7,8,9,10)"), 87,
true);
795 iStat += EqnTest(
_T(
"funud0_9()"), 9,
true);
796 iStat += EqnTest(
_T(
"funud1_17(10)"), 27,
true);
797 iStat += EqnTest(
_T(
"funud2_25(10, 100)"), 135,
true);
798 iStat += EqnTest(
_T(
"funud10_33(1,2,3,4,5,6,7,8,9,10)"), 88,
true);
799 iStat += EqnTest(
_T(
"sumud_100(1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2)"), 124,
true);
800 iStat += EqnTest(
_T(
"sumud_100()"), 0,
false);
805 mu::console() <<
_T(
"\n failed with ") << iStat <<
_T(
" errors") << endl;
812 int ParserTester::TestInfixOprt()
817 iStat += EqnTest(
_T(
"+1"), +1,
true);
818 iStat += EqnTest(
_T(
"-(+1)"), -1,
true);
819 iStat += EqnTest(
_T(
"-(+1)*2"), -2,
true);
820 iStat += EqnTest(
_T(
"-(+2)*sqrt(4)"), -4,
true);
821 iStat += EqnTest(
_T(
"3-+a"), 2,
true);
822 iStat += EqnTest(
_T(
"+1*3"), 3,
true);
824 iStat += EqnTest(
_T(
"-1"), -1,
true);
825 iStat += EqnTest(
_T(
"-(-1)"), 1,
true);
826 iStat += EqnTest(
_T(
"-(-1)*2"), 2,
true);
827 iStat += EqnTest(
_T(
"-(-2)*sqrt(4)"), 4,
true);
829 iStat += EqnTest(
_T(
"-a"), -1,
true);
830 iStat += EqnTest(
_T(
"-(a)"), -1,
true);
831 iStat += EqnTest(
_T(
"-(-a)"), 1,
true);
832 iStat += EqnTest(
_T(
"-(-a)*2"), 2,
true);
833 iStat += EqnTest(
_T(
"-(8)"), -8,
true);
834 iStat += EqnTest(
_T(
"-8"), -8,
true);
835 iStat += EqnTest(
_T(
"-(2+1)"), -3,
true);
836 iStat += EqnTest(
_T(
"-(f1of1(1+2*3)+1*2)"), -9,
true);
837 iStat += EqnTest(
_T(
"-(-f1of1(1+2*3)+1*2)"), 5,
true);
838 iStat += EqnTest(
_T(
"-sin(8)"), -0.989358,
true);
839 iStat += EqnTest(
_T(
"3-(-a)"), 4,
true);
840 iStat += EqnTest(
_T(
"3--a"), 4,
true);
841 iStat += EqnTest(
_T(
"-1*3"), -3,
true);
844 iStat += EqnTest(
_T(
"~2#"), 8,
true);
845 iStat += EqnTest(
_T(
"~f1of1(2)#"), 8,
true);
846 iStat += EqnTest(
_T(
"~(b)#"), 8,
true);
847 iStat += EqnTest(
_T(
"(~b)#"), 12,
true);
848 iStat += EqnTest(
_T(
"~(2#)"), 8,
true);
849 iStat += EqnTest(
_T(
"~(f1of1(2)#)"), 8,
true);
851 iStat += EqnTest(
_T(
"-2^2"), -4,
true);
852 iStat += EqnTest(
_T(
"-(a+b)^2"), -9,
true);
853 iStat += EqnTest(
_T(
"(-3)^2"), 9,
true);
854 iStat += EqnTest(
_T(
"-(-2^2)"), 4,
true);
855 iStat += EqnTest(
_T(
"3+-3^2"), -6,
true);
858 iStat += EqnTest(
_T(
"-2'"), -4,
true);
859 iStat += EqnTest(
_T(
"-(1+1)'"), -4,
true);
860 iStat += EqnTest(
_T(
"2+-(1+1)'"), -2,
true);
861 iStat += EqnTest(
_T(
"2+-2'"), -2,
true);
864 iStat += EqnTest(
_T(
"$2^2"), 4,
true);
865 iStat += EqnTest(
_T(
"$(a+b)^2"), 9,
true);
866 iStat += EqnTest(
_T(
"($3)^2"), 9,
true);
867 iStat += EqnTest(
_T(
"$($2^2)"), -4,
true);
868 iStat += EqnTest(
_T(
"3+$3^2"), 12,
true);
871 iStat += EqnTest(
_T(
"~ 123"), (
value_type)123.0 + 2,
true);
872 iStat += EqnTest(
_T(
"~~ 123"), (
value_type)123.0 + 2,
true);
877 mu::console() <<
_T(
"\n failed with ") << iStat <<
_T(
" errors") << endl;
884 int ParserTester::TestPostFix()
890 iStat += EqnTest(
_T(
"3{m}+5"), 5.003,
true);
891 iStat += EqnTest(
_T(
"1000{m}"), 1,
true);
892 iStat += EqnTest(
_T(
"1000 {m}"), 1,
true);
893 iStat += EqnTest(
_T(
"(a){m}"), 1e-3,
true);
894 iStat += EqnTest(
_T(
"a{m}"), 1e-3,
true);
895 iStat += EqnTest(
_T(
"a {m}"), 1e-3,
true);
896 iStat += EqnTest(
_T(
"-(a){m}"), -1e-3,
true);
897 iStat += EqnTest(
_T(
"-2{m}"), -2e-3,
true);
898 iStat += EqnTest(
_T(
"-2 {m}"), -2e-3,
true);
899 iStat += EqnTest(
_T(
"f1of1(1000){m}"), 1,
true);
900 iStat += EqnTest(
_T(
"-f1of1(1000){m}"), -1,
true);
901 iStat += EqnTest(
_T(
"-f1of1(-1000){m}"), 1,
true);
902 iStat += EqnTest(
_T(
"f4of4(0,0,0,1000){m}"), 1,
true);
903 iStat += EqnTest(
_T(
"2+(a*1000){m}"), 3,
true);
906 iStat += EqnTest(
_T(
"2*3000meg+2"), 2 * 3e9 + 2,
true);
909 iStat += EqnTest(
_T(
"1000{m}"), 0.1,
false);
910 iStat += EqnTest(
_T(
"(a){m}"), 2,
false);
929 mu::console() <<
_T(
"\n failed with ") << iStat <<
_T(
" errors") << endl;
935 int ParserTester::TestExpression()
942 iStat += EqnTest(
_T(
"f0()"), 42,
true);
943 iStat += EqnTest(
_T(
"b^2"), 4,
true);
944 iStat += EqnTest(
_T(
"b^1"), 2,
true);
945 iStat += EqnTest(
_T(
"b^0"), 1,
true);
946 iStat += EqnTest(
_T(
"b^-1"), 0.5,
true);
949 iStat += EqnTest(
_T(
"2*b*5"), 20,
true);
950 iStat += EqnTest(
_T(
"2*b*5 + 4*b"), 28,
true);
951 iStat += EqnTest(
_T(
"2*a/3"), 2.0 / 3.0,
true);
954 iStat += EqnTest(
_T(
"3+b"), b + 3,
true);
955 iStat += EqnTest(
_T(
"b+3"), b + 3,
true);
956 iStat += EqnTest(
_T(
"b*3+2"), b * 3 + 2,
true);
957 iStat += EqnTest(
_T(
"3*b+2"), b * 3 + 2,
true);
958 iStat += EqnTest(
_T(
"2+b*3"), b * 3 + 2,
true);
959 iStat += EqnTest(
_T(
"2+3*b"), b * 3 + 2,
true);
960 iStat += EqnTest(
_T(
"b+3*b"), b + 3 * b,
true);
961 iStat += EqnTest(
_T(
"3*b+b"), b + 3 * b,
true);
963 iStat += EqnTest(
_T(
"2+b*3+b"), 2 + b * 3 + b,
true);
964 iStat += EqnTest(
_T(
"b+2+b*3"), b + 2 + b * 3,
true);
966 iStat += EqnTest(
_T(
"(2*b+1)*4"), (2 * b + 1) * 4,
true);
967 iStat += EqnTest(
_T(
"4*(2*b+1)"), (2 * b + 1) * 4,
true);
970 iStat += EqnTest(
_T(
"1+2-3*4/5^6"), 2.99923,
true);
971 iStat += EqnTest(
_T(
"1^2/3*4-5+6"), 2.33333333,
true);
972 iStat += EqnTest(
_T(
"1+2*3"), 7,
true);
973 iStat += EqnTest(
_T(
"1+2*3"), 7,
true);
974 iStat += EqnTest(
_T(
"(1+2)*3"), 9,
true);
975 iStat += EqnTest(
_T(
"(1+2)*(-3)"), -9,
true);
976 iStat += EqnTest(
_T(
"2/4"), 0.5,
true);
978 iStat += EqnTest(
_T(
"exp(ln(7))"), 7,
true);
979 iStat += EqnTest(
_T(
"e^ln(7)"), 7,
true);
980 iStat += EqnTest(
_T(
"e^(ln(7))"), 7,
true);
981 iStat += EqnTest(
_T(
"(e^(ln(7)))"), 7,
true);
982 iStat += EqnTest(
_T(
"1-(e^(ln(7)))"), -6,
true);
983 iStat += EqnTest(
_T(
"2*(e^(ln(7)))"), 14,
true);
984 iStat += EqnTest(
_T(
"10^log(5)"), pow(10.0, log(5.0)),
true);
985 iStat += EqnTest(
_T(
"10^log10(5)"), 5,
true);
986 iStat += EqnTest(
_T(
"2^log2(4)"), 4,
true);
987 iStat += EqnTest(
_T(
"-(sin(0)+1)"), -1,
true);
988 iStat += EqnTest(
_T(
"-(2^1.1)"), -2.14354692,
true);
990 iStat += EqnTest(
_T(
"(cos(2.41)/b)"), -0.372056,
true);
991 iStat += EqnTest(
_T(
"(1*(2*(3*(4*(5*(6*(a+b)))))))"), 2160,
true);
992 iStat += EqnTest(
_T(
"(1*(2*(3*(4*(5*(6*(7*(a+b))))))))"), 15120,
true);
993 iStat += EqnTest(
_T(
"(a/((((b+(((e*(((((pi*((((3.45*((pi+a)+pi))+b)+b)*a))+0.68)+e)+a)/a))+a)+b))+b)*a)-pi))"), 0.00377999,
true);
997 _T(
"(((-9))-e/(((((((pi-(((-7)+(-3)/4/e))))/(((-5))-2)-((pi+(-0))*(sqrt((e+e))*(-8))*(((-pi)+(-pi)-(-9)*(6*5))")
998 _T(
"/(-e)-e))/2)/((((sqrt(2/(-e)+6)-(4-2))+((5/(-2))/(1*(-pi)+3))/8)*pi*((pi/((-2)/(-6)*1*(-1))*(-6)+(-e)))))/")
999 _T(
"((e+(-2)+(-e)*((((-3)*9+(-e)))+(-9)))))))-((((e-7+(((5/pi-(3/1+pi)))))/e)/(-5))/(sqrt((((((1+(-7))))+((((-")
1000 _T(
"e)*(-e)))-8))*(-5)/((-e)))*(-6)-((((((-2)-(-9)-(-e)-1)/3))))/(sqrt((8+(e-((-6))+(9*(-9))))*(((3+2-8))*(7+6")
1001 _T(
"+(-5))+((0/(-e)*(-pi))+7)))+(((((-e)/e/e)+((-6)*5)*e+(3+(-5)/pi))))+pi))/sqrt((((9))+((((pi))-8+2))+pi))/e")
1002 _T(
"*4)*((-5)/(((-pi))*(sqrt(e)))))-(((((((-e)*(e)-pi))/4+(pi)*(-9)))))))+(-pi)"), -12.23016549,
true);
1006 _T(
"(atan(sin((((((((((((((((pi/cos((a/((((0.53-b)-pi)*e)/b))))+2.51)+a)-0.54)/0.98)+b)*b)+e)/a)+b)+a)+b)+pi)/e")
1007 _T(
")+a)))*2.77)"), -2.16995656,
true);
1010 iStat += EqnTest(
_T(
"1+2-3*4/5^6*(2*(1-5+(3*7^9)*(4+6*7-3)))+12"), -7995810.09926,
true);
1015 mu::console() <<
_T(
"\n failed with ") << iStat <<
_T(
" errors") << endl;
1023 int ParserTester::TestIfThenElse()
1043 iStat += ThrowTest(
_T(
":3"), ecUNEXPECTED_CONDITIONAL);
1044 iStat += ThrowTest(
_T(
"? 1 : 2"), ecUNEXPECTED_CONDITIONAL);
1045 iStat += ThrowTest(
_T(
"(a<b) ? (b<c) ? 1 : 2"), ecMISSING_ELSE_CLAUSE);
1046 iStat += ThrowTest(
_T(
"(a<b) ? 1"), ecMISSING_ELSE_CLAUSE);
1047 iStat += ThrowTest(
_T(
"(a<b) ? a"), ecMISSING_ELSE_CLAUSE);
1048 iStat += ThrowTest(
_T(
"(a<b) ? a+b"), ecMISSING_ELSE_CLAUSE);
1049 iStat += ThrowTest(
_T(
"a : b"), ecMISPLACED_COLON);
1050 iStat += ThrowTest(
_T(
"1 : 2"), ecMISPLACED_COLON);
1051 iStat += ThrowTest(
_T(
"(1) ? 1 : 2 : 3"), ecMISPLACED_COLON);
1055 iStat += ThrowTest(
_T(
"1?2:0?(7:1)"), ecMISPLACED_COLON);
1066 iStat += EqnTest(
_T(
"1 ? 128 : 255"), 128,
true);
1067 iStat += EqnTest(
_T(
"1<2 ? 128 : 255"), 128,
true);
1068 iStat += EqnTest(
_T(
"a<b ? 128 : 255"), 128,
true);
1069 iStat += EqnTest(
_T(
"(a<b) ? 128 : 255"), 128,
true);
1070 iStat += EqnTest(
_T(
"(1) ? 10 : 11"), 10,
true);
1071 iStat += EqnTest(
_T(
"(0) ? 10 : 11"), 11,
true);
1072 iStat += EqnTest(
_T(
"(1) ? a+b : c+d"), 3,
true);
1073 iStat += EqnTest(
_T(
"(0) ? a+b : c+d"), 1,
true);
1074 iStat += EqnTest(
_T(
"(1) ? 0 : 1"), 0,
true);
1075 iStat += EqnTest(
_T(
"(0) ? 0 : 1"), 1,
true);
1076 iStat += EqnTest(
_T(
"(a<b) ? 10 : 11"), 10,
true);
1077 iStat += EqnTest(
_T(
"(a>b) ? 10 : 11"), 11,
true);
1078 iStat += EqnTest(
_T(
"(a<b) ? c : d"), 3,
true);
1079 iStat += EqnTest(
_T(
"(a>b) ? c : d"), -2,
true);
1081 iStat += EqnTest(
_T(
"(a>b) ? 1 : 0"), 0,
true);
1082 iStat += EqnTest(
_T(
"((a>b) ? 1 : 0) ? 1 : 2"), 2,
true);
1083 iStat += EqnTest(
_T(
"((a>b) ? 1 : 0) ? 1 : sum((a>b) ? 1 : 2)"), 2,
true);
1084 iStat += EqnTest(
_T(
"((a>b) ? 0 : 1) ? 1 : sum((a>b) ? 1 : 2)"), 1,
true);
1086 iStat += EqnTest(
_T(
"sum((a>b) ? 1 : 2)"), 2,
true);
1087 iStat += EqnTest(
_T(
"sum((1) ? 1 : 2)"), 1,
true);
1088 iStat += EqnTest(
_T(
"sum((a>b) ? 1 : 2, 100)"), 102,
true);
1089 iStat += EqnTest(
_T(
"sum((1) ? 1 : 2, 100)"), 101,
true);
1090 iStat += EqnTest(
_T(
"sum(3, (a>b) ? 3 : 10)"), 13,
true);
1091 iStat += EqnTest(
_T(
"sum(3, (a<b) ? 3 : 10)"), 6,
true);
1092 iStat += EqnTest(
_T(
"10*sum(3, (a>b) ? 3 : 10)"), 130,
true);
1093 iStat += EqnTest(
_T(
"10*sum(3, (a<b) ? 3 : 10)"), 60,
true);
1094 iStat += EqnTest(
_T(
"sum(3, (a>b) ? 3 : 10)*10"), 130,
true);
1095 iStat += EqnTest(
_T(
"sum(3, (a<b) ? 3 : 10)*10"), 60,
true);
1096 iStat += EqnTest(
_T(
"(a<b) ? sum(3, (a<b) ? 3 : 10)*10 : 99"), 60,
true);
1097 iStat += EqnTest(
_T(
"(a>b) ? sum(3, (a<b) ? 3 : 10)*10 : 99"), 99,
true);
1098 iStat += EqnTest(
_T(
"(a<b) ? sum(3, (a<b) ? 3 : 10,10,20)*10 : 99"), 360,
true);
1099 iStat += EqnTest(
_T(
"(a>b) ? sum(3, (a<b) ? 3 : 10,10,20)*10 : 99"), 99,
true);
1100 iStat += EqnTest(
_T(
"(a>b) ? sum(3, (a<b) ? 3 : 10,10,20)*10 : sum(3, (a<b) ? 3 : 10)*10"), 60,
true);
1103 iStat += EqnTest(
_T(
"(a<b)&&(a<b) ? 128 : 255"), 128,
true);
1104 iStat += EqnTest(
_T(
"(a>b)&&(a<b) ? 128 : 255"), 255,
true);
1105 iStat += EqnTest(
_T(
"(1<2)&&(1<2) ? 128 : 255"), 128,
true);
1106 iStat += EqnTest(
_T(
"(1>2)&&(1<2) ? 128 : 255"), 255,
true);
1107 iStat += EqnTest(
_T(
"((1<2)&&(1<2)) ? 128 : 255"), 128,
true);
1108 iStat += EqnTest(
_T(
"((1>2)&&(1<2)) ? 128 : 255"), 255,
true);
1109 iStat += EqnTest(
_T(
"((a<b)&&(a<b)) ? 128 : 255"), 128,
true);
1110 iStat += EqnTest(
_T(
"((a>b)&&(a<b)) ? 128 : 255"), 255,
true);
1112 iStat += EqnTest(
_T(
"1>0 ? 1>2 ? 128 : 255 : 1>0 ? 32 : 64"), 255,
true);
1113 iStat += EqnTest(
_T(
"1>0 ? 1>2 ? 128 : 255 :(1>0 ? 32 : 64)"), 255,
true);
1114 iStat += EqnTest(
_T(
"1>0 ? 1>0 ? 128 : 255 : 1>2 ? 32 : 64"), 128,
true);
1115 iStat += EqnTest(
_T(
"1>0 ? 1>0 ? 128 : 255 :(1>2 ? 32 : 64)"), 128,
true);
1116 iStat += EqnTest(
_T(
"1>2 ? 1>2 ? 128 : 255 : 1>0 ? 32 : 64"), 32,
true);
1117 iStat += EqnTest(
_T(
"1>2 ? 1>0 ? 128 : 255 : 1>2 ? 32 : 64"), 64,
true);
1118 iStat += EqnTest(
_T(
"1>0 ? 50 : 1>0 ? 128 : 255"), 50,
true);
1119 iStat += EqnTest(
_T(
"1>0 ? 50 : (1>0 ? 128 : 255)"), 50,
true);
1120 iStat += EqnTest(
_T(
"1>0 ? 1>0 ? 128 : 255 : 50"), 128,
true);
1121 iStat += EqnTest(
_T(
"1>2 ? 1>2 ? 128 : 255 : 1>0 ? 32 : 1>2 ? 64 : 16"), 32,
true);
1122 iStat += EqnTest(
_T(
"1>2 ? 1>2 ? 128 : 255 : 1>0 ? 32 :(1>2 ? 64 : 16)"), 32,
true);
1123 iStat += EqnTest(
_T(
"1>0 ? 1>2 ? 128 : 255 : 1>0 ? 32 :1>2 ? 64 : 16"), 255,
true);
1124 iStat += EqnTest(
_T(
"1>0 ? 1>2 ? 128 : 255 : (1>0 ? 32 :1>2 ? 64 : 16)"), 255,
true);
1125 iStat += EqnTest(
_T(
"1 ? 0 ? 128 : 255 : 1 ? 32 : 64"), 255,
true);
1128 iStat += EqnTest(
_T(
"a= 0 ? 128 : 255, a"), 255,
true);
1129 iStat += EqnTest(
_T(
"a=((a>b)&&(a<b)) ? 128 : 255, a"), 255,
true);
1130 iStat += EqnTest(
_T(
"c=(a<b)&&(a<b) ? 128 : 255, c"), 128,
true);
1131 iStat += EqnTest(
_T(
"0 ? a=a+1 : 666, a"), 1,
true);
1132 iStat += EqnTest(
_T(
"1?a=10:a=20, a"), 10,
true);
1133 iStat += EqnTest(
_T(
"0?a=10:a=20, a"), 20,
true);
1134 iStat += EqnTest(
_T(
"0?a=sum(3,4):10, a"), 1,
true);
1136 iStat += EqnTest(
_T(
"a=1?b=1?3:4:5, a"), 3,
true);
1137 iStat += EqnTest(
_T(
"a=1?b=1?3:4:5, b"), 3,
true);
1138 iStat += EqnTest(
_T(
"a=0?b=1?3:4:5, a"), 5,
true);
1139 iStat += EqnTest(
_T(
"a=0?b=1?3:4:5, b"), 2,
true);
1141 iStat += EqnTest(
_T(
"a=1?5:b=1?3:4, a"), 5,
true);
1142 iStat += EqnTest(
_T(
"a=1?5:b=1?3:4, b"), 2,
true);
1143 iStat += EqnTest(
_T(
"a=0?5:b=1?3:4, a"), 3,
true);
1144 iStat += EqnTest(
_T(
"a=0?5:b=1?3:4, b"), 3,
true);
1149 mu::console() <<
_T(
"\n failed with ") << iStat <<
_T(
" errors") << endl;
1155 int ParserTester::TestException()
1180 iStat += ThrowTest(
_T(
"valueof(\"xxx\")"), 999,
false);
1188 iStat += ThrowTest(
_T(
"valueof(\"\\\"abc\\\"\")"), 999,
false);
1226 mu::console() <<
_T(
"\n failed with ") << iStat <<
_T(
" errors") << endl;
1233 void ParserTester::AddTest(testfun_type a_pFun)
1235 m_vTestFun.push_back(a_pFun);
1239 int ParserTester::Run()
1244 for (
int i = 0; i < (int)m_vTestFun.size(); ++i)
1245 iStat += (this->*m_vTestFun[i])();
1253 catch (std::exception& e)
1266 mu::console() <<
"Test passed (" << ParserTester::c_iCount <<
" expressions)" << endl;
1271 <<
" errors (" << ParserTester::c_iCount
1272 <<
" expressions)" << endl;
1274 ParserTester::c_iCount = 0;
1280 int ParserTester::ThrowTest(
const string_type& a_str,
int a_iErrc,
bool a_expectedToFail)
1282 ParserTester::c_iCount++;
1309 if (a_expectedToFail ==
false || (a_expectedToFail ==
true && a_iErrc != e.
GetCode()))
1312 <<
_T(
"Expression: ") << a_str
1314 <<
_T(
" Expected:") << a_iErrc;
1317 return (a_iErrc == e.
GetCode()) ? 0 : 1;
1321 bool bRet((a_expectedToFail ==
false) ? 0 : 1);
1325 <<
_T(
"Expression: ") << a_str
1326 <<
_T(
" did evaluate; Expected error:") << a_iErrc;
1337 int ParserTester::EqnTestWithVarChange(
const string_type& a_str,
1343 ParserTester::c_iCount++;
1362 if (fabs(a_fRes1 - fVal[0]) > 0.0000000001)
1363 throw std::runtime_error(
"incorrect result (first pass)");
1365 if (fabs(a_fRes2 - fVal[1]) > 0.0000000001)
1366 throw std::runtime_error(
"incorrect result (second pass)");
1373 catch (std::exception& e)
1375 mu::console() <<
_T(
"\n fail: ") << a_str.c_str() <<
_T(
" (") << e.what() <<
_T(
")");
1380 mu::console() <<
_T(
"\n fail: ") << a_str.c_str() <<
_T(
" (unexpected exception)");
1392 int ParserTester::EqnTest(
const string_type& a_str,
double a_fRes,
bool a_fPass)
1394 ParserTester::c_iCount++;
1396 value_type fVal[6] = { -999, -998, -997, -996, -995, -994 };
1400 std::unique_ptr<Parser> p1;
1411 p1->DefineConst(
_T(
"const"), 1);
1412 p1->DefineConst(
_T(
"const1"), 2);
1413 p1->DefineConst(
_T(
"const2"), 3);
1415 p1->DefineStrConst(
_T(
"str1"),
_T(
"1.11"));
1416 p1->DefineStrConst(
_T(
"str2"),
_T(
"2.22"));
1419 p1->DefineVar(
_T(
"a"), &vVarVal[0]);
1420 p1->DefineVar(
_T(
"aa"), &vVarVal[1]);
1421 p1->DefineVar(
_T(
"b"), &vVarVal[1]);
1422 p1->DefineVar(
_T(
"c"), &vVarVal[2]);
1423 p1->DefineVar(
_T(
"d"), &vVarVal[3]);
1426 p1->AddValIdent(&ParserTester::IsHexVal);
1429 p1->DefineFun(
_T(
"ping"), Ping);
1430 p1->DefineFun(
_T(
"f0"), f0);
1431 p1->DefineFun(
_T(
"f1of1"), f1of1);
1432 p1->DefineFun(
_T(
"f1of2"), f1of2);
1433 p1->DefineFun(
_T(
"f2of2"), f2of2);
1434 p1->DefineFun(
_T(
"f1of3"), f1of3);
1435 p1->DefineFun(
_T(
"f2of3"), f2of3);
1436 p1->DefineFun(
_T(
"f3of3"), f3of3);
1437 p1->DefineFun(
_T(
"f1of4"), f1of4);
1438 p1->DefineFun(
_T(
"f2of4"), f2of4);
1439 p1->DefineFun(
_T(
"f3of4"), f3of4);
1440 p1->DefineFun(
_T(
"f4of4"), f4of4);
1441 p1->DefineFun(
_T(
"f1of5"), f1of5);
1442 p1->DefineFun(
_T(
"f2of5"), f2of5);
1443 p1->DefineFun(
_T(
"f3of5"), f3of5);
1444 p1->DefineFun(
_T(
"f4of5"), f4of5);
1445 p1->DefineFun(
_T(
"f5of5"), f5of5);
1448 p1->DefineOprt(
_T(
"add"), add, 0);
1449 p1->DefineOprt(
_T(
"++"), add, 0);
1450 p1->DefineOprt(
_T(
"&"), land, prLAND);
1453 p1->DefineFun(
_T(
"min"), Min);
1454 p1->DefineFun(
_T(
"max"), Max);
1455 p1->DefineFun(
_T(
"sum"), Sum);
1456 p1->DefineFun(
_T(
"valueof"), ValueOf);
1457 p1->DefineFun(
_T(
"atof"), StrToFloat);
1458 p1->DefineFun(
_T(
"strfun1"), StrFun1);
1459 p1->DefineFun(
_T(
"strfun2"), StrFun2);
1460 p1->DefineFun(
_T(
"strfun3"), StrFun3);
1461 p1->DefineFun(
_T(
"strfun4"), StrFun4);
1462 p1->DefineFun(
_T(
"strfun5"), StrFun5);
1463 p1->DefineFun(
_T(
"strfun6"), StrFun6);
1464 p1->DefineFun(
_T(
"lastArg"), LastArg);
1465 p1->DefineFun(
_T(
"firstArg"), FirstArg);
1466 p1->DefineFun(
_T(
"order"), FirstArg);
1469 p1->DefineFunUserData(
_T(
"funud0_8"), FunUd0, reinterpret_cast<void*>(8));
1470 p1->DefineFunUserData(
_T(
"funud1_16"), FunUd1, reinterpret_cast<void*>(16));
1471 p1->DefineFunUserData(
_T(
"funud2_24"), FunUd2, reinterpret_cast<void*>(24));
1472 p1->DefineFunUserData(
_T(
"funud10_32"), FunUd10, reinterpret_cast<void*>(32));
1473 p1->DefineFunUserData(
_T(
"funud0_9"), FunUd0, reinterpret_cast<void*>(9));
1474 p1->DefineFunUserData(
_T(
"funud1_17"), FunUd1, reinterpret_cast<void*>(17));
1475 p1->DefineFunUserData(
_T(
"funud2_25"), FunUd2, reinterpret_cast<void*>(25));
1476 p1->DefineFunUserData(
_T(
"funud10_33"), FunUd10, reinterpret_cast<void*>(33));
1477 p1->DefineFunUserData(
_T(
"strfunud3_10"), StrFunUd3, reinterpret_cast<void*>(10));
1478 p1->DefineFunUserData(
_T(
"sumud_100"), SumUd, reinterpret_cast<void*>(100));
1483 p1->DefineInfixOprt(
_T(
"$"), sign,
prPOW + 1);
1484 p1->DefineInfixOprt(
_T(
"~"), plus2);
1485 p1->DefineInfixOprt(
_T(
"~~"), plus2);
1486 p1->DefinePostfixOprt(
_T(
"{m}"), Milli);
1487 p1->DefinePostfixOprt(
_T(
"{M}"), Mega);
1488 p1->DefinePostfixOprt(
_T(
"m"), Milli);
1489 p1->DefinePostfixOprt(
_T(
"meg"), Mega);
1490 p1->DefinePostfixOprt(
_T(
"#"), times3);
1491 p1->DefinePostfixOprt(
_T(
"'"), sqr);
1496 fVal[0] = p1->Eval();
1497 fVal[1] = p1->Eval();
1498 if (fVal[0] != fVal[1])
1505 std::vector<mu::Parser> vParser;
1506 vParser.push_back(*(p1.get()));
1513 fVal[2] = p4.
Eval();
1520 fVal[3] = p5.
Eval();
1527 fVal[4] = v[nNum - 1];
1530 fVal[5] = v[nNum - 1];
1533 catch (std::exception& e)
1539 bool bCloseEnough(
true);
1540 for (
unsigned i = 0; i <
sizeof(fVal) /
sizeof(
value_type); ++i)
1542 bCloseEnough &= (fabs(a_fRes - fVal[i]) <= fabs(fVal[i] * 0.00001));
1548 #pragma warning(push)
1549 #pragma warning(disable:4127)
1551 if (std::numeric_limits<value_type>::has_infinity)
1553 #pragma warning(pop)
1556 bCloseEnough &= (fabs(fVal[i]) != numeric_limits<value_type>::infinity());
1560 iRet = ((bCloseEnough && a_fPass) || (!bCloseEnough && !a_fPass)) ? 0 : 1;
1566 <<
_T(
" (incorrect result; expected: ") << a_fRes
1567 <<
_T(
" ;calculated: ") << fVal[0] <<
_T(
",")
1568 << fVal[1] <<
_T(
",")
1569 << fVal[2] <<
_T(
",")
1570 << fVal[3] <<
_T(
",")
1571 << fVal[4] <<
_T(
",")
1572 << fVal[5] <<
_T(
").");
1579 if (fVal[0] != fVal[2] && fVal[0] != -999 && fVal[1] != -998)
1580 mu::console() <<
_T(
"\n fail: ") << a_str.c_str() <<
_T(
" (copy construction)");
1586 catch (std::exception& e)
1588 mu::console() <<
_T(
"\n fail: ") << a_str.c_str() <<
_T(
" (") << e.what() <<
_T(
")");
1593 mu::console() <<
_T(
"\n fail: ") << a_str.c_str() <<
_T(
" (unexpected exception)");
1601 int ParserTester::EqnTestInt(
const string_type& a_str,
double a_fRes,
bool a_fPass)
1603 ParserTester::c_iCount++;
1622 if (fVal[0] != fVal[1])
1625 iRet = ((a_fRes == fVal[0] && a_fPass) ||
1626 (a_fRes != fVal[0] && !a_fPass)) ? 0 : 1;
1630 <<
_T(
" (incorrect result; expected: ") << a_fRes
1631 <<
_T(
" ;calculated: ") << fVal[0] <<
_T(
").");
1644 mu::console() <<
_T(
"\n fail: ") << a_str.c_str() <<
_T(
" (unexpected exception)");
1653 int ParserTester::EqnTestBulk(
const string_type& a_str,
double a_fRes[4],
bool a_fPass)
1655 ParserTester::c_iCount++;
1675 p.
Eval(vResults, nBulkSize);
1677 bool bCloseEnough(
true);
1678 for (
int i = 0; i < nBulkSize; ++i)
1680 bCloseEnough &= (fabs(a_fRes[i] - vResults[i]) <= fabs(a_fRes[i] * 0.00001));
1683 iRet = ((bCloseEnough && a_fPass) || (!bCloseEnough && !a_fPass)) ? 0 : 1;
1687 <<
_T(
" (incorrect result; expected: {") << a_fRes[0] <<
_T(
",") << a_fRes[1] <<
_T(
",") << a_fRes[2] <<
_T(
",") << a_fRes[3] <<
_T(
"}")
1688 <<
_T(
" ;calculated: ") << vResults[0] <<
_T(
",") << vResults[1] <<
_T(
",") << vResults[2] <<
_T(
",") << vResults[3] <<
_T(
"}");
1701 mu::console() <<
_T(
"\n fail: ") << a_str.c_str() <<
_T(
" (unexpected exception)");
1710 void ParserTester::Abort()
const
1712 mu::console() <<
_T(
"Test failed (internal error in test class)") << endl;
void DefinePostfixOprt(const string_type &a_strFun, fun_type1 a_pOprt, bool a_bAllowOpt=true)
Add a user defined operator.
#define _T(x)
Activate this option in order to compile with OpenMP support.
const string_type & GetExpr() const
gets the expression related tp this error.
binary operators may only be applied to value items of the same type
An unexpected comma has been found. (Example: "1,23")
void DefineVar(const string_type &a_sName, value_type *a_fVar)
Add a user defined variable.
std::ostream & console()
Encapsulate cout.
Token can't be identified.
An unexpected argument has been found.
std::map< string_type, value_type * > varmap_type
Type used for storing variables.
unterminated string constant. (Example: "3*valueof("hello)")
void ClearConst()
Clear all user defined constants.
Unexpected function found. (Example: "sin(8)cos(9)")
power operator priority (highest)
value_type Eval() const
Calculate the result.
std::basic_stringstream< char_type, std::char_traits< char_type >, std::allocator< char_type > > stringstream_type
Typedef for easily using stringstream that respect the parser stringtype.
void EnableOptimizer(bool a_bIsOn=true)
Enable or disable the formula optimization feature.
Code for a generic function item.
An unexpected value token has been found.
void ClearPostfixOprt()
Clear all user defined postfix operators.
void DefineFun(const string_type &a_strName, T a_pFun, bool a_bAllowOpt=true)
Define a parser function without arguments.
Error class of the parser.
const varmap_type & GetVar() const
Return a map containing the used variables only.
MUP_BASETYPE value_type
The numeric datatype used by the parser.
void SetExpr(const string_type &a_sExpr)
Set the formula.
Mathematical expressions parser.
Too many function parameters.
A numerical function has been called with a non value type of argument.
A template class for providing wrappers for essential math functions.
Namespace for mathematical applications.
Unexpected end of formula. (Example: "2+sin(")
Too few function parameters. (Example: "ite(1<2,2)")
A string function has been called with a different type of argument.
EErrorCodes GetCode() const
Return the error code.
void RemoveVar(const string_type &a_strVarName)
Remove a variable from internal storage.
string_type::value_type char_type
The character type used by the parser.
Mathematical expressions parser.
void DefineConst(const string_type &a_sName, value_type a_fVal)
Add a user defined constant.
void EnableBuiltInOprt(bool a_bIsOn=true)
Enable or disable the built in binary operators.
This file contains the parser test class.
Unexpected binary operator found.
MUP_STRING_TYPE string_type
The stringtype used by the parser.
void ClearFun()
Clear all functions.
Unexpected Parenthesis, opening or closing.
const string_type & GetToken() const
Return string related with this token (if available).
Missing parens. (Example: "3*sin(3")
const string_type & GetMsg() const
Returns the message string for this error.
A string has been found at an inapropriate position.
const ParserByteCode & GetByteCode() const
Returns the bytecode of the current expression.
const varmap_type & GetUsedVar() const
Return a map containing the used variables only.