Line data Source code
1 : // Copyright (c) 2006-2025 Made to Order Software Corp. All Rights Reserved
2 : //
3 : // https://snapwebsites.org/project/snaplogger
4 : // contact@m2osw.com
5 : //
6 : // This program is free software: you can redistribute it and/or modify
7 : // it under the terms of the GNU General Public License as published by
8 : // the Free Software Foundation, either version 3 of the License, or
9 : // (at your option) any later version.
10 : //
11 : // This program is distributed in the hope that it will be useful,
12 : // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 : // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 : // GNU General Public License for more details.
15 : //
16 : // You should have received a copy of the GNU General Public License
17 : // along with this program. If not, see <https://www.gnu.org/licenses/>.
18 :
19 : // self
20 : //
21 : #include "catch_main.h"
22 :
23 :
24 : // snaplogger
25 : //
26 : #include <snaplogger/ordinal_indicator.h>
27 :
28 :
29 : // C
30 : //
31 : #include <unistd.h>
32 :
33 :
34 :
35 2 : CATCH_TEST_CASE("ordinal_indicator_common", "[ordinal_indicator]")
36 : {
37 2 : CATCH_START_SECTION("ordinal_indicator: default settings")
38 : {
39 1 : snaplogger::ordinal_indicator ind;
40 :
41 1 : CATCH_REQUIRE(ind.language() == snaplogger::language_t::LANGUAGE_DEFAULT);
42 1 : CATCH_REQUIRE(ind.gender() == snaplogger::gender_t::GENDER_MASCULINE);
43 1 : CATCH_REQUIRE(ind.number() == snaplogger::number_t::NUMBER_SINGULAR);
44 1 : CATCH_REQUIRE(ind.secondary_form() == snaplogger::secondary_form_t::SECONDARY_FORM_FORMAL);
45 : }
46 2 : CATCH_END_SECTION()
47 :
48 2 : CATCH_START_SECTION("ordinal_indicator: test all possible parameters")
49 : {
50 1 : snaplogger::ordinal_indicator ind;
51 :
52 1 : for(snaplogger::language_t language(snaplogger::language_t::LANGUAGE_FIRST);
53 30 : language <= snaplogger::language_t::LANGUAGE_LAST;
54 29 : language = static_cast<snaplogger::language_t>(static_cast<int>(language) + 1))
55 : {
56 29 : for(snaplogger::gender_t gender(snaplogger::gender_t::GENDER_MASCULINE);
57 116 : gender <= snaplogger::gender_t::GENDER_NEUTRAL;
58 87 : gender = static_cast<snaplogger::gender_t>(static_cast<int>(gender) + 1))
59 : {
60 87 : for(snaplogger::number_t number(snaplogger::number_t::NUMBER_SINGULAR);
61 261 : number <= snaplogger::number_t::NUMBER_PLURAL;
62 174 : number = static_cast<snaplogger::number_t>(static_cast<int>(number) + 1))
63 : {
64 174 : for(snaplogger::secondary_form_t form(snaplogger::secondary_form_t::SECONDARY_FORM_ONE);
65 696 : form <= snaplogger::secondary_form_t::SECONDARY_FORM_THREE;
66 522 : form = static_cast<snaplogger::secondary_form_t>(static_cast<int>(form) + 1))
67 : {
68 522 : ind.language(language);
69 522 : ind.gender(gender);
70 522 : ind.number(number);
71 522 : ind.secondary_form(form);
72 :
73 522 : CATCH_REQUIRE(ind.language() == language);
74 522 : CATCH_REQUIRE(ind.gender() == gender);
75 522 : CATCH_REQUIRE(ind.number() == number);
76 522 : CATCH_REQUIRE(ind.secondary_form() == form);
77 : }
78 : }
79 : }
80 : }
81 : }
82 2 : CATCH_END_SECTION()
83 2 : }
84 :
85 :
86 4 : CATCH_TEST_CASE("ordinal_indicator_english", "[ordinal_indicator]")
87 : {
88 4 : CATCH_START_SECTION("ordinal_indicator: 1st 2nd 3rd 4th ... 20th")
89 : {
90 1 : snaplogger::ordinal_indicator ind;
91 :
92 1 : ind.language(snaplogger::language_t::LANGUAGE_ENGLISH);
93 :
94 3 : CATCH_REQUIRE(ind.indicator(1) == std::string("st"));
95 3 : CATCH_REQUIRE(ind.indicator(2) == std::string("nd"));
96 3 : CATCH_REQUIRE(ind.indicator(3) == std::string("rd"));
97 18 : for(int n(4); n <= 20; ++n)
98 : {
99 51 : CATCH_REQUIRE(ind.indicator(n) == std::string("th"));
100 : }
101 : }
102 4 : CATCH_END_SECTION()
103 :
104 4 : CATCH_START_SECTION("ordinal_indicator: larger numbers")
105 : {
106 1 : snaplogger::ordinal_indicator ind;
107 :
108 1 : ind.language(snaplogger::language_t::LANGUAGE_ENGLISH);
109 :
110 3 : CATCH_REQUIRE(ind.indicator(11) == std::string("th"));
111 3 : CATCH_REQUIRE(ind.indicator(111) == std::string("th"));
112 3 : CATCH_REQUIRE(ind.indicator(37'511) == std::string("th"));
113 :
114 3 : CATCH_REQUIRE(ind.indicator(12) == std::string("th"));
115 3 : CATCH_REQUIRE(ind.indicator(112) == std::string("th"));
116 :
117 3 : CATCH_REQUIRE(ind.indicator(13) == std::string("th"));
118 3 : CATCH_REQUIRE(ind.indicator(513) == std::string("th"));
119 3 : CATCH_REQUIRE(ind.indicator(915'113) == std::string("th"));
120 : }
121 4 : CATCH_END_SECTION()
122 :
123 4 : CATCH_START_SECTION("ordinal_indicator: 1st 2nd 3rd 4th with any gender & number")
124 : {
125 1 : for(snaplogger::gender_t gender(snaplogger::gender_t::GENDER_MASCULINE);
126 4 : gender <= snaplogger::gender_t::GENDER_NEUTRAL;
127 3 : gender = static_cast<snaplogger::gender_t>(static_cast<int>(gender) + 1))
128 : {
129 3 : for(snaplogger::number_t number(snaplogger::number_t::NUMBER_SINGULAR);
130 9 : number <= snaplogger::number_t::NUMBER_PLURAL;
131 6 : number = static_cast<snaplogger::number_t>(static_cast<int>(number) + 1))
132 : {
133 : //std::cerr << "test with " << static_cast<int>(gender) << " & " << static_cast<int>(number) << "\n";
134 6 : snaplogger::ordinal_indicator ind;
135 6 : ind.language(snaplogger::language_t::LANGUAGE_ENGLISH);
136 6 : ind.gender(gender);
137 6 : ind.number(number);
138 :
139 18 : CATCH_REQUIRE(ind.indicator(1) == std::string("st"));
140 18 : CATCH_REQUIRE(ind.indicator(2) == std::string("nd"));
141 18 : CATCH_REQUIRE(ind.indicator(3) == std::string("rd"));
142 108 : for(int n(4); n <= 20; ++n)
143 : {
144 306 : CATCH_REQUIRE(ind.indicator(n) == std::string("th"));
145 : }
146 :
147 : // and a few of the special cases
148 : //
149 18 : CATCH_REQUIRE(ind.indicator(11) == std::string("th"));
150 18 : CATCH_REQUIRE(ind.indicator(112) == std::string("th"));
151 18 : CATCH_REQUIRE(ind.indicator(915'113) == std::string("th"));
152 : }
153 : }
154 : }
155 4 : CATCH_END_SECTION()
156 :
157 4 : CATCH_START_SECTION("ordinal_indicator: no other forms")
158 : {
159 1 : snaplogger::ordinal_indicator ind;
160 :
161 1 : ind.language(snaplogger::language_t::LANGUAGE_ENGLISH);
162 :
163 1 : for(snaplogger::gender_t gender(snaplogger::gender_t::GENDER_MASCULINE);
164 4 : gender <= snaplogger::gender_t::GENDER_NEUTRAL;
165 3 : gender = static_cast<snaplogger::gender_t>(static_cast<int>(gender) + 1))
166 : {
167 3 : for(snaplogger::number_t number(snaplogger::number_t::NUMBER_SINGULAR);
168 9 : number <= snaplogger::number_t::NUMBER_PLURAL;
169 6 : number = static_cast<snaplogger::number_t>(static_cast<int>(number) + 1))
170 : {
171 6 : for(snaplogger::secondary_form_t form(snaplogger::secondary_form_t::SECONDARY_FORM_ONE);
172 24 : form <= snaplogger::secondary_form_t::SECONDARY_FORM_THREE;
173 18 : form = static_cast<snaplogger::secondary_form_t>(static_cast<int>(form) + 1))
174 : {
175 : //std::cerr << "test with " << static_cast<int>(gender) << " & " << static_cast<int>(number) << "\n";
176 18 : ind.gender(gender);
177 18 : ind.number(number);
178 18 : ind.secondary_form(form);
179 :
180 18 : CATCH_REQUIRE(ind.indicator(1) == std::string());
181 18 : if(form == snaplogger::secondary_form_t::SECONDARY_FORM_ONE)
182 : {
183 18 : CATCH_REQUIRE(ind.indicator(2) == std::string("d"));
184 18 : CATCH_REQUIRE(ind.indicator(3) == std::string("d"));
185 : }
186 : else
187 : {
188 12 : CATCH_REQUIRE(ind.indicator(2) == std::string());
189 12 : CATCH_REQUIRE(ind.indicator(3) == std::string());
190 : }
191 324 : for(int n(4); n <= 20; ++n)
192 : {
193 306 : CATCH_REQUIRE(ind.indicator(n) == std::string());
194 : }
195 :
196 : // and a few of the special cases
197 : //
198 18 : CATCH_REQUIRE(ind.indicator(11) == std::string());
199 18 : CATCH_REQUIRE(ind.indicator(112) == std::string());
200 18 : CATCH_REQUIRE(ind.indicator(915'113) == std::string());
201 : }
202 : }
203 : }
204 : }
205 4 : CATCH_END_SECTION()
206 4 : }
207 :
208 :
209 :
210 3 : CATCH_TEST_CASE("ordinal_indicator_french", "[ordinal_indicator]")
211 : {
212 3 : CATCH_START_SECTION("ordinal_indicator: 1re 1res 1er 1ers (first)")
213 : {
214 1 : snaplogger::ordinal_indicator ind;
215 :
216 1 : ind.language(snaplogger::language_t::LANGUAGE_FRENCH);
217 :
218 1 : ind.gender(snaplogger::gender_t::GENDER_MASCULINE);
219 1 : ind.number(snaplogger::number_t::NUMBER_SINGULAR);
220 1 : ind.secondary_form(snaplogger::secondary_form_t::SECONDARY_FORM_FORMAL);
221 3 : CATCH_REQUIRE(ind.indicator(1) == std::string("er"));
222 :
223 1 : ind.gender(snaplogger::gender_t::GENDER_MASCULINE);
224 1 : ind.number(snaplogger::number_t::NUMBER_PLURAL);
225 1 : ind.secondary_form(snaplogger::secondary_form_t::SECONDARY_FORM_FORMAL);
226 3 : CATCH_REQUIRE(ind.indicator(1) == std::string("ers"));
227 :
228 1 : ind.gender(snaplogger::gender_t::GENDER_FEMININE);
229 1 : ind.number(snaplogger::number_t::NUMBER_SINGULAR);
230 1 : ind.secondary_form(snaplogger::secondary_form_t::SECONDARY_FORM_FORMAL);
231 3 : CATCH_REQUIRE(ind.indicator(1) == std::string("re"));
232 :
233 1 : ind.gender(snaplogger::gender_t::GENDER_FEMININE);
234 1 : ind.number(snaplogger::number_t::NUMBER_PLURAL);
235 1 : ind.secondary_form(snaplogger::secondary_form_t::SECONDARY_FORM_FORMAL);
236 3 : CATCH_REQUIRE(ind.indicator(1) == std::string("res"));
237 : }
238 3 : CATCH_END_SECTION()
239 :
240 3 : CATCH_START_SECTION("ordinal_indicator: 2e 2es 2d 2ds 2de 2des 2nd 2nds 2nde 2ndes 2eme 2emes (second)")
241 : {
242 1 : snaplogger::ordinal_indicator ind;
243 :
244 1 : ind.language(snaplogger::language_t::LANGUAGE_FRENCH);
245 :
246 1 : ind.gender(snaplogger::gender_t::GENDER_MASCULINE);
247 1 : ind.number(snaplogger::number_t::NUMBER_SINGULAR);
248 1 : ind.secondary_form(snaplogger::secondary_form_t::SECONDARY_FORM_FORMAL);
249 3 : CATCH_REQUIRE(ind.indicator(2) == std::string("e"));
250 :
251 1 : ind.gender(snaplogger::gender_t::GENDER_MASCULINE);
252 1 : ind.number(snaplogger::number_t::NUMBER_PLURAL);
253 1 : ind.secondary_form(snaplogger::secondary_form_t::SECONDARY_FORM_FORMAL);
254 3 : CATCH_REQUIRE(ind.indicator(2) == std::string("es"));
255 :
256 1 : ind.gender(snaplogger::gender_t::GENDER_FEMININE);
257 1 : ind.number(snaplogger::number_t::NUMBER_SINGULAR);
258 1 : ind.secondary_form(snaplogger::secondary_form_t::SECONDARY_FORM_FORMAL);
259 3 : CATCH_REQUIRE(ind.indicator(2) == std::string("e"));
260 :
261 1 : ind.gender(snaplogger::gender_t::GENDER_FEMININE);
262 1 : ind.number(snaplogger::number_t::NUMBER_PLURAL);
263 1 : ind.secondary_form(snaplogger::secondary_form_t::SECONDARY_FORM_FORMAL);
264 3 : CATCH_REQUIRE(ind.indicator(2) == std::string("es"));
265 :
266 1 : ind.gender(snaplogger::gender_t::GENDER_MASCULINE);
267 1 : ind.number(snaplogger::number_t::NUMBER_SINGULAR);
268 1 : ind.secondary_form(snaplogger::secondary_form_t::SECONDARY_FORM_ONE);
269 3 : CATCH_REQUIRE(ind.indicator(2) == std::string("\xC3\xA8me"));
270 :
271 1 : ind.gender(snaplogger::gender_t::GENDER_MASCULINE);
272 1 : ind.number(snaplogger::number_t::NUMBER_PLURAL);
273 1 : ind.secondary_form(snaplogger::secondary_form_t::SECONDARY_FORM_ONE);
274 3 : CATCH_REQUIRE(ind.indicator(2) == std::string("\xC3\xA8mes"));
275 :
276 1 : ind.gender(snaplogger::gender_t::GENDER_FEMININE);
277 1 : ind.number(snaplogger::number_t::NUMBER_SINGULAR);
278 1 : ind.secondary_form(snaplogger::secondary_form_t::SECONDARY_FORM_ONE);
279 3 : CATCH_REQUIRE(ind.indicator(2) == std::string("\xC3\xA8me"));
280 :
281 1 : ind.gender(snaplogger::gender_t::GENDER_FEMININE);
282 1 : ind.number(snaplogger::number_t::NUMBER_PLURAL);
283 1 : ind.secondary_form(snaplogger::secondary_form_t::SECONDARY_FORM_ONE);
284 3 : CATCH_REQUIRE(ind.indicator(2) == std::string("\xC3\xA8mes"));
285 :
286 1 : ind.gender(snaplogger::gender_t::GENDER_MASCULINE);
287 1 : ind.number(snaplogger::number_t::NUMBER_SINGULAR);
288 1 : ind.secondary_form(snaplogger::secondary_form_t::SECONDARY_FORM_TWO);
289 3 : CATCH_REQUIRE(ind.indicator(2) == std::string("i\xC3\xA8me"));
290 :
291 1 : ind.gender(snaplogger::gender_t::GENDER_MASCULINE);
292 1 : ind.number(snaplogger::number_t::NUMBER_PLURAL);
293 1 : ind.secondary_form(snaplogger::secondary_form_t::SECONDARY_FORM_TWO);
294 3 : CATCH_REQUIRE(ind.indicator(2) == std::string("i\xC3\xA8mes"));
295 :
296 1 : ind.gender(snaplogger::gender_t::GENDER_FEMININE);
297 1 : ind.number(snaplogger::number_t::NUMBER_SINGULAR);
298 1 : ind.secondary_form(snaplogger::secondary_form_t::SECONDARY_FORM_TWO);
299 3 : CATCH_REQUIRE(ind.indicator(2) == std::string("i\xC3\xA8me"));
300 :
301 1 : ind.gender(snaplogger::gender_t::GENDER_FEMININE);
302 1 : ind.number(snaplogger::number_t::NUMBER_PLURAL);
303 1 : ind.secondary_form(snaplogger::secondary_form_t::SECONDARY_FORM_TWO);
304 3 : CATCH_REQUIRE(ind.indicator(2) == std::string("i\xC3\xA8mes"));
305 :
306 1 : ind.gender(snaplogger::gender_t::GENDER_MASCULINE);
307 1 : ind.number(snaplogger::number_t::NUMBER_SINGULAR);
308 1 : ind.secondary_form(snaplogger::secondary_form_t::SECONDARY_FORM_THREE);
309 3 : CATCH_REQUIRE(ind.indicator(2) == std::string("d"));
310 :
311 1 : ind.gender(snaplogger::gender_t::GENDER_MASCULINE);
312 1 : ind.number(snaplogger::number_t::NUMBER_PLURAL);
313 1 : ind.secondary_form(snaplogger::secondary_form_t::SECONDARY_FORM_THREE);
314 3 : CATCH_REQUIRE(ind.indicator(2) == std::string("ds"));
315 :
316 1 : ind.gender(snaplogger::gender_t::GENDER_FEMININE);
317 1 : ind.number(snaplogger::number_t::NUMBER_SINGULAR);
318 1 : ind.secondary_form(snaplogger::secondary_form_t::SECONDARY_FORM_THREE);
319 3 : CATCH_REQUIRE(ind.indicator(2) == std::string("de"));
320 :
321 1 : ind.gender(snaplogger::gender_t::GENDER_FEMININE);
322 1 : ind.number(snaplogger::number_t::NUMBER_PLURAL);
323 1 : ind.secondary_form(snaplogger::secondary_form_t::SECONDARY_FORM_THREE);
324 3 : CATCH_REQUIRE(ind.indicator(2) == std::string("des"));
325 :
326 1 : ind.gender(snaplogger::gender_t::GENDER_MASCULINE);
327 1 : ind.number(snaplogger::number_t::NUMBER_SINGULAR);
328 1 : ind.secondary_form(snaplogger::secondary_form_t::SECONDARY_FORM_FOUR);
329 3 : CATCH_REQUIRE(ind.indicator(2) == std::string("nd"));
330 :
331 1 : ind.gender(snaplogger::gender_t::GENDER_MASCULINE);
332 1 : ind.number(snaplogger::number_t::NUMBER_PLURAL);
333 1 : ind.secondary_form(snaplogger::secondary_form_t::SECONDARY_FORM_FOUR);
334 3 : CATCH_REQUIRE(ind.indicator(2) == std::string("nds"));
335 :
336 1 : ind.gender(snaplogger::gender_t::GENDER_FEMININE);
337 1 : ind.number(snaplogger::number_t::NUMBER_SINGULAR);
338 1 : ind.secondary_form(snaplogger::secondary_form_t::SECONDARY_FORM_FOUR);
339 3 : CATCH_REQUIRE(ind.indicator(2) == std::string("nde"));
340 :
341 1 : ind.gender(snaplogger::gender_t::GENDER_FEMININE);
342 1 : ind.number(snaplogger::number_t::NUMBER_PLURAL);
343 1 : ind.secondary_form(snaplogger::secondary_form_t::SECONDARY_FORM_FOUR);
344 3 : CATCH_REQUIRE(ind.indicator(2) == std::string("ndes"));
345 : }
346 3 : CATCH_END_SECTION()
347 :
348 3 : CATCH_START_SECTION("ordinal_indicator: Ne Nes Neme Nemes Nieme Niemes (second)")
349 : {
350 1 : snaplogger::ordinal_indicator ind;
351 :
352 1 : ind.language(snaplogger::language_t::LANGUAGE_FRENCH);
353 :
354 998 : for(int n(3); n < 1'000; ++n)
355 : {
356 997 : ind.gender(snaplogger::gender_t::GENDER_MASCULINE);
357 997 : ind.number(snaplogger::number_t::NUMBER_SINGULAR);
358 997 : ind.secondary_form(snaplogger::secondary_form_t::SECONDARY_FORM_FORMAL);
359 2991 : CATCH_REQUIRE(ind.indicator(n) == std::string("e"));
360 :
361 997 : ind.gender(snaplogger::gender_t::GENDER_MASCULINE);
362 997 : ind.number(snaplogger::number_t::NUMBER_PLURAL);
363 997 : ind.secondary_form(snaplogger::secondary_form_t::SECONDARY_FORM_FORMAL);
364 2991 : CATCH_REQUIRE(ind.indicator(n) == std::string("es"));
365 :
366 997 : ind.gender(snaplogger::gender_t::GENDER_FEMININE);
367 997 : ind.number(snaplogger::number_t::NUMBER_SINGULAR);
368 997 : ind.secondary_form(snaplogger::secondary_form_t::SECONDARY_FORM_FORMAL);
369 2991 : CATCH_REQUIRE(ind.indicator(n) == std::string("e"));
370 :
371 997 : ind.gender(snaplogger::gender_t::GENDER_FEMININE);
372 997 : ind.number(snaplogger::number_t::NUMBER_PLURAL);
373 997 : ind.secondary_form(snaplogger::secondary_form_t::SECONDARY_FORM_FORMAL);
374 2991 : CATCH_REQUIRE(ind.indicator(n) == std::string("es"));
375 :
376 997 : ind.gender(snaplogger::gender_t::GENDER_MASCULINE);
377 997 : ind.number(snaplogger::number_t::NUMBER_SINGULAR);
378 997 : ind.secondary_form(snaplogger::secondary_form_t::SECONDARY_FORM_ONE);
379 2991 : CATCH_REQUIRE(ind.indicator(n) == std::string("\xC3\xA8me"));
380 :
381 997 : ind.gender(snaplogger::gender_t::GENDER_MASCULINE);
382 997 : ind.number(snaplogger::number_t::NUMBER_PLURAL);
383 997 : ind.secondary_form(snaplogger::secondary_form_t::SECONDARY_FORM_ONE);
384 2991 : CATCH_REQUIRE(ind.indicator(n) == std::string("\xC3\xA8mes"));
385 :
386 997 : ind.gender(snaplogger::gender_t::GENDER_FEMININE);
387 997 : ind.number(snaplogger::number_t::NUMBER_SINGULAR);
388 997 : ind.secondary_form(snaplogger::secondary_form_t::SECONDARY_FORM_ONE);
389 2991 : CATCH_REQUIRE(ind.indicator(n) == std::string("\xC3\xA8me"));
390 :
391 997 : ind.gender(snaplogger::gender_t::GENDER_FEMININE);
392 997 : ind.number(snaplogger::number_t::NUMBER_PLURAL);
393 997 : ind.secondary_form(snaplogger::secondary_form_t::SECONDARY_FORM_ONE);
394 2991 : CATCH_REQUIRE(ind.indicator(n) == std::string("\xC3\xA8mes"));
395 :
396 997 : ind.gender(snaplogger::gender_t::GENDER_MASCULINE);
397 997 : ind.number(snaplogger::number_t::NUMBER_SINGULAR);
398 997 : ind.secondary_form(snaplogger::secondary_form_t::SECONDARY_FORM_TWO);
399 2991 : CATCH_REQUIRE(ind.indicator(n) == std::string("i\xC3\xA8me"));
400 :
401 997 : ind.gender(snaplogger::gender_t::GENDER_MASCULINE);
402 997 : ind.number(snaplogger::number_t::NUMBER_PLURAL);
403 997 : ind.secondary_form(snaplogger::secondary_form_t::SECONDARY_FORM_TWO);
404 2991 : CATCH_REQUIRE(ind.indicator(n) == std::string("i\xC3\xA8mes"));
405 :
406 997 : ind.gender(snaplogger::gender_t::GENDER_FEMININE);
407 997 : ind.number(snaplogger::number_t::NUMBER_SINGULAR);
408 997 : ind.secondary_form(snaplogger::secondary_form_t::SECONDARY_FORM_TWO);
409 2991 : CATCH_REQUIRE(ind.indicator(n) == std::string("i\xC3\xA8me"));
410 :
411 997 : ind.gender(snaplogger::gender_t::GENDER_FEMININE);
412 997 : ind.number(snaplogger::number_t::NUMBER_PLURAL);
413 997 : ind.secondary_form(snaplogger::secondary_form_t::SECONDARY_FORM_TWO);
414 2991 : CATCH_REQUIRE(ind.indicator(n) == std::string("i\xC3\xA8mes"));
415 : }
416 : }
417 3 : CATCH_END_SECTION()
418 3 : }
419 :
420 :
421 :
422 3 : CATCH_TEST_CASE("ordinal_indicator_provincial", "[ordinal_indicator]")
423 : {
424 3 : CATCH_START_SECTION("ordinal_indicator: 1r 1re")
425 : {
426 1 : snaplogger::ordinal_indicator ind;
427 :
428 1 : ind.language(snaplogger::language_t::LANGUAGE_FRANCOPROVENCAL);
429 :
430 1 : ind.gender(snaplogger::gender_t::GENDER_MASCULINE);
431 1 : ind.number(snaplogger::number_t::NUMBER_SINGULAR);
432 1 : ind.secondary_form(snaplogger::secondary_form_t::SECONDARY_FORM_FORMAL);
433 3 : CATCH_REQUIRE(ind.indicator(1) == std::string("\xC3\xA9r"));
434 :
435 1 : ind.gender(snaplogger::gender_t::GENDER_MASCULINE);
436 1 : ind.number(snaplogger::number_t::NUMBER_PLURAL);
437 1 : ind.secondary_form(snaplogger::secondary_form_t::SECONDARY_FORM_FORMAL);
438 3 : CATCH_REQUIRE(ind.indicator(1) == std::string("\xC3\xA9r"));
439 :
440 1 : ind.gender(snaplogger::gender_t::GENDER_FEMININE);
441 1 : ind.number(snaplogger::number_t::NUMBER_SINGULAR);
442 1 : ind.secondary_form(snaplogger::secondary_form_t::SECONDARY_FORM_FORMAL);
443 3 : CATCH_REQUIRE(ind.indicator(1) == std::string("\xC3\xA9re"));
444 :
445 1 : ind.gender(snaplogger::gender_t::GENDER_FEMININE);
446 1 : ind.number(snaplogger::number_t::NUMBER_PLURAL);
447 1 : ind.secondary_form(snaplogger::secondary_form_t::SECONDARY_FORM_FORMAL);
448 3 : CATCH_REQUIRE(ind.indicator(1) == std::string("\xC3\xA9re"));
449 : }
450 3 : CATCH_END_SECTION()
451 :
452 3 : CATCH_START_SECTION("ordinal_indicator: 2nd 2nda 2emo 2ema (second)")
453 : {
454 1 : snaplogger::ordinal_indicator ind;
455 :
456 1 : ind.language(snaplogger::language_t::LANGUAGE_FRANCOPROVENCAL);
457 :
458 1 : ind.gender(snaplogger::gender_t::GENDER_MASCULINE);
459 1 : ind.number(snaplogger::number_t::NUMBER_SINGULAR);
460 1 : ind.secondary_form(snaplogger::secondary_form_t::SECONDARY_FORM_FORMAL);
461 3 : CATCH_REQUIRE(ind.indicator(2) == std::string("\xC3\xA9mo"));
462 :
463 1 : ind.gender(snaplogger::gender_t::GENDER_MASCULINE);
464 1 : ind.number(snaplogger::number_t::NUMBER_PLURAL);
465 1 : ind.secondary_form(snaplogger::secondary_form_t::SECONDARY_FORM_FORMAL);
466 3 : CATCH_REQUIRE(ind.indicator(2) == std::string("\xC3\xA9mo"));
467 :
468 1 : ind.gender(snaplogger::gender_t::GENDER_FEMININE);
469 1 : ind.number(snaplogger::number_t::NUMBER_SINGULAR);
470 1 : ind.secondary_form(snaplogger::secondary_form_t::SECONDARY_FORM_FORMAL);
471 3 : CATCH_REQUIRE(ind.indicator(2) == std::string("\xC3\xA9ma"));
472 :
473 1 : ind.gender(snaplogger::gender_t::GENDER_FEMININE);
474 1 : ind.number(snaplogger::number_t::NUMBER_PLURAL);
475 1 : ind.secondary_form(snaplogger::secondary_form_t::SECONDARY_FORM_FORMAL);
476 3 : CATCH_REQUIRE(ind.indicator(2) == std::string("\xC3\xA9ma"));
477 :
478 1 : ind.gender(snaplogger::gender_t::GENDER_MASCULINE);
479 1 : ind.number(snaplogger::number_t::NUMBER_SINGULAR);
480 1 : ind.secondary_form(snaplogger::secondary_form_t::SECONDARY_FORM_ONE);
481 3 : CATCH_REQUIRE(ind.indicator(2) == std::string("nd"));
482 :
483 1 : ind.gender(snaplogger::gender_t::GENDER_MASCULINE);
484 1 : ind.number(snaplogger::number_t::NUMBER_PLURAL);
485 1 : ind.secondary_form(snaplogger::secondary_form_t::SECONDARY_FORM_ONE);
486 3 : CATCH_REQUIRE(ind.indicator(2) == std::string("nd"));
487 :
488 1 : ind.gender(snaplogger::gender_t::GENDER_FEMININE);
489 1 : ind.number(snaplogger::number_t::NUMBER_SINGULAR);
490 1 : ind.secondary_form(snaplogger::secondary_form_t::SECONDARY_FORM_ONE);
491 3 : CATCH_REQUIRE(ind.indicator(2) == std::string("nda"));
492 :
493 1 : ind.gender(snaplogger::gender_t::GENDER_FEMININE);
494 1 : ind.number(snaplogger::number_t::NUMBER_PLURAL);
495 1 : ind.secondary_form(snaplogger::secondary_form_t::SECONDARY_FORM_ONE);
496 3 : CATCH_REQUIRE(ind.indicator(2) == std::string("nda"));
497 : }
498 3 : CATCH_END_SECTION()
499 :
500 3 : CATCH_START_SECTION("ordinal_indicator: Nemo Nema")
501 : {
502 1 : snaplogger::ordinal_indicator ind;
503 :
504 1 : ind.language(snaplogger::language_t::LANGUAGE_FRANCOPROVENCAL);
505 :
506 998 : for(int n(3); n < 1'000; ++n)
507 : {
508 997 : ind.gender(snaplogger::gender_t::GENDER_MASCULINE);
509 997 : ind.number(snaplogger::number_t::NUMBER_SINGULAR);
510 997 : ind.secondary_form(snaplogger::secondary_form_t::SECONDARY_FORM_FORMAL);
511 2991 : CATCH_REQUIRE(ind.indicator(n) == std::string("\xC3\xA9mo"));
512 :
513 997 : ind.gender(snaplogger::gender_t::GENDER_MASCULINE);
514 997 : ind.number(snaplogger::number_t::NUMBER_PLURAL);
515 997 : ind.secondary_form(snaplogger::secondary_form_t::SECONDARY_FORM_FORMAL);
516 2991 : CATCH_REQUIRE(ind.indicator(n) == std::string("\xC3\xA9mo"));
517 :
518 997 : ind.gender(snaplogger::gender_t::GENDER_FEMININE);
519 997 : ind.number(snaplogger::number_t::NUMBER_SINGULAR);
520 997 : ind.secondary_form(snaplogger::secondary_form_t::SECONDARY_FORM_FORMAL);
521 2991 : CATCH_REQUIRE(ind.indicator(n) == std::string("\xC3\xA9ma"));
522 :
523 997 : ind.gender(snaplogger::gender_t::GENDER_FEMININE);
524 997 : ind.number(snaplogger::number_t::NUMBER_PLURAL);
525 997 : ind.secondary_form(snaplogger::secondary_form_t::SECONDARY_FORM_FORMAL);
526 2991 : CATCH_REQUIRE(ind.indicator(n) == std::string("\xC3\xA9ma"));
527 : }
528 : }
529 3 : CATCH_END_SECTION()
530 3 : }
531 :
532 :
533 :
534 1 : CATCH_TEST_CASE("ordinal_indicator_breton", "[ordinal_indicator]")
535 : {
536 1 : CATCH_START_SECTION("ordinal_indicator: 1an 2l 3de 4re 5vet")
537 : {
538 1 : snaplogger::ordinal_indicator ind;
539 :
540 1 : ind.language(snaplogger::language_t::LANGUAGE_BRETON);
541 :
542 1 : for(snaplogger::gender_t gender(snaplogger::gender_t::GENDER_MASCULINE);
543 4 : gender <= snaplogger::gender_t::GENDER_NEUTRAL;
544 3 : gender = static_cast<snaplogger::gender_t>(static_cast<int>(gender) + 1))
545 : {
546 3 : for(snaplogger::number_t number(snaplogger::number_t::NUMBER_SINGULAR);
547 9 : number <= snaplogger::number_t::NUMBER_PLURAL;
548 6 : number = static_cast<snaplogger::number_t>(static_cast<int>(number) + 1))
549 : {
550 6 : ind.gender(gender);
551 6 : ind.number(number);
552 :
553 18 : CATCH_REQUIRE(ind.indicator(1) == std::string("a\xC3\xB1"));
554 18 : CATCH_REQUIRE(ind.indicator(2) == std::string("l"));
555 18 : CATCH_REQUIRE(ind.indicator(3) == std::string("de"));
556 18 : CATCH_REQUIRE(ind.indicator(4) == std::string("re"));
557 :
558 5976 : for(int n(5); n < 1'000; ++n)
559 : {
560 17910 : CATCH_REQUIRE(ind.indicator(n) == std::string("vet"));
561 : }
562 : }
563 : }
564 : }
565 1 : CATCH_END_SECTION()
566 1 : }
567 :
568 :
569 3 : CATCH_TEST_CASE("ordinal_indicator_occitan", "[ordinal_indicator]")
570 : {
571 3 : CATCH_START_SECTION("ordinal_indicator: occitan: 1er 1era (first)")
572 : {
573 1 : snaplogger::ordinal_indicator ind;
574 :
575 1 : ind.language(snaplogger::language_t::LANGUAGE_OCCITAN);
576 :
577 1 : ind.gender(snaplogger::gender_t::GENDER_MASCULINE);
578 1 : ind.number(snaplogger::number_t::NUMBER_SINGULAR);
579 1 : ind.secondary_form(snaplogger::secondary_form_t::SECONDARY_FORM_FORMAL);
580 3 : CATCH_REQUIRE(ind.indicator(1) == std::string("\xC3\xA8r"));
581 :
582 1 : ind.gender(snaplogger::gender_t::GENDER_MASCULINE);
583 1 : ind.number(snaplogger::number_t::NUMBER_PLURAL);
584 1 : ind.secondary_form(snaplogger::secondary_form_t::SECONDARY_FORM_FORMAL);
585 3 : CATCH_REQUIRE(ind.indicator(1) == std::string("\xC3\xA8r"));
586 :
587 1 : ind.gender(snaplogger::gender_t::GENDER_FEMININE);
588 1 : ind.number(snaplogger::number_t::NUMBER_SINGULAR);
589 1 : ind.secondary_form(snaplogger::secondary_form_t::SECONDARY_FORM_FORMAL);
590 3 : CATCH_REQUIRE(ind.indicator(1) == std::string("\xC3\xA8ra"));
591 :
592 1 : ind.gender(snaplogger::gender_t::GENDER_FEMININE);
593 1 : ind.number(snaplogger::number_t::NUMBER_PLURAL);
594 1 : ind.secondary_form(snaplogger::secondary_form_t::SECONDARY_FORM_FORMAL);
595 3 : CATCH_REQUIRE(ind.indicator(1) == std::string("\xC3\xA8ra"));
596 : }
597 3 : CATCH_END_SECTION()
598 :
599 3 : CATCH_START_SECTION("ordinal_indicator: occitan: 2nd 2nda (second)")
600 : {
601 1 : snaplogger::ordinal_indicator ind;
602 :
603 1 : ind.language(snaplogger::language_t::LANGUAGE_OCCITAN);
604 :
605 1 : ind.gender(snaplogger::gender_t::GENDER_MASCULINE);
606 1 : ind.number(snaplogger::number_t::NUMBER_SINGULAR);
607 1 : ind.secondary_form(snaplogger::secondary_form_t::SECONDARY_FORM_FORMAL);
608 3 : CATCH_REQUIRE(ind.indicator(2) == std::string("nd"));
609 :
610 1 : ind.gender(snaplogger::gender_t::GENDER_MASCULINE);
611 1 : ind.number(snaplogger::number_t::NUMBER_PLURAL);
612 1 : ind.secondary_form(snaplogger::secondary_form_t::SECONDARY_FORM_FORMAL);
613 3 : CATCH_REQUIRE(ind.indicator(2) == std::string("nd"));
614 :
615 1 : ind.gender(snaplogger::gender_t::GENDER_FEMININE);
616 1 : ind.number(snaplogger::number_t::NUMBER_SINGULAR);
617 1 : ind.secondary_form(snaplogger::secondary_form_t::SECONDARY_FORM_FORMAL);
618 3 : CATCH_REQUIRE(ind.indicator(2) == std::string("nda"));
619 :
620 1 : ind.gender(snaplogger::gender_t::GENDER_FEMININE);
621 1 : ind.number(snaplogger::number_t::NUMBER_PLURAL);
622 1 : ind.secondary_form(snaplogger::secondary_form_t::SECONDARY_FORM_FORMAL);
623 3 : CATCH_REQUIRE(ind.indicator(2) == std::string("nda"));
624 : }
625 3 : CATCH_END_SECTION()
626 :
627 3 : CATCH_START_SECTION("ordinal_indicator: Nen Nena")
628 : {
629 1 : snaplogger::ordinal_indicator ind;
630 :
631 1 : ind.language(snaplogger::language_t::LANGUAGE_OCCITAN);
632 :
633 998 : for(int n(3); n < 1'000; ++n)
634 : {
635 997 : ind.gender(snaplogger::gender_t::GENDER_MASCULINE);
636 997 : ind.number(snaplogger::number_t::NUMBER_SINGULAR);
637 997 : ind.secondary_form(snaplogger::secondary_form_t::SECONDARY_FORM_FORMAL);
638 2991 : CATCH_REQUIRE(ind.indicator(n) == std::string("en"));
639 :
640 997 : ind.gender(snaplogger::gender_t::GENDER_MASCULINE);
641 997 : ind.number(snaplogger::number_t::NUMBER_PLURAL);
642 997 : ind.secondary_form(snaplogger::secondary_form_t::SECONDARY_FORM_FORMAL);
643 2991 : CATCH_REQUIRE(ind.indicator(n) == std::string("en"));
644 :
645 997 : ind.gender(snaplogger::gender_t::GENDER_FEMININE);
646 997 : ind.number(snaplogger::number_t::NUMBER_SINGULAR);
647 997 : ind.secondary_form(snaplogger::secondary_form_t::SECONDARY_FORM_FORMAL);
648 2991 : CATCH_REQUIRE(ind.indicator(n) == std::string("ena"));
649 :
650 997 : ind.gender(snaplogger::gender_t::GENDER_FEMININE);
651 997 : ind.number(snaplogger::number_t::NUMBER_PLURAL);
652 997 : ind.secondary_form(snaplogger::secondary_form_t::SECONDARY_FORM_FORMAL);
653 2991 : CATCH_REQUIRE(ind.indicator(n) == std::string("ena"));
654 : }
655 : }
656 3 : CATCH_END_SECTION()
657 3 : }
658 :
659 :
660 :
661 1 : CATCH_TEST_CASE("ordinal_indicator_russian", "[ordinal_indicator]")
662 : {
663 1 : CATCH_START_SECTION("ordinal_indicator: singular plural neutral in russian")
664 : {
665 1 : snaplogger::ordinal_indicator ind;
666 :
667 1 : ind.language(snaplogger::language_t::LANGUAGE_RUSSIAN);
668 :
669 1 : for(snaplogger::number_t number(snaplogger::number_t::NUMBER_SINGULAR);
670 3 : number <= snaplogger::number_t::NUMBER_PLURAL;
671 2 : number = static_cast<snaplogger::number_t>(static_cast<int>(number) + 1))
672 : {
673 2 : ind.number(number);
674 :
675 2 : ind.gender(snaplogger::gender_t::GENDER_MASCULINE);
676 22 : for(int n(1); n <= 10; ++n)
677 : {
678 60 : CATCH_REQUIRE(ind.indicator(n) == std::string("-\xD0\xB9"));
679 : }
680 :
681 2 : ind.gender(snaplogger::gender_t::GENDER_FEMININE);
682 22 : for(int n(1); n <= 10; ++n)
683 : {
684 60 : CATCH_REQUIRE(ind.indicator(n) == std::string("-\xD1\x8F"));
685 : }
686 :
687 2 : ind.gender(snaplogger::gender_t::GENDER_NEUTRAL);
688 22 : for(int n(1); n <= 10; ++n)
689 : {
690 60 : CATCH_REQUIRE(ind.indicator(n) == std::string("-\xD0\xB5"));
691 : }
692 : }
693 : }
694 1 : CATCH_END_SECTION()
695 1 : }
696 :
697 :
698 1 : CATCH_TEST_CASE("ordinal_indicator_period", "[ordinal_indicator]")
699 : {
700 1 : CATCH_START_SECTION("ordinal_indicator: languages using a period")
701 : {
702 1 : snaplogger::ordinal_indicator ind;
703 :
704 1 : snaplogger::language_t lang[] = {
705 : snaplogger::language_t::LANGUAGE_BASQUE,
706 : snaplogger::language_t::LANGUAGE_BOSNIAN,
707 : snaplogger::language_t::LANGUAGE_CROATIAN,
708 : snaplogger::language_t::LANGUAGE_CZECH,
709 : snaplogger::language_t::LANGUAGE_FAROESE,
710 : snaplogger::language_t::LANGUAGE_FINNISH,
711 : snaplogger::language_t::LANGUAGE_GERMAN,
712 : snaplogger::language_t::LANGUAGE_ICELANDIC,
713 : snaplogger::language_t::LANGUAGE_LATVIAN,
714 : snaplogger::language_t::LANGUAGE_MONTENEGRIN,
715 : snaplogger::language_t::LANGUAGE_NORWEGIAN,
716 : snaplogger::language_t::LANGUAGE_SERBIAN,
717 : snaplogger::language_t::LANGUAGE_SLOVAK,
718 : snaplogger::language_t::LANGUAGE_SLOVENE,
719 : snaplogger::language_t::LANGUAGE_TURKISH,
720 : };
721 :
722 16 : for(auto l : lang)
723 : {
724 15 : ind.language(l);
725 :
726 15 : for(snaplogger::number_t number(snaplogger::number_t::NUMBER_SINGULAR);
727 45 : number <= snaplogger::number_t::NUMBER_PLURAL;
728 30 : number = static_cast<snaplogger::number_t>(static_cast<int>(number) + 1))
729 : {
730 30 : for(snaplogger::gender_t gender(snaplogger::gender_t::GENDER_MASCULINE);
731 120 : gender <= snaplogger::gender_t::GENDER_NEUTRAL;
732 90 : gender = static_cast<snaplogger::gender_t>(static_cast<int>(gender) + 1))
733 : {
734 90 : ind.number(number);
735 90 : ind.gender(gender);
736 :
737 90090 : for(int n(1); n <= 1'000; ++n)
738 : {
739 270000 : CATCH_REQUIRE(ind.indicator(n) == std::string("."));
740 : }
741 : }
742 : }
743 : }
744 : }
745 1 : CATCH_END_SECTION()
746 1 : }
747 :
748 :
749 2 : CATCH_TEST_CASE("ordinal_indicator_other_latin", "[ordinal_indicator]")
750 : {
751 2 : CATCH_START_SECTION("ordinal_indicator: other latin languages")
752 : {
753 1 : snaplogger::ordinal_indicator ind;
754 :
755 1 : snaplogger::language_t lang[] = {
756 : snaplogger::language_t::LANGUAGE_SPANISH,
757 : snaplogger::language_t::LANGUAGE_PORTUGUESE,
758 : snaplogger::language_t::LANGUAGE_ITALIAN,
759 : snaplogger::language_t::LANGUAGE_GALICIAN,
760 : };
761 :
762 5 : for(auto l : lang)
763 : {
764 4 : ind.language(l);
765 :
766 4 : for(snaplogger::number_t number(snaplogger::number_t::NUMBER_SINGULAR);
767 12 : number <= snaplogger::number_t::NUMBER_PLURAL;
768 8 : number = static_cast<snaplogger::number_t>(static_cast<int>(number) + 1))
769 : {
770 8 : ind.number(number);
771 :
772 8 : ind.gender(snaplogger::gender_t::GENDER_MASCULINE);
773 88 : for(int n(1); n <= 10; ++n)
774 : {
775 240 : CATCH_REQUIRE(ind.indicator(n) == std::string("\xC2\xBA"));
776 : }
777 :
778 8 : ind.gender(snaplogger::gender_t::GENDER_FEMININE);
779 88 : for(int n(1); n <= 10; ++n)
780 : {
781 240 : CATCH_REQUIRE(ind.indicator(n) == std::string("\xC2\xAA"));
782 : }
783 :
784 8 : ind.gender(snaplogger::gender_t::GENDER_NEUTRAL);
785 88 : for(int n(1); n <= 10; ++n)
786 : {
787 80 : CATCH_REQUIRE(ind.indicator(n) == std::string());
788 : }
789 : }
790 : }
791 : }
792 2 : CATCH_END_SECTION()
793 :
794 2 : CATCH_START_SECTION("ordinal_indicator: spanish/portuguese secondary")
795 : {
796 1 : snaplogger::ordinal_indicator ind;
797 :
798 1 : ind.secondary_form(snaplogger::secondary_form_t::SECONDARY_FORM_ONE);
799 :
800 1 : snaplogger::language_t lang[] = {
801 : snaplogger::language_t::LANGUAGE_SPANISH,
802 : snaplogger::language_t::LANGUAGE_PORTUGUESE,
803 : };
804 :
805 3 : for(auto l : lang)
806 : {
807 2 : ind.language(l);
808 :
809 2 : for(snaplogger::number_t number(snaplogger::number_t::NUMBER_SINGULAR);
810 6 : number <= snaplogger::number_t::NUMBER_PLURAL;
811 4 : number = static_cast<snaplogger::number_t>(static_cast<int>(number) + 1))
812 : {
813 4 : ind.number(number);
814 :
815 4 : ind.gender(snaplogger::gender_t::GENDER_MASCULINE);
816 44 : for(int n(1); n <= 10; ++n)
817 : {
818 120 : CATCH_REQUIRE(ind.indicator(n) == std::string(".\xC2\xBA"));
819 : }
820 :
821 4 : ind.gender(snaplogger::gender_t::GENDER_FEMININE);
822 44 : for(int n(1); n <= 10; ++n)
823 : {
824 120 : CATCH_REQUIRE(ind.indicator(n) == std::string(".\xC2\xAA"));
825 : }
826 :
827 4 : ind.gender(snaplogger::gender_t::GENDER_NEUTRAL);
828 44 : for(int n(1); n <= 10; ++n)
829 : {
830 40 : CATCH_REQUIRE(ind.indicator(n) == std::string());
831 : }
832 : }
833 : }
834 : }
835 2 : CATCH_END_SECTION()
836 2 : }
837 :
838 :
839 1 : CATCH_TEST_CASE("ordinal_indicator_error", "[ordinal_indicator][error]")
840 : {
841 1 : CATCH_START_SECTION("ordinal_indicator: negative and zero return an empty string")
842 : {
843 1 : snaplogger::ordinal_indicator ind;
844 :
845 1002 : for(int n(-1'000); n <= 0; ++n)
846 : {
847 1001 : CATCH_REQUIRE(ind.indicator(n) == std::string());
848 : }
849 : }
850 1 : CATCH_END_SECTION()
851 1 : }
852 :
853 :
854 :
855 :
856 : // vim: ts=4 sw=4 et
|