verba 0.5.1

A library for working with Latin words.
Documentation
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
mod decline;

use decline::{verify_declension};

use verba::noun::{Noun};
use verba::noun as N;

#[test]
fn test_first_declension() {
    let nom = "porta".to_string();
    let gen = "portae".to_string();

    match N::Regular::new(nom, gen, N::Gender::Feminine) {
        Ok(noun) => {
            verify_declension(&noun.decline(N::Number::Singular, N::Case::Nominative), &Some(vec!["porta".to_string()]));
            verify_declension(&noun.decline(N::Number::Singular, N::Case::Genitive), &Some(vec!["portae".to_string()]));
            verify_declension(&noun.decline(N::Number::Singular, N::Case::Dative), &Some(vec!["portae".to_string()]));
            verify_declension(&noun.decline(N::Number::Singular, N::Case::Accusative), &Some(vec!["portam".to_string()]));
            verify_declension(&noun.decline(N::Number::Singular, N::Case::Ablative), &Some(vec!["portā".to_string()]));
            verify_declension(&noun.decline(N::Number::Singular, N::Case::Vocative), &Some(vec!["porta".to_string()]));

            verify_declension(&noun.decline(N::Number::Plural, N::Case::Nominative), &Some(vec!["portae".to_string()]));
            verify_declension(&noun.decline(N::Number::Plural, N::Case::Genitive), &Some(vec!["portārum".to_string()]));
            verify_declension(&noun.decline(N::Number::Plural, N::Case::Dative), &Some(vec!["portīs".to_string()]));
            verify_declension(&noun.decline(N::Number::Plural, N::Case::Accusative), &Some(vec!["portās".to_string()]));
            verify_declension(&noun.decline(N::Number::Plural, N::Case::Ablative), &Some(vec!["portīs".to_string()]));
            verify_declension(&noun.decline(N::Number::Plural, N::Case::Vocative), &Some(vec!["portae".to_string()]));
        },
        Err(_) => panic!("Failed to create noun porta, portae."),
    }
}

#[test]
fn test_second_declension_masculine() {
    let nom = "dominus".to_string();
    let gen = "dominī".to_string();

    match N::Regular::new(nom, gen, N::Gender::Masculine) {
        Ok(noun) => {
            verify_declension(&noun.decline(N::Number::Singular, N::Case::Nominative), &Some(vec!["dominus".to_string()]));
            verify_declension(&noun.decline(N::Number::Singular, N::Case::Genitive), &Some(vec!["dominī".to_string()]));
            verify_declension(&noun.decline(N::Number::Singular, N::Case::Dative), &Some(vec!["dominō".to_string()]));
            verify_declension(&noun.decline(N::Number::Singular, N::Case::Accusative), &Some(vec!["dominum".to_string()]));
            verify_declension(&noun.decline(N::Number::Singular, N::Case::Ablative), &Some(vec!["dominō".to_string()]));
            verify_declension(&noun.decline(N::Number::Singular, N::Case::Vocative), &Some(vec!["domine".to_string()]));

            verify_declension(&noun.decline(N::Number::Plural, N::Case::Nominative), &Some(vec!["dominī".to_string()]));
            verify_declension(&noun.decline(N::Number::Plural, N::Case::Genitive), &Some(vec!["dominōrum".to_string()]));
            verify_declension(&noun.decline(N::Number::Plural, N::Case::Dative), &Some(vec!["dominīs".to_string()]));
            verify_declension(&noun.decline(N::Number::Plural, N::Case::Accusative), &Some(vec!["dominōs".to_string()]));
            verify_declension(&noun.decline(N::Number::Plural, N::Case::Ablative), &Some(vec!["dominīs".to_string()]));
            verify_declension(&noun.decline(N::Number::Plural, N::Case::Vocative), &Some(vec!["dominī".to_string()]));
        },
        Err(_) => panic!("Failed to create noun dominus, dominī"),
    }
}

#[test]
fn test_second_declension_masculine_ius() {
    let nom = "fīlius".to_string();
    let gen = "fīliī".to_string();

    match N::Regular::new(nom, gen, N::Gender::Masculine) {
        Ok(noun) => {
            verify_declension(&noun.decline(N::Number::Singular, N::Case::Nominative), &Some(vec!["fīlius".to_string()]));
            verify_declension(&noun.decline(N::Number::Singular, N::Case::Genitive), &Some(vec!["fīliī".to_string()]));
            verify_declension(&noun.decline(N::Number::Singular, N::Case::Dative), &Some(vec!["fīliō".to_string()]));
            verify_declension(&noun.decline(N::Number::Singular, N::Case::Accusative), &Some(vec!["fīlium".to_string()]));
            verify_declension(&noun.decline(N::Number::Singular, N::Case::Ablative), &Some(vec!["fīliō".to_string()]));
            verify_declension(&noun.decline(N::Number::Singular, N::Case::Vocative), &Some(vec!["fīlī".to_string()]));

            verify_declension(&noun.decline(N::Number::Plural, N::Case::Nominative), &Some(vec!["fīliī".to_string()]));
            verify_declension(&noun.decline(N::Number::Plural, N::Case::Genitive), &Some(vec!["fīliōrum".to_string()]));
            verify_declension(&noun.decline(N::Number::Plural, N::Case::Dative), &Some(vec!["fīliīs".to_string()]));
            verify_declension(&noun.decline(N::Number::Plural, N::Case::Accusative), &Some(vec!["fīliōs".to_string()]));
            verify_declension(&noun.decline(N::Number::Plural, N::Case::Ablative), &Some(vec!["fīliīs".to_string()]));
            verify_declension(&noun.decline(N::Number::Plural, N::Case::Vocative), &Some(vec!["fīliī".to_string()]));
        },
        Err(_) => panic!("Failed to create noun fīlius, fīliī"),
    }
}

#[test]
fn test_second_declension_masculine_er() {
    let nom = "puer".to_string();
    let gen = "puerī".to_string();

    match N::Regular::new(nom, gen, N::Gender::Masculine) {
        Ok(noun) => {
            verify_declension(&noun.decline(N::Number::Singular, N::Case::Nominative), &Some(vec!["puer".to_string()]));
            verify_declension(&noun.decline(N::Number::Singular, N::Case::Genitive), &Some(vec!["puerī".to_string()]));
            verify_declension(&noun.decline(N::Number::Singular, N::Case::Dative), &Some(vec!["puerō".to_string()]));
            verify_declension(&noun.decline(N::Number::Singular, N::Case::Accusative), &Some(vec!["puerum".to_string()]));
            verify_declension(&noun.decline(N::Number::Singular, N::Case::Ablative), &Some(vec!["puerō".to_string()]));
            verify_declension(&noun.decline(N::Number::Singular, N::Case::Vocative), &Some(vec!["puer".to_string()]));

            verify_declension(&noun.decline(N::Number::Plural, N::Case::Nominative), &Some(vec!["puerī".to_string()]));
            verify_declension(&noun.decline(N::Number::Plural, N::Case::Genitive), &Some(vec!["puerōrum".to_string()]));
            verify_declension(&noun.decline(N::Number::Plural, N::Case::Dative), &Some(vec!["puerīs".to_string()]));
            verify_declension(&noun.decline(N::Number::Plural, N::Case::Accusative), &Some(vec!["puerōs".to_string()]));
            verify_declension(&noun.decline(N::Number::Plural, N::Case::Ablative), &Some(vec!["puerīs".to_string()]));
            verify_declension(&noun.decline(N::Number::Plural, N::Case::Vocative), &Some(vec!["puerī".to_string()]));
        },
        Err(_) => panic!("Failed to create noun puer, puerī"),
    }
}

#[test]
fn test_second_declension_masculine_r() {
    let nom = "ager".to_string();
    let gen = "agrī".to_string();

    match N::Regular::new(nom, gen, N::Gender::Masculine) {
        Ok(noun) => {
            verify_declension(&noun.decline(N::Number::Singular, N::Case::Nominative), &Some(vec!["ager".to_string()]));
            verify_declension(&noun.decline(N::Number::Singular, N::Case::Genitive), &Some(vec!["agrī".to_string()]));
            verify_declension(&noun.decline(N::Number::Singular, N::Case::Dative), &Some(vec!["agrō".to_string()]));
            verify_declension(&noun.decline(N::Number::Singular, N::Case::Accusative), &Some(vec!["agrum".to_string()]));
            verify_declension(&noun.decline(N::Number::Singular, N::Case::Ablative), &Some(vec!["agrō".to_string()]));
            verify_declension(&noun.decline(N::Number::Singular, N::Case::Vocative), &Some(vec!["ager".to_string()]));

            verify_declension(&noun.decline(N::Number::Plural, N::Case::Nominative), &Some(vec!["agrī".to_string()]));
            verify_declension(&noun.decline(N::Number::Plural, N::Case::Genitive), &Some(vec!["agrōrum".to_string()]));
            verify_declension(&noun.decline(N::Number::Plural, N::Case::Dative), &Some(vec!["agrīs".to_string()]));
            verify_declension(&noun.decline(N::Number::Plural, N::Case::Accusative), &Some(vec!["agrōs".to_string()]));
            verify_declension(&noun.decline(N::Number::Plural, N::Case::Ablative), &Some(vec!["agrīs".to_string()]));
            verify_declension(&noun.decline(N::Number::Plural, N::Case::Vocative), &Some(vec!["agrī".to_string()]));
        },
        Err(_) => panic!("Failed to create noun ager, agrī"),
    }
}

#[test]
fn test_second_declension_neuter() {
    let nom = "bellum".to_string();
    let gen = "bellī".to_string();

    match N::Regular::new(nom, gen, N::Gender::Neuter) {
        Ok(noun) => {
            verify_declension(&noun.decline(N::Number::Singular, N::Case::Nominative), &Some(vec!["bellum".to_string()]));
            verify_declension(&noun.decline(N::Number::Singular, N::Case::Genitive), &Some(vec!["bellī".to_string()]));
            verify_declension(&noun.decline(N::Number::Singular, N::Case::Dative), &Some(vec!["bellō".to_string()]));
            verify_declension(&noun.decline(N::Number::Singular, N::Case::Accusative), &Some(vec!["bellum".to_string()]));
            verify_declension(&noun.decline(N::Number::Singular, N::Case::Ablative), &Some(vec!["bellō".to_string()]));
            verify_declension(&noun.decline(N::Number::Singular, N::Case::Vocative), &Some(vec!["bellum".to_string()]));

            verify_declension(&noun.decline(N::Number::Plural, N::Case::Nominative), &Some(vec!["bella".to_string()]));
            verify_declension(&noun.decline(N::Number::Plural, N::Case::Genitive), &Some(vec!["bellōrum".to_string()]));
            verify_declension(&noun.decline(N::Number::Plural, N::Case::Dative), &Some(vec!["bellīs".to_string()]));
            verify_declension(&noun.decline(N::Number::Plural, N::Case::Accusative), &Some(vec!["bella".to_string()]));
            verify_declension(&noun.decline(N::Number::Plural, N::Case::Ablative), &Some(vec!["bellīs".to_string()]));
            verify_declension(&noun.decline(N::Number::Plural, N::Case::Vocative), &Some(vec!["bella".to_string()]));
        },
        Err(_) => panic!("Failed to create noun bellum, bellī"),
    }
}

#[test]
fn test_second_declension_neuter_ium() {
    let nom = "auxilium".to_string();
    let gen = "auxiliī".to_string();

    match N::Regular::new(nom, gen, N::Gender::Neuter) {
        Ok(noun) => {
            verify_declension(&noun.decline(N::Number::Singular, N::Case::Nominative), &Some(vec!["auxilium".to_string()]));
            verify_declension(&noun.decline(N::Number::Singular, N::Case::Genitive), &Some(vec!["auxiliī".to_string()]));
            verify_declension(&noun.decline(N::Number::Singular, N::Case::Dative), &Some(vec!["auxiliō".to_string()]));
            verify_declension(&noun.decline(N::Number::Singular, N::Case::Accusative), &Some(vec!["auxilium".to_string()]));
            verify_declension(&noun.decline(N::Number::Singular, N::Case::Ablative), &Some(vec!["auxiliō".to_string()]));
            verify_declension(&noun.decline(N::Number::Singular, N::Case::Vocative), &Some(vec!["auxilium".to_string()]));

            verify_declension(&noun.decline(N::Number::Plural, N::Case::Nominative), &Some(vec!["auxilia".to_string()]));
            verify_declension(&noun.decline(N::Number::Plural, N::Case::Genitive), &Some(vec!["auxiliōrum".to_string()]));
            verify_declension(&noun.decline(N::Number::Plural, N::Case::Dative), &Some(vec!["auxiliīs".to_string()]));
            verify_declension(&noun.decline(N::Number::Plural, N::Case::Accusative), &Some(vec!["auxilia".to_string()]));
            verify_declension(&noun.decline(N::Number::Plural, N::Case::Ablative), &Some(vec!["auxiliīs".to_string()]));
            verify_declension(&noun.decline(N::Number::Plural, N::Case::Vocative), &Some(vec!["auxilia".to_string()]));
        },
        Err(_) => panic!("Failed to create noun auxilium, auxiliī"),
    }
}

#[test]
fn test_third_declension_masculine() {
    let nom = "dux".to_string();
    let gen = "ducis".to_string();

    match N::Regular::new(nom, gen, N::Gender::Masculine) {
        Ok(noun) => {
            verify_declension(&noun.decline(N::Number::Singular, N::Case::Nominative), &Some(vec!["dux".to_string()]));
            verify_declension(&noun.decline(N::Number::Singular, N::Case::Genitive), &Some(vec!["ducis".to_string()]));
            verify_declension(&noun.decline(N::Number::Singular, N::Case::Dative), &Some(vec!["ducī".to_string()]));
            verify_declension(&noun.decline(N::Number::Singular, N::Case::Accusative), &Some(vec!["ducem".to_string()]));
            verify_declension(&noun.decline(N::Number::Singular, N::Case::Ablative), &Some(vec!["duce".to_string()]));
            verify_declension(&noun.decline(N::Number::Singular, N::Case::Vocative), &Some(vec!["dux".to_string()]));

            verify_declension(&noun.decline(N::Number::Plural, N::Case::Nominative), &Some(vec!["ducēs".to_string()]));
            verify_declension(&noun.decline(N::Number::Plural, N::Case::Genitive), &Some(vec!["ducum".to_string()]));
            verify_declension(&noun.decline(N::Number::Plural, N::Case::Dative), &Some(vec!["ducibus".to_string()]));
            verify_declension(&noun.decline(N::Number::Plural, N::Case::Accusative), &Some(vec!["ducēs".to_string()]));
            verify_declension(&noun.decline(N::Number::Plural, N::Case::Ablative), &Some(vec!["ducibus".to_string()]));
            verify_declension(&noun.decline(N::Number::Plural, N::Case::Vocative), &Some(vec!["ducēs".to_string()]));
        },
        Err(_) => panic!("Failed to create noun dux, ducis"),
    }
}

#[test]
fn test_third_declension_feminine() {
    let nom = "virtūs".to_string();
    let gen = "virtūtis".to_string();

    match N::Regular::new(nom, gen, N::Gender::Feminine) {
        Ok(noun) => {
            verify_declension(&noun.decline(N::Number::Singular, N::Case::Nominative), &Some(vec!["virtūs".to_string()]));
            verify_declension(&noun.decline(N::Number::Singular, N::Case::Genitive), &Some(vec!["virtūtis".to_string()]));
            verify_declension(&noun.decline(N::Number::Singular, N::Case::Dative), &Some(vec!["virtūtī".to_string()]));
            verify_declension(&noun.decline(N::Number::Singular, N::Case::Accusative), &Some(vec!["virtūtem".to_string()]));
            verify_declension(&noun.decline(N::Number::Singular, N::Case::Ablative), &Some(vec!["virtūte".to_string()]));
            verify_declension(&noun.decline(N::Number::Singular, N::Case::Vocative), &Some(vec!["virtūs".to_string()]));

            verify_declension(&noun.decline(N::Number::Plural, N::Case::Nominative), &Some(vec!["virtūtēs".to_string()]));
            verify_declension(&noun.decline(N::Number::Plural, N::Case::Genitive), &Some(vec!["virtūtum".to_string()]));
            verify_declension(&noun.decline(N::Number::Plural, N::Case::Dative), &Some(vec!["virtūtibus".to_string()]));
            verify_declension(&noun.decline(N::Number::Plural, N::Case::Accusative), &Some(vec!["virtūtēs".to_string()]));
            verify_declension(&noun.decline(N::Number::Plural, N::Case::Ablative), &Some(vec!["virtūtibus".to_string()]));
            verify_declension(&noun.decline(N::Number::Plural, N::Case::Vocative), &Some(vec!["virtūtēs".to_string()]));
        },
        Err(_) => panic!("Failed to create noun virtūs, virtūtis"),
    }
}

#[test]
fn test_third_declension_neuter() {
    let nom = "nōmen".to_string();
    let gen = "nōminis".to_string();

    match N::Regular::new(nom, gen, N::Gender::Neuter) {
        Ok(noun) => {
            verify_declension(&noun.decline(N::Number::Singular, N::Case::Nominative), &Some(vec!["nōmen".to_string()]));
            verify_declension(&noun.decline(N::Number::Singular, N::Case::Genitive), &Some(vec!["nōminis".to_string()]));
            verify_declension(&noun.decline(N::Number::Singular, N::Case::Dative), &Some(vec!["nōminī".to_string()]));
            verify_declension(&noun.decline(N::Number::Singular, N::Case::Accusative), &Some(vec!["nōmen".to_string()]));
            verify_declension(&noun.decline(N::Number::Singular, N::Case::Ablative), &Some(vec!["nōmine".to_string()]));
            verify_declension(&noun.decline(N::Number::Singular, N::Case::Vocative), &Some(vec!["nōmen".to_string()]));

            verify_declension(&noun.decline(N::Number::Plural, N::Case::Nominative), &Some(vec!["nōmina".to_string()]));
            verify_declension(&noun.decline(N::Number::Plural, N::Case::Genitive), &Some(vec!["nōminum".to_string()]));
            verify_declension(&noun.decline(N::Number::Plural, N::Case::Dative), &Some(vec!["nōminibus".to_string()]));
            verify_declension(&noun.decline(N::Number::Plural, N::Case::Accusative), &Some(vec!["nōmina".to_string()]));
            verify_declension(&noun.decline(N::Number::Plural, N::Case::Ablative), &Some(vec!["nōminibus".to_string()]));
            verify_declension(&noun.decline(N::Number::Plural, N::Case::Vocative), &Some(vec!["nōmina".to_string()]));
        },
        Err(_) => panic!("Failed to create noun nōmen, nōminis"),
    }
}

#[test]
fn test_third_declension_i_stem_pure_masculine() {
    let nom = "amnis".to_string();
    let gen = "amnis".to_string();

    match N::Regular::new_third_i_stem(nom, gen, N::Gender::Masculine) {
        Ok(noun) => {
            verify_declension(&noun.decline(N::Number::Singular, N::Case::Nominative), &Some(vec!["amnis".to_string()]));
            verify_declension(&noun.decline(N::Number::Singular, N::Case::Genitive), &Some(vec!["amnis".to_string()]));
            verify_declension(&noun.decline(N::Number::Singular, N::Case::Dative), &Some(vec!["amnī".to_string()]));
            verify_declension(&noun.decline(N::Number::Singular, N::Case::Accusative), &Some(vec!["amnem".to_string(), "amnim".to_string()]));
            verify_declension(&noun.decline(N::Number::Singular, N::Case::Ablative), &Some(vec!["amne".to_string()]));
            verify_declension(&noun.decline(N::Number::Singular, N::Case::Vocative), &Some(vec!["amnis".to_string()]));

            verify_declension(&noun.decline(N::Number::Plural, N::Case::Nominative), &Some(vec!["amnēs".to_string()]));
            verify_declension(&noun.decline(N::Number::Plural, N::Case::Genitive), &Some(vec!["amnium".to_string()]));
            verify_declension(&noun.decline(N::Number::Plural, N::Case::Dative), &Some(vec!["amnibus".to_string()]));
            verify_declension(&noun.decline(N::Number::Plural, N::Case::Accusative), &Some(vec!["amnēs".to_string(), "amnīs".to_string()]));
            verify_declension(&noun.decline(N::Number::Plural, N::Case::Ablative), &Some(vec!["amnibus".to_string()]));
            verify_declension(&noun.decline(N::Number::Plural, N::Case::Vocative), &Some(vec!["amnēs".to_string()]));
        },
        Err(_) => panic!("Failed to create noun amnis, amnis"),
    }
}

#[test]
fn test_third_declension_i_stem_pure_neuter() {
    let nom = "animal".to_string();
    let gen = "animālis".to_string();

    match N::Regular::new_third_i_stem(nom, gen, N::Gender::Neuter) {
        Ok(noun) => {
            verify_declension(&noun.decline(N::Number::Singular, N::Case::Nominative), &Some(vec!["animal".to_string()]));
            verify_declension(&noun.decline(N::Number::Singular, N::Case::Genitive), &Some(vec!["animālis".to_string()]));
            verify_declension(&noun.decline(N::Number::Singular, N::Case::Dative), &Some(vec!["animālī".to_string()]));
            verify_declension(&noun.decline(N::Number::Singular, N::Case::Accusative), &Some(vec!["animal".to_string()]));
            verify_declension(&noun.decline(N::Number::Singular, N::Case::Ablative), &Some(vec!["animālī".to_string()]));
            verify_declension(&noun.decline(N::Number::Singular, N::Case::Vocative), &Some(vec!["animal".to_string()]));

            verify_declension(&noun.decline(N::Number::Plural, N::Case::Nominative), &Some(vec!["animālia".to_string()]));
            verify_declension(&noun.decline(N::Number::Plural, N::Case::Genitive), &Some(vec!["animālium".to_string()]));
            verify_declension(&noun.decline(N::Number::Plural, N::Case::Dative), &Some(vec!["animālibus".to_string()]));
            verify_declension(&noun.decline(N::Number::Plural, N::Case::Accusative), &Some(vec!["animālia".to_string()]));
            verify_declension(&noun.decline(N::Number::Plural, N::Case::Ablative), &Some(vec!["animālibus".to_string()]));
            verify_declension(&noun.decline(N::Number::Plural, N::Case::Vocative), &Some(vec!["animālia".to_string()]));
        },
        Err(_) => panic!("Failed to create noun animal, animālis"),
    }
}

#[test]
fn test_third_declension_i_stem_mixed_feminine() {
    let nom = "pars".to_string();
    let gen = "partis".to_string();

    match N::Regular::new_third_i_stem(nom, gen, N::Gender::Feminine) {
        Ok(noun) => {
            verify_declension(&noun.decline(N::Number::Singular, N::Case::Nominative), &Some(vec!["pars".to_string()]));
            verify_declension(&noun.decline(N::Number::Singular, N::Case::Genitive), &Some(vec!["partis".to_string()]));
            verify_declension(&noun.decline(N::Number::Singular, N::Case::Dative), &Some(vec!["partī".to_string()]));
            verify_declension(&noun.decline(N::Number::Singular, N::Case::Accusative), &Some(vec!["partem".to_string(), "partim".to_string()]));
            verify_declension(&noun.decline(N::Number::Singular, N::Case::Ablative), &Some(vec!["parte".to_string()]));
            verify_declension(&noun.decline(N::Number::Singular, N::Case::Vocative), &Some(vec!["pars".to_string()]));

            verify_declension(&noun.decline(N::Number::Plural, N::Case::Nominative), &Some(vec!["partēs".to_string()]));
            verify_declension(&noun.decline(N::Number::Plural, N::Case::Genitive), &Some(vec!["partium".to_string()]));
            verify_declension(&noun.decline(N::Number::Plural, N::Case::Dative), &Some(vec!["partibus".to_string()]));
            verify_declension(&noun.decline(N::Number::Plural, N::Case::Accusative), &Some(vec!["partēs".to_string(), "partīs".to_string()]));
            verify_declension(&noun.decline(N::Number::Plural, N::Case::Ablative), &Some(vec!["partibus".to_string()]));
            verify_declension(&noun.decline(N::Number::Plural, N::Case::Vocative), &Some(vec!["partēs".to_string()]));
        },
        Err(_) => panic!("Failed to create noun pars, partis"),
    }
}

#[test]
fn test_fourth_declension_masculine() {
    let nom = "portus".to_string();
    let gen = "portūs".to_string();

    match N::Regular::new(nom, gen, N::Gender::Masculine) {
        Ok(noun) => {
            verify_declension(&noun.decline(N::Number::Singular, N::Case::Nominative), &Some(vec!["portus".to_string()]));
            verify_declension(&noun.decline(N::Number::Singular, N::Case::Genitive), &Some(vec!["portūs".to_string()]));
            verify_declension(&noun.decline(N::Number::Singular, N::Case::Dative), &Some(vec!["portuī".to_string()]));
            verify_declension(&noun.decline(N::Number::Singular, N::Case::Accusative), &Some(vec!["portum".to_string()]));
            verify_declension(&noun.decline(N::Number::Singular, N::Case::Ablative), &Some(vec!["portū".to_string()]));
            verify_declension(&noun.decline(N::Number::Singular, N::Case::Vocative), &Some(vec!["portus".to_string()]));

            verify_declension(&noun.decline(N::Number::Plural, N::Case::Nominative), &Some(vec!["portūs".to_string()]));
            verify_declension(&noun.decline(N::Number::Plural, N::Case::Genitive), &Some(vec!["portuum".to_string()]));
            verify_declension(&noun.decline(N::Number::Plural, N::Case::Dative), &Some(vec!["portibus".to_string()]));
            verify_declension(&noun.decline(N::Number::Plural, N::Case::Accusative), &Some(vec!["portūs".to_string()]));
            verify_declension(&noun.decline(N::Number::Plural, N::Case::Ablative), &Some(vec!["portibus".to_string()]));
            verify_declension(&noun.decline(N::Number::Plural, N::Case::Vocative), &Some(vec!["portūs".to_string()]));
        },
        Err(_) => panic!("Failed to create noun portus, portūs"),
    }
}

#[test]
fn test_fourth_declension_neuter() {
    let nom = "cornū".to_string();
    let gen = "cornūs".to_string();

    match N::Regular::new(nom, gen, N::Gender::Neuter) {
        Ok(noun) => {
            verify_declension(&noun.decline(N::Number::Singular, N::Case::Nominative), &Some(vec!["cornū".to_string()]));
            verify_declension(&noun.decline(N::Number::Singular, N::Case::Genitive), &Some(vec!["cornūs".to_string()]));
            verify_declension(&noun.decline(N::Number::Singular, N::Case::Dative), &Some(vec!["cornū".to_string()]));
            verify_declension(&noun.decline(N::Number::Singular, N::Case::Accusative), &Some(vec!["cornū".to_string()]));
            verify_declension(&noun.decline(N::Number::Singular, N::Case::Ablative), &Some(vec!["cornū".to_string()]));
            verify_declension(&noun.decline(N::Number::Singular, N::Case::Vocative), &Some(vec!["cornū".to_string()]));

            verify_declension(&noun.decline(N::Number::Plural, N::Case::Nominative), &Some(vec!["cornua".to_string()]));
            verify_declension(&noun.decline(N::Number::Plural, N::Case::Genitive), &Some(vec!["cornuum".to_string()]));
            verify_declension(&noun.decline(N::Number::Plural, N::Case::Dative), &Some(vec!["cornibus".to_string()]));
            verify_declension(&noun.decline(N::Number::Plural, N::Case::Accusative), &Some(vec!["cornua".to_string()]));
            verify_declension(&noun.decline(N::Number::Plural, N::Case::Ablative), &Some(vec!["cornibus".to_string()]));
            verify_declension(&noun.decline(N::Number::Plural, N::Case::Vocative), &Some(vec!["cornua".to_string()]));
        },
        Err(_) => panic!("Failed to create noun cornū, cornūs"),
    }
}

#[test]
fn test_fifth_declension_dies() {
    let nom = "diēs".to_string();
    let gen = "diēī".to_string();

    match N::Regular::new(nom, gen, N::Gender::Feminine) {
        Ok(noun) => {
            verify_declension(&noun.decline(N::Number::Singular, N::Case::Nominative), &Some(vec!["diēs".to_string()]));
            verify_declension(&noun.decline(N::Number::Singular, N::Case::Genitive), &Some(vec!["diēī".to_string()]));
            verify_declension(&noun.decline(N::Number::Singular, N::Case::Dative), &Some(vec!["diēī".to_string()]));
            verify_declension(&noun.decline(N::Number::Singular, N::Case::Accusative), &Some(vec!["diem".to_string()]));
            verify_declension(&noun.decline(N::Number::Singular, N::Case::Ablative), &Some(vec!["diē".to_string()]));
            verify_declension(&noun.decline(N::Number::Singular, N::Case::Vocative), &Some(vec!["diēs".to_string()]));

            verify_declension(&noun.decline(N::Number::Plural, N::Case::Nominative), &Some(vec!["diēs".to_string()]));
            verify_declension(&noun.decline(N::Number::Plural, N::Case::Genitive), &Some(vec!["diērum".to_string()]));
            verify_declension(&noun.decline(N::Number::Plural, N::Case::Dative), &Some(vec!["diēbus".to_string()]));
            verify_declension(&noun.decline(N::Number::Plural, N::Case::Accusative), &Some(vec!["diēs".to_string()]));
            verify_declension(&noun.decline(N::Number::Plural, N::Case::Ablative), &Some(vec!["diēbus".to_string()]));
            verify_declension(&noun.decline(N::Number::Plural, N::Case::Vocative), &Some(vec!["diēs".to_string()]));
        },
        Err(_) => panic!("Failed to create noun diēs, diēī"),
    }
}

#[test]
fn test_fifth_declension_res() {
    let nom = "rēs".to_string();
    let gen = "reī".to_string();

    match N::Regular::new(nom, gen, N::Gender::Feminine) {
        Ok(noun) => {
            verify_declension(&noun.decline(N::Number::Singular, N::Case::Nominative), &Some(vec!["rēs".to_string()]));
            verify_declension(&noun.decline(N::Number::Singular, N::Case::Genitive), &Some(vec!["reī".to_string()]));
            verify_declension(&noun.decline(N::Number::Singular, N::Case::Dative), &Some(vec!["reī".to_string()]));
            verify_declension(&noun.decline(N::Number::Singular, N::Case::Accusative), &Some(vec!["rem".to_string()]));
            verify_declension(&noun.decline(N::Number::Singular, N::Case::Ablative), &Some(vec!["".to_string()]));
            verify_declension(&noun.decline(N::Number::Singular, N::Case::Vocative), &Some(vec!["rēs".to_string()]));

            verify_declension(&noun.decline(N::Number::Plural, N::Case::Nominative), &Some(vec!["rēs".to_string()]));
            verify_declension(&noun.decline(N::Number::Plural, N::Case::Genitive), &Some(vec!["rērum".to_string()]));
            verify_declension(&noun.decline(N::Number::Plural, N::Case::Dative), &Some(vec!["rēbus".to_string()]));
            verify_declension(&noun.decline(N::Number::Plural, N::Case::Accusative), &Some(vec!["rēs".to_string()]));
            verify_declension(&noun.decline(N::Number::Plural, N::Case::Ablative), &Some(vec!["rēbus".to_string()]));
            verify_declension(&noun.decline(N::Number::Plural, N::Case::Vocative), &Some(vec!["rēs".to_string()]));
        },
        Err(_) => panic!("Failed to create noun rēs, reī"),
    }
}