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