| 18 | |
| 19 | Y_UNIT_TEST_SUITE(TCalcExpressionTest) { |
| 20 | Y_UNIT_TEST(TestCalcExpression) { |
| 21 | THashMap<TString, double> m; |
| 22 | m["mv"] = 32768; |
| 23 | m["big"] = 68719476736; |
| 24 | m["small"] = 1; |
| 25 | m["neg"] = -1000.; |
| 26 | |
| 27 | UNIT_ASSERT_EQUAL(CalcExpression("1 == 1", m), 1); |
| 28 | UNIT_ASSERT_EQUAL(CalcExpression("1 == 0", m), 0); |
| 29 | UNIT_ASSERT_EQUAL(CalcExpression("1 > 0", m), 1); |
| 30 | UNIT_ASSERT_EQUAL(CalcExpression("(2 - 1) > 0", m), 1); |
| 31 | UNIT_ASSERT_EQUAL(CalcExpression("(2 - 1) > 1", m), 0); |
| 32 | UNIT_ASSERT_EQUAL(CalcExpression("2 - 2 - 2", m), -2); |
| 33 | UNIT_ASSERT_EQUAL(CalcExpression("!2", m), 0); |
| 34 | UNIT_ASSERT_VALUES_EQUAL(CalcExpression("0*neg", m), 0); |
| 35 | UNIT_ASSERT_VALUES_EQUAL(CalcExpression("1 * -1000", m), -1000); |
| 36 | UNIT_ASSERT_VALUES_EQUAL(CalcExpression("1 * +1000", m), 1000); |
| 37 | UNIT_ASSERT_VALUES_EQUAL(CalcExpression("small * +1000", m), 1000); |
| 38 | UNIT_ASSERT_VALUES_EQUAL(CalcExpression("small * -1000", m), -1000); |
| 39 | UNIT_ASSERT_VALUES_EQUAL(CalcExpression("small * -small", m), -1); |
| 40 | UNIT_ASSERT_VALUES_EQUAL(CalcExpression("(small + small) * -small", m), -2); |
| 41 | UNIT_ASSERT_EQUAL(CalcExpression("!small", m), 0); |
| 42 | UNIT_ASSERT_VALUES_EQUAL(CalcExpression("0*-1000", m), 0); |
| 43 | UNIT_ASSERT_VALUES_EQUAL(CalcExpression("1||0&&0", m), 0); |
| 44 | |
| 45 | UNIT_ASSERT_EQUAL(CalcExpression("-2 + 2", m), 0); |
| 46 | UNIT_ASSERT_EQUAL(CalcExpression("mv&32768==32768", m), 1); |
| 47 | |
| 48 | UNIT_ASSERT_EQUAL(CalcExpression("big&34359738368==big&68719476736", m), 0); //big & (1<<35) != big & 1 << 36 |
| 49 | UNIT_ASSERT_EQUAL(CalcExpression("small&34359738369==1", m), 1); |
| 50 | |
| 51 | UNIT_ASSERT_EQUAL(CalcExpression("(mv&32768==32768)||(mv&32768==32768)||(2 - 2 - 2)||(2 - 2 - 2)&&(mv&32768==32768)", m), 1); |
| 52 | |
| 53 | m["a"] = 0.1; |
| 54 | m["size"] = 18; |
| 55 | UNIT_ASSERT_EQUAL(CalcExpression("(a*11) > 1", m), 1); |
| 56 | UNIT_ASSERT_EQUAL(CalcExpression("(9*a) > 1 && size > 20", m), 0); |
| 57 | UNIT_ASSERT_EQUAL(CalcExpression("2+2*2", m), 6); |
| 58 | UNIT_ASSERT_EQUAL(CalcExpression("2+2^3", m), 10); |
| 59 | UNIT_ASSERT_EQUAL(CalcExpression("2 - 20*2", m), -38); |
| 60 | UNIT_ASSERT_EQUAL(CalcExpression("1 #MIN# 2", m), 1); |
| 61 | UNIT_ASSERT_EQUAL(CalcExpression("2 #MIN# 1", m), 1); |
| 62 | UNIT_ASSERT_EQUAL(CalcExpression("1 #MAX# 2", m), 2); |
| 63 | UNIT_ASSERT_EQUAL(CalcExpression("2 #MAX# 1", m), 2); |
| 64 | UNIT_ASSERT_EQUAL(CalcExpression("2 #MAX# 1 #MIN# 3", m), 2); |
| 65 | UNIT_ASSERT_EQUAL(CalcExpression("2+2*2 #MAX# 2+2^3", m), 10); |
| 66 | UNIT_ASSERT_EQUAL(CalcExpression("2+2*2 #MIN# 2+2^3", m), 6); |
| 67 | UNIT_ASSERT_EQUAL(CalcExpression("1 < 0 #MAX# a + 100", m), 100.1); |
| 68 | UNIT_ASSERT_EQUAL(CalcExpression("(2*a^(-3)-2000)^2<=10^(-5)", m), 1); // comparison adds EPS to lhs |
| 69 | UNIT_ASSERT_EQUAL(CalcExpression("2*a^(-3)==2000", m), 1); |
| 70 | UNIT_ASSERT_EQUAL(IsNan(CalcExpression("0^0", m)), 1); |
| 71 | UNIT_ASSERT_EQUAL(IsNan(CalcExpression("0.0^0", m)), 1); |
| 72 | UNIT_ASSERT_EQUAL(CalcExpression("0.00001^0", m), 1); |
| 73 | UNIT_ASSERT_EQUAL(CalcExpression("0.0^0.00001", m), 0); |
| 74 | |
| 75 | // Sum with boolean |
| 76 | UNIT_ASSERT_EQUAL(CalcExpression("2+(2==2)", m), 3); |
| 77 | UNIT_ASSERT_EQUAL(CalcExpression("2+(2==0)", m), 2); |
nothing calls this directly
no test coverage detected