package marytts.modules.phonemiser;
import java.io.InputStream;
import java.util.Arrays;
import java.util.List;
import marytts.exceptions.MaryConfigurationException;
import org.apache.commons.lang.StringUtils;
import org.testng.Assert;
import org.testng.annotations.*;
public class AllophoneSetTest {
private AllophoneSet allophoneSet;
@BeforeTest
public void setUp() throws MaryConfigurationException {
InputStream alloStream = AllophoneSetTest.class.getResourceAsStream("allophones.de.xml");
allophoneSet = AllophoneSet.getAllophoneSet(alloStream, "test");
}
@Test
public void testLoadOnceReuse() throws MaryConfigurationException {
InputStream alloStream1b = AllophoneSetTest.class.getResourceAsStream("allophones.de.xml");
AllophoneSet allo1b = AllophoneSet.getAllophoneSet(alloStream1b, "test");
Assert.assertEquals(allophoneSet, allo1b);
}
@Test
public void testUnloadedIsUnavailable() {
Assert.assertFalse(AllophoneSet.hasAllophoneSet("laaleeloo"));
}
@Test
public void testLoadedIsAvailable() throws MaryConfigurationException {
Assert.assertTrue(AllophoneSet.hasAllophoneSet("test"));
AllophoneSet copy = AllophoneSet.getAllophoneSetById("test");
Assert.assertEquals(allophoneSet, copy);
}
@Test(expectedExceptions = IllegalArgumentException.class)
public void testGetInvalidAllophone() {
allophoneSet.getAllophone("fnord");
}
@Test(dataProvider = "allophoneArrayData")
public void testSplitIntoAllophones(String phoneString, Allophone[] expecteds) {
Allophone[] actuals = allophoneSet.splitIntoAllophones(phoneString);
Assert.assertEquals(expecteds, actuals);
}
@DataProvider
private Object[][] allophoneArrayData() {
Allophone t = allophoneSet.getAllophone("t");
Allophone oy = allophoneSet.getAllophone("OY");
Allophone[] allophones = new Allophone[] { t, oy, t, oy, t, oy };
// @formatter:off
return new Object[][] {
{ "tOYtOYtOY", allophones },
{ "'tOYtOYtOY", allophones },
{ ",tOYtOY'tOY", allophones },
{ "tOY tOY tOY", allophones },
{ "'tOY tOY tOY", allophones },
{ ",tOY tOY 'tOY", allophones },
{ "tOY-tOY-tOY", allophones },
{ "'tOY-tOY-tOY", allophones },
{ ",tOY-tOY-'tOY", allophones }
};
// @formatter:on
}
@Test(dataProvider = "allophoneStringData")
public void testSplitAllophoneString(String phoneString, String expected) {
String actual = allophoneSet.splitAllophoneString(phoneString);
Assert.assertEquals(actual, expected);
}
@Test(dataProvider = "allophoneStringData")
public void testSplitIntoAllophoneList(String phoneString, String allophoneListString) {
String[] allophones = StringUtils.split(allophoneListString);
List<String> expected = Arrays.asList(allophones);
List<String> actual = allophoneSet.splitIntoAllophoneList(phoneString);
Assert.assertEquals(actual, expected);
}
@DataProvider
private Object[][] allophoneStringData() {
// @formatter:off
return new Object[][] {
{ "tOYtOYtOY", "t OY t OY t OY" },
{ "'tOYtOYtOY", "' t OY t OY t OY" },
{ ",tOYtOY'tOY", ", t OY t OY ' t OY" },
{ "tOY tOY tOY", "t OY t OY t OY" },
{ "'tOY tOY tOY", "' t OY t OY t OY" },
{ ",tOY tOY 'tOY", ", t OY t OY ' t OY" },
{ "tOY-tOY-tOY", "t OY - t OY - t OY" },
{ "'tOY-tOY-tOY", "' t OY - t OY - t OY" },
{ ",tOY-tOY-'tOY", ", t OY - t OY - ' t OY" }
};
// @formatter:on
}
@Test(expectedExceptions = IllegalArgumentException.class)
public void testSplitIntoAllophoneListWithInvalidInput() {
Assert.assertNull(allophoneSet.splitIntoAllophoneList("!@#$%^"));
}
@Test(expectedExceptions = IllegalArgumentException.class)
public void testSyllabifyWithEmptyInput() {
allophoneSet.syllabify("");
}
@Test(dataProvider = "syllabifierData")
public void testSyllabify(String phones, String expected) {
String actual = allophoneSet.syllabify(phones);
Assert.assertEquals(actual, expected);
}
@DataProvider
private Object[][] syllabifierData() {
// @formatter:off
return new Object[][] {
{ "ma", "' m a" },
{ "'ma", "' m a" },
{ "mama", "' m a - m a" },
{ "'mama", "' m a - m a" },
{ "ma'ma", "m a - ' m a" },
{ "mamama", "' m a - m a - m a" },
{ "'mamama", "' m a - m a - m a" },
{ "ma'mama", "m a - ' m a - m a" },
{ "mama'ma", "m a - m a - ' m a" },
{ "mamamama", "' m a - m a - m a - m a" },
{ "'mamamama", "' m a - m a - m a - m a" },
{ "ma'mamama", "m a - ' m a - m a - m a" },
{ "mama'mama", "m a - m a - ' m a - m a" },
{ "mamama'ma", "m a - m a - m a - ' m a" },
{ ",mama'mama", ", m a - m a - ' m a - m a" },
{ "StaInSla:k", "' S t aI n - S l a: k" },
{ "StRUntsdUm", "' S t R U n ts - d U m" },
{ "a:b6", "' a: - b 6" },
{ "daU6vU6st", "' d aU - 6 - v U 6 s t" },
{ "fOY6maU6", "' f OY - 6 - m aU - 6" },
{ ",ha6tbE6ktU6mg@'ve:6", ", h a 6 t - b E 6 k - t U 6 m - g @ - ' v e: 6" },
{ "'pfaU@n,SlOY@", "' pf aU - @ n - , S l OY - @" }
};
// @formatter:on
}
@Test
public void testSyllabifyWithoutNucleus() {
String actual = allophoneSet.syllabify("s");
String expected = "' s";
Assert.assertEquals(actual, expected);
}
@Test(dataProvider = "legacySyllabifierData")
public void testLegacySyllabify(String phones, String expected) {
String actual = allophoneSet.syllabify(phones);
Assert.assertEquals(actual, expected);
}
@DataProvider
private Object[][] legacySyllabifierData() {
// @formatter:off
return new Object[][] {
{ "ma1", "' m a" },
{ "ma1ma", "' m a - m a" },
{ "mama1", "m a - ' m a" },
{ "ma1mama", "' m a - m a - m a" },
{ "mama1ma", "m a - ' m a - m a" },
{ "mamama1", "m a - m a - ' m a" },
{ "ma1mamama", "' m a - m a - m a - m a" },
{ "mama1mama", "m a - ' m a - m a - m a" },
{ "mamama1ma", "m a - m a - ' m a - m a" },
{ "mamamama1", "m a - m a - m a - ' m a" }
};
// @formatter:on
}
@Test
public void testLegacySyllabifyWithoutNucleus() {
String actual = allophoneSet.syllabify("s1");
String expected = "' s";
Assert.assertEquals(actual, expected);
}
}