diff options
Diffstat (limited to 'tests/src')
4 files changed, 128 insertions, 52 deletions
diff --git a/tests/src/com/android/inputmethod/keyboard/SpacebarTextTests.java b/tests/src/com/android/inputmethod/keyboard/SpacebarTextTests.java index 1398db97c..850af94f7 100644 --- a/tests/src/com/android/inputmethod/keyboard/SpacebarTextTests.java +++ b/tests/src/com/android/inputmethod/keyboard/SpacebarTextTests.java @@ -113,7 +113,8 @@ public class SpacebarTextTests extends AndroidTestCase { final String subtypeName = SubtypeLocale.getSubtypeDisplayName(subtype); final Locale locale = SubtypeLocale.getSubtypeLocale(subtype); final String spacebarText = MainKeyboardView.getShortDisplayName(subtype); - final String languageCode = StringUtils.toTitleCase(locale.getLanguage(), locale); + final String languageCode = StringUtils.capitalizeFirstCodePoint( + locale.getLanguage(), locale); if (SubtypeLocale.isNoLanguage(subtype)) { assertEquals(subtypeName, "", spacebarText); } else { diff --git a/tests/src/com/android/inputmethod/latin/InputTestsBase.java b/tests/src/com/android/inputmethod/latin/InputTestsBase.java index 4583eab2f..9e107a49c 100644 --- a/tests/src/com/android/inputmethod/latin/InputTestsBase.java +++ b/tests/src/com/android/inputmethod/latin/InputTestsBase.java @@ -162,45 +162,22 @@ public class InputTestsBase extends ServiceTestCase<LatinIME> { // on the same thread that the tests are running on to mimic the actual environment as // closely as possible. // Now, Looper#loop() never exits in normal operation unless the Looper#quit() method - // is called, so we need to do that at the right time so that #loop() returns at some - // point and we don't end up in an infinite loop. - // After we quit, the looper is still technically ready to process more messages but - // the handler will refuse to enqueue any because #quit() has been called and it - // explicitly tests for it on message enqueuing, so we'll have to reset it so that - // it lets us continue normal operation. + // is called, which has a lot of bad side effects. We can however just throw an exception + // in the runnable which will unwind the stack and allow us to exit. + private final class InterruptRunMessagesException extends RuntimeException { + // Empty class + } protected void runMessages() { - // Here begins deep magic. - final Looper looper = mLatinIME.mHandler.getLooper(); mLatinIME.mHandler.post(new Runnable() { @Override public void run() { - looper.quit(); + throw new InterruptRunMessagesException(); } }); - // The only way to get out of Looper#loop() is to call #quit() on it (or on its queue). - // Once #quit() is called remaining messages are not processed, which is why we post - // a message that calls it instead of calling it directly. - Looper.loop(); - - // Once #quit() has been called, the looper is not functional any more (it used to be, - // but now it SIGSEGV's if it's used again). - // It won't accept creating a new looper for this thread and switching to it... - // ...unless we can trick it into throwing out the old looper and believing it hasn't - // been initialized before. - MessageQueue queue = Looper.myQueue(); try { - // However there is no way of doing it externally, and the static ThreadLocal - // field into which it's stored is private. - // So... get out the big guns. - java.lang.reflect.Field f = Looper.class.getDeclaredField("sThreadLocal"); - f.setAccessible(true); // private lolwut - final ThreadLocal<Looper> a = (ThreadLocal<Looper>) f.get(looper); - a.set(null); - looper.prepare(); - } catch (NoSuchFieldException e) { - throw new RuntimeException(e); - } catch (IllegalAccessException e) { - throw new RuntimeException(e); + Looper.loop(); + } catch (InterruptRunMessagesException e) { + // Resume normal operation } } diff --git a/tests/src/com/android/inputmethod/latin/RichInputConnectionTests.java b/tests/src/com/android/inputmethod/latin/RichInputConnectionTests.java index 9e545a5b2..dc8837dab 100644 --- a/tests/src/com/android/inputmethod/latin/RichInputConnectionTests.java +++ b/tests/src/com/android/inputmethod/latin/RichInputConnectionTests.java @@ -19,6 +19,7 @@ package com.android.inputmethod.latin; import android.inputmethodservice.InputMethodService; import android.test.AndroidTestCase; import android.test.suitebuilder.annotation.SmallTest; +import android.text.TextUtils; import android.view.inputmethod.ExtractedText; import android.view.inputmethod.ExtractedTextRequest; import android.view.inputmethod.InputConnection; @@ -141,11 +142,11 @@ public class RichInputConnectionTests extends AndroidTestCase { ic.beginBatchEdit(); // basic case r = ic.getWordRangeAtCursor(" ", 0); - assertEquals("word", r.mWord); + assertTrue(TextUtils.equals("word", r.mWord)); // more than one word r = ic.getWordRangeAtCursor(" ", 1); - assertEquals("word word", r.mWord); + assertTrue(TextUtils.equals("word word", r.mWord)); ic.endBatchEdit(); // tab character instead of space @@ -153,28 +154,28 @@ public class RichInputConnectionTests extends AndroidTestCase { ic.beginBatchEdit(); r = ic.getWordRangeAtCursor("\t", 1); ic.endBatchEdit(); - assertEquals("word\tword", r.mWord); + assertTrue(TextUtils.equals("word\tword", r.mWord)); // only one word doesn't go too far mockInputMethodService.setInputConnection(new MockConnection("one\tword\two", "rd", et)); ic.beginBatchEdit(); r = ic.getWordRangeAtCursor("\t", 1); ic.endBatchEdit(); - assertEquals("word\tword", r.mWord); + assertTrue(TextUtils.equals("word\tword", r.mWord)); // tab or space mockInputMethodService.setInputConnection(new MockConnection("one word\two", "rd", et)); ic.beginBatchEdit(); r = ic.getWordRangeAtCursor(" \t", 1); ic.endBatchEdit(); - assertEquals("word\tword", r.mWord); + assertTrue(TextUtils.equals("word\tword", r.mWord)); // tab or space multiword mockInputMethodService.setInputConnection(new MockConnection("one word\two", "rd", et)); ic.beginBatchEdit(); r = ic.getWordRangeAtCursor(" \t", 2); ic.endBatchEdit(); - assertEquals("one word\tword", r.mWord); + assertTrue(TextUtils.equals("one word\tword", r.mWord)); // splitting on supplementary character final String supplementaryChar = "\uD840\uDC8A"; @@ -183,6 +184,6 @@ public class RichInputConnectionTests extends AndroidTestCase { ic.beginBatchEdit(); r = ic.getWordRangeAtCursor(supplementaryChar, 0); ic.endBatchEdit(); - assertEquals("word", r.mWord); + assertTrue(TextUtils.equals("word", r.mWord)); } } diff --git a/tests/src/com/android/inputmethod/latin/StringUtilsTests.java b/tests/src/com/android/inputmethod/latin/StringUtilsTests.java index 966919ed3..136faff71 100644 --- a/tests/src/com/android/inputmethod/latin/StringUtilsTests.java +++ b/tests/src/com/android/inputmethod/latin/StringUtilsTests.java @@ -93,25 +93,43 @@ public class StringUtilsTests extends AndroidTestCase { StringUtils.removeFromCsvIfExists("key", "key1,key,key3,key,key5")); } - public void testToTitleCase() { + + public void testCapitalizeFirstCodePoint() { + assertEquals("SSaa", + StringUtils.capitalizeFirstCodePoint("ßaa", Locale.GERMAN)); + assertEquals("Aßa", + StringUtils.capitalizeFirstCodePoint("aßa", Locale.GERMAN)); + assertEquals("Iab", + StringUtils.capitalizeFirstCodePoint("iab", Locale.ENGLISH)); + assertEquals("CAmElCaSe", + StringUtils.capitalizeFirstCodePoint("cAmElCaSe", Locale.ENGLISH)); + assertEquals("İab", + StringUtils.capitalizeFirstCodePoint("iab", new Locale("tr"))); + assertEquals("AİB", + StringUtils.capitalizeFirstCodePoint("AİB", new Locale("tr"))); + assertEquals("A", + StringUtils.capitalizeFirstCodePoint("a", Locale.ENGLISH)); + assertEquals("A", + StringUtils.capitalizeFirstCodePoint("A", Locale.ENGLISH)); + } + + public void testCapitalizeFirstAndDowncaseRest() { assertEquals("SSaa", - StringUtils.toTitleCase("ßaa", Locale.GERMAN)); + StringUtils.capitalizeFirstAndDowncaseRest("ßaa", Locale.GERMAN)); assertEquals("Aßa", - StringUtils.toTitleCase("aßa", Locale.GERMAN)); + StringUtils.capitalizeFirstAndDowncaseRest("aßa", Locale.GERMAN)); assertEquals("Iab", - StringUtils.toTitleCase("iab", Locale.ENGLISH)); + StringUtils.capitalizeFirstAndDowncaseRest("iab", Locale.ENGLISH)); assertEquals("Camelcase", - StringUtils.toTitleCase("cAmElCaSe", Locale.ENGLISH)); + StringUtils.capitalizeFirstAndDowncaseRest("cAmElCaSe", Locale.ENGLISH)); assertEquals("İab", - StringUtils.toTitleCase("iab", new Locale("tr"))); + StringUtils.capitalizeFirstAndDowncaseRest("iab", new Locale("tr"))); assertEquals("Aib", - StringUtils.toTitleCase("AİB", new Locale("tr"))); - // For one character, toTitleCase returns the string as is. Not sure what the motivation - // is, but that's how it works now. - assertEquals("a", - StringUtils.toTitleCase("a", Locale.ENGLISH)); + StringUtils.capitalizeFirstAndDowncaseRest("AİB", new Locale("tr"))); assertEquals("A", - StringUtils.toTitleCase("A", Locale.ENGLISH)); + StringUtils.capitalizeFirstAndDowncaseRest("a", Locale.ENGLISH)); + assertEquals("A", + StringUtils.capitalizeFirstAndDowncaseRest("A", Locale.ENGLISH)); } public void testGetCapitalizationType() { @@ -136,4 +154,83 @@ public class StringUtilsTests extends AndroidTestCase { assertEquals(StringUtils.CAPITALIZE_NONE, StringUtils.getCapitalizationType("")); } + + public void testIsIdenticalAfterUpcaseIsIdenticalAfterDowncase() { + assertFalse(StringUtils.isIdenticalAfterUpcase("capitalize")); + assertTrue(StringUtils.isIdenticalAfterDowncase("capitalize")); + assertFalse(StringUtils.isIdenticalAfterUpcase("cApITalize")); + assertFalse(StringUtils.isIdenticalAfterDowncase("cApITalize")); + assertFalse(StringUtils.isIdenticalAfterUpcase("capitalizE")); + assertFalse(StringUtils.isIdenticalAfterDowncase("capitalizE")); + assertFalse(StringUtils.isIdenticalAfterUpcase("__c a piu$@tali56ze")); + assertTrue(StringUtils.isIdenticalAfterDowncase("__c a piu$@tali56ze")); + assertFalse(StringUtils.isIdenticalAfterUpcase("A__c a piu$@tali56ze")); + assertFalse(StringUtils.isIdenticalAfterDowncase("A__c a piu$@tali56ze")); + assertFalse(StringUtils.isIdenticalAfterUpcase("Capitalize")); + assertFalse(StringUtils.isIdenticalAfterDowncase("Capitalize")); + assertFalse(StringUtils.isIdenticalAfterUpcase(" Capitalize")); + assertFalse(StringUtils.isIdenticalAfterDowncase(" Capitalize")); + assertTrue(StringUtils.isIdenticalAfterUpcase("CAPITALIZE")); + assertFalse(StringUtils.isIdenticalAfterDowncase("CAPITALIZE")); + assertTrue(StringUtils.isIdenticalAfterUpcase(" PI26LIE")); + assertFalse(StringUtils.isIdenticalAfterDowncase(" PI26LIE")); + assertTrue(StringUtils.isIdenticalAfterUpcase("")); + assertTrue(StringUtils.isIdenticalAfterDowncase("")); + } + + private void checkCapitalize(final String src, final String dst, final String separators, + final Locale locale) { + assertEquals(dst, StringUtils.capitalizeEachWord(src, separators, locale)); + assert(src.equals(dst) + == StringUtils.isIdenticalAfterCapitalizeEachWord(src, separators)); + } + + public void testCapitalizeEachWord() { + checkCapitalize("", "", " ", Locale.ENGLISH); + checkCapitalize("test", "Test", " ", Locale.ENGLISH); + checkCapitalize(" test", " Test", " ", Locale.ENGLISH); + checkCapitalize("Test", "Test", " ", Locale.ENGLISH); + checkCapitalize(" Test", " Test", " ", Locale.ENGLISH); + checkCapitalize(".Test", ".test", " ", Locale.ENGLISH); + checkCapitalize(".Test", ".Test", " .", Locale.ENGLISH); + checkCapitalize(".Test", ".Test", ". ", Locale.ENGLISH); + checkCapitalize("test and retest", "Test And Retest", " .", Locale.ENGLISH); + checkCapitalize("Test and retest", "Test And Retest", " .", Locale.ENGLISH); + checkCapitalize("Test And Retest", "Test And Retest", " .", Locale.ENGLISH); + checkCapitalize("Test And.Retest ", "Test And.Retest ", " .", Locale.ENGLISH); + checkCapitalize("Test And.retest ", "Test And.Retest ", " .", Locale.ENGLISH); + checkCapitalize("Test And.retest ", "Test And.retest ", " ", Locale.ENGLISH); + checkCapitalize("Test And.Retest ", "Test And.retest ", " ", Locale.ENGLISH); + checkCapitalize("test and ietest", "Test And İetest", " .", new Locale("tr")); + checkCapitalize("test and ietest", "Test And Ietest", " .", Locale.ENGLISH); + checkCapitalize("Test&Retest", "Test&Retest", " \n.!?*()&", Locale.ENGLISH); + checkCapitalize("Test&retest", "Test&Retest", " \n.!?*()&", Locale.ENGLISH); + checkCapitalize("test&Retest", "Test&Retest", " \n.!?*()&", Locale.ENGLISH); + checkCapitalize("rest\nrecreation! And in the end...", + "Rest\nRecreation! And In The End...", " \n.!?*,();&", Locale.ENGLISH); + checkCapitalize("lorem ipsum dolor sit amet", "Lorem Ipsum Dolor Sit Amet", + " \n.,!?*()&;", Locale.ENGLISH); + checkCapitalize("Lorem!Ipsum (Dolor) Sit * Amet", "Lorem!Ipsum (Dolor) Sit * Amet", + " \n,.;!?*()&", Locale.ENGLISH); + checkCapitalize("Lorem!Ipsum (dolor) Sit * Amet", "Lorem!Ipsum (Dolor) Sit * Amet", + " \n,.;!?*()&", Locale.ENGLISH); + } + + public void testContainsAny() { + assertFalse(StringUtils.containsAny("", " ")); + assertFalse(StringUtils.containsAny("test and retest", "")); + assertTrue(StringUtils.containsAny("test and retest", "x3iq o")); + assertTrue(StringUtils.containsAny("test and retest", "x3iqo ")); + assertTrue(StringUtils.containsAny("test and retest", " x3iqo")); + assertFalse(StringUtils.containsAny("test and retest", "x3iqo")); + assertTrue(StringUtils.containsAny("test and retest", "tse ")); + assertTrue(StringUtils.containsAny("test and retest.", ".?()")); + assertFalse(StringUtils.containsAny("test and retest", ".?()")); + // Surrogate pair + assertTrue(StringUtils.containsAny("test and \uD861\uDED7 retest.", "\uD861\uDED7")); + // Ill-formed string + assertFalse(StringUtils.containsAny("test and \uD861 retest.", "\uD861\uDED7")); + // Ill-formed string + assertFalse(StringUtils.containsAny("test and \uDED7 retest.", "\uD861\uDED7")); + } } |