33 #define PARSER_CONST_PI 3.141592653589793238462643 34 #define PARSER_CONST_E 2.718281828459045235360287 46 int ParserTester::c_iCount = 0;
49 ParserTester::ParserTester()
78 stringstream_type::pos_type nPos(0);
80 ss >> std::hex >> iVal;
83 if (nPos==(stringstream_type::pos_type)0)
86 *a_iPos += (int)(2 + nPos);
128 mu::console() <<
_T(
"\n failed with ") << iStat <<
_T(
" errors") << endl;
139 iStat +=
EqnTest(
_T(
"valueof(\"\")"), 123,
true);
140 iStat +=
EqnTest(
_T(
"valueof(\"aaa\")+valueof(\"bbb\") "), 246,
true);
141 iStat +=
EqnTest(
_T(
"2*(valueof(\"aaa\")-23)+valueof(\"bbb\")"), 323,
true);
143 iStat +=
EqnTest(
_T(
"a*(atof(\"10\")-b)"), 8,
true);
144 iStat +=
EqnTest(
_T(
"a-(atof(\"10\")*b)"), -19,
true);
146 iStat +=
EqnTest(
_T(
"strfun1(\"100\")"), 100,
true);
147 iStat +=
EqnTest(
_T(
"strfun2(\"100\",1)"), 101,
true);
148 iStat +=
EqnTest(
_T(
"strfun3(\"99\",1,2)"), 102,
true);
150 iStat +=
EqnTest(
_T(
"atof(str1)+atof(str2)"), 3.33,
true);
155 mu::console() <<
_T(
"\n failed with ") << iStat <<
_T(
" errors") << endl;
166 #define EQN_TEST_BULK(EXPR, R1, R2, R3, R4, PASS) \ 168 double res[] = { R1, R2, R3, R4 }; \ 169 iStat += EqnTestBulk(_T(EXPR), res, (PASS)); \ 189 mu::console() <<
_T(
"\n failed with ") << iStat <<
_T(
" errors") << endl;
207 iStat +=
EqnTest(
_T(
"a add b"), 3,
true);
208 iStat +=
EqnTest(
_T(
"1 add 2"), 3,
true);
224 iStat +=
EqnTest(
_T(
"(a<b) && (b>a)"), 1,
true);
225 iStat +=
EqnTest(
_T(
"(a<b) && (a>b)"), 0,
true);
228 iStat +=
EqnTest(
_T(
"12 & 255"), 12,
true);
230 iStat +=
EqnTest(
_T(
"12&255"), 12,
true);
235 iStat +=
EqnTest(
_T(
"a = sin(b)"), 0.909297,
true);
236 iStat +=
EqnTest(
_T(
"a = 1+sin(b)"), 1.909297,
true);
237 iStat +=
EqnTest(
_T(
"(a=b)*2"), 4,
true);
238 iStat +=
EqnTest(
_T(
"2*(a=b)"), 4,
true);
239 iStat +=
EqnTest(
_T(
"2*(a=b+1)"), 6,
true);
240 iStat +=
EqnTest(
_T(
"(a=b+1)*2"), 6,
true);
241 iStat +=
EqnTest(
_T(
"a=c, a*10"), 30,
true);
243 iStat +=
EqnTest(
_T(
"2^2^3"), 256,
true);
244 iStat +=
EqnTest(
_T(
"1/2/3"), 1.0/6.0,
true);
247 iStat +=
EqnTest(
_T(
"3+4*2/(1-5)^2^3"), 3.0001220703125,
true);
269 iStat +=
EqnTestInt(
_T(
"2*(const1 | const2)"), 6,
true);
270 iStat +=
EqnTestInt(
_T(
"2*(const1 | const2)"), 7,
false);
275 iStat +=
EqnTestInt(
_T(
"2*(const1 + const2)"), 6,
true);
276 iStat +=
EqnTestInt(
_T(
"2*(const1 - const2)"), -2,
true);
325 mu::console() <<
_T(
"\n failed with ") << iStat <<
_T(
" errors") << endl;
337 mu::console() <<
"testing name restriction enforcement...";
341 #define PARSER_THROWCHECK(DOMAIN, FAIL, EXPR, ARG) \ 343 ParserTester::c_iCount++; \ 346 p.Define##DOMAIN(EXPR, ARG); \ 348 catch(Parser::exception_type&) \ 350 iErr = (FAIL==false) ? 0 : 1; \ 429 #undef PARSER_THROWCHECK 434 mu::console() <<
_T(
"\n failed with ") << iStat <<
_T(
" errors") << endl;
451 iStat +=
EqnTest(
_T(
"(1+ 2*a)"), 3,
true);
452 iStat +=
EqnTest(
_T(
"sqrt((4))"), 2,
true);
453 iStat +=
EqnTest(
_T(
"sqrt((2)+2)"), 2,
true);
454 iStat +=
EqnTest(
_T(
"sqrt(2+(2))"), 2,
true);
455 iStat +=
EqnTest(
_T(
"sqrt(a+(3))"), 2,
true);
456 iStat +=
EqnTest(
_T(
"sqrt((3)+a)"), 2,
true);
457 iStat +=
EqnTest(
_T(
"order(1,2)"), 1,
true);
466 iStat +=
EqnTest(
_T(
"sin(cos)"), 0,
false);
472 iStat +=
EqnTest(
_T(
"sin(8,8)"), 0,
false);
477 iStat +=
EqnTest(
_T(
"sin(())"), 0,
false);
483 mu::console() <<
_T(
"\n failed with ") << iStat <<
_T(
" errors") << endl;
492 mu::console() <<
_T(
"testing variable/constant detection...");
500 iStat +=
EqnTest(
_T(
"const1"), 2,
true);
501 iStat +=
EqnTest(
_T(
"const2"), 3,
true);
502 iStat +=
EqnTest(
_T(
"2*const"), 2,
true);
503 iStat +=
EqnTest(
_T(
"2*const1"), 4,
true);
504 iStat +=
EqnTest(
_T(
"2*const2"), 6,
true);
505 iStat +=
EqnTest(
_T(
"2*const+1"), 3,
true);
506 iStat +=
EqnTest(
_T(
"2*const1+1"), 5,
true);
507 iStat +=
EqnTest(
_T(
"2*const2+1"), 7,
true);
508 iStat +=
EqnTest(
_T(
"const"), 0,
false);
509 iStat +=
EqnTest(
_T(
"const1"), 0,
false);
510 iStat +=
EqnTest(
_T(
"const2"), 0,
false);
518 iStat +=
EqnTest(
_T(
"2*aa-1"), 3,
true);
521 iStat +=
EqnTest(
_T(
"0xff"), 255,
true);
522 iStat +=
EqnTest(
_T(
"0x97 + 0xff"), 406,
true);
540 int iCount = (int)UsedVar.size();
549 mu::varmap_type::const_iterator item = UsedVar.begin();
550 for (idx=0; item!=UsedVar.end(); ++item)
552 if (&vVarVal[idx++]!=item->second)
559 iCount = (int)UsedVar.size();
568 for (item = UsedVar.begin(); item!=UsedVar.end(); ++item)
577 iCount = (int)UsedVar.size();
578 if (iCount!=2)
throw false;
579 item = UsedVar.begin();
580 for (idx=0; item!=UsedVar.end(); ++item)
581 if (&vVarVal[idx++]!=item->second)
throw false;
592 mu::console() <<
_T(
"\n failed with ") << iStat <<
_T(
" errors") << endl;
606 iStat +=
EqnTest(
_T(
"a=10,b=20,c=a*b"), 200,
true);
607 iStat +=
EqnTest(
_T(
"1,\n2,\n3"), 3,
true);
608 iStat +=
EqnTest(
_T(
"a,\nb,\nc"), 3,
true);
609 iStat +=
EqnTest(
_T(
"a=10,\nb=20,\nc=a*b"), 200,
true);
610 iStat +=
EqnTest(
_T(
"1,\r\n2,\r\n3"), 3,
true);
611 iStat +=
EqnTest(
_T(
"a,\r\nb,\r\nc"), 3,
true);
612 iStat +=
EqnTest(
_T(
"a=10,\r\nb=20,\r\nc=a*b"), 200,
true);
615 iStat +=
EqnTest(
_T(
"f1of1(1)"), 1,
true);
616 iStat +=
EqnTest(
_T(
"f1of2(1, 2)"), 1,
true);
617 iStat +=
EqnTest(
_T(
"f2of2(1, 2)"), 2,
true);
618 iStat +=
EqnTest(
_T(
"f1of3(1, 2, 3)"), 1,
true);
619 iStat +=
EqnTest(
_T(
"f2of3(1, 2, 3)"), 2,
true);
620 iStat +=
EqnTest(
_T(
"f3of3(1, 2, 3)"), 3,
true);
621 iStat +=
EqnTest(
_T(
"f1of4(1, 2, 3, 4)"), 1,
true);
622 iStat +=
EqnTest(
_T(
"f2of4(1, 2, 3, 4)"), 2,
true);
623 iStat +=
EqnTest(
_T(
"f3of4(1, 2, 3, 4)"), 3,
true);
624 iStat +=
EqnTest(
_T(
"f4of4(1, 2, 3, 4)"), 4,
true);
625 iStat +=
EqnTest(
_T(
"f1of5(1, 2, 3, 4, 5)"), 1,
true);
626 iStat +=
EqnTest(
_T(
"f2of5(1, 2, 3, 4, 5)"), 2,
true);
627 iStat +=
EqnTest(
_T(
"f3of5(1, 2, 3, 4, 5)"), 3,
true);
628 iStat +=
EqnTest(
_T(
"f4of5(1, 2, 3, 4, 5)"), 4,
true);
629 iStat +=
EqnTest(
_T(
"f5of5(1, 2, 3, 4, 5)"), 5,
true);
631 iStat +=
EqnTest(
_T(
"1+ping()"), 11,
true);
632 iStat +=
EqnTest(
_T(
"ping()+1"), 11,
true);
633 iStat +=
EqnTest(
_T(
"2*ping()"), 20,
true);
634 iStat +=
EqnTest(
_T(
"ping()*2"), 20,
true);
635 iStat +=
EqnTest(
_T(
"ping(1,2)"), 0,
false);
636 iStat +=
EqnTest(
_T(
"1+ping(1,2)"), 0,
false);
637 iStat +=
EqnTest(
_T(
"f1of1(1,2)"), 0,
false);
638 iStat +=
EqnTest(
_T(
"f1of1()"), 0,
false);
639 iStat +=
EqnTest(
_T(
"f1of2(1, 2, 3)"), 0,
false);
640 iStat +=
EqnTest(
_T(
"f1of2(1)"), 0,
false);
641 iStat +=
EqnTest(
_T(
"f1of3(1, 2, 3, 4)"), 0,
false);
642 iStat +=
EqnTest(
_T(
"f1of3(1)"), 0,
false);
643 iStat +=
EqnTest(
_T(
"f1of4(1, 2, 3, 4, 5)"), 0,
false);
644 iStat +=
EqnTest(
_T(
"f1of4(1)"), 0,
false);
645 iStat +=
EqnTest(
_T(
"(1,2,3)"), 0,
false);
646 iStat +=
EqnTest(
_T(
"1,2,3"), 0,
false);
647 iStat +=
EqnTest(
_T(
"(1*a,2,3)"), 0,
false);
648 iStat +=
EqnTest(
_T(
"1,2*a,3"), 0,
false);
651 iStat +=
EqnTest(
_T(
"min(a, 1)"), 1,
true);
652 iStat +=
EqnTest(
_T(
"min(3*2, 1)"), 1,
true);
653 iStat +=
EqnTest(
_T(
"min(3*2, 1)"), 6,
false);
654 iStat +=
EqnTest(
_T(
"firstArg(2,3,4)"), 2,
true);
655 iStat +=
EqnTest(
_T(
"lastArg(2,3,4)"), 4,
true);
656 iStat +=
EqnTest(
_T(
"min(3*a+1, 1)"), 1,
true);
657 iStat +=
EqnTest(
_T(
"max(3*a+1, 1)"), 4,
true);
658 iStat +=
EqnTest(
_T(
"max(3*a+1, 1)*2"), 8,
true);
659 iStat +=
EqnTest(
_T(
"2*max(3*a+1, 1)+2"), 10,
true);
662 iStat +=
EqnTest(
_T(
"sum(a)"), 1,
true);
663 iStat +=
EqnTest(
_T(
"sum(1,2,3)"), 6,
true);
664 iStat +=
EqnTest(
_T(
"sum(a,b,c)"), 6,
true);
665 iStat +=
EqnTest(
_T(
"sum(1,-max(1,2),3)*2"), 4,
true);
666 iStat +=
EqnTest(
_T(
"2*sum(1,2,3)"), 12,
true);
667 iStat +=
EqnTest(
_T(
"2*sum(1,2,3)+2"), 14,
true);
668 iStat +=
EqnTest(
_T(
"2*sum(-1,2,3)+2"), 10,
true);
669 iStat +=
EqnTest(
_T(
"2*sum(-1,2,-(-a))+2"), 6,
true);
670 iStat +=
EqnTest(
_T(
"2*sum(-1,10,-a)+2"), 18,
true);
671 iStat +=
EqnTest(
_T(
"2*sum(1,2,3)*2"), 24,
true);
672 iStat +=
EqnTest(
_T(
"sum(1,-max(1,2),3)*2"), 4,
true);
673 iStat +=
EqnTest(
_T(
"sum(1*3, 4, a+2)"), 10,
true);
674 iStat +=
EqnTest(
_T(
"sum(1*3, 2*sum(1,2,2), a+2)"), 16,
true);
675 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);
678 iStat +=
EqnTest(
_T(
"sum()"), 0,
false);
679 iStat +=
EqnTest(
_T(
"sum(,)"), 0,
false);
680 iStat +=
EqnTest(
_T(
"sum(1,2,)"), 0,
false);
681 iStat +=
EqnTest(
_T(
"sum(,1,2)"), 0,
false);
686 mu::console() <<
_T(
"\n failed with ") << iStat <<
_T(
" errors") << endl;
699 iStat +=
EqnTest(
_T(
"-(+1)"), -1,
true);
700 iStat +=
EqnTest(
_T(
"-(+1)*2"), -2,
true);
701 iStat +=
EqnTest(
_T(
"-(+2)*sqrt(4)"), -4,
true);
707 iStat +=
EqnTest(
_T(
"-(-1)*2"), 2,
true);
708 iStat +=
EqnTest(
_T(
"-(-2)*sqrt(4)"), 4,
true);
713 iStat +=
EqnTest(
_T(
"-(-a)*2"), 2,
true);
716 iStat +=
EqnTest(
_T(
"-(2+1)"), -3,
true);
717 iStat +=
EqnTest(
_T(
"-(f1of1(1+2*3)+1*2)"), -9,
true);
718 iStat +=
EqnTest(
_T(
"-(-f1of1(1+2*3)+1*2)"), 5,
true);
719 iStat +=
EqnTest(
_T(
"-sin(8)"), -0.989358,
true);
720 iStat +=
EqnTest(
_T(
"3-(-a)"), 4,
true);
726 iStat +=
EqnTest(
_T(
"~f1of1(2)#"), 8,
true);
728 iStat +=
EqnTest(
_T(
"(~b)#"), 12,
true);
730 iStat +=
EqnTest(
_T(
"~(f1of1(2)#)"), 8,
true);
733 iStat +=
EqnTest(
_T(
"-(a+b)^2"),-9,
true);
735 iStat +=
EqnTest(
_T(
"-(-2^2)"),4,
true);
736 iStat +=
EqnTest(
_T(
"3+-3^2"),-6,
true);
740 iStat +=
EqnTest(
_T(
"-(1+1)'"),-4,
true);
741 iStat +=
EqnTest(
_T(
"2+-(1+1)'"),-2,
true);
742 iStat +=
EqnTest(
_T(
"2+-2'"), -2,
true);
746 iStat +=
EqnTest(
_T(
"$(a+b)^2"),9,
true);
748 iStat +=
EqnTest(
_T(
"$($2^2)"),-4,
true);
749 iStat +=
EqnTest(
_T(
"3+$3^2"),12,
true);
752 iStat +=
EqnTest(
_T(
"~ 123"), 123+2,
true);
753 iStat +=
EqnTest(
_T(
"~~ 123"), 123+2,
true);
758 mu::console() <<
_T(
"\n failed with ") << iStat <<
_T(
" errors") << endl;
771 iStat +=
EqnTest(
_T(
"3{m}+5"), 5.003,
true);
772 iStat +=
EqnTest(
_T(
"1000{m}"), 1,
true);
773 iStat +=
EqnTest(
_T(
"1000 {m}"), 1,
true);
777 iStat +=
EqnTest(
_T(
"-(a){m}"), -1
e-3,
true);
780 iStat +=
EqnTest(
_T(
"f1of1(1000){m}"), 1,
true);
781 iStat +=
EqnTest(
_T(
"-f1of1(1000){m}"), -1,
true);
782 iStat +=
EqnTest(
_T(
"-f1of1(-1000){m}"), 1,
true);
783 iStat +=
EqnTest(
_T(
"f4of4(0,0,0,1000){m}"), 1,
true);
784 iStat +=
EqnTest(
_T(
"2+(a*1000){m}"), 3,
true);
787 iStat +=
EqnTest(
_T(
"2*3000meg+2"), 2*3e9+2,
true);
790 iStat +=
EqnTest(
_T(
"1000{m}"), 0.1,
false);
791 iStat +=
EqnTest(
_T(
"(a){m}"), 2,
false);
810 mu::console() <<
_T(
"\n failed with ") << iStat <<
_T(
" errors") << endl;
824 iStat +=
EqnTest(
_T(
"2*b*5"), 20,
true);
825 iStat +=
EqnTest(
_T(
"2*b*5 + 4*b"), 28,
true);
826 iStat +=
EqnTest(
_T(
"2*a/3"), 2.0/3.0,
true);
831 iStat +=
EqnTest(
_T(
"b*3+2"), b*3+2,
true);
832 iStat +=
EqnTest(
_T(
"3*b+2"), b*3+2,
true);
833 iStat +=
EqnTest(
_T(
"2+b*3"), b*3+2,
true);
834 iStat +=
EqnTest(
_T(
"2+3*b"), b*3+2,
true);
835 iStat +=
EqnTest(
_T(
"b+3*b"), b+3*b,
true);
836 iStat +=
EqnTest(
_T(
"3*b+b"), b+3*b,
true);
838 iStat +=
EqnTest(
_T(
"2+b*3+b"), 2+b*3+b,
true);
839 iStat +=
EqnTest(
_T(
"b+2+b*3"), b+2+b*3,
true);
841 iStat +=
EqnTest(
_T(
"(2*b+1)*4"), (2*b+1)*4,
true);
842 iStat +=
EqnTest(
_T(
"4*(2*b+1)"), (2*b+1)*4,
true);
845 iStat +=
EqnTest(
_T(
"1+2-3*4/5^6"), 2.99923,
true);
846 iStat +=
EqnTest(
_T(
"1^2/3*4-5+6"), 2.33333333,
true);
849 iStat +=
EqnTest(
_T(
"(1+2)*3"), 9,
true);
850 iStat +=
EqnTest(
_T(
"(1+2)*(-3)"), -9,
true);
853 iStat +=
EqnTest(
_T(
"exp(ln(7))"), 7,
true);
854 iStat +=
EqnTest(
_T(
"e^ln(7)"), 7,
true);
855 iStat +=
EqnTest(
_T(
"e^(ln(7))"), 7,
true);
856 iStat +=
EqnTest(
_T(
"(e^(ln(7)))"), 7,
true);
857 iStat +=
EqnTest(
_T(
"1-(e^(ln(7)))"), -6,
true);
858 iStat +=
EqnTest(
_T(
"2*(e^(ln(7)))"), 14,
true);
859 iStat +=
EqnTest(
_T(
"10^log(5)"),
pow(10.0, log(5.0)),
true);
860 iStat +=
EqnTest(
_T(
"10^log10(5)"), 5,
true);
861 iStat +=
EqnTest(
_T(
"2^log2(4)"), 4,
true);
862 iStat +=
EqnTest(
_T(
"-(sin(0)+1)"), -1,
true);
863 iStat +=
EqnTest(
_T(
"-(2^1.1)"), -2.14354692,
true);
865 iStat +=
EqnTest(
_T(
"(cos(2.41)/b)"), -0.372056,
true);
866 iStat +=
EqnTest(
_T(
"(1*(2*(3*(4*(5*(6*(a+b)))))))"), 2160,
true);
867 iStat +=
EqnTest(
_T(
"(1*(2*(3*(4*(5*(6*(7*(a+b))))))))"), 15120,
true);
868 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);
872 _T(
"(((-9))-e/(((((((pi-(((-7)+(-3)/4/e))))/(((-5))-2)-((pi+(-0))*(sqrt((e+e))*(-8))*(((-pi)+(-pi)-(-9)*(6*5))")
873 _T(
"/(-e)-e))/2)/((((sqrt(2/(-e)+6)-(4-2))+((5/(-2))/(1*(-pi)+3))/8)*pi*((pi/((-2)/(-6)*1*(-1))*(-6)+(-e)))))/")
874 _T(
"((e+(-2)+(-e)*((((-3)*9+(-e)))+(-9)))))))-((((e-7+(((5/pi-(3/1+pi)))))/e)/(-5))/(sqrt((((((1+(-7))))+((((-")
875 _T(
"e)*(-e)))-8))*(-5)/((-e)))*(-6)-((((((-2)-(-9)-(-e)-1)/3))))/(sqrt((8+(e-((-6))+(9*(-9))))*(((3+2-8))*(7+6")
876 _T(
"+(-5))+((0/(-e)*(-pi))+7)))+(((((-e)/e/e)+((-6)*5)*e+(3+(-5)/pi))))+pi))/sqrt((((9))+((((pi))-8+2))+pi))/e")
877 _T(
"*4)*((-5)/(((-pi))*(sqrt(e)))))-(((((((-e)*(e)-pi))/4+(pi)*(-9)))))))+(-pi)"), -12.23016549,
true);
881 _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")
882 _T(
")+a)))*2.77)"), -2.16995656,
true);
885 iStat +=
EqnTest(
_T(
"1+2-3*4/5^6*(2*(1-5+(3*7^9)*(4+6*7-3)))+12"), -7995810.09926,
true);
890 mu::console() <<
_T(
"\n failed with ") << iStat <<
_T(
" errors") << endl;
915 iStat +=
EqnTest(
_T(
"1 ? 128 : 255"), 128,
true);
916 iStat +=
EqnTest(
_T(
"1<2 ? 128 : 255"), 128,
true);
917 iStat +=
EqnTest(
_T(
"a<b ? 128 : 255"), 128,
true);
918 iStat +=
EqnTest(
_T(
"(a<b) ? 128 : 255"), 128,
true);
919 iStat +=
EqnTest(
_T(
"(1) ? 10 : 11"), 10,
true);
920 iStat +=
EqnTest(
_T(
"(0) ? 10 : 11"), 11,
true);
921 iStat +=
EqnTest(
_T(
"(1) ? a+b : c+d"), 3,
true);
922 iStat +=
EqnTest(
_T(
"(0) ? a+b : c+d"), 1,
true);
923 iStat +=
EqnTest(
_T(
"(1) ? 0 : 1"), 0,
true);
924 iStat +=
EqnTest(
_T(
"(0) ? 0 : 1"), 1,
true);
925 iStat +=
EqnTest(
_T(
"(a<b) ? 10 : 11"), 10,
true);
926 iStat +=
EqnTest(
_T(
"(a>b) ? 10 : 11"), 11,
true);
927 iStat +=
EqnTest(
_T(
"(a<b) ? c : d"), 3,
true);
928 iStat +=
EqnTest(
_T(
"(a>b) ? c : d"), -2,
true);
930 iStat +=
EqnTest(
_T(
"(a>b) ? 1 : 0"), 0,
true);
931 iStat +=
EqnTest(
_T(
"((a>b) ? 1 : 0) ? 1 : 2"), 2,
true);
932 iStat +=
EqnTest(
_T(
"((a>b) ? 1 : 0) ? 1 : sum((a>b) ? 1 : 2)"), 2,
true);
933 iStat +=
EqnTest(
_T(
"((a>b) ? 0 : 1) ? 1 : sum((a>b) ? 1 : 2)"), 1,
true);
935 iStat +=
EqnTest(
_T(
"sum((a>b) ? 1 : 2)"), 2,
true);
936 iStat +=
EqnTest(
_T(
"sum((1) ? 1 : 2)"), 1,
true);
937 iStat +=
EqnTest(
_T(
"sum((a>b) ? 1 : 2, 100)"), 102,
true);
938 iStat +=
EqnTest(
_T(
"sum((1) ? 1 : 2, 100)"), 101,
true);
939 iStat +=
EqnTest(
_T(
"sum(3, (a>b) ? 3 : 10)"), 13,
true);
940 iStat +=
EqnTest(
_T(
"sum(3, (a<b) ? 3 : 10)"), 6,
true);
941 iStat +=
EqnTest(
_T(
"10*sum(3, (a>b) ? 3 : 10)"), 130,
true);
942 iStat +=
EqnTest(
_T(
"10*sum(3, (a<b) ? 3 : 10)"), 60,
true);
943 iStat +=
EqnTest(
_T(
"sum(3, (a>b) ? 3 : 10)*10"), 130,
true);
944 iStat +=
EqnTest(
_T(
"sum(3, (a<b) ? 3 : 10)*10"), 60,
true);
945 iStat +=
EqnTest(
_T(
"(a<b) ? sum(3, (a<b) ? 3 : 10)*10 : 99"), 60,
true);
946 iStat +=
EqnTest(
_T(
"(a>b) ? sum(3, (a<b) ? 3 : 10)*10 : 99"), 99,
true);
947 iStat +=
EqnTest(
_T(
"(a<b) ? sum(3, (a<b) ? 3 : 10,10,20)*10 : 99"), 360,
true);
948 iStat +=
EqnTest(
_T(
"(a>b) ? sum(3, (a<b) ? 3 : 10,10,20)*10 : 99"), 99,
true);
949 iStat +=
EqnTest(
_T(
"(a>b) ? sum(3, (a<b) ? 3 : 10,10,20)*10 : sum(3, (a<b) ? 3 : 10)*10"), 60,
true);
952 iStat +=
EqnTest(
_T(
"(a<b)&&(a<b) ? 128 : 255"), 128,
true);
953 iStat +=
EqnTest(
_T(
"(a>b)&&(a<b) ? 128 : 255"), 255,
true);
954 iStat +=
EqnTest(
_T(
"(1<2)&&(1<2) ? 128 : 255"), 128,
true);
955 iStat +=
EqnTest(
_T(
"(1>2)&&(1<2) ? 128 : 255"), 255,
true);
956 iStat +=
EqnTest(
_T(
"((1<2)&&(1<2)) ? 128 : 255"), 128,
true);
957 iStat +=
EqnTest(
_T(
"((1>2)&&(1<2)) ? 128 : 255"), 255,
true);
958 iStat +=
EqnTest(
_T(
"((a<b)&&(a<b)) ? 128 : 255"), 128,
true);
959 iStat +=
EqnTest(
_T(
"((a>b)&&(a<b)) ? 128 : 255"), 255,
true);
961 iStat +=
EqnTest(
_T(
"1>0 ? 1>2 ? 128 : 255 : 1>0 ? 32 : 64"), 255,
true);
962 iStat +=
EqnTest(
_T(
"1>0 ? 1>2 ? 128 : 255 :(1>0 ? 32 : 64)"), 255,
true);
963 iStat +=
EqnTest(
_T(
"1>0 ? 1>0 ? 128 : 255 : 1>2 ? 32 : 64"), 128,
true);
964 iStat +=
EqnTest(
_T(
"1>0 ? 1>0 ? 128 : 255 :(1>2 ? 32 : 64)"), 128,
true);
965 iStat +=
EqnTest(
_T(
"1>2 ? 1>2 ? 128 : 255 : 1>0 ? 32 : 64"), 32,
true);
966 iStat +=
EqnTest(
_T(
"1>2 ? 1>0 ? 128 : 255 : 1>2 ? 32 : 64"), 64,
true);
967 iStat +=
EqnTest(
_T(
"1>0 ? 50 : 1>0 ? 128 : 255"), 50,
true);
968 iStat +=
EqnTest(
_T(
"1>0 ? 50 : (1>0 ? 128 : 255)"), 50,
true);
969 iStat +=
EqnTest(
_T(
"1>0 ? 1>0 ? 128 : 255 : 50"), 128,
true);
970 iStat +=
EqnTest(
_T(
"1>2 ? 1>2 ? 128 : 255 : 1>0 ? 32 : 1>2 ? 64 : 16"), 32,
true);
971 iStat +=
EqnTest(
_T(
"1>2 ? 1>2 ? 128 : 255 : 1>0 ? 32 :(1>2 ? 64 : 16)"), 32,
true);
972 iStat +=
EqnTest(
_T(
"1>0 ? 1>2 ? 128 : 255 : 1>0 ? 32 :1>2 ? 64 : 16"), 255,
true);
973 iStat +=
EqnTest(
_T(
"1>0 ? 1>2 ? 128 : 255 : (1>0 ? 32 :1>2 ? 64 : 16)"), 255,
true);
974 iStat +=
EqnTest(
_T(
"1 ? 0 ? 128 : 255 : 1 ? 32 : 64"), 255,
true);
977 iStat +=
EqnTest(
_T(
"a= 0 ? 128 : 255, a"), 255,
true);
978 iStat +=
EqnTest(
_T(
"a=((a>b)&&(a<b)) ? 128 : 255, a"), 255,
true);
979 iStat +=
EqnTest(
_T(
"c=(a<b)&&(a<b) ? 128 : 255, c"), 128,
true);
980 iStat +=
EqnTest(
_T(
"0 ? a=a+1 : 666, a"), 1,
true);
981 iStat +=
EqnTest(
_T(
"1?a=10:a=20, a"), 10,
true);
982 iStat +=
EqnTest(
_T(
"0?a=10:a=20, a"), 20,
true);
983 iStat +=
EqnTest(
_T(
"0?a=sum(3,4):10, a"), 1,
true);
985 iStat +=
EqnTest(
_T(
"a=1?b=1?3:4:5, a"), 3,
true);
986 iStat +=
EqnTest(
_T(
"a=1?b=1?3:4:5, b"), 3,
true);
987 iStat +=
EqnTest(
_T(
"a=0?b=1?3:4:5, a"), 5,
true);
988 iStat +=
EqnTest(
_T(
"a=0?b=1?3:4:5, b"), 2,
true);
990 iStat +=
EqnTest(
_T(
"a=1?5:b=1?3:4, a"), 5,
true);
991 iStat +=
EqnTest(
_T(
"a=1?5:b=1?3:4, b"), 2,
true);
992 iStat +=
EqnTest(
_T(
"a=0?5:b=1?3:4, a"), 3,
true);
993 iStat +=
EqnTest(
_T(
"a=0?5:b=1?3:4, b"), 3,
true);
998 mu::console() <<
_T(
"\n failed with ") << iStat <<
_T(
" errors") << endl;
1022 #if defined(MUP_MATH_EXCEPTIONS) 1046 iStat +=
ThrowTest(
_T(
"valueof(\"xxx\")"), 999,
false);
1054 iStat +=
ThrowTest(
_T(
"valueof(\"\\\"abc\\\"\")"), 999,
false);
1092 mu::console() <<
_T(
"\n failed with ") << iStat <<
_T(
" errors") << endl;
1138 <<
" expressions)" << endl;
1170 if (a_bFail==
false || (a_bFail==
true && a_iErrc!=
e.GetCode()) )
1173 <<
_T(
"Expression: ") << a_str
1174 <<
_T(
" Code:") <<
e.GetCode() <<
_T(
"(") <<
e.GetMsg() <<
_T(
")")
1175 <<
_T(
" Expected:") << a_iErrc;
1178 return (a_iErrc==
e.GetCode()) ? 0 : 1;
1182 bool bRet((a_bFail==
false) ? 0 : 1);
1186 <<
_T(
"Expression: ") << a_str
1187 <<
_T(
" did evaluate; Expected error:") << a_iErrc;
1223 if ( fabs(a_fRes1-fVal[0]) > 0.0000000001)
1224 throw std::runtime_error(
"incorrect result (first pass)");
1226 if ( fabs(a_fRes2-fVal[1]) > 0.0000000001)
1227 throw std::runtime_error(
"incorrect result (second pass)");
1231 mu::console() <<
_T(
"\n fail: ") << a_str.c_str() <<
_T(
" (") <<
e.GetMsg() <<
_T(
")");
1236 mu::console() <<
_T(
"\n fail: ") << a_str.c_str() <<
_T(
" (") <<
e.what() <<
_T(
")");
1241 mu::console() <<
_T(
"\n fail: ") << a_str.c_str() <<
_T(
" (unexpected exception)");
1257 value_type fVal[5] = {-999, -998, -997, -996, -995};
1261 std::unique_ptr<Parser> p1;
1272 p1->DefineConst(
_T(
"const"), 1);
1273 p1->DefineConst(
_T(
"const1"), 2);
1274 p1->DefineConst(
_T(
"const2"), 3);
1276 p1->DefineStrConst(
_T(
"str1"),
_T(
"1.11"));
1277 p1->DefineStrConst(
_T(
"str2"),
_T(
"2.22"));
1280 p1->DefineVar(
_T(
"a"), &vVarVal[0]);
1281 p1->DefineVar(
_T(
"aa"), &vVarVal[1]);
1282 p1->DefineVar(
_T(
"b"), &vVarVal[1]);
1283 p1->DefineVar(
_T(
"c"), &vVarVal[2]);
1284 p1->DefineVar(
_T(
"d"), &vVarVal[3]);
1290 p1->DefineFun(
_T(
"ping"),
Ping);
1291 p1->DefineFun(
_T(
"f1of1"),
f1of1);
1292 p1->DefineFun(
_T(
"f1of2"),
f1of2);
1293 p1->DefineFun(
_T(
"f2of2"),
f2of2);
1294 p1->DefineFun(
_T(
"f1of3"),
f1of3);
1295 p1->DefineFun(
_T(
"f2of3"),
f2of3);
1296 p1->DefineFun(
_T(
"f3of3"),
f3of3);
1297 p1->DefineFun(
_T(
"f1of4"),
f1of4);
1298 p1->DefineFun(
_T(
"f2of4"),
f2of4);
1299 p1->DefineFun(
_T(
"f3of4"),
f3of4);
1300 p1->DefineFun(
_T(
"f4of4"),
f4of4);
1301 p1->DefineFun(
_T(
"f1of5"),
f1of5);
1302 p1->DefineFun(
_T(
"f2of5"),
f2of5);
1303 p1->DefineFun(
_T(
"f3of5"),
f3of5);
1304 p1->DefineFun(
_T(
"f4of5"),
f4of5);
1305 p1->DefineFun(
_T(
"f5of5"),
f5of5);
1308 p1->DefineOprt(
_T(
"add"),
add, 0);
1309 p1->DefineOprt(
_T(
"++"),
add, 0);
1313 p1->DefineFun(
_T(
"min"),
Min);
1314 p1->DefineFun(
_T(
"max"),
Max);
1315 p1->DefineFun(
_T(
"sum"),
Sum);
1329 p1->DefineInfixOprt(
_T(
"~"),
plus2);
1330 p1->DefineInfixOprt(
_T(
"~~"),
plus2);
1331 p1->DefinePostfixOprt(
_T(
"{m}"),
Milli);
1332 p1->DefinePostfixOprt(
_T(
"{M}"),
Mega);
1333 p1->DefinePostfixOprt(
_T(
"m"),
Milli);
1334 p1->DefinePostfixOprt(
_T(
"meg"),
Mega);
1335 p1->DefinePostfixOprt(
_T(
"#"),
times3);
1336 p1->DefinePostfixOprt(
_T(
"'"),
sqr);
1341 fVal[0] = p1->Eval();
1342 fVal[1] = p1->Eval();
1343 if (fVal[0]!=fVal[1])
1350 std::vector<mu::Parser> vParser;
1351 vParser.push_back(*(p1.get()));
1358 fVal[2] = p4.
Eval();
1365 fVal[3] = p5.
Eval();
1371 fVal[4] = v[
nNum-1];
1379 bool bCloseEnough(
true);
1380 for (
unsigned i=0; i<
sizeof(fVal)/
sizeof(
value_type); ++i)
1382 bCloseEnough &= (fabs(a_fRes-fVal[i]) <= fabs(fVal[i]*0.00001));
1388 #pragma warning(push) 1389 #pragma warning(disable:4127) 1391 if (std::numeric_limits<value_type>::has_infinity)
1393 #pragma warning(pop) 1396 bCloseEnough &= (fabs(fVal[i]) != numeric_limits<value_type>::infinity());
1400 iRet = ((bCloseEnough && a_fPass) || (!bCloseEnough && !a_fPass)) ? 0 : 1;
1406 <<
_T(
" (incorrect result; expected: ") << a_fRes
1407 <<
_T(
" ;calculated: ") << fVal[0] <<
_T(
",")
1408 << fVal[1] <<
_T(
",")
1409 << fVal[2] <<
_T(
",")
1410 << fVal[3] <<
_T(
",")
1411 << fVal[4] <<
_T(
").");
1418 if (fVal[0]!=fVal[2] && fVal[0]!=-999 && fVal[1]!=-998)
1419 mu::console() <<
_T(
"\n fail: ") << a_str.c_str() <<
_T(
" (copy construction)");
1421 mu::console() <<
_T(
"\n fail: ") << a_str.c_str() <<
_T(
" (") <<
e.GetMsg() <<
_T(
")");
1427 mu::console() <<
_T(
"\n fail: ") << a_str.c_str() <<
_T(
" (") <<
e.what() <<
_T(
")");
1432 mu::console() <<
_T(
"\n fail: ") << a_str.c_str() <<
_T(
" (unexpected exception)");
1461 if (fVal[0]!=fVal[1])
1464 iRet = ( (a_fRes==fVal[0] && a_fPass) ||
1465 (a_fRes!=fVal[0] && !a_fPass) ) ? 0 : 1;
1469 <<
_T(
" (incorrect result; expected: ") << a_fRes
1470 <<
_T(
" ;calculated: ") << fVal[0]<<
_T(
").");
1483 mu::console() <<
_T(
"\n fail: ") << a_str.c_str() <<
_T(
" (unexpected exception)");
1514 p.
Eval(vResults, nBulkSize);
1516 bool bCloseEnough(
true);
1517 for (
int i = 0; i < nBulkSize; ++i)
1519 bCloseEnough &= (fabs(a_fRes[i] - vResults[i]) <= fabs(a_fRes[i] * 0.00001));
1522 iRet = ((bCloseEnough && a_fPass) || (!bCloseEnough && !a_fPass)) ? 0 : 1;
1526 <<
_T(
" (incorrect result; expected: {") << a_fRes[0] <<
_T(
",") << a_fRes[1] <<
_T(
",") << a_fRes[2] <<
_T(
",") << a_fRes[3] <<
_T(
"}")
1527 <<
_T(
" ;calculated: ") << vResults[0] <<
_T(
",") << vResults[1] <<
_T(
",") << vResults[2] <<
_T(
",") << vResults[3] <<
_T(
"}");
1540 mu::console() <<
_T(
"\n fail: ") << a_str.c_str() <<
_T(
" (unexpected exception)");
1551 mu::console() <<
_T(
"Test failed (internal error in test class)") << endl;