blob: cdfe718f8647231a6a5df4558a3d6879f2a33ab4 [file]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.commons.codec.language;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.junit.jupiter.api.Assertions.fail;
import org.apache.commons.codec.AbstractStringEncoderTest;
import org.junit.jupiter.api.Test;
/**
*/
class MetaphoneTest extends AbstractStringEncoderTest<Metaphone> {
void assertIsMetaphoneEqual(final String source, final String[] matches) {
// match source to all matches
for (final String matche : matches) {
assertTrue(getStringEncoder().isMetaphoneEqual(source, matche), "Source: " + source + ", should have same Metaphone as: " + matche);
}
// match to each other
for (final String matche : matches) {
for (final String matche2 : matches) {
assertTrue(getStringEncoder().isMetaphoneEqual(matche, matche2));
}
}
}
void assertMetaphoneEqual(final String[][] pairs) {
validateFixture(pairs);
for (final String[] pair : pairs) {
final String name0 = pair[0];
final String name1 = pair[1];
final String failMsg = "Expected match between " + name0 + " and " + name1;
assertTrue(getStringEncoder().isMetaphoneEqual(name0, name1), failMsg);
assertTrue(getStringEncoder().isMetaphoneEqual(name1, name0), failMsg);
}
}
@Override
protected Metaphone createStringEncoder() {
return new Metaphone();
}
@Test
void testDiscardOfSCEOrSCIOrSCY() {
assertEquals("SNS", getStringEncoder().metaphone("SCIENCE"));
assertEquals("SN", getStringEncoder().metaphone("SCENE"));
assertEquals("S", getStringEncoder().metaphone("SCY"));
}
@Test
void testDiscardOfSilentGN() {
// NOTE: This does not test for silent GN, but for starting with GN
assertEquals("N", getStringEncoder().metaphone("GNU"));
// NOTE: Trying to test for GNED, but expected code does not appear to execute
assertEquals("SNT", getStringEncoder().metaphone("SIGNED"));
}
@Test
void testDiscardOfSilentHAfterG() {
assertEquals("KNT", getStringEncoder().metaphone("GHENT"));
assertEquals("B", getStringEncoder().metaphone("BAUGH"));
}
@Test
void testExceedLength() {
// should be AKSKS, but is truncated by Max Code Length
assertEquals("AKSK", getStringEncoder().metaphone("AXEAXE"));
}
@Test
void testIsMetaphoneEqual1() {
assertMetaphoneEqual(new String[][] { { "Case", "case" }, { "CASE", "Case" }, { "caSe", "cAsE" }, { "quick", "cookie" } });
}
/**
* Matches computed from http://www.lanw.com/java/phonetic/default.htm
*/
@Test
void testIsMetaphoneEqual2() {
assertMetaphoneEqual(new String[][] { { "Lawrence", "Lorenza" }, { "Gary", "Cahra" }, });
}
/**
* Initial AE case.
*
* Match data computed from http://www.lanw.com/java/phonetic/default.htm
*/
@Test
void testIsMetaphoneEqualAero() {
assertIsMetaphoneEqual("Aero", new String[] { "Eure" });
}
/**
* Initial A, not followed by an E case.
*
* Match data computed from http://www.lanw.com/java/phonetic/default.htm
*/
@Test
void testIsMetaphoneEqualAlbert() {
assertIsMetaphoneEqual("Albert", new String[] { "Ailbert", "Alberik", "Albert", "Alberto", "Albrecht" });
}
/**
* Match data computed from http://www.lanw.com/java/phonetic/default.htm
*/
@Test
void testIsMetaphoneEqualGary() {
assertIsMetaphoneEqual("Gary",
new String[] { "Cahra", "Cara", "Carey", "Cari", "Caria", "Carie", "Caro", "Carree", "Carri", "Carrie", "Carry", "Cary", "Cora", "Corey",
"Cori", "Corie", "Correy", "Corri", "Corrie", "Corry", "Cory", "Gray", "Kara", "Kare", "Karee", "Kari", "Karia", "Karie", "Karrah",
"Karrie", "Karry", "Kary", "Keri", "Kerri", "Kerrie", "Kerry", "Kira", "Kiri", "Kora", "Kore", "Kori", "Korie", "Korrie", "Korry" });
}
/**
* Match data computed from http://www.lanw.com/java/phonetic/default.htm
*/
@Test
void testIsMetaphoneEqualJohn() {
assertIsMetaphoneEqual("John",
new String[] { "Gena", "Gene", "Genia", "Genna", "Genni", "Gennie", "Genny", "Giana", "Gianna", "Gina", "Ginni", "Ginnie", "Ginny", "Jaine",
"Jan", "Jana", "Jane", "Janey", "Jania", "Janie", "Janna", "Jany", "Jayne", "Jean", "Jeana", "Jeane", "Jeanie", "Jeanna", "Jeanne",
"Jeannie", "Jen", "Jena", "Jeni", "Jenn", "Jenna", "Jennee", "Jenni", "Jennie", "Jenny", "Jinny", "Jo Ann", "Jo-Ann", "Jo-Anne", "Joan",
"Joana", "Joane", "Joanie", "Joann", "Joanna", "Joanne", "Joeann", "Johna", "Johnna", "Joni", "Jonie", "Juana", "June", "Junia",
"Junie" });
}
/**
* Initial KN case.
*
* Match data computed from http://www.lanw.com/java/phonetic/default.htm
*/
@Test
void testIsMetaphoneEqualKnight() {
assertIsMetaphoneEqual("Knight", new String[] { "Hynda", "Nada", "Nadia", "Nady", "Nat", "Nata", "Natty", "Neda", "Nedda", "Nedi", "Netta",
"Netti", "Nettie", "Netty", "Nita", "Nydia" });
}
/**
* Match data computed from http://www.lanw.com/java/phonetic/default.htm
*/
@Test
void testIsMetaphoneEqualMary() {
assertIsMetaphoneEqual("Mary", new String[] { "Mair", "Maire", "Mara", "Mareah", "Mari", "Maria", "Marie", "Mary", "Maura", "Maure", "Meara",
"Merrie", "Merry", "Mira", "Moira", "Mora", "Moria", "Moyra", "Muire", "Myra", "Myrah" });
}
/**
* Match data computed from http://www.lanw.com/java/phonetic/default.htm
*/
@Test
void testIsMetaphoneEqualParis() {
assertIsMetaphoneEqual("Paris", new String[] { "Pearcy", "Perris", "Piercy", "Pierz", "Pryse" });
}
/**
* Match data computed from http://www.lanw.com/java/phonetic/default.htm
*/
@Test
void testIsMetaphoneEqualPeter() {
assertIsMetaphoneEqual("Peter", new String[] { "Peadar", "Peder", "Pedro", "Peter", "Petr", "Peyter", "Pieter", "Pietro", "Piotr" });
}
/**
* Match data computed from http://www.lanw.com/java/phonetic/default.htm
*/
@Test
void testIsMetaphoneEqualRay() {
assertIsMetaphoneEqual("Ray", new String[] { "Ray", "Rey", "Roi", "Roy", "Ruy" });
}
/**
* Match data computed from http://www.lanw.com/java/phonetic/default.htm
*/
@Test
void testIsMetaphoneEqualSusan() {
assertIsMetaphoneEqual("Susan",
new String[] { "Siusan", "Sosanna", "Susan", "Susana", "Susann", "Susanna", "Susannah", "Susanne", "Suzann", "Suzanna", "Suzanne", "Zuzana" });
}
/**
* Initial WH case.
*
* Match data computed from http://www.lanw.com/java/phonetic/default.htm
*/
@Test
void testIsMetaphoneEqualWhite() {
assertIsMetaphoneEqual("White",
new String[] { "Wade", "Wait", "Waite", "Wat", "Whit", "Wiatt", "Wit", "Wittie", "Witty", "Wood", "Woodie", "Woody" });
}
/**
* Initial WR case.
*
* Match data computed from http://www.lanw.com/java/phonetic/default.htm
*/
@Test
void testIsMetaphoneEqualWright() {
assertIsMetaphoneEqual("Wright", new String[] { "Rota", "Rudd", "Ryde" });
}
/**
* Match data computed from http://www.lanw.com/java/phonetic/default.htm
*/
@Test
void testIsMetaphoneEqualXalan() {
assertIsMetaphoneEqual("Xalan", new String[] { "Celene", "Celina", "Celine", "Selena", "Selene", "Selina", "Seline", "Suellen", "Xylina" });
}
@Test
void testMetaphone() {
assertEquals("HL", getStringEncoder().metaphone("howl"));
assertEquals("TSTN", getStringEncoder().metaphone("testing"));
assertEquals("0", getStringEncoder().metaphone("The"));
assertEquals("KK", getStringEncoder().metaphone("quick"));
assertEquals("BRN", getStringEncoder().metaphone("brown"));
assertEquals("FKS", getStringEncoder().metaphone("fox"));
assertEquals("JMPT", getStringEncoder().metaphone("jumped"));
assertEquals("OFR", getStringEncoder().metaphone("over"));
assertEquals("0", getStringEncoder().metaphone("the"));
assertEquals("LS", getStringEncoder().metaphone("lazy"));
assertEquals("TKS", getStringEncoder().metaphone("dogs"));
}
@Test
void testPHTOF() {
assertEquals("FX", getStringEncoder().metaphone("PHISH"));
}
@Test
void testSetMaxLengthWithTruncation() {
// should be AKSKS, but istruncated by Max Code Length
getStringEncoder().setMaxCodeLen(6);
assertEquals("AKSKSK", getStringEncoder().metaphone("AXEAXEAXE"));
}
@Test
void testSHAndSIOAndSIAToX() {
assertEquals("XT", getStringEncoder().metaphone("SHOT"));
assertEquals("OTXN", getStringEncoder().metaphone("ODSIAN"));
assertEquals("PLXN", getStringEncoder().metaphone("PULSION"));
}
@Test
void testTCH() {
assertEquals("RX", getStringEncoder().metaphone("RETCH"));
assertEquals("WX", getStringEncoder().metaphone("WATCH"));
}
@Test
void testTIOAndTIAToX() {
assertEquals("OX", getStringEncoder().metaphone("OTIA"));
assertEquals("PRXN", getStringEncoder().metaphone("PORTION"));
}
@Test
void testTranslateOfCHCharacterWithMaxCodeLenFive() {
final Metaphone metaphone = new Metaphone();
metaphone.setMaxCodeLen(5);
assertEquals("XRKTR", metaphone.metaphone("CHARACTER"));
}
@Test
void testTranslateOfSCHAndCH() {
assertEquals("SNS", getStringEncoder().metaphone("SCIENCE"));
assertEquals("SN", getStringEncoder().metaphone("SCENE"));
assertEquals("S", getStringEncoder().metaphone("SCY"));
assertEquals("SKTL", getStringEncoder().metaphone("SCHEDULE"));
assertEquals("SKMT", getStringEncoder().metaphone("SCHEMATIC"));
assertEquals("TSKR", getStringEncoder().metaphone("DISCHARGE"));
assertEquals("EX", getStringEncoder().metaphone("ECHO"));
assertEquals("TX", getStringEncoder().metaphone("TEACH"));
assertEquals("XR", getStringEncoder().metaphone("CHERI"));
assertEquals("XP", getStringEncoder().metaphone("CHIP"));
assertEquals("XRST", getStringEncoder().metaphone("CHRIST"));
assertEquals("X", getStringEncoder().metaphone("CIAO"));
assertEquals("ST", getStringEncoder().metaphone("CITY"));
assertEquals("KT", getStringEncoder().metaphone("CAT"));
}
@Test
void testTranslateToJOfDGEOrDGIOrDGY() {
assertEquals("TJ", getStringEncoder().metaphone("DODGY"));
assertEquals("TJ", getStringEncoder().metaphone("DODGE"));
assertEquals("AJMT", getStringEncoder().metaphone("ADGIEMTI"));
}
/**
* Tests (CODEC-57) Metaphone.Metaphone(String) returns an empty string when passed the word "why"
*/
@Test
void testWhy() {
// PHP returns "H". The original Metaphone returns an empty string.
assertEquals("", getStringEncoder().metaphone("WHY"));
}
@Test
void testWordEndingInMB() {
assertEquals("KM", getStringEncoder().metaphone("COMB"));
assertEquals("TM", getStringEncoder().metaphone("TOMB"));
assertEquals("WM", getStringEncoder().metaphone("WOMB"));
}
@Test
void testWordsWithCIA() {
assertEquals("XP", getStringEncoder().metaphone("CIAPO"));
}
public void validateFixture(final String[][] pairs) {
if (pairs.length == 0) {
fail("Test fixture is empty");
}
for (int i = 0; i < pairs.length; i++) {
if (pairs[i].length != 2) {
fail("Error in test fixture in the data array at index " + i);
}
}
}
}