1 /* 2 * Copyright (C) 2007 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 17 import junit.framework.Assert; 18 import java.util.Locale; 19 20 /** 21 * more string tests 22 */ 23 public class Main { main(String args[])24 public static void main(String args[]) { 25 String test = "0123456789"; 26 String test1 = new String("0123456789"); // different object 27 String test2 = new String("0123456780"); // different value 28 String offset = new String("xxx0123456789yyy"); 29 String sub = offset.substring(3, 13); 30 Object blah = new Object(); 31 32 Assert.assertTrue(test.equals(test)); 33 Assert.assertTrue(test.equals(test1)); 34 Assert.assertFalse(test.equals(test2)); 35 36 Assert.assertEquals(test.compareTo(test1), 0); 37 Assert.assertTrue(test1.compareTo(test2) > 0); 38 Assert.assertTrue(test2.compareTo(test1) < 0); 39 40 Assert.assertEquals("".compareTo(""), 0); 41 Assert.assertTrue(test.compareTo("") > 0); 42 Assert.assertTrue("".compareTo(test) < 0); 43 44 /* compare string with a nonzero offset, in left/right side */ 45 Assert.assertEquals(test.compareTo(sub), 0); 46 Assert.assertEquals(sub.compareTo(test), 0); 47 Assert.assertTrue(test.equals(sub)); 48 Assert.assertTrue(sub.equals(test)); 49 /* same base, one is a substring */ 50 Assert.assertFalse(offset.equals(sub)); 51 Assert.assertFalse(sub.equals(offset)); 52 /* wrong class */ 53 Assert.assertFalse(test.equals(blah)); 54 55 /* null ptr - throw */ 56 try { 57 test.compareTo(null); 58 Assert.fail("didn't get expected npe"); 59 } catch (NullPointerException npe) { 60 System.out.println("Got expected npe"); 61 } 62 /* null ptr - ok */ 63 Assert.assertFalse(test.equals(null)); 64 65 test = test.substring(1); 66 Assert.assertTrue(test.equals("123456789")); 67 Assert.assertFalse(test.equals(test1)); 68 69 test = test.substring(1); 70 Assert.assertTrue(test.equals("23456789")); 71 72 test = test.substring(1); 73 Assert.assertTrue(test.equals("3456789")); 74 75 test = test.substring(1); 76 Assert.assertTrue(test.equals("456789")); 77 78 test = test.substring(3,5); 79 Assert.assertTrue(test.equals("78")); 80 81 test = "this/is/a/path"; 82 String[] strings = test.split("/"); 83 Assert.assertEquals(4, strings.length); 84 85 Assert.assertEquals("this is a path", test.replaceAll("/", " ")); 86 Assert.assertEquals("this is a path", test.replace("/", " ")); 87 88 String result = new String(new char[] { 'O', 'K' }); 89 System.out.println(result); 90 91 testCompareToAndEquals(); 92 testIndexOf(); 93 94 String s0_0 = "\u0000"; 95 String s0_1 = new String(s0_0); 96 String s0_2 = new String(new char[] { '\u0000' }); 97 String s0_3 = s0_0 + ""; 98 System.out.println( 99 " " + $noinline$equals(s0_0, s0_0) + 100 " " + $noinline$equals(s0_0, s0_1) + 101 " " + $noinline$equals(s0_0, s0_2) + 102 " " + $noinline$equals(s0_0, s0_3)); 103 System.out.println( 104 " " + $noinline$equals(s0_1, s0_0) + 105 " " + $noinline$equals(s0_1, s0_1) + 106 " " + $noinline$equals(s0_1, s0_2) + 107 " " + $noinline$equals(s0_1, s0_3)); 108 System.out.println( 109 " " + $noinline$equals(s0_2, s0_0) + 110 " " + $noinline$equals(s0_2, s0_1) + 111 " " + $noinline$equals(s0_2, s0_2) + 112 " " + $noinline$equals(s0_2, s0_3)); 113 System.out.println( 114 " " + $noinline$equals(s0_3, s0_0) + 115 " " + $noinline$equals(s0_3, s0_1) + 116 " " + $noinline$equals(s0_3, s0_2) + 117 " " + $noinline$equals(s0_3, s0_3)); 118 119 testEqualsConstString(); 120 testConstStringEquals(); 121 testStringConcat(); 122 testEmptyWithHighByte(); 123 124 // Regression tests for String.setCharAt() breaking string compression invariants. 125 Locale en_US = new Locale("en", "US"); 126 Assert.assertEquals("I", /* Small latin dotless i */ "\u0131".toUpperCase()); 127 Assert.assertEquals("abc", "a\u0131c".replace('\u0131', 'b')); 128 Assert.assertEquals("a\u0131c", "abc".replace('b', '\u0131')); 129 130 // Regression test for scratch register exhaustion in String.equals() intrinsic on arm64. 131 Assert.assertFalse(result.equals("Very long constant string, so that the known constant count field cannot be embedded in a CMP immediate instruction on arm64. Since it can hold 12-bit values, optionally shifted left by 12, let's go somewhere over 2^12, i.e. 4096. That should trigger the bug with or without string compression. 0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/")); 132 } 133 testCompareToAndEquals()134 public static void testCompareToAndEquals() { 135 String[] strings = { 136 // Special: empty string. 137 "", 138 // Category 0, ASCII strings: 139 // "0123456789abcdef".substring(0, index + 1) 140 "0", 141 "01", 142 "012", 143 "0123", 144 "01234", 145 "012345", 146 "0123456", 147 "01234567", 148 "012345678", 149 "0123456789", 150 "0123456789a", 151 "0123456789ab", 152 "0123456789abc", 153 "0123456789abcd", 154 "0123456789abcde", 155 "0123456789abcdef", 156 // Category 1, ASCII strings: 157 // "0123456789abcdef".substring(0, index) + "x" 158 "x", 159 "0x", 160 "01x", 161 "012x", 162 "0123x", 163 "01234x", 164 "012345x", 165 "0123456x", 166 "01234567x", 167 "012345678x", 168 "0123456789x", 169 "0123456789ax", 170 "0123456789abx", 171 "0123456789abcx", 172 "0123456789abcdx", 173 "0123456789abcdex", 174 // Category 2, ASCII strings, 175 // "0123456789abcdef".substring(0, index) + "x" + 176 // "0123456789abcdef".substring(index + 1) 177 "x123456789abcdef", 178 "0x23456789abcdef", 179 "01x3456789abcdef", 180 "012x456789abcdef", 181 "0123x56789abcdef", 182 "01234x6789abcdef", 183 "012345x789abcdef", 184 "0123456x89abcdef", 185 "01234567x9abcdef", 186 "012345678xabcdef", 187 "0123456789xbcdef", 188 "0123456789axcdef", 189 "0123456789abxdef", 190 "0123456789abcxef", 191 "0123456789abcdxf", 192 "0123456789abcdex", 193 // Category 3, ASCII strings: 194 // "z" + "0123456789abcdef".substring(1, index + 1) 195 "z", 196 "z1", 197 "z12", 198 "z123", 199 "z1234", 200 "z12345", 201 "z123456", 202 "z1234567", 203 "z12345678", 204 "z123456789", 205 "z123456789a", 206 "z123456789ab", 207 "z123456789abc", 208 "z123456789abcd", 209 "z123456789abcde", 210 "z123456789abcdef", 211 // Category 4, non-ASCII strings: 212 // "0123456789abcdef".substring(0, index) + "\u0440" 213 "\u0440", 214 "0\u0440", 215 "01\u0440", 216 "012\u0440", 217 "0123\u0440", 218 "01234\u0440", 219 "012345\u0440", 220 "0123456\u0440", 221 "01234567\u0440", 222 "012345678\u0440", 223 "0123456789\u0440", 224 "0123456789a\u0440", 225 "0123456789ab\u0440", 226 "0123456789abc\u0440", 227 "0123456789abcd\u0440", 228 "0123456789abcde\u0440", 229 // Category 5, non-ASCII strings: 230 // "0123456789abcdef".substring(0, index) + "\u0440" + 231 // "0123456789abcdef".substring(index + 1) 232 "\u0440123456789abcdef", 233 "0\u044023456789abcdef", 234 "01\u04403456789abcdef", 235 "012\u0440456789abcdef", 236 "0123\u044056789abcdef", 237 "01234\u04406789abcdef", 238 "012345\u0440789abcdef", 239 "0123456\u044089abcdef", 240 "01234567\u04409abcdef", 241 "012345678\u0440abcdef", 242 "0123456789\u0440bcdef", 243 "0123456789a\u0440cdef", 244 "0123456789ab\u0440def", 245 "0123456789abc\u0440ef", 246 "0123456789abcd\u0440f", 247 "0123456789abcde\u0440", 248 // Category 6, ASCII strings: 249 // "\u0443" + "0123456789abcdef".substring(1, index + 1) 250 "\u0443", 251 "\u04431", 252 "\u044312", 253 "\u0443123", 254 "\u04431234", 255 "\u044312345", 256 "\u0443123456", 257 "\u04431234567", 258 "\u044312345678", 259 "\u0443123456789", 260 "\u0443123456789a", 261 "\u0443123456789ab", 262 "\u0443123456789abc", 263 "\u0443123456789abcd", 264 "\u0443123456789abcde", 265 "\u0443123456789abcdef", 266 // Category 7, non-ASCII strings: 267 // "0123456789abcdef".substring(0, index) + "\u0482" 268 "\u0482", 269 "0\u0482", 270 "01\u0482", 271 "012\u0482", 272 "0123\u0482", 273 "01234\u0482", 274 "012345\u0482", 275 "0123456\u0482", 276 "01234567\u0482", 277 "012345678\u0482", 278 "0123456789\u0482", 279 "0123456789a\u0482", 280 "0123456789ab\u0482", 281 "0123456789abc\u0482", 282 "0123456789abcd\u0482", 283 "0123456789abcde\u0482", 284 // Category 8, non-ASCII strings: 285 // "0123456789abcdef".substring(0, index) + "\u0482" + 286 // "0123456789abcdef".substring(index + 1) 287 "\u0482123456789abcdef", 288 "0\u048223456789abcdef", 289 "01\u04823456789abcdef", 290 "012\u0482456789abcdef", 291 "0123\u048256789abcdef", 292 "01234\u04826789abcdef", 293 "012345\u0482789abcdef", 294 "0123456\u048289abcdef", 295 "01234567\u04829abcdef", 296 "012345678\u0482abcdef", 297 "0123456789\u0482bcdef", 298 "0123456789a\u0482cdef", 299 "0123456789ab\u0482def", 300 "0123456789abc\u0482ef", 301 "0123456789abcd\u0482f", 302 "0123456789abcde\u0482", 303 // Category 9, ASCII strings: 304 // "\u0489" + "0123456789abcdef".substring(1, index + 1) 305 "\u0489", 306 "\u04891", 307 "\u048912", 308 "\u0489123", 309 "\u04891234", 310 "\u048912345", 311 "\u0489123456", 312 "\u04891234567", 313 "\u048912345678", 314 "\u0489123456789", 315 "\u0489123456789a", 316 "\u0489123456789ab", 317 "\u0489123456789abc", 318 "\u0489123456789abcd", 319 "\u0489123456789abcde", 320 "\u0489123456789abcdef", 321 }; 322 int length = strings.length; 323 Assert.assertEquals(1 + 16 * 10, length); 324 for (int i = 0; i != length; ++i) { 325 String lhs = strings[i]; 326 for (int j = 0; j != length; ++j) { 327 String rhs = strings[j]; 328 int result = $noinline$compareTo(lhs, rhs); 329 final int expected; 330 if (i == 0 || j == 0 || i == j) { 331 // One of the strings is empty or the strings are the same. 332 expected = lhs.length() - rhs.length(); 333 } else { 334 int i_category = (i - 1) / 16; 335 int i_index = (i - 1) % 16; 336 int j_category = (j - 1) / 16; 337 int j_index = (j - 1) % 16; 338 int min_ij_index = (i_index < j_index) ? i_index : j_index; 339 if (i_category == j_category) { 340 switch (i_category) { 341 case 0: case 3: case 6: case 9: 342 // Differs in length. 343 expected = lhs.length() - rhs.length(); 344 break; 345 case 1: case 2: case 4: case 5: case 7: case 8: 346 // Differs in charAt(min_ij_index). 347 expected = lhs.charAt(min_ij_index) - rhs.charAt(min_ij_index); 348 break; 349 default: throw new Error("Unexpected category."); 350 } 351 } else if (i_category == 3 || i_category == 6 || i_category == 9 || 352 j_category == 3 || j_category == 6 || j_category == 9) { 353 // In these categories, charAt(0) differs from other categories' strings. 354 expected = lhs.charAt(0) - rhs.charAt(0); 355 } else if (// Category 0 string is a prefix to any longer string in 356 // remaining categories. 357 (i_category == 0 && i_index < j_index) || 358 (j_category == 0 && j_index < i_index) || 359 // Category 2 string is a prefix to category 3 string at the same 360 // index. Similar for categories 4 and 5 and also 7 and 8. 361 // This includes matching last strings of these pairs of categories. 362 (i_index == j_index && 363 ((i_category == 1 && j_category == 2) || 364 (i_category == 2 && j_category == 1) || 365 (i_category == 4 && j_category == 5) || 366 (i_category == 5 && j_category == 4) || 367 (i_category == 7 && j_category == 8) || 368 (i_category == 8 && j_category == 7)))) { 369 // Differs in length. 370 expected = lhs.length() - rhs.length(); 371 } else { 372 // The remaining cases differ in charAt(min_ij_index), the characters 373 // before that are "0123456789abcdef".substring(0, min_ij_index). 374 for (int k = 0; k < min_ij_index; ++k) { 375 Assert.assertEquals("0123456789abcdef".charAt(k), lhs.charAt(k)); 376 Assert.assertEquals("0123456789abcdef".charAt(k), rhs.charAt(k)); 377 } 378 expected = lhs.charAt(min_ij_index) - rhs.charAt(min_ij_index); 379 Assert.assertFalse(expected == 0); 380 } 381 } 382 if (expected != result) { 383 throw new Error( 384 "Mismatch at i=" + i + ", j=" + j + ", expected=" + expected + 385 ", result=" + result); 386 } 387 boolean equalsExpected = 388 (i == j) || 389 // Last string in categories 1 and 2. 390 (i == 32 && j == 48) || (i == 48 && j == 32) || 391 // Last string in categories 4 and 5. 392 (i == 80 && j == 96) || (i == 96 && j == 80) || 393 // Last string in categories 7 and 8. 394 (i == 128 && j == 144) || (i == 144 && j == 128); 395 Assert.assertEquals(equalsExpected, $noinline$equals(lhs, rhs)); 396 } 397 } 398 399 try { 400 $noinline$compareTo("", null); 401 Assert.fail(); 402 } catch (NullPointerException expected) { 403 } 404 try { 405 $noinline$compareTo(null, ""); 406 Assert.fail(); 407 } catch (NullPointerException expected) { 408 } 409 410 Assert.assertFalse($noinline$equals("", null)); 411 try { 412 $noinline$equals(null, ""); 413 Assert.fail(); 414 } catch (NullPointerException expected) { 415 } 416 } 417 testIndexOf()418 public static void testIndexOf() { 419 String[] prefixes = { 420 "", 421 "0", 422 "01", 423 "012", 424 "0123", 425 "01234", 426 "012345", 427 "0123456", 428 "01234567", 429 "012345678", 430 "0123456789", 431 "0123456789a", 432 "0123456789ab", 433 "0123456789abc", 434 "0123456789abcd", 435 "0123456789abcdef", 436 }; 437 String[] cores = { 438 "", 439 "x", 440 "xx", 441 "xxx", 442 "xxxx", 443 "xxxxx", 444 "xxxxxx", 445 "xxxxxxx", 446 "xxxxxxxx", 447 "xzx", 448 "xxzx", 449 "xxxzx", 450 "xxxxzx", 451 "xxxxxzx", 452 "xxxxxxzx", 453 "xxxxxxxzx", 454 "xxxxxxxxzx", 455 "\u0440", 456 "\u0440\u0440", 457 "\u0440\u0440\u0440", 458 "\u0440\u0440\u0440\u0440", 459 "\u0440\u0440\u0440\u0440\u0440", 460 "\u0440\u0440\u0440\u0440\u0440\u0440", 461 "\u0440\u0440\u0440\u0440\u0440\u0440\u0440", 462 "\u0440\u0440\u0440\u0440\u0440\u0440\u0440\u0440", 463 "\u0440z\u0440", 464 "\u0440\u0440z\u0440", 465 "\u0440\u0440\u0440z\u0440", 466 "\u0440\u0440\u0440\u0440z\u0440", 467 "\u0440\u0440\u0440\u0440\u0440z\u0440", 468 "\u0440\u0440\u0440\u0440\u0440\u0440z\u0440", 469 "\u0440\u0440\u0440\u0440\u0440\u0440\u0440z\u0440", 470 "\u0440\u0440\u0440\u0440\u0440\u0440\u0440\u0440z\u0440", 471 "\u0000", 472 "\u0000\u0000", 473 "\u0000\u0000\u0000", 474 "\u0000\u0000\u0000\u0000", 475 "\u0000\u0000\u0000\u0000\u0000", 476 "\u0000\u0000\u0000\u0000\u0000\u0000", 477 "\u0000\u0000\u0000\u0000\u0000\u0000\u0000", 478 "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", 479 "\u0000z\u0000", 480 "\u0000\u0000z\u0000", 481 "\u0000\u0000\u0000z\u0000", 482 "\u0000\u0000\u0000\u0000z\u0000", 483 "\u0000\u0000\u0000\u0000\u0000z\u0000", 484 "\u0000\u0000\u0000\u0000\u0000\u0000z\u0000", 485 "\u0000\u0000\u0000\u0000\u0000\u0000\u0000z\u0000", 486 "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000z\u0000", 487 }; 488 String[] suffixes = { 489 "", 490 "y", 491 "yy", 492 "yyy", 493 "yyyy", 494 "yyyyy", 495 "yyyyyy", 496 "yyyyyyy", 497 "yyyyyyyy", 498 "\u0441", 499 "y\u0441", 500 "yy\u0441", 501 "yyy\u0441", 502 "yyyy\u0441", 503 "yyyyy\u0441", 504 "yyyyyy\u0441", 505 "yyyyyyy\u0441", 506 "yyyyyyyy\u0441", 507 }; 508 for (String p : prefixes) { 509 for (String c : cores) { 510 for (String s : suffixes) { 511 String full = p + c + s; 512 int expX = (c.isEmpty() || c.charAt(0) != 'x') ? -1 : p.length(); 513 int exp0440 = (c.isEmpty() || c.charAt(0) != '\u0440') ? -1 : p.length(); 514 int exp0000 = (c.isEmpty() || c.charAt(0) != '\u0000') ? -1 : p.length(); 515 Assert.assertEquals(expX, $noinline$indexOf(full, 'x')); 516 Assert.assertEquals(exp0440, $noinline$indexOf(full, '\u0440')); 517 Assert.assertEquals(exp0000, $noinline$indexOf(full, '\u0000')); 518 Assert.assertEquals(expX, $noinline$indexOf(full, 'x', -1)); 519 Assert.assertEquals(exp0440, $noinline$indexOf(full, '\u0440', -1)); 520 Assert.assertEquals(exp0000, $noinline$indexOf(full, '\u0000', -1)); 521 Assert.assertEquals(-1, $noinline$indexOf(full, 'x', full.length() + 1)); 522 Assert.assertEquals(-1, $noinline$indexOf(full, '\u0440', full.length() + 1)); 523 Assert.assertEquals(-1, $noinline$indexOf(full, '\u0000', full.length() + 1)); 524 for (int from = 0; from != full.length(); ++from) { 525 final int eX; 526 final int e0440; 527 final int e0000; 528 if (from <= p.length()) { 529 eX = expX; 530 e0440 = exp0440; 531 e0000 = exp0000; 532 } else if (from >= p.length() + c.length()) { 533 eX = -1; 534 e0440 = -1; 535 e0000 = -1; 536 } else if (full.charAt(from) == 'z') { 537 eX = (full.charAt(from + 1) != 'x') ? -1 : from + 1; 538 e0440 = (full.charAt(from + 1) != '\u0440') ? -1 : from + 1; 539 e0000 = (full.charAt(from + 1) != '\u0000') ? -1 : from + 1; 540 } else { 541 eX = (full.charAt(from) != 'x') ? -1 : from; 542 e0440 = (full.charAt(from) != '\u0440') ? -1 : from; 543 e0000 = (full.charAt(from) != '\u0000') ? -1 : from; 544 } 545 Assert.assertEquals(eX, $noinline$indexOf(full, 'x', from)); 546 Assert.assertEquals(e0440, $noinline$indexOf(full, '\u0440', from)); 547 Assert.assertEquals(e0000, $noinline$indexOf(full, '\u0000', from)); 548 } 549 } 550 } 551 } 552 } 553 testEqualsConstString()554 public static void testEqualsConstString() { 555 Assert.assertTrue($noinline$equalsConstString0("")); 556 Assert.assertFalse($noinline$equalsConstString0("1")); 557 558 Assert.assertTrue($noinline$equalsConstString3("012")); 559 Assert.assertFalse($noinline$equalsConstString3("01")); 560 Assert.assertFalse($noinline$equalsConstString3("0123")); 561 Assert.assertFalse($noinline$equalsConstString3("01x")); 562 Assert.assertFalse($noinline$equalsConstString3("01\u0440")); 563 564 Assert.assertTrue($noinline$equalsConstString7("0123456")); 565 Assert.assertFalse($noinline$equalsConstString7("012345")); 566 Assert.assertFalse($noinline$equalsConstString7("01234567")); 567 Assert.assertFalse($noinline$equalsConstString7("012345x")); 568 Assert.assertFalse($noinline$equalsConstString7("012345\u0440")); 569 570 Assert.assertTrue($noinline$equalsConstString12("012345678901")); 571 Assert.assertFalse($noinline$equalsConstString12("01234567890")); 572 Assert.assertFalse($noinline$equalsConstString12("0123456789012")); 573 Assert.assertFalse($noinline$equalsConstString12("01234567890x")); 574 Assert.assertFalse($noinline$equalsConstString12("01234567890\u0440")); 575 576 Assert.assertTrue($noinline$equalsConstString14("01234567890123")); 577 Assert.assertFalse($noinline$equalsConstString14("0123456789012")); 578 Assert.assertFalse($noinline$equalsConstString14("012345678901234")); 579 Assert.assertFalse($noinline$equalsConstString14("0123456789012x")); 580 Assert.assertFalse($noinline$equalsConstString14("0123456789012\u0440")); 581 582 Assert.assertTrue($noinline$equalsConstString24("012345678901234567890123")); 583 Assert.assertFalse($noinline$equalsConstString24("01234567890123456789012")); 584 Assert.assertFalse($noinline$equalsConstString24("0123456789012345678901234")); 585 Assert.assertFalse($noinline$equalsConstString24("01234567890123456789012x")); 586 Assert.assertFalse($noinline$equalsConstString24("01234567890123456789012\u0440")); 587 588 Assert.assertTrue($noinline$equalsConstString29("01234567890123456789012345678")); 589 Assert.assertFalse($noinline$equalsConstString29("0123456789012345678901234567")); 590 Assert.assertFalse($noinline$equalsConstString29("012345678901234567890123456789")); 591 Assert.assertFalse($noinline$equalsConstString29("0123456789012345678901234567x")); 592 Assert.assertFalse($noinline$equalsConstString29("0123456789012345678901234567\u0440")); 593 594 Assert.assertTrue($noinline$equalsConstString35("01234567890123456789012345678901234")); 595 Assert.assertFalse($noinline$equalsConstString35("0123456789012345678901234567890123")); 596 Assert.assertFalse($noinline$equalsConstString35("012345678901234567890123456789012345")); 597 Assert.assertFalse($noinline$equalsConstString35("0123456789012345678901234567890123x")); 598 Assert.assertFalse( 599 $noinline$equalsConstString35("0123456789012345678901234567890123\u0440")); 600 601 Assert.assertTrue($noinline$equalsConstNonAsciiString3("\u044012")); 602 Assert.assertFalse($noinline$equalsConstNonAsciiString3("\u04401")); 603 Assert.assertFalse($noinline$equalsConstNonAsciiString3("\u0440123")); 604 Assert.assertFalse($noinline$equalsConstNonAsciiString3("\u04401x")); 605 Assert.assertFalse($noinline$equalsConstNonAsciiString3("012")); 606 607 Assert.assertTrue($noinline$equalsConstNonAsciiString7("\u0440123456")); 608 Assert.assertFalse($noinline$equalsConstNonAsciiString7("\u044012345")); 609 Assert.assertFalse($noinline$equalsConstNonAsciiString7("\u04401234567")); 610 Assert.assertFalse($noinline$equalsConstNonAsciiString7("\u044012345x")); 611 Assert.assertFalse($noinline$equalsConstNonAsciiString7("0123456")); 612 613 Assert.assertTrue($noinline$equalsConstNonAsciiString12("\u044012345678901")); 614 Assert.assertFalse($noinline$equalsConstNonAsciiString12("\u04401234567890")); 615 Assert.assertFalse($noinline$equalsConstNonAsciiString12("\u0440123456789012")); 616 Assert.assertFalse($noinline$equalsConstNonAsciiString12("\u04401234567890x")); 617 Assert.assertFalse($noinline$equalsConstNonAsciiString12("012345678901")); 618 619 Assert.assertTrue($noinline$equalsConstNonAsciiString14("\u04401234567890123")); 620 Assert.assertFalse($noinline$equalsConstNonAsciiString14("\u0440123456789012")); 621 Assert.assertFalse($noinline$equalsConstNonAsciiString14("\u044012345678901234")); 622 Assert.assertFalse($noinline$equalsConstNonAsciiString14("\u0440123456789012x")); 623 Assert.assertFalse($noinline$equalsConstNonAsciiString14("01234567890123")); 624 625 Assert.assertTrue($noinline$equalsConstNonAsciiString24("\u044012345678901234567890123")); 626 Assert.assertFalse($noinline$equalsConstNonAsciiString24("\u04401234567890123456789012")); 627 Assert.assertFalse($noinline$equalsConstNonAsciiString24("\u0440123456789012345678901234")); 628 Assert.assertFalse($noinline$equalsConstNonAsciiString24("\u04401234567890123456789012x")); 629 Assert.assertFalse($noinline$equalsConstNonAsciiString24("\012345678901234567890123")); 630 631 Assert.assertTrue( 632 $noinline$equalsConstNonAsciiString29("\u04401234567890123456789012345678")); 633 Assert.assertFalse( 634 $noinline$equalsConstNonAsciiString29("\u0440123456789012345678901234567")); 635 Assert.assertFalse( 636 $noinline$equalsConstNonAsciiString29("\u044012345678901234567890123456789")); 637 Assert.assertFalse( 638 $noinline$equalsConstNonAsciiString29("\u0440123456789012345678901234567x")); 639 Assert.assertFalse($noinline$equalsConstNonAsciiString29("01234567890123456789012345678")); 640 641 Assert.assertTrue( 642 $noinline$equalsConstNonAsciiString35("\u04401234567890123456789012345678901234")); 643 Assert.assertFalse( 644 $noinline$equalsConstNonAsciiString35("\u0440123456789012345678901234567890123")); 645 Assert.assertFalse( 646 $noinline$equalsConstNonAsciiString35("\u044012345678901234567890123456789012345")); 647 Assert.assertFalse( 648 $noinline$equalsConstNonAsciiString35("\u0440123456789012345678901234567890123x")); 649 Assert.assertFalse( 650 $noinline$equalsConstNonAsciiString35("01234567890123456789012345678901234")); 651 } 652 testConstStringEquals()653 public static void testConstStringEquals() { 654 Assert.assertTrue($noinline$constString0Equals("")); 655 Assert.assertFalse($noinline$constString0Equals("1")); 656 657 Assert.assertTrue($noinline$constString3Equals("012")); 658 Assert.assertFalse($noinline$constString3Equals("01")); 659 Assert.assertFalse($noinline$constString3Equals("0123")); 660 Assert.assertFalse($noinline$constString3Equals("01x")); 661 Assert.assertFalse($noinline$constString3Equals("01\u0440")); 662 663 Assert.assertTrue($noinline$constString7Equals("0123456")); 664 Assert.assertFalse($noinline$constString7Equals("012345")); 665 Assert.assertFalse($noinline$constString7Equals("01234567")); 666 Assert.assertFalse($noinline$constString7Equals("012345x")); 667 Assert.assertFalse($noinline$constString7Equals("012345\u0440")); 668 669 Assert.assertTrue($noinline$constString12Equals("012345678901")); 670 Assert.assertFalse($noinline$constString12Equals("01234567890")); 671 Assert.assertFalse($noinline$constString12Equals("0123456789012")); 672 Assert.assertFalse($noinline$constString12Equals("01234567890x")); 673 Assert.assertFalse($noinline$constString12Equals("01234567890\u0440")); 674 675 Assert.assertTrue($noinline$constString14Equals("01234567890123")); 676 Assert.assertFalse($noinline$constString14Equals("0123456789012")); 677 Assert.assertFalse($noinline$constString14Equals("012345678901234")); 678 Assert.assertFalse($noinline$constString14Equals("0123456789012x")); 679 Assert.assertFalse($noinline$constString14Equals("0123456789012\u0440")); 680 681 Assert.assertTrue($noinline$constString24Equals("012345678901234567890123")); 682 Assert.assertFalse($noinline$constString24Equals("01234567890123456789012")); 683 Assert.assertFalse($noinline$constString24Equals("0123456789012345678901234")); 684 Assert.assertFalse($noinline$constString24Equals("01234567890123456789012x")); 685 Assert.assertFalse($noinline$constString24Equals("01234567890123456789012\u0440")); 686 687 Assert.assertTrue($noinline$constString29Equals("01234567890123456789012345678")); 688 Assert.assertFalse($noinline$constString29Equals("0123456789012345678901234567")); 689 Assert.assertFalse($noinline$constString29Equals("012345678901234567890123456789")); 690 Assert.assertFalse($noinline$constString29Equals("0123456789012345678901234567x")); 691 Assert.assertFalse($noinline$constString29Equals("0123456789012345678901234567\u0440")); 692 693 Assert.assertTrue($noinline$constString35Equals("01234567890123456789012345678901234")); 694 Assert.assertFalse($noinline$constString35Equals("0123456789012345678901234567890123")); 695 Assert.assertFalse($noinline$constString35Equals("012345678901234567890123456789012345")); 696 Assert.assertFalse($noinline$constString35Equals("0123456789012345678901234567890123x")); 697 Assert.assertFalse( 698 $noinline$constString35Equals("0123456789012345678901234567890123\u0040")); 699 700 Assert.assertTrue($noinline$constNonAsciiString3Equals("\u044012")); 701 Assert.assertFalse($noinline$constNonAsciiString3Equals("\u04401")); 702 Assert.assertFalse($noinline$constNonAsciiString3Equals("\u0440123")); 703 Assert.assertFalse($noinline$constNonAsciiString3Equals("\u04401x")); 704 Assert.assertFalse($noinline$constNonAsciiString3Equals("0123456")); 705 706 Assert.assertTrue($noinline$constNonAsciiString7Equals("\u0440123456")); 707 Assert.assertFalse($noinline$constNonAsciiString7Equals("\u044012345")); 708 Assert.assertFalse($noinline$constNonAsciiString7Equals("\u04401234567")); 709 Assert.assertFalse($noinline$constNonAsciiString7Equals("\u044012345x")); 710 Assert.assertFalse($noinline$constNonAsciiString7Equals("0123456")); 711 712 Assert.assertTrue($noinline$constNonAsciiString12Equals("\u044012345678901")); 713 Assert.assertFalse($noinline$constNonAsciiString12Equals("\u04401234567890")); 714 Assert.assertFalse($noinline$constNonAsciiString12Equals("\u0440123456789012")); 715 Assert.assertFalse($noinline$constNonAsciiString12Equals("\u04401234567890x")); 716 Assert.assertFalse($noinline$constNonAsciiString12Equals("012345678901")); 717 718 Assert.assertTrue($noinline$constNonAsciiString14Equals("\u04401234567890123")); 719 Assert.assertFalse($noinline$constNonAsciiString14Equals("\u0440123456789012")); 720 Assert.assertFalse($noinline$constNonAsciiString14Equals("\u044012345678901234")); 721 Assert.assertFalse($noinline$constNonAsciiString14Equals("\u0440123456789012x")); 722 Assert.assertFalse($noinline$constNonAsciiString14Equals("01234567890123")); 723 724 Assert.assertTrue($noinline$constNonAsciiString24Equals("\u044012345678901234567890123")); 725 Assert.assertFalse($noinline$constNonAsciiString24Equals("\u04401234567890123456789012")); 726 Assert.assertFalse($noinline$constNonAsciiString24Equals("\u0440123456789012345678901234")); 727 Assert.assertFalse($noinline$constNonAsciiString24Equals("\u04401234567890123456789012x")); 728 Assert.assertFalse($noinline$constNonAsciiString24Equals("\012345678901234567890123")); 729 730 Assert.assertTrue( 731 $noinline$constNonAsciiString29Equals("\u04401234567890123456789012345678")); 732 Assert.assertFalse( 733 $noinline$constNonAsciiString29Equals("\u0440123456789012345678901234567")); 734 Assert.assertFalse( 735 $noinline$constNonAsciiString29Equals("\u044012345678901234567890123456789")); 736 Assert.assertFalse( 737 $noinline$constNonAsciiString29Equals("\u0440123456789012345678901234567x")); 738 Assert.assertFalse($noinline$constNonAsciiString29Equals("01234567890123456789012345678")); 739 740 Assert.assertTrue( 741 $noinline$constNonAsciiString35Equals("\u04401234567890123456789012345678901234")); 742 Assert.assertFalse( 743 $noinline$constNonAsciiString35Equals("\u0440123456789012345678901234567890123")); 744 Assert.assertFalse( 745 $noinline$constNonAsciiString35Equals("\u044012345678901234567890123456789012345")); 746 Assert.assertFalse( 747 $noinline$constNonAsciiString35Equals("\u0440123456789012345678901234567890123x")); 748 Assert.assertFalse( 749 $noinline$constNonAsciiString35Equals("01234567890123456789012345678901234")); 750 751 // Regression test for incorrectly creating an uncompressed string when the 752 // string should be compressed. Only the low 8 bits are relevant but the whole 753 // `hibyte` was erroneously tested. Bug: 63661357 754 Assert.assertTrue("A".equals(new String(new byte[] { (byte)'A' }, /* hibyte */ 0x100))); 755 } 756 testStringConcat()757 public static void testStringConcat() { 758 Assert.assertEquals("abcxyzw", "abc".concat("xyzw")); 759 Assert.assertEquals("abc\u0440", "abc".concat("\u0440")); 760 Assert.assertEquals("\u0440xyzw", "\u0440".concat("xyzw")); 761 Assert.assertEquals("abc\u0440xyzw\u0440", "abc\u0440".concat("xyzw\u0440")); 762 } 763 testEmptyWithHighByte()764 public static void testEmptyWithHighByte() { 765 String empty = new String(new byte[0], 1); 766 Assert.assertEquals("", empty); 767 } 768 $noinline$equalsConstString0(String s)769 public static boolean $noinline$equalsConstString0(String s) { 770 return s.equals(""); 771 } 772 $noinline$equalsConstString3(String s)773 public static boolean $noinline$equalsConstString3(String s) { 774 return s.equals("012"); 775 } 776 $noinline$equalsConstString7(String s)777 public static boolean $noinline$equalsConstString7(String s) { 778 return s.equals("0123456"); 779 } 780 $noinline$equalsConstString12(String s)781 public static boolean $noinline$equalsConstString12(String s) { 782 return s.equals("012345678901"); 783 } 784 $noinline$equalsConstString14(String s)785 public static boolean $noinline$equalsConstString14(String s) { 786 return s.equals("01234567890123"); 787 } 788 $noinline$equalsConstString24(String s)789 public static boolean $noinline$equalsConstString24(String s) { 790 return s.equals("012345678901234567890123"); 791 } 792 $noinline$equalsConstString29(String s)793 public static boolean $noinline$equalsConstString29(String s) { 794 return s.equals("01234567890123456789012345678"); 795 } 796 $noinline$equalsConstString35(String s)797 public static boolean $noinline$equalsConstString35(String s) { 798 return s.equals("01234567890123456789012345678901234"); 799 } 800 $noinline$equalsConstNonAsciiString3(String s)801 public static boolean $noinline$equalsConstNonAsciiString3(String s) { 802 return s.equals("\u044012"); 803 } 804 $noinline$equalsConstNonAsciiString7(String s)805 public static boolean $noinline$equalsConstNonAsciiString7(String s) { 806 return s.equals("\u0440123456"); 807 } 808 $noinline$equalsConstNonAsciiString12(String s)809 public static boolean $noinline$equalsConstNonAsciiString12(String s) { 810 return s.equals("\u044012345678901"); 811 } 812 $noinline$equalsConstNonAsciiString14(String s)813 public static boolean $noinline$equalsConstNonAsciiString14(String s) { 814 return s.equals("\u04401234567890123"); 815 } 816 $noinline$equalsConstNonAsciiString24(String s)817 public static boolean $noinline$equalsConstNonAsciiString24(String s) { 818 return s.equals("\u044012345678901234567890123"); 819 } 820 $noinline$equalsConstNonAsciiString29(String s)821 public static boolean $noinline$equalsConstNonAsciiString29(String s) { 822 return s.equals("\u04401234567890123456789012345678"); 823 } 824 $noinline$equalsConstNonAsciiString35(String s)825 public static boolean $noinline$equalsConstNonAsciiString35(String s) { 826 return s.equals("\u04401234567890123456789012345678901234"); 827 } 828 $noinline$constString0Equals(String s)829 public static boolean $noinline$constString0Equals(String s) { 830 return s.equals(""); 831 } 832 $noinline$constString3Equals(String s)833 public static boolean $noinline$constString3Equals(String s) { 834 return "012".equals(s); 835 } 836 $noinline$constString7Equals(String s)837 public static boolean $noinline$constString7Equals(String s) { 838 return "0123456".equals(s); 839 } 840 $noinline$constString12Equals(String s)841 public static boolean $noinline$constString12Equals(String s) { 842 return "012345678901".equals(s); 843 } 844 $noinline$constString14Equals(String s)845 public static boolean $noinline$constString14Equals(String s) { 846 return "01234567890123".equals(s); 847 } 848 $noinline$constString24Equals(String s)849 public static boolean $noinline$constString24Equals(String s) { 850 return "012345678901234567890123".equals(s); 851 } 852 $noinline$constString29Equals(String s)853 public static boolean $noinline$constString29Equals(String s) { 854 return "01234567890123456789012345678".equals(s); 855 } 856 $noinline$constString35Equals(String s)857 public static boolean $noinline$constString35Equals(String s) { 858 return "01234567890123456789012345678901234".equals(s); 859 } 860 $noinline$constNonAsciiString3Equals(String s)861 public static boolean $noinline$constNonAsciiString3Equals(String s) { 862 return "\u044012".equals(s); 863 } 864 $noinline$constNonAsciiString7Equals(String s)865 public static boolean $noinline$constNonAsciiString7Equals(String s) { 866 return "\u0440123456".equals(s); 867 } 868 $noinline$constNonAsciiString12Equals(String s)869 public static boolean $noinline$constNonAsciiString12Equals(String s) { 870 return "\u044012345678901".equals(s); 871 } 872 $noinline$constNonAsciiString14Equals(String s)873 public static boolean $noinline$constNonAsciiString14Equals(String s) { 874 return "\u04401234567890123".equals(s); 875 } 876 $noinline$constNonAsciiString24Equals(String s)877 public static boolean $noinline$constNonAsciiString24Equals(String s) { 878 return "\u044012345678901234567890123".equals(s); 879 } 880 $noinline$constNonAsciiString29Equals(String s)881 public static boolean $noinline$constNonAsciiString29Equals(String s) { 882 return "\u04401234567890123456789012345678".equals(s); 883 } 884 $noinline$constNonAsciiString35Equals(String s)885 public static boolean $noinline$constNonAsciiString35Equals(String s) { 886 return "\u04401234567890123456789012345678901234".equals(s); 887 } 888 $noinline$compareTo(String lhs, String rhs)889 public static int $noinline$compareTo(String lhs, String rhs) { 890 return lhs.compareTo(rhs); 891 } 892 $noinline$equals(String lhs, String rhs)893 public static boolean $noinline$equals(String lhs, String rhs) { 894 return lhs.equals(rhs); 895 } 896 $noinline$indexOf(String lhs, int ch)897 public static int $noinline$indexOf(String lhs, int ch) { 898 return lhs.indexOf(ch); 899 } 900 $noinline$indexOf(String lhs, int ch, int fromIndex)901 public static int $noinline$indexOf(String lhs, int ch, int fromIndex) { 902 return lhs.indexOf(ch, fromIndex); 903 } 904 } 905