@@ -77,4 +77,122 @@ public function testIsChoiceSelected($expected, $choice, $value)
7777 {
7878 $ this ->assertSame ($ expected , FormUtil::isChoiceSelected ($ choice , $ value ));
7979 }
80+
81+ public function singularifyProvider ()
82+ {
83+ // see http://english-zone.com/spelling/plurals.html
84+ // see http://www.scribd.com/doc/3271143/List-of-100-Irregular-Plural-Nouns-in-English
85+ return array (
86+ array ('tags ' , 'tag ' ),
87+ array ('alumni ' , 'alumnus ' ),
88+ array ('funguses ' , array ('fungus ' , 'funguse ' , 'fungusis ' )),
89+ array ('fungi ' , 'fungus ' ),
90+ array ('axes ' , 'axis ' ),
91+ array ('appendices ' , array ('appendex ' , 'appendix ' )),
92+ array ('indices ' , array ('index ' , 'indix ' )),
93+ array ('indexes ' , 'index ' ),
94+ array ('children ' , 'child ' ),
95+ array ('men ' , 'man ' ),
96+ array ('women ' , 'woman ' ),
97+ array ('oxen ' , 'ox ' ),
98+ array ('bacteria ' , array ('bacterion ' , 'bacterium ' )),
99+ array ('criteria ' , array ('criterion ' , 'criterium ' )),
100+ array ('feet ' , 'foot ' ),
101+ array ('nebulae ' , 'nebula ' ),
102+ array ('babies ' , 'baby ' ),
103+ array ('hooves ' , 'hoof ' ),
104+ array ('chateaux ' , 'chateau ' ),
105+ array ('echoes ' , array ('echo ' , 'echoe ' )),
106+ array ('analyses ' , array ('analys ' , 'analyse ' , 'analysis ' )),
107+ array ('theses ' , array ('thes ' , 'these ' , 'thesis ' )),
108+ array ('foci ' , 'focus ' ),
109+ array ('focuses ' , array ('focus ' , 'focuse ' , 'focusis ' )),
110+ array ('oases ' , array ('oas ' , 'oase ' , 'oasis ' )),
111+ array ('matrices ' , array ('matrex ' , 'matrix ' )),
112+ array ('matrixes ' , 'matrix ' ),
113+ array ('bureaus ' , 'bureau ' ),
114+ array ('bureaux ' , 'bureau ' ),
115+ array ('beaux ' , 'beau ' ),
116+ array ('data ' , array ('daton ' , 'datum ' )),
117+ array ('phenomena ' , array ('phenomenon ' , 'phenomenum ' )),
118+ array ('strata ' , array ('straton ' , 'stratum ' )),
119+ array ('geese ' , 'goose ' ),
120+ array ('teeth ' , 'tooth ' ),
121+ array ('antennae ' , 'antenna ' ),
122+ array ('antennas ' , 'antenna ' ),
123+ array ('houses ' , array ('hous ' , 'house ' , 'housis ' )),
124+ array ('arches ' , array ('arch ' , 'arche ' )),
125+ array ('atlases ' , array ('atlas ' , 'atlase ' , 'atlasis ' )),
126+ // array('axes', 'axe'),
127+ array ('batches ' , array ('batch ' , 'batche ' )),
128+ array ('bushes ' , array ('bush ' , 'bushe ' )),
129+ array ('buses ' , array ('bus ' , 'buse ' , 'busis ' )),
130+ array ('calves ' , 'calf ' ),
131+ array ('circuses ' , array ('circus ' , 'circuse ' , 'circusis ' )),
132+ array ('crises ' , array ('cris ' , 'crise ' , 'crisis ' )),
133+ array ('dwarves ' , 'dwarf ' ),
134+ array ('elves ' , 'elf ' ),
135+ array ('emphases ' , array ('emphas ' , 'emphase ' , 'emphasis ' )),
136+ array ('faxes ' , 'fax ' ),
137+ array ('halves ' , 'half ' ),
138+ array ('heroes ' , array ('hero ' , 'heroe ' )),
139+ array ('hoaxes ' , 'hoax ' ),
140+ array ('irises ' , array ('iris ' , 'irise ' , 'irisis ' )),
141+ array ('kisses ' , array ('kiss ' , 'kisse ' , 'kissis ' )),
142+ array ('knives ' , 'knife ' ),
143+ array ('lives ' , 'life ' ),
144+ array ('lice ' , 'louse ' ),
145+ array ('mice ' , 'mouse ' ),
146+ array ('neuroses ' , array ('neuros ' , 'neurose ' , 'neurosis ' )),
147+ array ('plateaux ' , 'plateau ' ),
148+ array ('poppies ' , 'poppy ' ),
149+ array ('quizzes ' , 'quiz ' ),
150+ array ('scarves ' , 'scarf ' ),
151+ array ('spies ' , 'spy ' ),
152+ array ('stories ' , 'story ' ),
153+ array ('syllabi ' , 'syllabus ' ),
154+ array ('thieves ' , 'thief ' ),
155+ array ('waltzes ' , array ('waltz ' , 'waltze ' )),
156+ array ('wharves ' , 'wharf ' ),
157+ array ('wives ' , 'wife ' ),
158+ array ('ions ' , 'ion ' ),
159+ array ('bases ' , array ('bas ' , 'base ' , 'basis ' )),
160+ array ('cars ' , 'car ' ),
161+ array ('cassettes ' , array ('cassett ' , 'cassette ' )),
162+ array ('lamps ' , 'lamp ' ),
163+ array ('hats ' , 'hat ' ),
164+ array ('cups ' , 'cup ' ),
165+ array ('boxes ' , 'box ' ),
166+ array ('sandwiches ' , array ('sandwich ' , 'sandwiche ' )),
167+ array ('suitcases ' , array ('suitcas ' , 'suitcase ' , 'suitcasis ' )),
168+ array ('roses ' , array ('ros ' , 'rose ' , 'rosis ' )),
169+ array ('garages ' , array ('garag ' , 'garage ' )),
170+ array ('shoes ' , array ('sho ' , 'shoe ' )),
171+ array ('days ' , 'day ' ),
172+ array ('boys ' , 'boy ' ),
173+ array ('roofs ' , 'roof ' ),
174+ array ('cliffs ' , 'cliff ' ),
175+ array ('sheriffs ' , 'sheriff ' ),
176+ array ('discos ' , 'disco ' ),
177+ array ('pianos ' , 'piano ' ),
178+ array ('photos ' , 'photo ' ),
179+ array ('trees ' , array ('tre ' , 'tree ' )),
180+ array ('bees ' , array ('be ' , 'bee ' )),
181+ array ('cheeses ' , array ('chees ' , 'cheese ' , 'cheesis ' )),
182+ array ('radii ' , 'radius ' ),
183+
184+ // test casing: if the first letter was uppercase, it should remain so
185+ array ('Men ' , 'Man ' ),
186+ array ('GrandChildren ' , 'GrandChild ' ),
187+ array ('SubTrees ' , array ('SubTre ' , 'SubTree ' )),
188+ );
189+ }
190+
191+ /**
192+ * @dataProvider singularifyProvider
193+ */
194+ public function testSingularify ($ plural , $ singular )
195+ {
196+ $ this ->assertEquals ($ singular , FormUtil::singularify ($ plural ));
197+ }
80198}
0 commit comments