1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 package org.apache.commons.codec.language;
19
20 import static org.junit.jupiter.api.Assertions.assertEquals;
21 import static org.junit.jupiter.api.Assertions.assertTrue;
22 import static org.junit.jupiter.api.Assertions.fail;
23
24 import org.apache.commons.codec.AbstractStringEncoderTest;
25 import org.junit.jupiter.api.Test;
26
27
28
29 class MetaphoneTest extends AbstractStringEncoderTest<Metaphone> {
30
31 void assertIsMetaphoneEqual(final String source, final String[] matches) {
32
33 for (final String matche : matches) {
34 assertTrue(getStringEncoder().isMetaphoneEqual(source, matche), "Source: " + source + ", should have same Metaphone as: " + matche);
35 }
36
37 for (final String matche : matches) {
38 for (final String matche2 : matches) {
39 assertTrue(getStringEncoder().isMetaphoneEqual(matche, matche2));
40 }
41 }
42 }
43
44 void assertMetaphoneEqual(final String[][] pairs) {
45 validateFixture(pairs);
46 for (final String[] pair : pairs) {
47 final String name0 = pair[0];
48 final String name1 = pair[1];
49 final String failMsg = "Expected match between " + name0 + " and " + name1;
50 assertTrue(getStringEncoder().isMetaphoneEqual(name0, name1), failMsg);
51 assertTrue(getStringEncoder().isMetaphoneEqual(name1, name0), failMsg);
52 }
53 }
54
55 @Override
56 protected Metaphone createStringEncoder() {
57 return new Metaphone();
58 }
59
60 @Test
61 void testDiscardOfSCEOrSCIOrSCY() {
62 assertEquals("SNS", getStringEncoder().metaphone("SCIENCE"));
63 assertEquals("SN", getStringEncoder().metaphone("SCENE"));
64 assertEquals("S", getStringEncoder().metaphone("SCY"));
65 }
66
67 @Test
68 void testDiscardOfSilentGN() {
69
70 assertEquals("N", getStringEncoder().metaphone("GNU"));
71
72
73 assertEquals("SNT", getStringEncoder().metaphone("SIGNED"));
74 }
75
76 @Test
77 void testDiscardOfSilentHAfterG() {
78 assertEquals("KNT", getStringEncoder().metaphone("GHENT"));
79 assertEquals("B", getStringEncoder().metaphone("BAUGH"));
80 }
81
82 @Test
83 void testExceedLength() {
84
85 assertEquals("AKSK", getStringEncoder().metaphone("AXEAXE"));
86 }
87
88 @Test
89 void testIsMetaphoneEqual1() {
90 assertMetaphoneEqual(new String[][] { { "Case", "case" }, { "CASE", "Case" }, { "caSe", "cAsE" }, { "quick", "cookie" } });
91 }
92
93
94
95
96 @Test
97 void testIsMetaphoneEqual2() {
98 assertMetaphoneEqual(new String[][] { { "Lawrence", "Lorenza" }, { "Gary", "Cahra" }, });
99 }
100
101
102
103
104
105
106 @Test
107 void testIsMetaphoneEqualAero() {
108 assertIsMetaphoneEqual("Aero", new String[] { "Eure" });
109 }
110
111
112
113
114
115
116 @Test
117 void testIsMetaphoneEqualAlbert() {
118 assertIsMetaphoneEqual("Albert", new String[] { "Ailbert", "Alberik", "Albert", "Alberto", "Albrecht" });
119 }
120
121
122
123
124 @Test
125 void testIsMetaphoneEqualGary() {
126 assertIsMetaphoneEqual("Gary",
127 new String[] { "Cahra", "Cara", "Carey", "Cari", "Caria", "Carie", "Caro", "Carree", "Carri", "Carrie", "Carry", "Cary", "Cora", "Corey",
128 "Cori", "Corie", "Correy", "Corri", "Corrie", "Corry", "Cory", "Gray", "Kara", "Kare", "Karee", "Kari", "Karia", "Karie", "Karrah",
129 "Karrie", "Karry", "Kary", "Keri", "Kerri", "Kerrie", "Kerry", "Kira", "Kiri", "Kora", "Kore", "Kori", "Korie", "Korrie", "Korry" });
130 }
131
132
133
134
135 @Test
136 void testIsMetaphoneEqualJohn() {
137 assertIsMetaphoneEqual("John",
138 new String[] { "Gena", "Gene", "Genia", "Genna", "Genni", "Gennie", "Genny", "Giana", "Gianna", "Gina", "Ginni", "Ginnie", "Ginny", "Jaine",
139 "Jan", "Jana", "Jane", "Janey", "Jania", "Janie", "Janna", "Jany", "Jayne", "Jean", "Jeana", "Jeane", "Jeanie", "Jeanna", "Jeanne",
140 "Jeannie", "Jen", "Jena", "Jeni", "Jenn", "Jenna", "Jennee", "Jenni", "Jennie", "Jenny", "Jinny", "Jo Ann", "Jo-Ann", "Jo-Anne", "Joan",
141 "Joana", "Joane", "Joanie", "Joann", "Joanna", "Joanne", "Joeann", "Johna", "Johnna", "Joni", "Jonie", "Juana", "June", "Junia",
142 "Junie" });
143 }
144
145
146
147
148
149
150 @Test
151 void testIsMetaphoneEqualKnight() {
152 assertIsMetaphoneEqual("Knight", new String[] { "Hynda", "Nada", "Nadia", "Nady", "Nat", "Nata", "Natty", "Neda", "Nedda", "Nedi", "Netta",
153 "Netti", "Nettie", "Netty", "Nita", "Nydia" });
154 }
155
156
157
158
159 @Test
160 void testIsMetaphoneEqualMary() {
161 assertIsMetaphoneEqual("Mary", new String[] { "Mair", "Maire", "Mara", "Mareah", "Mari", "Maria", "Marie", "Mary", "Maura", "Maure", "Meara",
162 "Merrie", "Merry", "Mira", "Moira", "Mora", "Moria", "Moyra", "Muire", "Myra", "Myrah" });
163 }
164
165
166
167
168 @Test
169 void testIsMetaphoneEqualParis() {
170 assertIsMetaphoneEqual("Paris", new String[] { "Pearcy", "Perris", "Piercy", "Pierz", "Pryse" });
171 }
172
173
174
175
176 @Test
177 void testIsMetaphoneEqualPeter() {
178 assertIsMetaphoneEqual("Peter", new String[] { "Peadar", "Peder", "Pedro", "Peter", "Petr", "Peyter", "Pieter", "Pietro", "Piotr" });
179 }
180
181
182
183
184 @Test
185 void testIsMetaphoneEqualRay() {
186 assertIsMetaphoneEqual("Ray", new String[] { "Ray", "Rey", "Roi", "Roy", "Ruy" });
187 }
188
189
190
191
192 @Test
193 void testIsMetaphoneEqualSusan() {
194 assertIsMetaphoneEqual("Susan",
195 new String[] { "Siusan", "Sosanna", "Susan", "Susana", "Susann", "Susanna", "Susannah", "Susanne", "Suzann", "Suzanna", "Suzanne", "Zuzana" });
196 }
197
198
199
200
201
202
203 @Test
204 void testIsMetaphoneEqualWhite() {
205 assertIsMetaphoneEqual("White",
206 new String[] { "Wade", "Wait", "Waite", "Wat", "Whit", "Wiatt", "Wit", "Wittie", "Witty", "Wood", "Woodie", "Woody" });
207 }
208
209
210
211
212
213
214 @Test
215 void testIsMetaphoneEqualWright() {
216 assertIsMetaphoneEqual("Wright", new String[] { "Rota", "Rudd", "Ryde" });
217 }
218
219
220
221
222 @Test
223 void testIsMetaphoneEqualXalan() {
224 assertIsMetaphoneEqual("Xalan", new String[] { "Celene", "Celina", "Celine", "Selena", "Selene", "Selina", "Seline", "Suellen", "Xylina" });
225 }
226
227 @Test
228 void testMetaphone() {
229 assertEquals("HL", getStringEncoder().metaphone("howl"));
230 assertEquals("TSTN", getStringEncoder().metaphone("testing"));
231 assertEquals("0", getStringEncoder().metaphone("The"));
232 assertEquals("KK", getStringEncoder().metaphone("quick"));
233 assertEquals("BRN", getStringEncoder().metaphone("brown"));
234 assertEquals("FKS", getStringEncoder().metaphone("fox"));
235 assertEquals("JMPT", getStringEncoder().metaphone("jumped"));
236 assertEquals("OFR", getStringEncoder().metaphone("over"));
237 assertEquals("0", getStringEncoder().metaphone("the"));
238 assertEquals("LS", getStringEncoder().metaphone("lazy"));
239 assertEquals("TKS", getStringEncoder().metaphone("dogs"));
240 }
241
242 @Test
243 void testPHTOF() {
244 assertEquals("FX", getStringEncoder().metaphone("PHISH"));
245 }
246
247 @Test
248 void testSetMaxLengthWithTruncation() {
249
250 getStringEncoder().setMaxCodeLen(6);
251 assertEquals("AKSKSK", getStringEncoder().metaphone("AXEAXEAXE"));
252 }
253
254 @Test
255 void testSHAndSIOAndSIAToX() {
256 assertEquals("XT", getStringEncoder().metaphone("SHOT"));
257 assertEquals("OTXN", getStringEncoder().metaphone("ODSIAN"));
258 assertEquals("PLXN", getStringEncoder().metaphone("PULSION"));
259 }
260
261 @Test
262 void testTCH() {
263 assertEquals("RX", getStringEncoder().metaphone("RETCH"));
264 assertEquals("WX", getStringEncoder().metaphone("WATCH"));
265 }
266
267 @Test
268 void testTIOAndTIAToX() {
269 assertEquals("OX", getStringEncoder().metaphone("OTIA"));
270 assertEquals("PRXN", getStringEncoder().metaphone("PORTION"));
271 }
272
273 @Test
274 void testTranslateOfCHCharacterWithMaxCodeLenFive() {
275 final Metaphone metaphone = new Metaphone();
276 metaphone.setMaxCodeLen(5);
277 assertEquals("XRKTR", metaphone.metaphone("CHARACTER"));
278 }
279
280 @Test
281 void testTranslateOfSCHAndCH() {
282 assertEquals("SNS", getStringEncoder().metaphone("SCIENCE"));
283 assertEquals("SN", getStringEncoder().metaphone("SCENE"));
284 assertEquals("S", getStringEncoder().metaphone("SCY"));
285 assertEquals("SKTL", getStringEncoder().metaphone("SCHEDULE"));
286 assertEquals("SKMT", getStringEncoder().metaphone("SCHEMATIC"));
287 assertEquals("TSKR", getStringEncoder().metaphone("DISCHARGE"));
288 assertEquals("EX", getStringEncoder().metaphone("ECHO"));
289 assertEquals("TX", getStringEncoder().metaphone("TEACH"));
290 assertEquals("XR", getStringEncoder().metaphone("CHERI"));
291 assertEquals("XP", getStringEncoder().metaphone("CHIP"));
292 assertEquals("XRST", getStringEncoder().metaphone("CHRIST"));
293 assertEquals("X", getStringEncoder().metaphone("CIAO"));
294 assertEquals("ST", getStringEncoder().metaphone("CITY"));
295 assertEquals("KT", getStringEncoder().metaphone("CAT"));
296
297 }
298
299 @Test
300 void testTranslateToJOfDGEOrDGIOrDGY() {
301 assertEquals("TJ", getStringEncoder().metaphone("DODGY"));
302 assertEquals("TJ", getStringEncoder().metaphone("DODGE"));
303 assertEquals("AJMT", getStringEncoder().metaphone("ADGIEMTI"));
304 }
305
306
307
308
309 @Test
310 void testWhy() {
311
312 assertEquals("", getStringEncoder().metaphone("WHY"));
313 }
314
315 @Test
316 void testWordEndingInMB() {
317 assertEquals("KM", getStringEncoder().metaphone("COMB"));
318 assertEquals("TM", getStringEncoder().metaphone("TOMB"));
319 assertEquals("WM", getStringEncoder().metaphone("WOMB"));
320 }
321
322 @Test
323 void testWordsWithCIA() {
324 assertEquals("XP", getStringEncoder().metaphone("CIAPO"));
325 }
326
327 public void validateFixture(final String[][] pairs) {
328 if (pairs.length == 0) {
329 fail("Test fixture is empty");
330 }
331 for (int i = 0; i < pairs.length; i++) {
332 if (pairs[i].length != 2) {
333 fail("Error in test fixture in the data array at index " + i);
334 }
335 }
336 }
337
338 }