@@ -20,114 +20,127 @@ public function singularifyProvider()
20
20
// see http://english-zone.com/spelling/plurals.html
21
21
// see http://www.scribd.com/doc/3271143/List-of-100-Irregular-Plural-Nouns-in-English
22
22
return array (
23
- array ('tags ' , 'tag ' ),
23
+ array ('accesses ' , 'access ' ),
24
+ array ('addresses ' , 'address ' ),
25
+ array ('agendas ' , 'agenda ' ),
26
+ array ('alumnae ' , 'alumna ' ),
24
27
array ('alumni ' , 'alumnus ' ),
25
- array ('funguses ' , array ('fungus ' , 'funguse ' , 'fungusis ' )),
26
- array ('fungi ' , 'fungus ' ),
27
- array ('axes ' , array ('ax ' , 'axe ' , 'axis ' )),
28
- array ('appendices ' , array ('appendex ' , 'appendix ' , 'appendice ' )),
29
- array ('indices ' , array ('index ' , 'indix ' , 'indice ' )),
30
- array ('prices ' , array ('prex ' , 'prix ' , 'price ' )),
31
- array ('indexes ' , 'index ' ),
32
- array ('children ' , 'child ' ),
33
- array ('men ' , 'man ' ),
34
- array ('women ' , 'woman ' ),
35
- array ('oxen ' , 'ox ' ),
36
- array ('bacteria ' , array ('bacterion ' , 'bacterium ' )),
37
- array ('criteria ' , array ('criterion ' , 'criterium ' )),
38
- array ('feet ' , 'foot ' ),
39
- array ('nebulae ' , 'nebula ' ),
40
- array ('babies ' , 'baby ' ),
41
- array ('hooves ' , array ('hoof ' , 'hoove ' , 'hooff ' )),
42
- array ('chateaux ' , 'chateau ' ),
43
- array ('echoes ' , array ('echo ' , 'echoe ' )),
44
28
array ('analyses ' , array ('analys ' , 'analyse ' , 'analysis ' )),
45
- array ('theses ' , array ('thes ' , 'these ' , 'thesis ' )),
46
- array ('foci ' , 'focus ' ),
47
- array ('focuses ' , array ('focus ' , 'focuse ' , 'focusis ' )),
48
- array ('oases ' , array ('oas ' , 'oase ' , 'oasis ' )),
49
- array ('matrices ' , array ('matrex ' , 'matrix ' , 'matrice ' )),
50
- array ('matrixes ' , 'matrix ' ),
51
- array ('bureaus ' , 'bureau ' ),
52
- array ('bureaux ' , 'bureau ' ),
53
- array ('beaux ' , 'beau ' ),
54
- array ('data ' , array ('daton ' , 'datum ' )),
55
- array ('phenomena ' , array ('phenomenon ' , 'phenomenum ' )),
56
- array ('strata ' , array ('straton ' , 'stratum ' )),
57
- array ('geese ' , 'goose ' ),
58
- array ('teeth ' , 'tooth ' ),
59
29
array ('antennae ' , 'antenna ' ),
60
30
array ('antennas ' , 'antenna ' ),
61
- array ('houses ' , array ('hous ' , 'house ' , 'housis ' )),
31
+ array ('appendices ' , array ('appendex ' , 'appendix ' , 'appendice ' )),
62
32
array ('arches ' , array ('arch ' , 'arche ' )),
63
33
array ('atlases ' , array ('atlas ' , 'atlase ' , 'atlasis ' )),
34
+ array ('axes ' , array ('ax ' , 'axe ' , 'axis ' )),
35
+ array ('babies ' , 'baby ' ),
36
+ array ('bacteria ' , array ('bacterion ' , 'bacterium ' )),
37
+ array ('bases ' , array ('bas ' , 'base ' , 'basis ' )),
64
38
array ('batches ' , array ('batch ' , 'batche ' )),
65
- array ('bushes ' , array ('bush ' , 'bushe ' )),
39
+ array ('beaux ' , 'beau ' ),
40
+ array ('bees ' , array ('be ' , 'bee ' )),
41
+ array ('boxes ' , 'box ' ),
42
+ array ('boys ' , 'boy ' ),
43
+ array ('bureaus ' , 'bureau ' ),
44
+ array ('bureaux ' , 'bureau ' ),
66
45
array ('buses ' , array ('bus ' , 'buse ' , 'busis ' )),
46
+ array ('bushes ' , array ('bush ' , 'bushe ' )),
67
47
array ('calves ' , array ('calf ' , 'calve ' , 'calff ' )),
48
+ array ('cars ' , 'car ' ),
49
+ array ('cassettes ' , array ('cassett ' , 'cassette ' )),
50
+ array ('caves ' , array ('caf ' , 'cave ' , 'caff ' )),
51
+ array ('chateaux ' , 'chateau ' ),
52
+ array ('cheeses ' , array ('chees ' , 'cheese ' , 'cheesis ' )),
53
+ array ('children ' , 'child ' ),
68
54
array ('circuses ' , array ('circus ' , 'circuse ' , 'circusis ' )),
55
+ array ('cliffs ' , 'cliff ' ),
69
56
array ('crises ' , array ('cris ' , 'crise ' , 'crisis ' )),
57
+ array ('criteria ' , array ('criterion ' , 'criterium ' )),
58
+ array ('cups ' , 'cup ' ),
59
+ array ('data ' , array ('daton ' , 'datum ' )),
60
+ array ('days ' , 'day ' ),
61
+ array ('discos ' , 'disco ' ),
62
+ array ('drives ' , 'drive ' ),
63
+ array ('drivers ' , 'driver ' ),
70
64
array ('dwarves ' , array ('dwarf ' , 'dwarve ' , 'dwarff ' )),
65
+ array ('echoes ' , array ('echo ' , 'echoe ' )),
71
66
array ('elves ' , array ('elf ' , 'elve ' , 'elff ' )),
72
67
array ('emphases ' , array ('emphas ' , 'emphase ' , 'emphasis ' )),
73
68
array ('faxes ' , 'fax ' ),
69
+ array ('feet ' , 'foot ' ),
70
+ array ('foci ' , 'focus ' ),
71
+ array ('focuses ' , array ('focus ' , 'focuse ' , 'focusis ' )),
72
+ array ('formulae ' , 'formula ' ),
73
+ array ('formulas ' , 'formula ' ),
74
+ array ('fungi ' , 'fungus ' ),
75
+ array ('funguses ' , array ('fungus ' , 'funguse ' , 'fungusis ' )),
76
+ array ('garages ' , array ('garag ' , 'garage ' )),
77
+ array ('geese ' , 'goose ' ),
74
78
array ('halves ' , array ('half ' , 'halve ' , 'halff ' )),
79
+ array ('hats ' , 'hat ' ),
75
80
array ('heroes ' , array ('hero ' , 'heroe ' )),
81
+ array ('hippopotamuses ' , array ('hippopotamus ' , 'hippopotamuse ' , 'hippopotamusis ' )), //hippopotami
76
82
array ('hoaxes ' , 'hoax ' ),
83
+ array ('hooves ' , array ('hoof ' , 'hoove ' , 'hooff ' )),
84
+ array ('houses ' , array ('hous ' , 'house ' , 'housis ' )),
85
+ array ('indexes ' , 'index ' ),
86
+ array ('indices ' , array ('index ' , 'indix ' , 'indice ' )),
87
+ array ('ions ' , 'ion ' ),
77
88
array ('irises ' , array ('iris ' , 'irise ' , 'irisis ' )),
78
89
array ('kisses ' , 'kiss ' ),
79
- array ('addresses ' , 'address ' ),
80
- array ('accesses ' , 'access ' ),
81
90
array ('knives ' , 'knife ' ),
82
- array ('lives ' , 'life ' ),
91
+ array ('lamps ' , 'lamp ' ),
92
+ array ('leaves ' , array ('leaf ' , 'leave ' , 'leaff ' )),
83
93
array ('lice ' , 'louse ' ),
94
+ array ('lives ' , 'life ' ),
95
+ array ('matrices ' , array ('matrex ' , 'matrix ' , 'matrice ' )),
96
+ array ('matrixes ' , 'matrix ' ),
97
+ array ('men ' , 'man ' ),
84
98
array ('mice ' , 'mouse ' ),
99
+ array ('moves ' , 'move ' ),
100
+ array ('nebulae ' , 'nebula ' ),
85
101
array ('neuroses ' , array ('neuros ' , 'neurose ' , 'neurosis ' )),
102
+ array ('oases ' , array ('oas ' , 'oase ' , 'oasis ' )),
103
+ array ('objectives ' , 'objective ' ),
104
+ array ('oxen ' , 'ox ' ),
105
+ array ('parties ' , 'party ' ),
106
+ array ('phenomena ' , array ('phenomenon ' , 'phenomenum ' )),
107
+ array ('photos ' , 'photo ' ),
108
+ array ('pianos ' , 'piano ' ),
86
109
array ('plateaux ' , 'plateau ' ),
87
110
array ('poppies ' , 'poppy ' ),
111
+ array ('prices ' , array ('prex ' , 'prix ' , 'price ' )),
88
112
array ('quizzes ' , 'quiz ' ),
113
+ array ('radii ' , 'radius ' ),
114
+ array ('roofs ' , 'roof ' ),
115
+ array ('roses ' , array ('ros ' , 'rose ' , 'rosis ' )),
116
+ array ('sandwiches ' , array ('sandwich ' , 'sandwiche ' )),
89
117
array ('scarves ' , array ('scarf ' , 'scarve ' , 'scarff ' )),
118
+ array ('schemas ' , 'schema ' ), //schemata
119
+ array ('sheriffs ' , 'sheriff ' ),
120
+ array ('shoes ' , array ('sho ' , 'shoe ' )),
90
121
array ('spies ' , 'spy ' ),
122
+ array ('staves ' , array ('staf ' , 'stave ' , 'staff ' )),
91
123
array ('stories ' , 'story ' ),
124
+ array ('strata ' , array ('straton ' , 'stratum ' )),
125
+ array ('suitcases ' , array ('suitcas ' , 'suitcase ' , 'suitcasis ' )),
92
126
array ('syllabi ' , 'syllabus ' ),
127
+ array ('tags ' , 'tag ' ),
128
+ array ('teeth ' , 'tooth ' ),
129
+ array ('theses ' , array ('thes ' , 'these ' , 'thesis ' )),
93
130
array ('thieves ' , array ('thief ' , 'thieve ' , 'thieff ' )),
131
+ array ('trees ' , array ('tre ' , 'tree ' )),
94
132
array ('waltzes ' , array ('waltz ' , 'waltze ' )),
95
- array ('wharves ' , array ('wharf ' , 'wharve ' , 'wharff ' )),
96
- array ('caves ' , array ('caf ' , 'cave ' , 'caff ' )),
97
- array ('staves ' , array ('staf ' , 'stave ' , 'staff ' )),
98
133
array ('wives ' , 'wife ' ),
99
- array ('ions ' , 'ion ' ),
100
- array ('bases ' , array ('bas ' , 'base ' , 'basis ' )),
101
- array ('cars ' , 'car ' ),
102
- array ('cassettes ' , array ('cassett ' , 'cassette ' )),
103
- array ('lamps ' , 'lamp ' ),
104
- array ('hats ' , 'hat ' ),
105
- array ('cups ' , 'cup ' ),
106
- array ('boxes ' , 'box ' ),
107
- array ('sandwiches ' , array ('sandwich ' , 'sandwiche ' )),
108
- array ('suitcases ' , array ('suitcas ' , 'suitcase ' , 'suitcasis ' )),
109
- array ('roses ' , array ('ros ' , 'rose ' , 'rosis ' )),
110
- array ('garages ' , array ('garag ' , 'garage ' )),
111
- array ('shoes ' , array ('sho ' , 'shoe ' )),
112
- array ('days ' , 'day ' ),
113
- array ('boys ' , 'boy ' ),
114
- array ('roofs ' , 'roof ' ),
115
- array ('cliffs ' , 'cliff ' ),
116
- array ('sheriffs ' , 'sheriff ' ),
117
- array ('discos ' , 'disco ' ),
118
- array ('pianos ' , 'piano ' ),
119
- array ('photos ' , 'photo ' ),
120
- array ('trees ' , array ('tre ' , 'tree ' )),
121
- array ('bees ' , array ('be ' , 'bee ' )),
122
- array ('cheeses ' , array ('chees ' , 'cheese ' , 'cheesis ' )),
123
- array ('radii ' , 'radius ' ),
124
- array ('objectives ' , 'objective ' ),
125
- array ('moves ' , 'move ' ),
126
134
127
135
// test casing: if the first letter was uppercase, it should remain so
128
136
array ('Men ' , 'Man ' ),
129
137
array ('GrandChildren ' , 'GrandChild ' ),
130
138
array ('SubTrees ' , array ('SubTre ' , 'SubTree ' )),
139
+
140
+ // Known issues
141
+ //array('insignia', 'insigne'),
142
+ //array('insignias', 'insigne'),
143
+ //array('rattles', 'rattle'),
131
144
);
132
145
}
133
146
@@ -136,6 +149,13 @@ public function singularifyProvider()
136
149
*/
137
150
public function testSingularify ($ plural , $ singular )
138
151
{
139
- $ this ->assertEquals ($ singular , StringUtil::singularify ($ plural ));
152
+ $ single = StringUtil::singularify ($ plural );
153
+ if (is_string ($ singular ) && is_array ($ single )) {
154
+ $ this ->fail ("--- Expected \n`string`: " . $ singular . "\n+++ Actual \n`array`: " . implode (', ' , $ single ));
155
+ } elseif (is_array ($ singular ) && is_string ($ single )) {
156
+ $ this ->fail ("--- Expected \n`array`: " . implode (', ' , $ singular ) . "\n+++ Actual \n`string`: " . $ single );
157
+ }
158
+
159
+ $ this ->assertEquals ($ singular , $ single );
140
160
}
141
161
}
0 commit comments