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