StringAndJsonUtilsTests.java revision 73065b778c30eecd5913cca5ac42746537dec495
1/* 2 * Copyright (C) 2012 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17package com.android.inputmethod.latin.utils; 18 19import android.test.AndroidTestCase; 20import android.test.suitebuilder.annotation.SmallTest; 21 22import com.android.inputmethod.latin.Constants; 23 24import java.util.Arrays; 25import java.util.List; 26import java.util.Locale; 27 28@SmallTest 29public class StringAndJsonUtilsTests extends AndroidTestCase { 30 public void testContainsInArray() { 31 assertFalse("empty array", StringUtils.containsInArray("key", new String[0])); 32 assertFalse("not in 1 element", StringUtils.containsInArray("key", new String[] { 33 "key1" 34 })); 35 assertFalse("not in 2 elements", StringUtils.containsInArray("key", new String[] { 36 "key1", "key2" 37 })); 38 39 assertTrue("in 1 element", StringUtils.containsInArray("key", new String[] { 40 "key" 41 })); 42 assertTrue("in 2 elements", StringUtils.containsInArray("key", new String[] { 43 "key1", "key" 44 })); 45 } 46 47 public void testContainsInCommaSplittableText() { 48 assertFalse("null", StringUtils.containsInCommaSplittableText("key", null)); 49 assertFalse("empty", StringUtils.containsInCommaSplittableText("key", "")); 50 assertFalse("not in 1 element", 51 StringUtils.containsInCommaSplittableText("key", "key1")); 52 assertFalse("not in 2 elements", 53 StringUtils.containsInCommaSplittableText("key", "key1,key2")); 54 55 assertTrue("in 1 element", StringUtils.containsInCommaSplittableText("key", "key")); 56 assertTrue("in 2 elements", StringUtils.containsInCommaSplittableText("key", "key1,key")); 57 } 58 59 public void testRemoveFromCommaSplittableTextIfExists() { 60 assertEquals("null", "", StringUtils.removeFromCommaSplittableTextIfExists("key", null)); 61 assertEquals("empty", "", StringUtils.removeFromCommaSplittableTextIfExists("key", "")); 62 63 assertEquals("not in 1 element", "key1", 64 StringUtils.removeFromCommaSplittableTextIfExists("key", "key1")); 65 assertEquals("not in 2 elements", "key1,key2", 66 StringUtils.removeFromCommaSplittableTextIfExists("key", "key1,key2")); 67 68 assertEquals("in 1 element", "", 69 StringUtils.removeFromCommaSplittableTextIfExists("key", "key")); 70 assertEquals("in 2 elements at position 1", "key2", 71 StringUtils.removeFromCommaSplittableTextIfExists("key", "key,key2")); 72 assertEquals("in 2 elements at position 2", "key1", 73 StringUtils.removeFromCommaSplittableTextIfExists("key", "key1,key")); 74 assertEquals("in 3 elements at position 2", "key1,key3", 75 StringUtils.removeFromCommaSplittableTextIfExists("key", "key1,key,key3")); 76 77 assertEquals("in 3 elements at position 1,2,3", "", 78 StringUtils.removeFromCommaSplittableTextIfExists("key", "key,key,key")); 79 assertEquals("in 5 elements at position 2,4", "key1,key3,key5", 80 StringUtils.removeFromCommaSplittableTextIfExists( 81 "key", "key1,key,key3,key,key5")); 82 } 83 84 85 public void testCapitalizeFirstCodePoint() { 86 assertEquals("SSaa", 87 StringUtils.capitalizeFirstCodePoint("ßaa", Locale.GERMAN)); 88 assertEquals("Aßa", 89 StringUtils.capitalizeFirstCodePoint("aßa", Locale.GERMAN)); 90 assertEquals("Iab", 91 StringUtils.capitalizeFirstCodePoint("iab", Locale.ENGLISH)); 92 assertEquals("CAmElCaSe", 93 StringUtils.capitalizeFirstCodePoint("cAmElCaSe", Locale.ENGLISH)); 94 assertEquals("İab", 95 StringUtils.capitalizeFirstCodePoint("iab", new Locale("tr"))); 96 assertEquals("AİB", 97 StringUtils.capitalizeFirstCodePoint("AİB", new Locale("tr"))); 98 assertEquals("A", 99 StringUtils.capitalizeFirstCodePoint("a", Locale.ENGLISH)); 100 assertEquals("A", 101 StringUtils.capitalizeFirstCodePoint("A", Locale.ENGLISH)); 102 } 103 104 public void testCapitalizeFirstAndDowncaseRest() { 105 assertEquals("SSaa", 106 StringUtils.capitalizeFirstAndDowncaseRest("ßaa", Locale.GERMAN)); 107 assertEquals("Aßa", 108 StringUtils.capitalizeFirstAndDowncaseRest("aßa", Locale.GERMAN)); 109 assertEquals("Iab", 110 StringUtils.capitalizeFirstAndDowncaseRest("iab", Locale.ENGLISH)); 111 assertEquals("Camelcase", 112 StringUtils.capitalizeFirstAndDowncaseRest("cAmElCaSe", Locale.ENGLISH)); 113 assertEquals("İab", 114 StringUtils.capitalizeFirstAndDowncaseRest("iab", new Locale("tr"))); 115 assertEquals("Aib", 116 StringUtils.capitalizeFirstAndDowncaseRest("AİB", new Locale("tr"))); 117 assertEquals("A", 118 StringUtils.capitalizeFirstAndDowncaseRest("a", Locale.ENGLISH)); 119 assertEquals("A", 120 StringUtils.capitalizeFirstAndDowncaseRest("A", Locale.ENGLISH)); 121 } 122 123 public void testGetCapitalizationType() { 124 assertEquals(StringUtils.CAPITALIZE_NONE, 125 StringUtils.getCapitalizationType("capitalize")); 126 assertEquals(StringUtils.CAPITALIZE_NONE, 127 StringUtils.getCapitalizationType("cApITalize")); 128 assertEquals(StringUtils.CAPITALIZE_NONE, 129 StringUtils.getCapitalizationType("capitalizE")); 130 assertEquals(StringUtils.CAPITALIZE_NONE, 131 StringUtils.getCapitalizationType("__c a piu$@tali56ze")); 132 assertEquals(StringUtils.CAPITALIZE_FIRST, 133 StringUtils.getCapitalizationType("A__c a piu$@tali56ze")); 134 assertEquals(StringUtils.CAPITALIZE_FIRST, 135 StringUtils.getCapitalizationType("Capitalize")); 136 assertEquals(StringUtils.CAPITALIZE_FIRST, 137 StringUtils.getCapitalizationType(" Capitalize")); 138 assertEquals(StringUtils.CAPITALIZE_ALL, 139 StringUtils.getCapitalizationType("CAPITALIZE")); 140 assertEquals(StringUtils.CAPITALIZE_ALL, 141 StringUtils.getCapitalizationType(" PI26LIE")); 142 assertEquals(StringUtils.CAPITALIZE_NONE, 143 StringUtils.getCapitalizationType("")); 144 } 145 146 public void testIsIdenticalAfterUpcaseIsIdenticalAfterDowncase() { 147 assertFalse(StringUtils.isIdenticalAfterUpcase("capitalize")); 148 assertTrue(StringUtils.isIdenticalAfterDowncase("capitalize")); 149 assertFalse(StringUtils.isIdenticalAfterUpcase("cApITalize")); 150 assertFalse(StringUtils.isIdenticalAfterDowncase("cApITalize")); 151 assertFalse(StringUtils.isIdenticalAfterUpcase("capitalizE")); 152 assertFalse(StringUtils.isIdenticalAfterDowncase("capitalizE")); 153 assertFalse(StringUtils.isIdenticalAfterUpcase("__c a piu$@tali56ze")); 154 assertTrue(StringUtils.isIdenticalAfterDowncase("__c a piu$@tali56ze")); 155 assertFalse(StringUtils.isIdenticalAfterUpcase("A__c a piu$@tali56ze")); 156 assertFalse(StringUtils.isIdenticalAfterDowncase("A__c a piu$@tali56ze")); 157 assertFalse(StringUtils.isIdenticalAfterUpcase("Capitalize")); 158 assertFalse(StringUtils.isIdenticalAfterDowncase("Capitalize")); 159 assertFalse(StringUtils.isIdenticalAfterUpcase(" Capitalize")); 160 assertFalse(StringUtils.isIdenticalAfterDowncase(" Capitalize")); 161 assertTrue(StringUtils.isIdenticalAfterUpcase("CAPITALIZE")); 162 assertFalse(StringUtils.isIdenticalAfterDowncase("CAPITALIZE")); 163 assertTrue(StringUtils.isIdenticalAfterUpcase(" PI26LIE")); 164 assertFalse(StringUtils.isIdenticalAfterDowncase(" PI26LIE")); 165 assertTrue(StringUtils.isIdenticalAfterUpcase("")); 166 assertTrue(StringUtils.isIdenticalAfterDowncase("")); 167 } 168 169 private static void checkCapitalize(final String src, final String dst, 170 final int[] sortedSeparators, final Locale locale) { 171 assertEquals(dst, StringUtils.capitalizeEachWord(src, sortedSeparators, locale)); 172 assert(src.equals(dst) 173 == StringUtils.isIdenticalAfterCapitalizeEachWord(src, sortedSeparators)); 174 } 175 176 private static final int[] SPACE = { Constants.CODE_SPACE }; 177 private static final int[] SPACE_PERIOD = StringUtils.toSortedCodePointArray(" ."); 178 private static final int[] SENTENCE_SEPARATORS = 179 StringUtils.toSortedCodePointArray(" \n.!?*()&"); 180 private static final int[] WORD_SEPARATORS = StringUtils.toSortedCodePointArray(" \n.!?*,();&"); 181 182 public void testCapitalizeEachWord() { 183 checkCapitalize("", "", SPACE, Locale.ENGLISH); 184 checkCapitalize("test", "Test", SPACE, Locale.ENGLISH); 185 checkCapitalize(" test", " Test", SPACE, Locale.ENGLISH); 186 checkCapitalize("Test", "Test", SPACE, Locale.ENGLISH); 187 checkCapitalize(" Test", " Test", SPACE, Locale.ENGLISH); 188 checkCapitalize(".Test", ".test", SPACE, Locale.ENGLISH); 189 checkCapitalize(".Test", ".Test", SPACE_PERIOD, Locale.ENGLISH); 190 checkCapitalize("test and retest", "Test And Retest", SPACE_PERIOD, Locale.ENGLISH); 191 checkCapitalize("Test and retest", "Test And Retest", SPACE_PERIOD, Locale.ENGLISH); 192 checkCapitalize("Test And Retest", "Test And Retest", SPACE_PERIOD, Locale.ENGLISH); 193 checkCapitalize("Test And.Retest ", "Test And.Retest ", SPACE_PERIOD, Locale.ENGLISH); 194 checkCapitalize("Test And.retest ", "Test And.Retest ", SPACE_PERIOD, Locale.ENGLISH); 195 checkCapitalize("Test And.retest ", "Test And.retest ", SPACE, Locale.ENGLISH); 196 checkCapitalize("Test And.Retest ", "Test And.retest ", SPACE, Locale.ENGLISH); 197 checkCapitalize("test and ietest", "Test And İetest", SPACE_PERIOD, new Locale("tr")); 198 checkCapitalize("test and ietest", "Test And Ietest", SPACE_PERIOD, Locale.ENGLISH); 199 checkCapitalize("Test&Retest", "Test&Retest", SENTENCE_SEPARATORS, Locale.ENGLISH); 200 checkCapitalize("Test&retest", "Test&Retest", SENTENCE_SEPARATORS, Locale.ENGLISH); 201 checkCapitalize("test&Retest", "Test&Retest", SENTENCE_SEPARATORS, Locale.ENGLISH); 202 checkCapitalize("rest\nrecreation! And in the end...", 203 "Rest\nRecreation! And In The End...", WORD_SEPARATORS, Locale.ENGLISH); 204 checkCapitalize("lorem ipsum dolor sit amet", "Lorem Ipsum Dolor Sit Amet", 205 WORD_SEPARATORS, Locale.ENGLISH); 206 checkCapitalize("Lorem!Ipsum (Dolor) Sit * Amet", "Lorem!Ipsum (Dolor) Sit * Amet", 207 WORD_SEPARATORS, Locale.ENGLISH); 208 checkCapitalize("Lorem!Ipsum (dolor) Sit * Amet", "Lorem!Ipsum (Dolor) Sit * Amet", 209 WORD_SEPARATORS, Locale.ENGLISH); 210 } 211 212 public void testLooksLikeURL() { 213 assertTrue(StringUtils.lastPartLooksLikeURL("http://www.google.")); 214 assertFalse(StringUtils.lastPartLooksLikeURL("word wo")); 215 assertTrue(StringUtils.lastPartLooksLikeURL("/etc/foo")); 216 assertFalse(StringUtils.lastPartLooksLikeURL("left/right")); 217 assertTrue(StringUtils.lastPartLooksLikeURL("www.goo")); 218 assertTrue(StringUtils.lastPartLooksLikeURL("www.")); 219 assertFalse(StringUtils.lastPartLooksLikeURL("U.S.A")); 220 assertFalse(StringUtils.lastPartLooksLikeURL("U.S.A.")); 221 assertTrue(StringUtils.lastPartLooksLikeURL("rtsp://foo.")); 222 assertTrue(StringUtils.lastPartLooksLikeURL("://")); 223 assertFalse(StringUtils.lastPartLooksLikeURL("abc/")); 224 assertTrue(StringUtils.lastPartLooksLikeURL("abc.def/ghi")); 225 assertFalse(StringUtils.lastPartLooksLikeURL("abc.def")); 226 // TODO: ideally this would not look like a URL, but to keep down the complexity of the 227 // code for now True is acceptable. 228 assertTrue(StringUtils.lastPartLooksLikeURL("abc./def")); 229 // TODO: ideally this would not look like a URL, but to keep down the complexity of the 230 // code for now True is acceptable. 231 assertTrue(StringUtils.lastPartLooksLikeURL(".abc/def")); 232 } 233 234 public void testHexStringUtils() { 235 final byte[] bytes = new byte[] { (byte)0x01, (byte)0x11, (byte)0x22, (byte)0x33, 236 (byte)0x55, (byte)0x88, (byte)0xEE }; 237 final String bytesStr = StringUtils.byteArrayToHexString(bytes); 238 final byte[] bytes2 = StringUtils.hexStringToByteArray(bytesStr); 239 for (int i = 0; i < bytes.length; ++i) { 240 assertTrue(bytes[i] == bytes2[i]); 241 } 242 final String bytesStr2 = StringUtils.byteArrayToHexString(bytes2); 243 assertTrue(bytesStr.equals(bytesStr2)); 244 } 245 246 public void testJsonUtils() { 247 final Object[] objs = new Object[] { 1, "aaa", "bbb", 3 }; 248 final List<Object> objArray = Arrays.asList(objs); 249 final String str = JsonUtils.listToJsonStr(objArray); 250 final List<Object> newObjArray = JsonUtils.jsonStrToList(str); 251 for (int i = 0; i < objs.length; ++i) { 252 assertEquals(objs[i], newObjArray.get(i)); 253 } 254 } 255 256 public void testToCodePointArray() { 257 final String STR_WITH_SUPPLEMENTARY_CHAR = "abcde\uD861\uDED7fgh\u0000\u2002\u2003\u3000xx"; 258 final int[] EXPECTED_RESULT = new int[] { 'a', 'b', 'c', 'd', 'e', 0x286D7, 'f', 'g', 'h', 259 0, 0x2002, 0x2003, 0x3000, 'x', 'x'}; 260 final int[] codePointArray = StringUtils.toCodePointArray(STR_WITH_SUPPLEMENTARY_CHAR, 0, 261 STR_WITH_SUPPLEMENTARY_CHAR.length()); 262 assertEquals("toCodePointArray, size matches", codePointArray.length, 263 EXPECTED_RESULT.length); 264 for (int i = 0; i < EXPECTED_RESULT.length; ++i) { 265 assertEquals("toCodePointArray position " + i, codePointArray[i], EXPECTED_RESULT[i]); 266 } 267 } 268 269 public void testCopyCodePointsAndReturnCodePointCount() { 270 final String STR_WITH_SUPPLEMENTARY_CHAR = "AbcDE\uD861\uDED7fGh\u0000\u2002\u3000あx"; 271 final int[] EXPECTED_RESULT = new int[] { 'A', 'b', 'c', 'D', 'E', 0x286D7, 272 'f', 'G', 'h', 0, 0x2002, 0x3000, 'あ', 'x'}; 273 final int[] EXPECTED_RESULT_DOWNCASE = new int[] { 'a', 'b', 'c', 'd', 'e', 0x286D7, 274 'f', 'g', 'h', 0, 0x2002, 0x3000, 'あ', 'x'}; 275 276 int[] codePointArray = new int[50]; 277 int codePointCount = StringUtils.copyCodePointsAndReturnCodePointCount(codePointArray, 278 STR_WITH_SUPPLEMENTARY_CHAR, 0, 279 STR_WITH_SUPPLEMENTARY_CHAR.length(), false /* downCase */); 280 assertEquals("copyCodePointsAndReturnCodePointCount, size matches", codePointCount, 281 EXPECTED_RESULT.length); 282 for (int i = 0; i < codePointCount; ++i) { 283 assertEquals("copyCodePointsAndReturnCodePointCount position " + i, codePointArray[i], 284 EXPECTED_RESULT[i]); 285 } 286 287 codePointCount = StringUtils.copyCodePointsAndReturnCodePointCount(codePointArray, 288 STR_WITH_SUPPLEMENTARY_CHAR, 0, 289 STR_WITH_SUPPLEMENTARY_CHAR.length(), true /* downCase */); 290 assertEquals("copyCodePointsAndReturnCodePointCount downcase, size matches", codePointCount, 291 EXPECTED_RESULT_DOWNCASE.length); 292 for (int i = 0; i < codePointCount; ++i) { 293 assertEquals("copyCodePointsAndReturnCodePointCount position " + i, codePointArray[i], 294 EXPECTED_RESULT_DOWNCASE[i]); 295 } 296 297 final int JAVA_CHAR_COUNT = 8; 298 final int CODEPOINT_COUNT = 7; 299 codePointCount = StringUtils.copyCodePointsAndReturnCodePointCount(codePointArray, 300 STR_WITH_SUPPLEMENTARY_CHAR, 0, JAVA_CHAR_COUNT, false /* downCase */); 301 assertEquals("copyCodePointsAndReturnCodePointCount, size matches", codePointCount, 302 CODEPOINT_COUNT); 303 for (int i = 0; i < codePointCount; ++i) { 304 assertEquals("copyCodePointsAndReturnCodePointCount position " + i, codePointArray[i], 305 EXPECTED_RESULT[i]); 306 } 307 308 boolean exceptionHappened = false; 309 codePointArray = new int[5]; 310 try { 311 codePointCount = StringUtils.copyCodePointsAndReturnCodePointCount(codePointArray, 312 STR_WITH_SUPPLEMENTARY_CHAR, 0, JAVA_CHAR_COUNT, false /* downCase */); 313 } catch (ArrayIndexOutOfBoundsException e) { 314 exceptionHappened = true; 315 } 316 assertTrue("copyCodePointsAndReturnCodePointCount throws when array is too small", 317 exceptionHappened); 318 } 319 320 public void testGetTrailingSingleQuotesCount() { 321 assertEquals(0, StringUtils.getTrailingSingleQuotesCount("")); 322 assertEquals(1, StringUtils.getTrailingSingleQuotesCount("'")); 323 assertEquals(5, StringUtils.getTrailingSingleQuotesCount("'''''")); 324 assertEquals(0, StringUtils.getTrailingSingleQuotesCount("a")); 325 assertEquals(0, StringUtils.getTrailingSingleQuotesCount("'this")); 326 assertEquals(1, StringUtils.getTrailingSingleQuotesCount("'word'")); 327 assertEquals(0, StringUtils.getTrailingSingleQuotesCount("I'm")); 328 } 329} 330