1f62b5d633d17b94a7ea46c968e073fdaa3fcbe15Tadashi G. Takaoka/*
2f62b5d633d17b94a7ea46c968e073fdaa3fcbe15Tadashi G. Takaoka * Copyright (C) 2014 The Android Open Source Project
3f62b5d633d17b94a7ea46c968e073fdaa3fcbe15Tadashi G. Takaoka *
4f62b5d633d17b94a7ea46c968e073fdaa3fcbe15Tadashi G. Takaoka * Licensed under the Apache License, Version 2.0 (the "License");
5f62b5d633d17b94a7ea46c968e073fdaa3fcbe15Tadashi G. Takaoka * you may not use this file except in compliance with the License.
6f62b5d633d17b94a7ea46c968e073fdaa3fcbe15Tadashi G. Takaoka * You may obtain a copy of the License at
7f62b5d633d17b94a7ea46c968e073fdaa3fcbe15Tadashi G. Takaoka *
8f62b5d633d17b94a7ea46c968e073fdaa3fcbe15Tadashi G. Takaoka *      http://www.apache.org/licenses/LICENSE-2.0
9f62b5d633d17b94a7ea46c968e073fdaa3fcbe15Tadashi G. Takaoka *
10f62b5d633d17b94a7ea46c968e073fdaa3fcbe15Tadashi G. Takaoka * Unless required by applicable law or agreed to in writing, software
11f62b5d633d17b94a7ea46c968e073fdaa3fcbe15Tadashi G. Takaoka * distributed under the License is distributed on an "AS IS" BASIS,
12f62b5d633d17b94a7ea46c968e073fdaa3fcbe15Tadashi G. Takaoka * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13f62b5d633d17b94a7ea46c968e073fdaa3fcbe15Tadashi G. Takaoka * See the License for the specific language governing permissions and
14f62b5d633d17b94a7ea46c968e073fdaa3fcbe15Tadashi G. Takaoka * limitations under the License.
15f62b5d633d17b94a7ea46c968e073fdaa3fcbe15Tadashi G. Takaoka */
16f62b5d633d17b94a7ea46c968e073fdaa3fcbe15Tadashi G. Takaoka
17f62b5d633d17b94a7ea46c968e073fdaa3fcbe15Tadashi G. Takaokapackage com.android.inputmethod.latin.common;
18f62b5d633d17b94a7ea46c968e073fdaa3fcbe15Tadashi G. Takaoka
19f62b5d633d17b94a7ea46c968e073fdaa3fcbe15Tadashi G. Takaokaimport android.test.AndroidTestCase;
20f62b5d633d17b94a7ea46c968e073fdaa3fcbe15Tadashi G. Takaokaimport android.test.suitebuilder.annotation.SmallTest;
21f62b5d633d17b94a7ea46c968e073fdaa3fcbe15Tadashi G. Takaoka
22f62b5d633d17b94a7ea46c968e073fdaa3fcbe15Tadashi G. Takaokaimport java.util.Locale;
23f62b5d633d17b94a7ea46c968e073fdaa3fcbe15Tadashi G. Takaoka
24f62b5d633d17b94a7ea46c968e073fdaa3fcbe15Tadashi G. Takaoka@SmallTest
25f62b5d633d17b94a7ea46c968e073fdaa3fcbe15Tadashi G. Takaokapublic class StringUtilsTests extends AndroidTestCase {
26f62b5d633d17b94a7ea46c968e073fdaa3fcbe15Tadashi G. Takaoka    private static final Locale US = Locale.US;
27f62b5d633d17b94a7ea46c968e073fdaa3fcbe15Tadashi G. Takaoka    private static final Locale GERMAN = Locale.GERMAN;
28f62b5d633d17b94a7ea46c968e073fdaa3fcbe15Tadashi G. Takaoka    private static final Locale TURKEY = new Locale("tr", "TR");
29f62b5d633d17b94a7ea46c968e073fdaa3fcbe15Tadashi G. Takaoka    private static final Locale GREECE = new Locale("el", "GR");
30f62b5d633d17b94a7ea46c968e073fdaa3fcbe15Tadashi G. Takaoka
316c47403e27fd703ece844f4b1b24632721da1772Tadashi G. Takaoka    private static void assert_toTitleCaseOfKeyLabel(final Locale locale,
32f62b5d633d17b94a7ea46c968e073fdaa3fcbe15Tadashi G. Takaoka            final String lowerCase, final String expected) {
33f62b5d633d17b94a7ea46c968e073fdaa3fcbe15Tadashi G. Takaoka        assertEquals(lowerCase + " in " + locale, expected,
346c47403e27fd703ece844f4b1b24632721da1772Tadashi G. Takaoka                StringUtils.toTitleCaseOfKeyLabel(lowerCase, locale));
35f62b5d633d17b94a7ea46c968e073fdaa3fcbe15Tadashi G. Takaoka    }
36f62b5d633d17b94a7ea46c968e073fdaa3fcbe15Tadashi G. Takaoka
376c47403e27fd703ece844f4b1b24632721da1772Tadashi G. Takaoka    public void test_toTitleCaseOfKeyLabel() {
386c47403e27fd703ece844f4b1b24632721da1772Tadashi G. Takaoka        assert_toTitleCaseOfKeyLabel(US, null, null);
396c47403e27fd703ece844f4b1b24632721da1772Tadashi G. Takaoka        assert_toTitleCaseOfKeyLabel(US, "", "");
406c47403e27fd703ece844f4b1b24632721da1772Tadashi G. Takaoka        assert_toTitleCaseOfKeyLabel(US, "aeiou", "AEIOU");
41f62b5d633d17b94a7ea46c968e073fdaa3fcbe15Tadashi G. Takaoka        // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE
42f62b5d633d17b94a7ea46c968e073fdaa3fcbe15Tadashi G. Takaoka        // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
43f62b5d633d17b94a7ea46c968e073fdaa3fcbe15Tadashi G. Takaoka        // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX
44f62b5d633d17b94a7ea46c968e073fdaa3fcbe15Tadashi G. Takaoka        // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
45f62b5d633d17b94a7ea46c968e073fdaa3fcbe15Tadashi G. Takaoka        // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON
46f62b5d633d17b94a7ea46c968e073fdaa3fcbe15Tadashi G. Takaoka        // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
47f62b5d633d17b94a7ea46c968e073fdaa3fcbe15Tadashi G. Takaoka        // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA
48f62b5d633d17b94a7ea46c968e073fdaa3fcbe15Tadashi G. Takaoka        // U+00C0: "À" LATIN CAPITAL LETTER A WITH GRAVE
49f62b5d633d17b94a7ea46c968e073fdaa3fcbe15Tadashi G. Takaoka        // U+00C8: "È" LATIN CAPITAL LETTER E WITH GRAVE
50f62b5d633d17b94a7ea46c968e073fdaa3fcbe15Tadashi G. Takaoka        // U+00CE: "Î" LATIN CAPITAL LETTER I WITH CIRCUMFLEX
51f62b5d633d17b94a7ea46c968e073fdaa3fcbe15Tadashi G. Takaoka        // U+00D6: "Ö" LATIN CAPITAL LETTER O WITH DIAERESIS
52f62b5d633d17b94a7ea46c968e073fdaa3fcbe15Tadashi G. Takaoka        // U+016A: "Ū" LATIN CAPITAL LETTER U WITH MACRON
53f62b5d633d17b94a7ea46c968e073fdaa3fcbe15Tadashi G. Takaoka        // U+00D1: "Ñ" LATIN CAPITAL LETTER N WITH TILDE
54f62b5d633d17b94a7ea46c968e073fdaa3fcbe15Tadashi G. Takaoka        // U+00C7: "Ç" LATIN CAPITAL LETTER C WITH CEDILLA
556c47403e27fd703ece844f4b1b24632721da1772Tadashi G. Takaoka        assert_toTitleCaseOfKeyLabel(US,
56f62b5d633d17b94a7ea46c968e073fdaa3fcbe15Tadashi G. Takaoka                "\u00E0\u00E8\u00EE\u00F6\u016B\u00F1\u00E7",
57f62b5d633d17b94a7ea46c968e073fdaa3fcbe15Tadashi G. Takaoka                "\u00C0\u00C8\u00CE\u00D6\u016A\u00D1\u00C7");
58f62b5d633d17b94a7ea46c968e073fdaa3fcbe15Tadashi G. Takaoka        // U+00DF: "ß" LATIN SMALL LETTER SHARP S
59f62b5d633d17b94a7ea46c968e073fdaa3fcbe15Tadashi G. Takaoka        // U+015B: "ś" LATIN SMALL LETTER S WITH ACUTE
60f62b5d633d17b94a7ea46c968e073fdaa3fcbe15Tadashi G. Takaoka        // U+0161: "š" LATIN SMALL LETTER S WITH CARON
61f62b5d633d17b94a7ea46c968e073fdaa3fcbe15Tadashi G. Takaoka        // U+015A: "Ś" LATIN CAPITAL LETTER S WITH ACUTE
62f62b5d633d17b94a7ea46c968e073fdaa3fcbe15Tadashi G. Takaoka        // U+0160: "Š" LATIN CAPITAL LETTER S WITH CARONZ
636c47403e27fd703ece844f4b1b24632721da1772Tadashi G. Takaoka        assert_toTitleCaseOfKeyLabel(GERMAN,
64f62b5d633d17b94a7ea46c968e073fdaa3fcbe15Tadashi G. Takaoka                "\u00DF\u015B\u0161",
65f62b5d633d17b94a7ea46c968e073fdaa3fcbe15Tadashi G. Takaoka                "SS\u015A\u0160");
66f62b5d633d17b94a7ea46c968e073fdaa3fcbe15Tadashi G. Takaoka        // U+0259: "ə" LATIN SMALL LETTER SCHWA
67f62b5d633d17b94a7ea46c968e073fdaa3fcbe15Tadashi G. Takaoka        // U+0069: "i" LATIN SMALL LETTER I
68f62b5d633d17b94a7ea46c968e073fdaa3fcbe15Tadashi G. Takaoka        // U+0131: "ı" LATIN SMALL LETTER DOTLESS I
69f62b5d633d17b94a7ea46c968e073fdaa3fcbe15Tadashi G. Takaoka        // U+018F: "Ə" LATIN SMALL LETTER SCHWA
70f62b5d633d17b94a7ea46c968e073fdaa3fcbe15Tadashi G. Takaoka        // U+0130: "İ" LATIN SMALL LETTER I WITH DOT ABOVE
71f62b5d633d17b94a7ea46c968e073fdaa3fcbe15Tadashi G. Takaoka        // U+0049: "I" LATIN SMALL LETTER I
726c47403e27fd703ece844f4b1b24632721da1772Tadashi G. Takaoka        assert_toTitleCaseOfKeyLabel(TURKEY,
73f62b5d633d17b94a7ea46c968e073fdaa3fcbe15Tadashi G. Takaoka                "\u0259\u0069\u0131",
74f62b5d633d17b94a7ea46c968e073fdaa3fcbe15Tadashi G. Takaoka                "\u018F\u0130\u0049");
75f62b5d633d17b94a7ea46c968e073fdaa3fcbe15Tadashi G. Takaoka        // U+03C3: "σ" GREEK SMALL LETTER SIGMA
76f62b5d633d17b94a7ea46c968e073fdaa3fcbe15Tadashi G. Takaoka        // U+03C2: "ς" GREEK SMALL LETTER FINAL SIGMA
77f62b5d633d17b94a7ea46c968e073fdaa3fcbe15Tadashi G. Takaoka        // U+03A3: "Σ" GREEK CAPITAL LETTER SIGMA
786c47403e27fd703ece844f4b1b24632721da1772Tadashi G. Takaoka        assert_toTitleCaseOfKeyLabel(GREECE,
79f62b5d633d17b94a7ea46c968e073fdaa3fcbe15Tadashi G. Takaoka                "\u03C3\u03C2",
80f62b5d633d17b94a7ea46c968e073fdaa3fcbe15Tadashi G. Takaoka                "\u03A3\u03A3");
81f62b5d633d17b94a7ea46c968e073fdaa3fcbe15Tadashi G. Takaoka        // U+03AC: "ά" GREEK SMALL LETTER ALPHA WITH TONOS
82f62b5d633d17b94a7ea46c968e073fdaa3fcbe15Tadashi G. Takaoka        // U+03AD: "έ" GREEK SMALL LETTER EPSILON WITH TONOS
83f62b5d633d17b94a7ea46c968e073fdaa3fcbe15Tadashi G. Takaoka        // U+03AE: "ή" GREEK SMALL LETTER ETA WITH TONOS
84f62b5d633d17b94a7ea46c968e073fdaa3fcbe15Tadashi G. Takaoka        // U+03AF: "ί" GREEK SMALL LETTER IOTA WITH TONOS
85f62b5d633d17b94a7ea46c968e073fdaa3fcbe15Tadashi G. Takaoka        // U+03CC: "ό" GREEK SMALL LETTER OMICRON WITH TONOS
86f62b5d633d17b94a7ea46c968e073fdaa3fcbe15Tadashi G. Takaoka        // U+03CD: "ύ" GREEK SMALL LETTER UPSILON WITH TONOS
87f62b5d633d17b94a7ea46c968e073fdaa3fcbe15Tadashi G. Takaoka        // U+03CE: "ώ" GREEK SMALL LETTER OMEGA WITH TONOS
88f62b5d633d17b94a7ea46c968e073fdaa3fcbe15Tadashi G. Takaoka        // U+0386: "Ά" GREEK CAPITAL LETTER ALPHA WITH TONOS
89f62b5d633d17b94a7ea46c968e073fdaa3fcbe15Tadashi G. Takaoka        // U+0388: "Έ" GREEK CAPITAL LETTER EPSILON WITH TONOS
90f62b5d633d17b94a7ea46c968e073fdaa3fcbe15Tadashi G. Takaoka        // U+0389: "Ή" GREEK CAPITAL LETTER ETA WITH TONOS
91f62b5d633d17b94a7ea46c968e073fdaa3fcbe15Tadashi G. Takaoka        // U+038A: "Ί" GREEK CAPITAL LETTER IOTA WITH TONOS
92f62b5d633d17b94a7ea46c968e073fdaa3fcbe15Tadashi G. Takaoka        // U+038C: "Ό" GREEK CAPITAL LETTER OMICRON WITH TONOS
93f62b5d633d17b94a7ea46c968e073fdaa3fcbe15Tadashi G. Takaoka        // U+038E: "Ύ" GREEK CAPITAL LETTER UPSILON WITH TONOS
94f62b5d633d17b94a7ea46c968e073fdaa3fcbe15Tadashi G. Takaoka        // U+038F: "Ώ" GREEK CAPITAL LETTER OMEGA WITH TONOS
956c47403e27fd703ece844f4b1b24632721da1772Tadashi G. Takaoka        assert_toTitleCaseOfKeyLabel(GREECE,
96f62b5d633d17b94a7ea46c968e073fdaa3fcbe15Tadashi G. Takaoka                "\u03AC\u03AD\u03AE\u03AF\u03CC\u03CD\u03CE",
97f62b5d633d17b94a7ea46c968e073fdaa3fcbe15Tadashi G. Takaoka                "\u0386\u0388\u0389\u038A\u038C\u038E\u038F");
98f62b5d633d17b94a7ea46c968e073fdaa3fcbe15Tadashi G. Takaoka        // U+03CA: "ϊ" GREEK SMALL LETTER IOTA WITH DIALYTIKA
99f62b5d633d17b94a7ea46c968e073fdaa3fcbe15Tadashi G. Takaoka        // U+03CB: "ϋ" GREEK SMALL LETTER UPSILON WITH DIALYTIKA
100f62b5d633d17b94a7ea46c968e073fdaa3fcbe15Tadashi G. Takaoka        // U+0390: "ΐ" GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS
101f62b5d633d17b94a7ea46c968e073fdaa3fcbe15Tadashi G. Takaoka        // U+03B0: "ΰ" GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS
102f62b5d633d17b94a7ea46c968e073fdaa3fcbe15Tadashi G. Takaoka        // U+03AA: "Ϊ" GREEK CAPITAL LETTER IOTA WITH DIALYTIKA
103f62b5d633d17b94a7ea46c968e073fdaa3fcbe15Tadashi G. Takaoka        // U+03AB: "Ϋ" GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA
104f62b5d633d17b94a7ea46c968e073fdaa3fcbe15Tadashi G. Takaoka        // U+0399: "Ι" GREEK CAPITAL LETTER IOTA
105f62b5d633d17b94a7ea46c968e073fdaa3fcbe15Tadashi G. Takaoka        // U+03A5: "Υ" GREEK CAPITAL LETTER UPSILON
106f62b5d633d17b94a7ea46c968e073fdaa3fcbe15Tadashi G. Takaoka        // U+0308: COMBINING DIAERESIS
107f62b5d633d17b94a7ea46c968e073fdaa3fcbe15Tadashi G. Takaoka        // U+0301: COMBINING GRAVE ACCENT
1086c47403e27fd703ece844f4b1b24632721da1772Tadashi G. Takaoka        assert_toTitleCaseOfKeyLabel(GREECE,
109f62b5d633d17b94a7ea46c968e073fdaa3fcbe15Tadashi G. Takaoka                "\u03CA\u03CB\u0390\u03B0",
110f62b5d633d17b94a7ea46c968e073fdaa3fcbe15Tadashi G. Takaoka                "\u03AA\u03AB\u0399\u0308\u0301\u03A5\u0308\u0301");
111f62b5d633d17b94a7ea46c968e073fdaa3fcbe15Tadashi G. Takaoka    }
112f62b5d633d17b94a7ea46c968e073fdaa3fcbe15Tadashi G. Takaoka
1136c47403e27fd703ece844f4b1b24632721da1772Tadashi G. Takaoka    private static void assert_toTitleCaseOfKeyCode(final Locale locale, final int lowerCase,
114f62b5d633d17b94a7ea46c968e073fdaa3fcbe15Tadashi G. Takaoka            final int expected) {
115f62b5d633d17b94a7ea46c968e073fdaa3fcbe15Tadashi G. Takaoka        assertEquals(lowerCase + " in " + locale, expected,
1166c47403e27fd703ece844f4b1b24632721da1772Tadashi G. Takaoka                StringUtils.toTitleCaseOfKeyCode(lowerCase, locale));
117f62b5d633d17b94a7ea46c968e073fdaa3fcbe15Tadashi G. Takaoka    }
118f62b5d633d17b94a7ea46c968e073fdaa3fcbe15Tadashi G. Takaoka
1196c47403e27fd703ece844f4b1b24632721da1772Tadashi G. Takaoka    public void test_toTitleCaseOfKeyCode() {
1206c47403e27fd703ece844f4b1b24632721da1772Tadashi G. Takaoka        assert_toTitleCaseOfKeyCode(US, Constants.CODE_ENTER, Constants.CODE_ENTER);
1216c47403e27fd703ece844f4b1b24632721da1772Tadashi G. Takaoka        assert_toTitleCaseOfKeyCode(US, Constants.CODE_SPACE, Constants.CODE_SPACE);
1226c47403e27fd703ece844f4b1b24632721da1772Tadashi G. Takaoka        assert_toTitleCaseOfKeyCode(US, Constants.CODE_COMMA, Constants.CODE_COMMA);
123f62b5d633d17b94a7ea46c968e073fdaa3fcbe15Tadashi G. Takaoka        // U+0069: "i" LATIN SMALL LETTER I
124f62b5d633d17b94a7ea46c968e073fdaa3fcbe15Tadashi G. Takaoka        // U+0131: "ı" LATIN SMALL LETTER DOTLESS I
125f62b5d633d17b94a7ea46c968e073fdaa3fcbe15Tadashi G. Takaoka        // U+0130: "İ" LATIN SMALL LETTER I WITH DOT ABOVE
126f62b5d633d17b94a7ea46c968e073fdaa3fcbe15Tadashi G. Takaoka        // U+0049: "I" LATIN SMALL LETTER I
1276c47403e27fd703ece844f4b1b24632721da1772Tadashi G. Takaoka        assert_toTitleCaseOfKeyCode(US, 0x0069, 0x0049); // i -> I
1286c47403e27fd703ece844f4b1b24632721da1772Tadashi G. Takaoka        assert_toTitleCaseOfKeyCode(US, 0x0131, 0x0049); // ı -> I
1296c47403e27fd703ece844f4b1b24632721da1772Tadashi G. Takaoka        assert_toTitleCaseOfKeyCode(TURKEY, 0x0069, 0x0130); // i -> İ
1306c47403e27fd703ece844f4b1b24632721da1772Tadashi G. Takaoka        assert_toTitleCaseOfKeyCode(TURKEY, 0x0131, 0x0049); // ı -> I
131f62b5d633d17b94a7ea46c968e073fdaa3fcbe15Tadashi G. Takaoka        // U+00DF: "ß" LATIN SMALL LETTER SHARP S
132f62b5d633d17b94a7ea46c968e073fdaa3fcbe15Tadashi G. Takaoka        // The title case of "ß" is "SS".
1336c47403e27fd703ece844f4b1b24632721da1772Tadashi G. Takaoka        assert_toTitleCaseOfKeyCode(US, 0x00DF, Constants.CODE_UNSPECIFIED);
134f62b5d633d17b94a7ea46c968e073fdaa3fcbe15Tadashi G. Takaoka        // U+03AC: "ά" GREEK SMALL LETTER ALPHA WITH TONOS
135f62b5d633d17b94a7ea46c968e073fdaa3fcbe15Tadashi G. Takaoka        // U+0386: "Ά" GREEK CAPITAL LETTER ALPHA WITH TONOS
1366c47403e27fd703ece844f4b1b24632721da1772Tadashi G. Takaoka        assert_toTitleCaseOfKeyCode(GREECE, 0x03AC, 0x0386);
137f62b5d633d17b94a7ea46c968e073fdaa3fcbe15Tadashi G. Takaoka        // U+03CA: "ϊ" GREEK SMALL LETTER IOTA WITH DIALYTIKA
138f62b5d633d17b94a7ea46c968e073fdaa3fcbe15Tadashi G. Takaoka        // U+03AA: "Ϊ" GREEK CAPITAL LETTER IOTA WITH DIALYTIKA
1396c47403e27fd703ece844f4b1b24632721da1772Tadashi G. Takaoka        assert_toTitleCaseOfKeyCode(GREECE, 0x03CA, 0x03AA);
140f62b5d633d17b94a7ea46c968e073fdaa3fcbe15Tadashi G. Takaoka        // U+03B0: "ΰ" GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS
141f62b5d633d17b94a7ea46c968e073fdaa3fcbe15Tadashi G. Takaoka        // The title case of "ΰ" is "\u03A5\u0308\u0301".
1426c47403e27fd703ece844f4b1b24632721da1772Tadashi G. Takaoka        assert_toTitleCaseOfKeyCode(GREECE, 0x03B0, Constants.CODE_UNSPECIFIED);
143f62b5d633d17b94a7ea46c968e073fdaa3fcbe15Tadashi G. Takaoka    }
144f62b5d633d17b94a7ea46c968e073fdaa3fcbe15Tadashi G. Takaoka
145f62b5d633d17b94a7ea46c968e073fdaa3fcbe15Tadashi G. Takaoka    private static void assert_capitalizeFirstCodePoint(final Locale locale, final String text,
146f62b5d633d17b94a7ea46c968e073fdaa3fcbe15Tadashi G. Takaoka            final String expected) {
147f62b5d633d17b94a7ea46c968e073fdaa3fcbe15Tadashi G. Takaoka        assertEquals(text + " in " + locale, expected,
148f62b5d633d17b94a7ea46c968e073fdaa3fcbe15Tadashi G. Takaoka                StringUtils.capitalizeFirstCodePoint(text, locale));
149f62b5d633d17b94a7ea46c968e073fdaa3fcbe15Tadashi G. Takaoka    }
150f62b5d633d17b94a7ea46c968e073fdaa3fcbe15Tadashi G. Takaoka
151f62b5d633d17b94a7ea46c968e073fdaa3fcbe15Tadashi G. Takaoka    public void test_capitalizeFirstCodePoint() {
152f62b5d633d17b94a7ea46c968e073fdaa3fcbe15Tadashi G. Takaoka        assert_capitalizeFirstCodePoint(US, "", "");
153f62b5d633d17b94a7ea46c968e073fdaa3fcbe15Tadashi G. Takaoka        assert_capitalizeFirstCodePoint(US, "a", "A");
154f62b5d633d17b94a7ea46c968e073fdaa3fcbe15Tadashi G. Takaoka        assert_capitalizeFirstCodePoint(US, "à", "À");
155f62b5d633d17b94a7ea46c968e073fdaa3fcbe15Tadashi G. Takaoka        assert_capitalizeFirstCodePoint(US, "ß", "SS");
156f62b5d633d17b94a7ea46c968e073fdaa3fcbe15Tadashi G. Takaoka        assert_capitalizeFirstCodePoint(US, "text", "Text");
157f62b5d633d17b94a7ea46c968e073fdaa3fcbe15Tadashi G. Takaoka        assert_capitalizeFirstCodePoint(US, "iGoogle", "IGoogle");
158f62b5d633d17b94a7ea46c968e073fdaa3fcbe15Tadashi G. Takaoka        assert_capitalizeFirstCodePoint(TURKEY, "iyi", "İyi");
159f62b5d633d17b94a7ea46c968e073fdaa3fcbe15Tadashi G. Takaoka        assert_capitalizeFirstCodePoint(TURKEY, "ısırdı", "Isırdı");
160f62b5d633d17b94a7ea46c968e073fdaa3fcbe15Tadashi G. Takaoka        assert_capitalizeFirstCodePoint(GREECE, "ά", "Ά");
161f62b5d633d17b94a7ea46c968e073fdaa3fcbe15Tadashi G. Takaoka        assert_capitalizeFirstCodePoint(GREECE, "άνεση", "Άνεση");
162f62b5d633d17b94a7ea46c968e073fdaa3fcbe15Tadashi G. Takaoka    }
163f62b5d633d17b94a7ea46c968e073fdaa3fcbe15Tadashi G. Takaoka
164f62b5d633d17b94a7ea46c968e073fdaa3fcbe15Tadashi G. Takaoka    private static void assert_capitalizeFirstAndDowncaseRest(final Locale locale,
165f62b5d633d17b94a7ea46c968e073fdaa3fcbe15Tadashi G. Takaoka            final String text, final String expected) {
166f62b5d633d17b94a7ea46c968e073fdaa3fcbe15Tadashi G. Takaoka        assertEquals(text + " in " + locale, expected,
167f62b5d633d17b94a7ea46c968e073fdaa3fcbe15Tadashi G. Takaoka                StringUtils.capitalizeFirstAndDowncaseRest(text, locale));
168f62b5d633d17b94a7ea46c968e073fdaa3fcbe15Tadashi G. Takaoka    }
169f62b5d633d17b94a7ea46c968e073fdaa3fcbe15Tadashi G. Takaoka
170f62b5d633d17b94a7ea46c968e073fdaa3fcbe15Tadashi G. Takaoka    public void test_capitalizeFirstAndDowncaseRest() {
171f62b5d633d17b94a7ea46c968e073fdaa3fcbe15Tadashi G. Takaoka        assert_capitalizeFirstAndDowncaseRest(US, "", "");
172f62b5d633d17b94a7ea46c968e073fdaa3fcbe15Tadashi G. Takaoka        assert_capitalizeFirstAndDowncaseRest(US, "a", "A");
173f62b5d633d17b94a7ea46c968e073fdaa3fcbe15Tadashi G. Takaoka        assert_capitalizeFirstAndDowncaseRest(US, "à", "À");
174f62b5d633d17b94a7ea46c968e073fdaa3fcbe15Tadashi G. Takaoka        assert_capitalizeFirstAndDowncaseRest(US, "ß", "SS");
175f62b5d633d17b94a7ea46c968e073fdaa3fcbe15Tadashi G. Takaoka        assert_capitalizeFirstAndDowncaseRest(US, "text", "Text");
176f62b5d633d17b94a7ea46c968e073fdaa3fcbe15Tadashi G. Takaoka        assert_capitalizeFirstAndDowncaseRest(US, "iGoogle", "Igoogle");
177f62b5d633d17b94a7ea46c968e073fdaa3fcbe15Tadashi G. Takaoka        assert_capitalizeFirstAndDowncaseRest(US, "invite", "Invite");
178f62b5d633d17b94a7ea46c968e073fdaa3fcbe15Tadashi G. Takaoka        assert_capitalizeFirstAndDowncaseRest(US, "INVITE", "Invite");
179f62b5d633d17b94a7ea46c968e073fdaa3fcbe15Tadashi G. Takaoka        assert_capitalizeFirstAndDowncaseRest(TURKEY, "iyi", "İyi");
180f62b5d633d17b94a7ea46c968e073fdaa3fcbe15Tadashi G. Takaoka        assert_capitalizeFirstAndDowncaseRest(TURKEY, "İYİ", "İyi");
181f62b5d633d17b94a7ea46c968e073fdaa3fcbe15Tadashi G. Takaoka        assert_capitalizeFirstAndDowncaseRest(TURKEY, "ısırdı", "Isırdı");
182f62b5d633d17b94a7ea46c968e073fdaa3fcbe15Tadashi G. Takaoka        assert_capitalizeFirstAndDowncaseRest(TURKEY, "ISIRDI", "Isırdı");
183f62b5d633d17b94a7ea46c968e073fdaa3fcbe15Tadashi G. Takaoka        assert_capitalizeFirstAndDowncaseRest(GREECE, "ά", "Ά");
184f62b5d633d17b94a7ea46c968e073fdaa3fcbe15Tadashi G. Takaoka        assert_capitalizeFirstAndDowncaseRest(GREECE, "άνεση", "Άνεση");
185f62b5d633d17b94a7ea46c968e073fdaa3fcbe15Tadashi G. Takaoka        assert_capitalizeFirstAndDowncaseRest(GREECE, "ΆΝΕΣΗ", "Άνεση");
186f62b5d633d17b94a7ea46c968e073fdaa3fcbe15Tadashi G. Takaoka    }
187cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka
188cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka    public void testContainsInArray() {
189cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        assertFalse("empty array", StringUtils.containsInArray("key", new String[0]));
190cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        assertFalse("not in 1 element", StringUtils.containsInArray("key", new String[] {
191cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka                "key1"
192cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        }));
193cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        assertFalse("not in 2 elements", StringUtils.containsInArray("key", new String[] {
194cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka                "key1", "key2"
195cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        }));
196cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka
197cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        assertTrue("in 1 element", StringUtils.containsInArray("key", new String[] {
198cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka                "key"
199cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        }));
200cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        assertTrue("in 2 elements", StringUtils.containsInArray("key", new String[] {
201cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka                "key1", "key"
202cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        }));
203cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka    }
204cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka
205cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka    public void testContainsInCommaSplittableText() {
206cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        assertFalse("null", StringUtils.containsInCommaSplittableText("key", null));
207cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        assertFalse("empty", StringUtils.containsInCommaSplittableText("key", ""));
208cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        assertFalse("not in 1 element",
209cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka                StringUtils.containsInCommaSplittableText("key", "key1"));
210cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        assertFalse("not in 2 elements",
211cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka                StringUtils.containsInCommaSplittableText("key", "key1,key2"));
212cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka
213cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        assertTrue("in 1 element", StringUtils.containsInCommaSplittableText("key", "key"));
214cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        assertTrue("in 2 elements", StringUtils.containsInCommaSplittableText("key", "key1,key"));
215cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka    }
216cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka
217cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka    public void testRemoveFromCommaSplittableTextIfExists() {
218cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        assertEquals("null", "", StringUtils.removeFromCommaSplittableTextIfExists("key", null));
219cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        assertEquals("empty", "", StringUtils.removeFromCommaSplittableTextIfExists("key", ""));
220cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka
221cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        assertEquals("not in 1 element", "key1",
222cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka                StringUtils.removeFromCommaSplittableTextIfExists("key", "key1"));
223cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        assertEquals("not in 2 elements", "key1,key2",
224cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka                StringUtils.removeFromCommaSplittableTextIfExists("key", "key1,key2"));
225cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka
226cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        assertEquals("in 1 element", "",
227cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka                StringUtils.removeFromCommaSplittableTextIfExists("key", "key"));
228cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        assertEquals("in 2 elements at position 1", "key2",
229cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka                StringUtils.removeFromCommaSplittableTextIfExists("key", "key,key2"));
230cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        assertEquals("in 2 elements at position 2", "key1",
231cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka                StringUtils.removeFromCommaSplittableTextIfExists("key", "key1,key"));
232cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        assertEquals("in 3 elements at position 2", "key1,key3",
233cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka                StringUtils.removeFromCommaSplittableTextIfExists("key", "key1,key,key3"));
234cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka
235cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        assertEquals("in 3 elements at position 1,2,3", "",
236cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka                StringUtils.removeFromCommaSplittableTextIfExists("key", "key,key,key"));
237cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        assertEquals("in 5 elements at position 2,4", "key1,key3,key5",
238cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka                StringUtils.removeFromCommaSplittableTextIfExists(
239cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka                        "key", "key1,key,key3,key,key5"));
240cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka    }
241cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka
242cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka
243cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka    public void testCapitalizeFirstCodePoint() {
244cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        assertEquals("SSaa",
245cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka                StringUtils.capitalizeFirstCodePoint("ßaa", Locale.GERMAN));
246cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        assertEquals("Aßa",
247cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka                StringUtils.capitalizeFirstCodePoint("aßa", Locale.GERMAN));
248cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        assertEquals("Iab",
249cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka                StringUtils.capitalizeFirstCodePoint("iab", Locale.ENGLISH));
250cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        assertEquals("CAmElCaSe",
251cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka                StringUtils.capitalizeFirstCodePoint("cAmElCaSe", Locale.ENGLISH));
252cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        assertEquals("İab",
253cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka                StringUtils.capitalizeFirstCodePoint("iab", new Locale("tr")));
254cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        assertEquals("AİB",
255cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka                StringUtils.capitalizeFirstCodePoint("AİB", new Locale("tr")));
256cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        assertEquals("A",
257cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka                StringUtils.capitalizeFirstCodePoint("a", Locale.ENGLISH));
258cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        assertEquals("A",
259cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka                StringUtils.capitalizeFirstCodePoint("A", Locale.ENGLISH));
260cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka    }
261cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka
262cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka    public void testCapitalizeFirstAndDowncaseRest() {
263cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        assertEquals("SSaa",
264cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka                StringUtils.capitalizeFirstAndDowncaseRest("ßaa", Locale.GERMAN));
265cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        assertEquals("Aßa",
266cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka                StringUtils.capitalizeFirstAndDowncaseRest("aßa", Locale.GERMAN));
267cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        assertEquals("Iab",
268cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka                StringUtils.capitalizeFirstAndDowncaseRest("iab", Locale.ENGLISH));
269cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        assertEquals("Camelcase",
270cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka                StringUtils.capitalizeFirstAndDowncaseRest("cAmElCaSe", Locale.ENGLISH));
271cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        assertEquals("İab",
272cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka                StringUtils.capitalizeFirstAndDowncaseRest("iab", new Locale("tr")));
273cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        assertEquals("Aib",
274cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka                StringUtils.capitalizeFirstAndDowncaseRest("AİB", new Locale("tr")));
275cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        assertEquals("A",
276cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka                StringUtils.capitalizeFirstAndDowncaseRest("a", Locale.ENGLISH));
277cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        assertEquals("A",
278cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka                StringUtils.capitalizeFirstAndDowncaseRest("A", Locale.ENGLISH));
279cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka    }
280cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka
281cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka    public void testGetCapitalizationType() {
282cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        assertEquals(StringUtils.CAPITALIZE_NONE,
283cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka                StringUtils.getCapitalizationType("capitalize"));
284cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        assertEquals(StringUtils.CAPITALIZE_NONE,
285cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka                StringUtils.getCapitalizationType("cApITalize"));
286cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        assertEquals(StringUtils.CAPITALIZE_NONE,
287cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka                StringUtils.getCapitalizationType("capitalizE"));
288cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        assertEquals(StringUtils.CAPITALIZE_NONE,
289cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka                StringUtils.getCapitalizationType("__c a piu$@tali56ze"));
290cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        assertEquals(StringUtils.CAPITALIZE_FIRST,
291cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka                StringUtils.getCapitalizationType("A__c a piu$@tali56ze"));
292cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        assertEquals(StringUtils.CAPITALIZE_FIRST,
293cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka                StringUtils.getCapitalizationType("Capitalize"));
294cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        assertEquals(StringUtils.CAPITALIZE_FIRST,
295cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka                StringUtils.getCapitalizationType("     Capitalize"));
296cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        assertEquals(StringUtils.CAPITALIZE_ALL,
297cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka                StringUtils.getCapitalizationType("CAPITALIZE"));
298cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        assertEquals(StringUtils.CAPITALIZE_ALL,
299cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka                StringUtils.getCapitalizationType("  PI26LIE"));
300cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        assertEquals(StringUtils.CAPITALIZE_NONE,
301cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka                StringUtils.getCapitalizationType(""));
302cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka    }
303cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka
304cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka    public void testIsIdenticalAfterUpcaseIsIdenticalAfterDowncase() {
305cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        assertFalse(StringUtils.isIdenticalAfterUpcase("capitalize"));
306cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        assertTrue(StringUtils.isIdenticalAfterDowncase("capitalize"));
307cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        assertFalse(StringUtils.isIdenticalAfterUpcase("cApITalize"));
308cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        assertFalse(StringUtils.isIdenticalAfterDowncase("cApITalize"));
309cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        assertFalse(StringUtils.isIdenticalAfterUpcase("capitalizE"));
310cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        assertFalse(StringUtils.isIdenticalAfterDowncase("capitalizE"));
311cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        assertFalse(StringUtils.isIdenticalAfterUpcase("__c a piu$@tali56ze"));
312cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        assertTrue(StringUtils.isIdenticalAfterDowncase("__c a piu$@tali56ze"));
313cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        assertFalse(StringUtils.isIdenticalAfterUpcase("A__c a piu$@tali56ze"));
314cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        assertFalse(StringUtils.isIdenticalAfterDowncase("A__c a piu$@tali56ze"));
315cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        assertFalse(StringUtils.isIdenticalAfterUpcase("Capitalize"));
316cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        assertFalse(StringUtils.isIdenticalAfterDowncase("Capitalize"));
317cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        assertFalse(StringUtils.isIdenticalAfterUpcase("     Capitalize"));
318cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        assertFalse(StringUtils.isIdenticalAfterDowncase("     Capitalize"));
319cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        assertTrue(StringUtils.isIdenticalAfterUpcase("CAPITALIZE"));
320cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        assertFalse(StringUtils.isIdenticalAfterDowncase("CAPITALIZE"));
321cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        assertTrue(StringUtils.isIdenticalAfterUpcase("  PI26LIE"));
322cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        assertFalse(StringUtils.isIdenticalAfterDowncase("  PI26LIE"));
323cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        assertTrue(StringUtils.isIdenticalAfterUpcase(""));
324cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        assertTrue(StringUtils.isIdenticalAfterDowncase(""));
325cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka    }
326cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka
327cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka    private static void checkCapitalize(final String src, final String dst,
328cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka            final int[] sortedSeparators, final Locale locale) {
329cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        assertEquals(dst, StringUtils.capitalizeEachWord(src, sortedSeparators, locale));
330cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        assert(src.equals(dst)
331cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka                == StringUtils.isIdenticalAfterCapitalizeEachWord(src, sortedSeparators));
332cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka    }
333cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka
334cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka    private static final int[] SPACE = { Constants.CODE_SPACE };
335cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka    private static final int[] SPACE_PERIOD = StringUtils.toSortedCodePointArray(" .");
336cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka    private static final int[] SENTENCE_SEPARATORS =
337cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka            StringUtils.toSortedCodePointArray(" \n.!?*()&");
338cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka    private static final int[] WORD_SEPARATORS = StringUtils.toSortedCodePointArray(" \n.!?*,();&");
339cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka
340cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka    public void testCapitalizeEachWord() {
341cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        checkCapitalize("", "", SPACE, Locale.ENGLISH);
342cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        checkCapitalize("test", "Test", SPACE, Locale.ENGLISH);
343cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        checkCapitalize("    test", "    Test", SPACE, Locale.ENGLISH);
344cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        checkCapitalize("Test", "Test", SPACE, Locale.ENGLISH);
345cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        checkCapitalize("    Test", "    Test", SPACE, Locale.ENGLISH);
346cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        checkCapitalize(".Test", ".test", SPACE, Locale.ENGLISH);
347cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        checkCapitalize(".Test", ".Test", SPACE_PERIOD, Locale.ENGLISH);
348cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        checkCapitalize("test and retest", "Test And Retest", SPACE_PERIOD, Locale.ENGLISH);
349cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        checkCapitalize("Test and retest", "Test And Retest", SPACE_PERIOD, Locale.ENGLISH);
350cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        checkCapitalize("Test And Retest", "Test And Retest", SPACE_PERIOD, Locale.ENGLISH);
351cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        checkCapitalize("Test And.Retest  ", "Test And.Retest  ", SPACE_PERIOD, Locale.ENGLISH);
352cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        checkCapitalize("Test And.retest  ", "Test And.Retest  ", SPACE_PERIOD, Locale.ENGLISH);
353cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        checkCapitalize("Test And.retest  ", "Test And.retest  ", SPACE, Locale.ENGLISH);
354cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        checkCapitalize("Test And.Retest  ", "Test And.retest  ", SPACE, Locale.ENGLISH);
355cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        checkCapitalize("test and ietest", "Test And İetest", SPACE_PERIOD, new Locale("tr"));
356cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        checkCapitalize("test and ietest", "Test And Ietest", SPACE_PERIOD, Locale.ENGLISH);
357cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        checkCapitalize("Test&Retest", "Test&Retest", SENTENCE_SEPARATORS, Locale.ENGLISH);
358cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        checkCapitalize("Test&retest", "Test&Retest", SENTENCE_SEPARATORS, Locale.ENGLISH);
359cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        checkCapitalize("test&Retest", "Test&Retest", SENTENCE_SEPARATORS, Locale.ENGLISH);
360cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        checkCapitalize("rest\nrecreation! And in the end...",
361cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka                "Rest\nRecreation! And In The End...", WORD_SEPARATORS, Locale.ENGLISH);
362cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        checkCapitalize("lorem ipsum dolor sit amet", "Lorem Ipsum Dolor Sit Amet",
363cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka                WORD_SEPARATORS, Locale.ENGLISH);
364cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        checkCapitalize("Lorem!Ipsum (Dolor) Sit * Amet", "Lorem!Ipsum (Dolor) Sit * Amet",
365cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka                WORD_SEPARATORS, Locale.ENGLISH);
366cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        checkCapitalize("Lorem!Ipsum (dolor) Sit * Amet", "Lorem!Ipsum (Dolor) Sit * Amet",
367cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka                WORD_SEPARATORS, Locale.ENGLISH);
368cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka    }
369cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka
370cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka    public void testLooksLikeURL() {
371cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        assertTrue(StringUtils.lastPartLooksLikeURL("http://www.google."));
372cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        assertFalse(StringUtils.lastPartLooksLikeURL("word wo"));
373cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        assertTrue(StringUtils.lastPartLooksLikeURL("/etc/foo"));
374cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        assertFalse(StringUtils.lastPartLooksLikeURL("left/right"));
375cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        assertTrue(StringUtils.lastPartLooksLikeURL("www.goo"));
376cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        assertTrue(StringUtils.lastPartLooksLikeURL("www."));
377cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        assertFalse(StringUtils.lastPartLooksLikeURL("U.S.A"));
378cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        assertFalse(StringUtils.lastPartLooksLikeURL("U.S.A."));
379cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        assertTrue(StringUtils.lastPartLooksLikeURL("rtsp://foo."));
380cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        assertTrue(StringUtils.lastPartLooksLikeURL("://"));
381cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        assertFalse(StringUtils.lastPartLooksLikeURL("abc/"));
382cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        assertTrue(StringUtils.lastPartLooksLikeURL("abc.def/ghi"));
383cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        assertFalse(StringUtils.lastPartLooksLikeURL("abc.def"));
384cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        // TODO: ideally this would not look like a URL, but to keep down the complexity of the
385cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        // code for now True is acceptable.
386cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        assertTrue(StringUtils.lastPartLooksLikeURL("abc./def"));
387cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        // TODO: ideally this would not look like a URL, but to keep down the complexity of the
388cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        // code for now True is acceptable.
389cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        assertTrue(StringUtils.lastPartLooksLikeURL(".abc/def"));
390cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka    }
391cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka
392cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka    public void testHexStringUtils() {
393cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        final byte[] bytes = new byte[] { (byte)0x01, (byte)0x11, (byte)0x22, (byte)0x33,
394cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka                (byte)0x55, (byte)0x88, (byte)0xEE };
395cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        final String bytesStr = StringUtils.byteArrayToHexString(bytes);
396cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        final byte[] bytes2 = StringUtils.hexStringToByteArray(bytesStr);
397cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        for (int i = 0; i < bytes.length; ++i) {
398cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka            assertTrue(bytes[i] == bytes2[i]);
399cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        }
400cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        final String bytesStr2 = StringUtils.byteArrayToHexString(bytes2);
401cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        assertTrue(bytesStr.equals(bytesStr2));
402cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka    }
403cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka
404cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka    public void testToCodePointArray() {
405cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        final String STR_WITH_SUPPLEMENTARY_CHAR = "abcde\uD861\uDED7fgh\u0000\u2002\u2003\u3000xx";
406cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        final int[] EXPECTED_RESULT = new int[] { 'a', 'b', 'c', 'd', 'e', 0x286D7, 'f', 'g', 'h',
407cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka                0, 0x2002, 0x2003, 0x3000, 'x', 'x'};
408cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        final int[] codePointArray = StringUtils.toCodePointArray(STR_WITH_SUPPLEMENTARY_CHAR, 0,
409cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka                STR_WITH_SUPPLEMENTARY_CHAR.length());
410cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        assertEquals("toCodePointArray, size matches", codePointArray.length,
411cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka                EXPECTED_RESULT.length);
412cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        for (int i = 0; i < EXPECTED_RESULT.length; ++i) {
413cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka            assertEquals("toCodePointArray position " + i, codePointArray[i], EXPECTED_RESULT[i]);
414cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        }
415cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka    }
416cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka
417cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka    public void testCopyCodePointsAndReturnCodePointCount() {
418cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        final String STR_WITH_SUPPLEMENTARY_CHAR = "AbcDE\uD861\uDED7fGh\u0000\u2002\u3000あx";
419cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        final int[] EXPECTED_RESULT = new int[] { 'A', 'b', 'c', 'D', 'E', 0x286D7,
420cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka                'f', 'G', 'h', 0, 0x2002, 0x3000, 'あ', 'x'};
421cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        final int[] EXPECTED_RESULT_DOWNCASE = new int[] { 'a', 'b', 'c', 'd', 'e', 0x286D7,
422cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka                'f', 'g', 'h', 0, 0x2002, 0x3000, 'あ', 'x'};
423cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka
424cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        int[] codePointArray = new int[50];
425cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        int codePointCount = StringUtils.copyCodePointsAndReturnCodePointCount(codePointArray,
426cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka                STR_WITH_SUPPLEMENTARY_CHAR, 0,
427cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka                STR_WITH_SUPPLEMENTARY_CHAR.length(), false /* downCase */);
428cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        assertEquals("copyCodePointsAndReturnCodePointCount, size matches", codePointCount,
429cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka                EXPECTED_RESULT.length);
430cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        for (int i = 0; i < codePointCount; ++i) {
431cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka            assertEquals("copyCodePointsAndReturnCodePointCount position " + i, codePointArray[i],
432cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka                    EXPECTED_RESULT[i]);
433cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        }
434cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka
435cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        codePointCount = StringUtils.copyCodePointsAndReturnCodePointCount(codePointArray,
436cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka                STR_WITH_SUPPLEMENTARY_CHAR, 0,
437cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka                STR_WITH_SUPPLEMENTARY_CHAR.length(), true /* downCase */);
438cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        assertEquals("copyCodePointsAndReturnCodePointCount downcase, size matches", codePointCount,
439cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka                EXPECTED_RESULT_DOWNCASE.length);
440cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        for (int i = 0; i < codePointCount; ++i) {
441cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka            assertEquals("copyCodePointsAndReturnCodePointCount position " + i, codePointArray[i],
442cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka                    EXPECTED_RESULT_DOWNCASE[i]);
443cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        }
444cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka
445cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        final int JAVA_CHAR_COUNT = 8;
446cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        final int CODEPOINT_COUNT = 7;
447cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        codePointCount = StringUtils.copyCodePointsAndReturnCodePointCount(codePointArray,
448cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka                STR_WITH_SUPPLEMENTARY_CHAR, 0, JAVA_CHAR_COUNT, false /* downCase */);
449cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        assertEquals("copyCodePointsAndReturnCodePointCount, size matches", codePointCount,
450cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka                CODEPOINT_COUNT);
451cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        for (int i = 0; i < codePointCount; ++i) {
452cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka            assertEquals("copyCodePointsAndReturnCodePointCount position " + i, codePointArray[i],
453cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka                    EXPECTED_RESULT[i]);
454cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        }
455cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka
456cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        boolean exceptionHappened = false;
457cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        codePointArray = new int[5];
458cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        try {
459cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka            codePointCount = StringUtils.copyCodePointsAndReturnCodePointCount(codePointArray,
460cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka                    STR_WITH_SUPPLEMENTARY_CHAR, 0, JAVA_CHAR_COUNT, false /* downCase */);
461cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        } catch (ArrayIndexOutOfBoundsException e) {
462cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka            exceptionHappened = true;
463cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        }
464cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        assertTrue("copyCodePointsAndReturnCodePointCount throws when array is too small",
465cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka                exceptionHappened);
466cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka    }
467cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka
468cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka    public void testGetTrailingSingleQuotesCount() {
469cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        assertEquals(0, StringUtils.getTrailingSingleQuotesCount(""));
470cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        assertEquals(1, StringUtils.getTrailingSingleQuotesCount("'"));
471cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        assertEquals(5, StringUtils.getTrailingSingleQuotesCount("'''''"));
472cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        assertEquals(0, StringUtils.getTrailingSingleQuotesCount("a"));
473cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        assertEquals(0, StringUtils.getTrailingSingleQuotesCount("'this"));
474cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        assertEquals(1, StringUtils.getTrailingSingleQuotesCount("'word'"));
475cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        assertEquals(0, StringUtils.getTrailingSingleQuotesCount("I'm"));
476cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka    }
477f62b5d633d17b94a7ea46c968e073fdaa3fcbe15Tadashi G. Takaoka}
478