package nodomain.freeyourgadget.gadgetbridge.util.language; import android.content.SharedPreferences; import org.junit.Test; import java.util.Arrays; import java.util.LinkedHashMap; import java.util.Map; import nodomain.freeyourgadget.gadgetbridge.GBApplication; import nodomain.freeyourgadget.gadgetbridge.impl.GBDevice; import nodomain.freeyourgadget.gadgetbridge.test.TestBase; import nodomain.freeyourgadget.gadgetbridge.util.language.impl.CzechTransliterator; import nodomain.freeyourgadget.gadgetbridge.util.language.impl.ExtendedAsciiTransliterator; import nodomain.freeyourgadget.gadgetbridge.util.language.impl.FlattenToAsciiTransliterator; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import static nodomain.freeyourgadget.gadgetbridge.activities.devicesettings.DeviceSettingsPreferenceConst.PREF_TRANSLITERATION_LANGUAGES; /** * Tests LanguageUtils */ public class LanguageUtilsTest extends TestBase { private GBDevice dummyGBDevice; @Override public void setUp() throws Exception { super.setUp(); dummyGBDevice = createDummyGDevice("00:00:00:00:10"); } @Test public void testStringTransliterateCyrillic() throws Exception { final Transliterator transliterator = LanguageUtils.getTransliterator("russian"); // input with cyrillic and diacritic letters String input = "Прõсто текčт"; String output = transliterator.transliterate(input); String result = "Prosto tekct"; assertEquals("Transliteration failed", result, output); } @Test public void testStringTransliterateSerbian() throws Exception { final Transliterator transliterator = LanguageUtils.getTransliterator("serbian"); final Map tests = new LinkedHashMap() {{ put("Тхе qицк брон фоx јумпед овер тхе лаз* дог", "The qick bron fox jumped over the laz* dog"); put("Српска ћирилица", "Srpska cirilica"); put("Novak Đoković", "Novak Dokovic"); put("Џ, Њ and Љ", "Dz, Nj and Lj"); put("Љуљачка", "Ljuljacka"); put("Наковањ", "Nakovanj"); put("Качкаваљ", "Kackavalj"); put("Чачак", "Cacak"); put("Ч, ч", "C, c"); put("Ћ, ћ", "C, c"); put("Ж, ж", "Z, z"); put("Ш, ш", "S, s"); put("Ђ, ђ", "D, d"); put("Џ, џ", "Dz, dz"); put("Њ, њ", "Nj, nj"); put("Љ, љ", "Lj, lj"); }}; for (final Map.Entry e : tests.entrySet()) { assertEquals("Transliteration failed for " + e.getKey(), e.getValue(), transliterator.transliterate(e.getKey())); } } @Test public void testStringTransliterateHebrew() throws Exception { final Transliterator transliterator = LanguageUtils.getTransliterator("hebrew"); String input = "בדיקה עברית"; String output = transliterator.transliterate(input); String result = "bdykh 'bryth"; assertEquals("Transliteration failed", result, output); } @Test public void testStringTransliterateArabic() { final Transliterator transliterator = LanguageUtils.getTransliterator("arabic"); String pangram = "نص حكيم له سر قاطع وذو شأن عظيم مكتوب على ثوب أخضر ومغلف بجلد أزرق"; String pangramExpected = "n9 7kym lh sr qa63 wthw sh2n 36'ym mktwb 3la thwb 259'r wm3'lf bjld 2zrq"; String pangramActual = transliterator.transliterate(pangram); assertEquals("Arabic pangram transliteration failed", pangramExpected, pangramActual); String taMarbutah = "ﺓ"; String taMarbutahExpected = ""; String taMarbutahActual = transliterator.transliterate(taMarbutah); assertEquals("ta marbutah transliteration failed", taMarbutahExpected, taMarbutahActual); String hamza = "ءأؤإئآ"; String hamzaExpected = "222222"; String hamzaActual = transliterator.transliterate(hamza); assertEquals("hamza transliteration failed", hamzaExpected, hamzaActual); String easternArabicNumeralsArabic = "٠١٢٣٤٥٦٧٨٩"; String easternArabicNumeralsExpected = "0123456789"; assertEquals("Eastern Arabic numerals (Arabic) failed", easternArabicNumeralsExpected, transliterator.transliterate(easternArabicNumeralsArabic)); } public void testStringTransliteratePersian() { final Transliterator transliterator = LanguageUtils.getTransliterator("persian"); String farsi = "گچپژ"; String farsiExpected = "gchpzh"; String farsiActual = transliterator.transliterate(farsi); assertEquals("Farsi transiteration failed", farsiExpected, farsiActual); String easternArabicNumeralsFarsi = "۰۱۲۳۴۵۶۷۸۹"; String easternArabicNumeralsExpected = "0123456789"; assertEquals("Eastern Arabic numerals (Farsi) failed", easternArabicNumeralsExpected, transliterator.transliterate(easternArabicNumeralsFarsi)); } @Test public void testStringTransliterateBengali() throws Exception { final Transliterator transliterator = LanguageUtils.getTransliterator("bengali"); // input with cyrillic and diacritic letters String[] inputs = {"অনিরুদ্ধ", "বিজ্ঞানযাত্রা চলছে চলবে।", "আমি সব দেখেশুনে ক্ষেপে গিয়ে করি বাঙলায় চিৎকার!", "আমার জাভা কোড is so bad! কী আর বলবো!"}; String[] outputs = {"oniruddho", "biggaanJaatraa cholchhe cholbe.", "aami sob dekheshune kkhepe giye kori baanglaay chitkaar!", "aamaar jaabhaa koD is so bad! kii aar bolbo!"}; String result; for (int i = 0; i < inputs.length; i++) { result = transliterator.transliterate(inputs[i]); assertEquals("Transliteration failed", outputs[i], result); } } @Test public void testStringTransliterateKorean() { final Transliterator transliterator = LanguageUtils.getTransliterator("korean"); // A familiar phrase with no special provisions. String hello = "안녕하세요"; String helloExpected = "annyeonghaseyo"; String helloActual = transliterator.transliterate(hello); assertEquals("Korean hello transliteration failed", helloExpected, helloActual); // Korean pangram. Includes some ASCII punctuation which should not be changed by // transliteration. // // Translation: "Chocolate!? What I wanted was some rice puffs and clothes." "Child, why are // you complaining again?" String pangram = "\"웬 초콜릿? 제가 원했던 건 뻥튀기 쬐끔과 의류예요.\" \"얘야, 왜 또 불평?\""; String pangramExpected = "\"wen chokollit? jega wonhaetdeon geon ppeongtwigi jjoekkeumgwa uiryuyeyo.\" \"yaeya, wae tto bulpyeong?\""; String pangramActual = transliterator.transliterate(pangram); assertEquals("Korean pangram transliteration failed", pangramExpected, pangramActual); // Several words excercising special provisions, from Wikipedia. String special = "좋고, 놓다, 잡혀, 낳지"; String specialExpected = "joko, nota, japhyeo, nachi"; String specialActual = transliterator.transliterate(special); assertEquals("Korean special provisions transliteration failed", specialExpected, specialActual); // Isolated jamo. String isolatedJamo = "ㅋㅋㅋ"; String isolatedJamoExpected = "kkk"; String isolatedJamoActual = transliterator.transliterate(isolatedJamo); assertEquals("Korean isolated jamo transliteration failed", isolatedJamoExpected, isolatedJamoActual); // Korean transliteration shouldn't touch non-Hangul composites. String german = "schön"; String germanExpected = german; String germanActual = transliterator.transliterate(german); assertEquals("Korean transliteration modified a non-Hangul composite", germanExpected, germanActual); } @Test public void testStringTransliterateLatvian() { final Transliterator transliterator = LanguageUtils.getTransliterator("latvian"); String input = "ā č ē ģ ī ķ ļ ņ š ū ž Ā Č Ē Ģ Ī Ķ Ļ Ņ Š Ū Ž"; String output = transliterator.transliterate(input); String expected = "a c e g i k l n s u z A C E G I K L N S U Z"; assertEquals("latvian translation failed", expected, output); input = "aāa cčc eēe gģg iīi kķk lļl nņn sšs uūu zžz AĀA CČC EĒE GĢG IĪI KĶK LĻL NŅN SŠS UŪU ZŽZ"; output = transliterator.transliterate(input); expected = "aaa ccc eee ggg iii kkk lll nnn sss uuu zzz AAA CCC EEE GGG III KKK LLL NNN SSS UUU ZZZ"; assertEquals("latvian translation failed", expected, output); } @Test public void testStringTransliterateLithuanian() { final Transliterator transliterator = LanguageUtils.getTransliterator("lithuanian"); String input = "ą č ę ė į š ų ū ž"; String output = transliterator.transliterate(input); String expected = "a c e e i s u u z"; assertEquals("lithuanian translation failed", expected, output); input = "aąa cčc eęe eėe iįi sšs uųu uūu zžz"; output = transliterator.transliterate(input); expected = "aaa ccc eee eee iii sss uuu uuu zzz"; assertEquals("lithuanian translation failed", expected, output); } @Test public void testStringTransliterateGeorgian() { final Transliterator transliterator = LanguageUtils.getTransliterator("georgian"); String input = "ა ბ ტ თ ჟ ყ წ ჭ ჰ"; String output = transliterator.transliterate(input); String expected = "a b t T J y w W h"; assertEquals("georgian transliteration failed", expected, output); } @Test public void testStringTransliterateHungarian() { final Transliterator transliterator = LanguageUtils.getTransliterator("hungarian"); String input = "á é í ó ö ő ü ű"; String output = transliterator.transliterate(input); String expected = "a e i o o o u u"; assertEquals("hungarian transliteration failed", expected, output); } @Test public void testStringTransliterateCommonSymbols() { final Transliterator transliterator = LanguageUtils.getTransliterator("common_symbols"); String input = "© ® ™ ° « – » “ ” 〜 ² ³ ₅"; String output = transliterator.transliterate(input); String expected = "(c) (r) (tm) * < - > \" \" ~ 2 3 5"; assertEquals("common symbols translation failed", expected, output); input = "a©a b®b c™c d°d e«e f–f g»g h“h i”i j〜j k²k l³l m₅m"; output = transliterator.transliterate(input); expected = "a(c)a b(r)b c(tm)c d*d eg h\"h i\"i j~j k2k l3l m5m"; assertEquals("common symbols translation failed", expected, output); } @Test public void testStringTransliterateCroatian() { final Transliterator transliterator = LanguageUtils.getTransliterator("croatian"); String input = "č ć đ š ž"; String output = transliterator.transliterate(input); String expected = "c c d s z"; assertEquals("croatian transliteration failed", expected, output); } @Test public void testFlattenToAscii() throws Exception { final FlattenToAsciiTransliterator transliterator = new FlattenToAsciiTransliterator(); String input = "ä ș ț ă fine"; String output = transliterator.transliterate(input); String expected = "a s t a fine"; assertEquals("flatten to ascii transliteration failed", expected, output); } @Test public void testMultitransliterator() throws Exception { final MultiTransliterator multiTransliterator = new MultiTransliterator(Arrays.asList( new CzechTransliterator(), new ExtendedAsciiTransliterator(), new FlattenToAsciiTransliterator() )); assertEquals("Zlutoucky kun upel \"dabelske\" \"ody\"", multiTransliterator.transliterate("Žluťoučký kůň úpěl »ďábelské« „ódy“")); assertEquals("300 Kc", multiTransliterator.transliterate("300\u00A0Kč")); } @Test public void testTransliterateOption() throws Exception { enableTransliteration(false); assertNull("Transliteration option fail! Expected 'Off' by default, but result is 'On'", getTransliteration()); enableTransliteration(true); assertNotNull("Transliteration option fail! Expected 'On', but result is 'Off'", getTransliteration()); } private void enableTransliteration(boolean enable) { SharedPreferences devicePrefs = GBApplication.getDeviceSpecificSharedPrefs(dummyGBDevice.getAddress()); SharedPreferences.Editor editor = devicePrefs.edit(); if (enable) { editor.putString(PREF_TRANSLITERATION_LANGUAGES, "extended_ascii,scandinavian,german,russian,hebrew,greek,ukranian,arabic,persian,lithuanian,polish,estonian,icelandic,czech,turkish,bengali,korean,georgian,croatian"); } else { editor.remove(PREF_TRANSLITERATION_LANGUAGES); } editor.apply(); } private Transliterator getTransliteration() { return LanguageUtils.getTransliterator(dummyGBDevice); } }