Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ddafcf82 authored by Jean Chalard's avatar Jean Chalard Committed by Android (Google) Code Review
Browse files

Merge "Fix bugs and add tests"

parents 1f70a4d6 c8744949
Loading
Loading
Loading
Loading
+20 −9
Original line number Original line Diff line number Diff line
@@ -115,11 +115,12 @@ public final class StringUtils {
        // - This does not work for Greek, because it returns upper case instead of title case.
        // - This does not work for Greek, because it returns upper case instead of title case.
        // - It does not work for Serbian, because it fails to account for the "lj" character,
        // - It does not work for Serbian, because it fails to account for the "lj" character,
        // which should be "Lj" in title case and "LJ" in upper case.
        // which should be "Lj" in title case and "LJ" in upper case.
        // - It does not work for Dutch, because it fails to account for the "ij" digraph, which
        // - It does not work for Dutch, because it fails to account for the "ij" digraph when it's
        // are two different characters but both should be capitalized as "IJ" as if they were
        // written as two separate code points. They are two different characters but both should
        // a single letter.
        // be capitalized as "IJ" as if they were a single letter in most words (not all). If the
        // - It also does not work with unicode surrogate code points.
        // unicode char for the ligature is used however, it works.
        return s.toUpperCase(locale).charAt(0) + s.substring(1);
        final int cutoff = s.offsetByCodePoints(0, 1);
        return s.substring(0, cutoff).toUpperCase(locale) + s.substring(cutoff).toLowerCase(locale);
    }
    }


    private static final int[] EMPTY_CODEPOINTS = {};
    private static final int[] EMPTY_CODEPOINTS = {};
@@ -176,17 +177,27 @@ public final class StringUtils {
        return list.toArray(new String[list.size()]);
        return list.toArray(new String[list.size()]);
    }
    }


    // This method assumes the text is not empty or null.
    // This method assumes the text is not null. For the empty string, it returns CAPITALIZE_NONE.
    public static int getCapitalizationType(final String text) {
    public static int getCapitalizationType(final String text) {
        // If the first char is not uppercase, then the word is either all lower case or
        // If the first char is not uppercase, then the word is either all lower case or
        // camel case, and in either case we return CAPITALIZE_NONE.
        // camel case, and in either case we return CAPITALIZE_NONE.
        if (!Character.isUpperCase(text.codePointAt(0))) return CAPITALIZE_NONE;
        final int len = text.length();
        final int len = text.length();
        int index = 0;
        for (; index < len; index = text.offsetByCodePoints(index, 1)) {
            if (Character.isLetter(text.codePointAt(index))) {
                break;
            }
        }
        if (index == len) return CAPITALIZE_NONE;
        if (!Character.isUpperCase(text.codePointAt(index))) {
            return CAPITALIZE_NONE;
        }
        int capsCount = 1;
        int capsCount = 1;
        int letterCount = 1;
        int letterCount = 1;
        for (int i = 1; i < len; i = text.offsetByCodePoints(i, 1)) {
        for (index = text.offsetByCodePoints(index, 1); index < len;
                index = text.offsetByCodePoints(index, 1)) {
            if (1 != capsCount && letterCount != capsCount) break;
            if (1 != capsCount && letterCount != capsCount) break;
            final int codePoint = text.codePointAt(i);
            final int codePoint = text.codePointAt(index);
            if (Character.isUpperCase(codePoint)) {
            if (Character.isUpperCase(codePoint)) {
                ++capsCount;
                ++capsCount;
                ++letterCount;
                ++letterCount;
+46 −0
Original line number Original line Diff line number Diff line
@@ -19,6 +19,8 @@ package com.android.inputmethod.latin;
import android.test.AndroidTestCase;
import android.test.AndroidTestCase;
import android.test.suitebuilder.annotation.SmallTest;
import android.test.suitebuilder.annotation.SmallTest;


import java.util.Locale;

@SmallTest
@SmallTest
public class StringUtilsTests extends AndroidTestCase {
public class StringUtilsTests extends AndroidTestCase {
    public void testContainsInArray() {
    public void testContainsInArray() {
@@ -90,4 +92,48 @@ public class StringUtilsTests extends AndroidTestCase {
        assertEquals("in 5 elements at position 2,4", "key1,key3,key5",
        assertEquals("in 5 elements at position 2,4", "key1,key3,key5",
                StringUtils.removeFromCsvIfExists("key", "key1,key,key3,key,key5"));
                StringUtils.removeFromCsvIfExists("key", "key1,key,key3,key,key5"));
    }
    }

    public void testToTitleCase() {
        assertEquals("SSaa",
                StringUtils.toTitleCase("ßaa", Locale.GERMAN));
        assertEquals("Aßa",
                StringUtils.toTitleCase("aßa", Locale.GERMAN));
        assertEquals("Iab",
                StringUtils.toTitleCase("iab", Locale.ENGLISH));
        assertEquals("Camelcase",
                StringUtils.toTitleCase("cAmElCaSe", Locale.ENGLISH));
        assertEquals("İab",
                StringUtils.toTitleCase("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));
        assertEquals("A",
                StringUtils.toTitleCase("A", Locale.ENGLISH));
    }

    public void testGetCapitalizationType() {
        assertEquals(StringUtils.CAPITALIZE_NONE,
                StringUtils.getCapitalizationType("capitalize"));
        assertEquals(StringUtils.CAPITALIZE_NONE,
                StringUtils.getCapitalizationType("cApITalize"));
        assertEquals(StringUtils.CAPITALIZE_NONE,
                StringUtils.getCapitalizationType("capitalizE"));
        assertEquals(StringUtils.CAPITALIZE_NONE,
                StringUtils.getCapitalizationType("__c a piu$@tali56ze"));
        assertEquals(StringUtils.CAPITALIZE_FIRST,
                StringUtils.getCapitalizationType("A__c a piu$@tali56ze"));
        assertEquals(StringUtils.CAPITALIZE_FIRST,
                StringUtils.getCapitalizationType("Capitalize"));
        assertEquals(StringUtils.CAPITALIZE_FIRST,
                StringUtils.getCapitalizationType("     Capitalize"));
        assertEquals(StringUtils.CAPITALIZE_ALL,
                StringUtils.getCapitalizationType("CAPITALIZE"));
        assertEquals(StringUtils.CAPITALIZE_ALL,
                StringUtils.getCapitalizationType("  PI26LIE"));
        assertEquals(StringUtils.CAPITALIZE_NONE,
                StringUtils.getCapitalizationType(""));
    }
}
}