CExpressionParserTest.C 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191
  1. /*
  2. * Copyright (C) 2009 Emweb bvba, Kessel-Lo, Belgium.
  3. *
  4. * See the LICENSE file for terms of use.
  5. */
  6. #include <Wt/WMessageResources>
  7. #include <boost/test/unit_test.hpp>
  8. namespace {
  9. int eval(std::string expression, ::uint64_t n)
  10. {
  11. return Wt::WMessageResources::evalPluralCase(expression, n);
  12. }
  13. }
  14. BOOST_AUTO_TEST_CASE( cexpression_basic_expression_test )
  15. {
  16. {
  17. std::string e = "1 + 2";
  18. BOOST_REQUIRE(eval(e, -1) == 3);
  19. }
  20. {
  21. std::string e = "1 + n";
  22. BOOST_REQUIRE(eval(e, 2) == 3);
  23. }
  24. {
  25. std::string e = "3 - n";
  26. BOOST_REQUIRE(eval(e, 2) == 1);
  27. }
  28. {
  29. std::string e = "3 * n";
  30. BOOST_REQUIRE(eval(e, 2) == 6);
  31. }
  32. {
  33. std::string e = "4 / n";
  34. BOOST_REQUIRE(eval(e, 2) == 2);
  35. }
  36. {
  37. std::string e = "5 % n";
  38. BOOST_REQUIRE(eval(e, 2) == 1);
  39. }
  40. {
  41. std::string e = "(5 + n) * (n + 2) + (n * n)";
  42. BOOST_REQUIRE(eval(e, 3) == 49);
  43. }
  44. {
  45. std::string e = "n == 4";
  46. BOOST_REQUIRE(eval(e, 4) == 1);
  47. }
  48. {
  49. std::string e = "n == 3";
  50. std::string e2 = "n != 3";
  51. BOOST_REQUIRE(eval(e, 4) == 0);
  52. BOOST_REQUIRE(eval(e2, 4) == 1);
  53. BOOST_REQUIRE(eval(e + " && " + e2, 4) == 0);
  54. BOOST_REQUIRE(eval(e + " || " + e2, 4) == 1);
  55. std::string te = e + " ? n + 3 : n * n";
  56. BOOST_REQUIRE(eval(te, 3) == 6);
  57. BOOST_REQUIRE(eval(te, 4) == 16);
  58. }
  59. {
  60. std::string lt_e = "n < 3";
  61. BOOST_REQUIRE(eval(lt_e, 2) == 1);
  62. BOOST_REQUIRE(eval(lt_e, 3) == 0);
  63. BOOST_REQUIRE(eval(lt_e, 4) == 0);
  64. std::string lte_e = "n <= 3";
  65. BOOST_REQUIRE(eval(lte_e, 2) == 1);
  66. BOOST_REQUIRE(eval(lte_e, 3) == 1);
  67. BOOST_REQUIRE(eval(lte_e, 4) == 0);
  68. std::string gt_e = "n > 3";
  69. BOOST_REQUIRE(eval(gt_e, 2) == 0);
  70. BOOST_REQUIRE(eval(gt_e, 3) == 0);
  71. BOOST_REQUIRE(eval(gt_e, 4) == 1);
  72. std::string gte_e = "n >= 3";
  73. BOOST_REQUIRE(eval(gte_e, 2) == 0);
  74. BOOST_REQUIRE(eval(gte_e, 3) == 1);
  75. BOOST_REQUIRE(eval(gte_e, 4) == 1);
  76. std::string combined =
  77. lt_e + " || " + lte_e + " && " + gt_e + " && " + gte_e;
  78. BOOST_REQUIRE(eval(combined, 2) == 1);
  79. BOOST_REQUIRE(eval(combined, 3) == 0);
  80. BOOST_REQUIRE(eval(combined, 4) == 0);
  81. }
  82. {
  83. std::string e = "2 + 3 * n";
  84. BOOST_REQUIRE(eval(e, 2) == 8);
  85. }
  86. {
  87. std::string e = "2 < 3 == n";
  88. BOOST_REQUIRE(eval(e, 2) == 0);
  89. e += " || 1";
  90. BOOST_REQUIRE(eval(e, 2) == 1);
  91. e += " ? 2 : 4";
  92. BOOST_REQUIRE(eval(e, 2) == 2);
  93. }
  94. }
  95. BOOST_AUTO_TEST_CASE( cexpression_basic_languagesTest )
  96. {
  97. //Polish language expression
  98. {
  99. std::string e
  100. = "n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2";
  101. BOOST_REQUIRE(eval(e, 1) == 0);
  102. BOOST_REQUIRE(eval(e, 3) == 1);
  103. BOOST_REQUIRE(eval(e, 22) == 1);
  104. BOOST_REQUIRE(eval(e, 6) == 2);
  105. BOOST_REQUIRE(eval(e, 30) == 2);
  106. }
  107. //Japanese/Vietnamese/Korean language expression
  108. {
  109. std::string e = "0";
  110. BOOST_REQUIRE(eval(e, 0) == 0);
  111. BOOST_REQUIRE(eval(e, 1) == 0);
  112. BOOST_REQUIRE(eval(e, 3) == 0);
  113. BOOST_REQUIRE(eval(e, 22) == 0);
  114. }
  115. //English, German, Dutch, Swedish, Danish, Norwegian, Faroese,
  116. //Spanish, Portuguese, Italian, Bulgarian
  117. //Greek
  118. //Finnish, Estonian, Hungarian
  119. //Hebrew
  120. //Esperanto
  121. //Turkish
  122. //language expression
  123. {
  124. std::string e = "n != 1";
  125. BOOST_REQUIRE(eval(e, 0) == 1);
  126. BOOST_REQUIRE(eval(e, 1) == 0);
  127. BOOST_REQUIRE(eval(e, 3) == 1);
  128. BOOST_REQUIRE(eval(e, 22) == 1);
  129. }
  130. //Brazilian Portuguese, French language expression
  131. {
  132. std::string e = "n > 1";
  133. BOOST_REQUIRE(eval(e, 0) == 0);
  134. BOOST_REQUIRE(eval(e, 1) == 0);
  135. BOOST_REQUIRE(eval(e, 3) == 1);
  136. BOOST_REQUIRE(eval(e, 22) == 1);
  137. }
  138. //Russian, Ukrainian, Serbian, Croatian language expression
  139. {
  140. std::string e = "n%10==1 && n%100!=11 ? 0 :"
  141. "n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2";
  142. BOOST_REQUIRE(eval(e, 0) == 2);
  143. BOOST_REQUIRE(eval(e, 1) == 0);
  144. BOOST_REQUIRE(eval(e, 2) == 1);
  145. BOOST_REQUIRE(eval(e, 3) == 1);
  146. BOOST_REQUIRE(eval(e, 4) == 1);
  147. BOOST_REQUIRE(eval(e, 11) == 2);
  148. BOOST_REQUIRE(eval(e, 12) == 2);
  149. BOOST_REQUIRE(eval(e, 13) == 2);
  150. BOOST_REQUIRE(eval(e, 14) == 2);
  151. BOOST_REQUIRE(eval(e, 211) == 2);
  152. BOOST_REQUIRE(eval(e, 212) == 2);
  153. BOOST_REQUIRE(eval(e, 213) == 2);
  154. BOOST_REQUIRE(eval(e, 214) == 2);
  155. BOOST_REQUIRE(eval(e, 201) == 0);
  156. BOOST_REQUIRE(eval(e, 202) == 1);
  157. BOOST_REQUIRE(eval(e, 203) == 1);
  158. BOOST_REQUIRE(eval(e, 204) == 1);
  159. }
  160. }