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