Home | History | Annotate | Download | only in lang
      1 /*
      2  * Licensed to the Apache Software Foundation (ASF) under one or more
      3  * contributor license agreements.  See the NOTICE file distributed with
      4  * this work for additional information regarding copyright ownership.
      5  * The ASF licenses this file to You under the Apache License, Version 2.0
      6  * (the "License"); you may not use this file except in compliance with
      7  * the License.  You may obtain a copy of the License at
      8  *
      9  * http://www.apache.org/licenses/LICENSE-2.0
     10  *
     11  * Unless required by applicable law or agreed to in writing, software
     12  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
     13  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
     14  * License for the specific language governing permissions and limitations under
     15  * the License.
     16  */
     17 
     18 package org.apache.harmony.luni.tests.java.lang;
     19 
     20 import java.io.Serializable;
     21 import java.util.Arrays;
     22 
     23 import junit.framework.TestCase;
     24 
     25 import org.apache.harmony.testframework.serialization.SerializationTest;
     26 import org.apache.harmony.testframework.serialization.SerializationTest.SerializableAssert;
     27 
     28 public class StringBuilderTest extends TestCase {
     29 
     30 	/**
     31 	 * @tests java.lang.StringBuilder.StringBuilder()
     32 	 */
     33 	public void test_Constructor() {
     34 		StringBuilder sb = new StringBuilder();
     35 		assertNotNull(sb);
     36 		assertEquals(16, sb.capacity());
     37 	}
     38 
     39 	/**
     40 	 * @tests java.lang.StringBuilder.StringBuilder(int)
     41 	 */
     42 	public void test_ConstructorI() {
     43 		StringBuilder sb = new StringBuilder(24);
     44 		assertNotNull(sb);
     45 		assertEquals(24, sb.capacity());
     46 
     47 		try {
     48 			new StringBuilder(-1);
     49 			fail("no exception");
     50 		} catch (NegativeArraySizeException e) {
     51 			// Expected
     52 		}
     53 
     54 		assertNotNull(new StringBuilder(0));
     55 	}
     56 
     57 	/**
     58 	 * @tests java.lang.StringBuilder.StringBuilder(CharSequence)
     59 	 */
     60 	@SuppressWarnings("cast")
     61     public void test_ConstructorLjava_lang_CharSequence() {
     62 		StringBuilder sb = new StringBuilder((CharSequence) "fixture");
     63 		assertEquals("fixture", sb.toString());
     64 		assertEquals("fixture".length() + 16, sb.capacity());
     65 
     66 		sb = new StringBuilder((CharSequence) new StringBuffer("fixture"));
     67 		assertEquals("fixture", sb.toString());
     68 		assertEquals("fixture".length() + 16, sb.capacity());
     69 
     70 		try {
     71 			new StringBuilder((CharSequence) null);
     72 			fail("no NPE");
     73 		} catch (NullPointerException e) {
     74 			// Expected
     75 		}
     76 	}
     77 
     78 	/**
     79 	 * @tests java.lang.StringBuilder.StringBuilder(String)
     80 	 */
     81 	public void test_ConstructorLjava_lang_String() {
     82 		StringBuilder sb = new StringBuilder("fixture");
     83 		assertEquals("fixture", sb.toString());
     84 		assertEquals("fixture".length() + 16, sb.capacity());
     85 
     86 		try {
     87 			new StringBuilder((String) null);
     88 			fail("no NPE");
     89 		} catch (NullPointerException e) {
     90 		}
     91 	}
     92 
     93 	/**
     94 	 * @tests java.lang.StringBuilder.append(boolean)
     95 	 */
     96 	public void test_appendZ() {
     97 		StringBuilder sb = new StringBuilder();
     98 		assertSame(sb, sb.append(true));
     99 		assertEquals("true", sb.toString());
    100 		sb.setLength(0);
    101 		assertSame(sb, sb.append(false));
    102 		assertEquals("false", sb.toString());
    103 	}
    104 
    105 	/**
    106 	 * @tests java.lang.StringBuilder.append(char)
    107 	 */
    108 	public void test_appendC() {
    109 		StringBuilder sb = new StringBuilder();
    110 		assertSame(sb, sb.append('a'));
    111 		assertEquals("a", sb.toString());
    112 		sb.setLength(0);
    113 		assertSame(sb, sb.append('b'));
    114 		assertEquals("b", sb.toString());
    115 	}
    116 
    117 	/**
    118 	 * @tests java.lang.StringBuilder.append(char[])
    119 	 */
    120 	public void test_append$C() {
    121 		StringBuilder sb = new StringBuilder();
    122 		assertSame(sb, sb.append(new char[] { 'a', 'b' }));
    123 		assertEquals("ab", sb.toString());
    124 		sb.setLength(0);
    125 		assertSame(sb, sb.append(new char[] { 'c', 'd' }));
    126 		assertEquals("cd", sb.toString());
    127 		try {
    128 			sb.append((char[]) null);
    129 			fail("no NPE");
    130 		} catch (NullPointerException e) {
    131 			// Expected
    132 		}
    133 	}
    134 
    135 	/**
    136 	 * @tests java.lang.StringBuilder.append(char[], int, int)
    137 	 */
    138 	public void test_append$CII() {
    139 		StringBuilder sb = new StringBuilder();
    140 		assertSame(sb, sb.append(new char[] { 'a', 'b' }, 0, 2));
    141 		assertEquals("ab", sb.toString());
    142 		sb.setLength(0);
    143 		assertSame(sb, sb.append(new char[] { 'c', 'd' }, 0, 2));
    144 		assertEquals("cd", sb.toString());
    145 
    146 		sb.setLength(0);
    147 		assertSame(sb, sb.append(new char[] { 'a', 'b', 'c', 'd' }, 0, 2));
    148 		assertEquals("ab", sb.toString());
    149 
    150 		sb.setLength(0);
    151 		assertSame(sb, sb.append(new char[] { 'a', 'b', 'c', 'd' }, 2, 2));
    152 		assertEquals("cd", sb.toString());
    153 
    154 		sb.setLength(0);
    155 		assertSame(sb, sb.append(new char[] { 'a', 'b', 'c', 'd' }, 2, 0));
    156 		assertEquals("", sb.toString());
    157 
    158 		try {
    159 			sb.append((char[]) null, 0, 2);
    160 			fail("no NPE");
    161 		} catch (NullPointerException e) {
    162 			// Expected
    163 		}
    164 
    165 		try {
    166 			sb.append(new char[] { 'a', 'b', 'c', 'd' }, -1, 2);
    167 			fail("no IOOBE, negative offset");
    168 		} catch (IndexOutOfBoundsException e) {
    169 			// Expected
    170 		}
    171 
    172 		try {
    173 			sb.append(new char[] { 'a', 'b', 'c', 'd' }, 0, -1);
    174 			fail("no IOOBE, negative length");
    175 		} catch (IndexOutOfBoundsException e) {
    176 			// Expected
    177 		}
    178 
    179 		try {
    180 			sb.append(new char[] { 'a', 'b', 'c', 'd' }, 2, 3);
    181 			fail("no IOOBE, offset and length overflow");
    182 		} catch (IndexOutOfBoundsException e) {
    183 			// Expected
    184 		}
    185 	}
    186 
    187 	/**
    188 	 * @tests java.lang.StringBuilder.append(CharSequence)
    189 	 */
    190 	public void test_appendLjava_lang_CharSequence() {
    191 		StringBuilder sb = new StringBuilder();
    192 		assertSame(sb, sb.append((CharSequence) "ab"));
    193 		assertEquals("ab", sb.toString());
    194 		sb.setLength(0);
    195 		assertSame(sb, sb.append((CharSequence) "cd"));
    196 		assertEquals("cd", sb.toString());
    197 		sb.setLength(0);
    198 		assertSame(sb, sb.append((CharSequence) null));
    199 		assertEquals("null", sb.toString());
    200 	}
    201 
    202 	/**
    203 	 * @tests java.lang.StringBuilder.append(CharSequence, int, int)
    204 	 */
    205 	@SuppressWarnings("cast")
    206     public void test_appendLjava_lang_CharSequenceII() {
    207 		StringBuilder sb = new StringBuilder();
    208 		assertSame(sb, sb.append((CharSequence) "ab", 0, 2));
    209 		assertEquals("ab", sb.toString());
    210 		sb.setLength(0);
    211 		assertSame(sb, sb.append((CharSequence) "cd", 0, 2));
    212 		assertEquals("cd", sb.toString());
    213 		sb.setLength(0);
    214 		assertSame(sb, sb.append((CharSequence) "abcd", 0, 2));
    215 		assertEquals("ab", sb.toString());
    216 		sb.setLength(0);
    217 		assertSame(sb, sb.append((CharSequence) "abcd", 2, 4));
    218 		assertEquals("cd", sb.toString());
    219 		sb.setLength(0);
    220 		assertSame(sb, sb.append((CharSequence) null, 0, 2));
    221 		assertEquals("nu", sb.toString());
    222 	}
    223 
    224 	/**
    225 	 * @tests java.lang.StringBuilder.append(double)
    226 	 */
    227 	public void test_appendD() {
    228 		StringBuilder sb = new StringBuilder();
    229 		assertSame(sb, sb.append(1D));
    230 		assertEquals(String.valueOf(1D), sb.toString());
    231 		sb.setLength(0);
    232 		assertSame(sb, sb.append(0D));
    233 		assertEquals(String.valueOf(0D), sb.toString());
    234 		sb.setLength(0);
    235 		assertSame(sb, sb.append(-1D));
    236 		assertEquals(String.valueOf(-1D), sb.toString());
    237 		sb.setLength(0);
    238 		assertSame(sb, sb.append(Double.NaN));
    239 		assertEquals(String.valueOf(Double.NaN), sb.toString());
    240 		sb.setLength(0);
    241 		assertSame(sb, sb.append(Double.NEGATIVE_INFINITY));
    242 		assertEquals(String.valueOf(Double.NEGATIVE_INFINITY), sb.toString());
    243 		sb.setLength(0);
    244 		assertSame(sb, sb.append(Double.POSITIVE_INFINITY));
    245 		assertEquals(String.valueOf(Double.POSITIVE_INFINITY), sb.toString());
    246 		sb.setLength(0);
    247 		assertSame(sb, sb.append(Double.MIN_VALUE));
    248 		assertEquals(String.valueOf(Double.MIN_VALUE), sb.toString());
    249 		sb.setLength(0);
    250 		assertSame(sb, sb.append(Double.MAX_VALUE));
    251 		assertEquals(String.valueOf(Double.MAX_VALUE), sb.toString());
    252 	}
    253 
    254 	/**
    255 	 * @tests java.lang.StringBuilder.append(float)
    256 	 */
    257 	public void test_appendF() {
    258 		StringBuilder sb = new StringBuilder();
    259 		assertSame(sb, sb.append(1F));
    260 		assertEquals(String.valueOf(1F), sb.toString());
    261 		sb.setLength(0);
    262 		assertSame(sb, sb.append(0F));
    263 		assertEquals(String.valueOf(0F), sb.toString());
    264 		sb.setLength(0);
    265 		assertSame(sb, sb.append(-1F));
    266 		assertEquals(String.valueOf(-1F), sb.toString());
    267 		sb.setLength(0);
    268 		assertSame(sb, sb.append(Float.NaN));
    269 		assertEquals(String.valueOf(Float.NaN), sb.toString());
    270 		sb.setLength(0);
    271 		assertSame(sb, sb.append(Float.NEGATIVE_INFINITY));
    272 		assertEquals(String.valueOf(Float.NEGATIVE_INFINITY), sb.toString());
    273 		sb.setLength(0);
    274 		assertSame(sb, sb.append(Float.POSITIVE_INFINITY));
    275 		assertEquals(String.valueOf(Float.POSITIVE_INFINITY), sb.toString());
    276 		sb.setLength(0);
    277 		assertSame(sb, sb.append(Float.MIN_VALUE));
    278 		assertEquals(String.valueOf(Float.MIN_VALUE), sb.toString());
    279 		sb.setLength(0);
    280 		assertSame(sb, sb.append(Float.MAX_VALUE));
    281 		assertEquals(String.valueOf(Float.MAX_VALUE), sb.toString());
    282 	}
    283 
    284 	/**
    285 	 * @tests java.lang.StringBuilder.append(int)
    286 	 */
    287 	public void test_appendI() {
    288 		StringBuilder sb = new StringBuilder();
    289 		assertSame(sb, sb.append(1));
    290 		assertEquals(String.valueOf(1), sb.toString());
    291 		sb.setLength(0);
    292 		assertSame(sb, sb.append(0));
    293 		assertEquals(String.valueOf(0), sb.toString());
    294 		sb.setLength(0);
    295 		assertSame(sb, sb.append(-1));
    296 		assertEquals(String.valueOf(-1), sb.toString());
    297 		sb.setLength(0);
    298 		assertSame(sb, sb.append(Integer.MIN_VALUE));
    299 		assertEquals(String.valueOf(Integer.MIN_VALUE), sb.toString());
    300 		sb.setLength(0);
    301 		assertSame(sb, sb.append(Integer.MAX_VALUE));
    302 		assertEquals(String.valueOf(Integer.MAX_VALUE), sb.toString());
    303 	}
    304 
    305 	/**
    306 	 * @tests java.lang.StringBuilder.append(long)
    307 	 */
    308 	public void test_appendL() {
    309 		StringBuilder sb = new StringBuilder();
    310 		assertSame(sb, sb.append(1L));
    311 		assertEquals(String.valueOf(1L), sb.toString());
    312 		sb.setLength(0);
    313 		assertSame(sb, sb.append(0L));
    314 		assertEquals(String.valueOf(0L), sb.toString());
    315 		sb.setLength(0);
    316 		assertSame(sb, sb.append(-1L));
    317 		assertEquals(String.valueOf(-1L), sb.toString());
    318 		sb.setLength(0);
    319 		assertSame(sb, sb.append(Integer.MIN_VALUE));
    320 		assertEquals(String.valueOf(Integer.MIN_VALUE), sb.toString());
    321 		sb.setLength(0);
    322 		assertSame(sb, sb.append(Integer.MAX_VALUE));
    323 		assertEquals(String.valueOf(Integer.MAX_VALUE), sb.toString());
    324 	}
    325 
    326 	/**
    327 	 * @tests java.lang.StringBuilder.append(Object)'
    328 	 */
    329 	public void test_appendLjava_lang_Object() {
    330 		StringBuilder sb = new StringBuilder();
    331 		assertSame(sb, sb.append(Fixture.INSTANCE));
    332 		assertEquals(Fixture.INSTANCE.toString(), sb.toString());
    333 
    334 		sb.setLength(0);
    335 		assertSame(sb, sb.append((Object) null));
    336 		assertEquals("null", sb.toString());
    337 	}
    338 
    339 	/**
    340 	 * @tests java.lang.StringBuilder.append(String)
    341 	 */
    342 	public void test_appendLjava_lang_String() {
    343 		StringBuilder sb = new StringBuilder();
    344 		assertSame(sb, sb.append("ab"));
    345 		assertEquals("ab", sb.toString());
    346 		sb.setLength(0);
    347 		assertSame(sb, sb.append("cd"));
    348 		assertEquals("cd", sb.toString());
    349 		sb.setLength(0);
    350 		assertSame(sb, sb.append((String) null));
    351 		assertEquals("null", sb.toString());
    352 	}
    353 
    354 	/**
    355 	 * @tests java.lang.StringBuilder.append(StringBuffer)
    356 	 */
    357 	public void test_appendLjava_lang_StringBuffer() {
    358 		StringBuilder sb = new StringBuilder();
    359 		assertSame(sb, sb.append(new StringBuffer("ab")));
    360 		assertEquals("ab", sb.toString());
    361 		sb.setLength(0);
    362 		assertSame(sb, sb.append(new StringBuffer("cd")));
    363 		assertEquals("cd", sb.toString());
    364 		sb.setLength(0);
    365 		assertSame(sb, sb.append((StringBuffer) null));
    366 		assertEquals("null", sb.toString());
    367 	}
    368 
    369 	/**
    370 	 * @tests java.lang.StringBuilder.appendCodePoint(int)'
    371 	 */
    372 	public void test_appendCodePointI() {
    373 		StringBuilder sb = new StringBuilder();
    374         sb.appendCodePoint(0x10000);
    375         assertEquals("\uD800\uDC00", sb.toString());
    376         sb.append("fixture");
    377         assertEquals("\uD800\uDC00fixture", sb.toString());
    378         sb.appendCodePoint(0x00010FFFF);
    379         assertEquals("\uD800\uDC00fixture\uDBFF\uDFFF", sb.toString());
    380 	}
    381 
    382 	/**
    383 	 * @tests java.lang.StringBuilder.capacity()'
    384 	 */
    385 	public void test_capacity() {
    386 		StringBuilder sb = new StringBuilder();
    387 		assertEquals(16, sb.capacity());
    388 		sb.append("0123456789ABCDEF0123456789ABCDEF");
    389 		assertTrue(sb.capacity() > 16);
    390 	}
    391 
    392 	/**
    393 	 * @tests java.lang.StringBuilder.charAt(int)'
    394 	 */
    395 	public void test_charAtI() {
    396 		final String fixture = "0123456789";
    397 		StringBuilder sb = new StringBuilder(fixture);
    398 		for (int i = 0; i < fixture.length(); i++) {
    399 			assertEquals((char) ('0' + i), sb.charAt(i));
    400 		}
    401 
    402 		try {
    403 			sb.charAt(-1);
    404 			fail("no IOOBE, negative index");
    405 		} catch (IndexOutOfBoundsException e) {
    406 			// Expected
    407 		}
    408 
    409 		try {
    410 			sb.charAt(fixture.length());
    411 			fail("no IOOBE, equal to length");
    412 		} catch (IndexOutOfBoundsException e) {
    413 		}
    414 
    415 		try {
    416 			sb.charAt(fixture.length() + 1);
    417 			fail("no IOOBE, greater than length");
    418 		} catch (IndexOutOfBoundsException e) {
    419 		}
    420 	}
    421 
    422 	/**
    423 	 * @tests java.lang.StringBuilder.codePointAt(int)
    424 	 */
    425 	public void test_codePointAtI() {
    426         StringBuilder sb = new StringBuilder("abc");
    427         assertEquals('a', sb.codePointAt(0));
    428         assertEquals('b', sb.codePointAt(1));
    429         assertEquals('c', sb.codePointAt(2));
    430 
    431         sb = new StringBuilder("\uD800\uDC00");
    432         assertEquals(0x10000, sb.codePointAt(0));
    433         assertEquals('\uDC00', sb.codePointAt(1));
    434 
    435         sb = new StringBuilder();
    436         sb.append("abc");
    437         try {
    438             sb.codePointAt(-1);
    439             fail("No IOOBE on negative index.");
    440         } catch (IndexOutOfBoundsException e) {
    441 
    442         }
    443 
    444         try {
    445             sb.codePointAt(sb.length());
    446             fail("No IOOBE on index equal to length.");
    447         } catch (IndexOutOfBoundsException e) {
    448 
    449         }
    450 
    451         try {
    452             sb.codePointAt(sb.length() + 1);
    453             fail("No IOOBE on index greater than length.");
    454         } catch (IndexOutOfBoundsException e) {
    455 
    456         }
    457 	}
    458 
    459 	/**
    460 	 * @tests java.lang.StringBuilder.codePointBefore(int)
    461 	 */
    462 	public void test_codePointBeforeI() {
    463         StringBuilder sb = new StringBuilder("abc");
    464         assertEquals('a', sb.codePointBefore(1));
    465         assertEquals('b', sb.codePointBefore(2));
    466         assertEquals('c', sb.codePointBefore(3));
    467 
    468         sb = new StringBuilder("\uD800\uDC00");
    469         assertEquals(0x10000, sb.codePointBefore(2));
    470         assertEquals('\uD800', sb.codePointBefore(1));
    471 
    472         sb = new StringBuilder();
    473         sb.append("abc");
    474 
    475         try {
    476             sb.codePointBefore(0);
    477             fail("No IOOBE on zero index.");
    478         } catch (IndexOutOfBoundsException e) {
    479 
    480         }
    481 
    482         try {
    483             sb.codePointBefore(-1);
    484             fail("No IOOBE on negative index.");
    485         } catch (IndexOutOfBoundsException e) {
    486 
    487         }
    488 
    489         try {
    490             sb.codePointBefore(sb.length() + 1);
    491             fail("No IOOBE on index greater than length.");
    492         } catch (IndexOutOfBoundsException e) {
    493 
    494         }
    495 	}
    496 
    497 	/**
    498 	 * @tests java.lang.StringBuilder.codePointCount(int, int)
    499 	 */
    500 	public void test_codePointCountII() {
    501         assertEquals(1, new StringBuilder("\uD800\uDC00").codePointCount(0, 2));
    502         assertEquals(1, new StringBuilder("\uD800\uDC01").codePointCount(0, 2));
    503         assertEquals(1, new StringBuilder("\uD801\uDC01").codePointCount(0, 2));
    504         assertEquals(1, new StringBuilder("\uDBFF\uDFFF").codePointCount(0, 2));
    505 
    506         assertEquals(3, new StringBuilder("a\uD800\uDC00b").codePointCount(0, 4));
    507         assertEquals(4, new StringBuilder("a\uD800\uDC00b\uD800").codePointCount(0, 5));
    508 
    509         StringBuilder sb = new StringBuilder();
    510         sb.append("abc");
    511         try {
    512             sb.codePointCount(-1, 2);
    513             fail("No IOOBE for negative begin index.");
    514         } catch (IndexOutOfBoundsException e) {
    515 
    516         }
    517 
    518         try {
    519             sb.codePointCount(0, 4);
    520             fail("No IOOBE for end index that's too large.");
    521         } catch (IndexOutOfBoundsException e) {
    522 
    523         }
    524 
    525         try {
    526             sb.codePointCount(3, 2);
    527             fail("No IOOBE for begin index larger than end index.");
    528         } catch (IndexOutOfBoundsException e) {
    529 
    530         }
    531 	}
    532 
    533 	/**
    534 	 * @tests java.lang.StringBuilder.delete(int, int)
    535 	 */
    536 	public void test_deleteII() {
    537 		final String fixture = "0123456789";
    538 		StringBuilder sb = new StringBuilder(fixture);
    539 		assertSame(sb, sb.delete(0, 0));
    540 		assertEquals(fixture, sb.toString());
    541 		assertSame(sb, sb.delete(5, 5));
    542 		assertEquals(fixture, sb.toString());
    543 		assertSame(sb, sb.delete(0, 1));
    544 		assertEquals("123456789", sb.toString());
    545 		assertEquals(9, sb.length());
    546 		assertSame(sb, sb.delete(0, sb.length()));
    547 		assertEquals("", sb.toString());
    548 		assertEquals(0, sb.length());
    549 
    550 		sb = new StringBuilder(fixture);
    551 		assertSame(sb, sb.delete(0, 11));
    552 		assertEquals("", sb.toString());
    553 		assertEquals(0, sb.length());
    554 
    555 		try {
    556 			new StringBuilder(fixture).delete(-1, 2);
    557 			fail("no SIOOBE, negative start");
    558 		} catch (StringIndexOutOfBoundsException e) {
    559 			// Expected
    560 		}
    561 
    562 		try {
    563 			new StringBuilder(fixture).delete(11, 12);
    564 			fail("no SIOOBE, start too far");
    565 		} catch (StringIndexOutOfBoundsException e) {
    566 			// Expected
    567 		}
    568 
    569 		try {
    570 			new StringBuilder(fixture).delete(13, 12);
    571 			fail("no SIOOBE, start larger than end");
    572 		} catch (StringIndexOutOfBoundsException e) {
    573 			// Expected
    574 		}
    575 
    576                 // HARMONY 6212
    577                 sb = new StringBuilder();
    578                 sb.append("abcde");
    579                 String str = sb.toString();
    580                 sb.delete(0, sb.length());
    581                 sb.append("YY");
    582                 assertEquals("abcde", str);
    583                 assertEquals("YY", sb.toString());
    584 	}
    585 
    586 	/**
    587 	 * @tests java.lang.StringBuilder.deleteCharAt(int)
    588 	 */
    589 	public void test_deleteCharAtI() {
    590 		final String fixture = "0123456789";
    591 		StringBuilder sb = new StringBuilder(fixture);
    592 		assertSame(sb, sb.deleteCharAt(0));
    593 		assertEquals("123456789", sb.toString());
    594 		assertEquals(9, sb.length());
    595 		sb = new StringBuilder(fixture);
    596 		assertSame(sb, sb.deleteCharAt(5));
    597 		assertEquals("012346789", sb.toString());
    598 		assertEquals(9, sb.length());
    599 		sb = new StringBuilder(fixture);
    600 		assertSame(sb, sb.deleteCharAt(9));
    601 		assertEquals("012345678", sb.toString());
    602 		assertEquals(9, sb.length());
    603 
    604 		try {
    605 			new StringBuilder(fixture).deleteCharAt(-1);
    606 			fail("no SIOOBE, negative index");
    607 		} catch (StringIndexOutOfBoundsException e) {
    608 			// Expected
    609 		}
    610 
    611 		try {
    612 			new StringBuilder(fixture).deleteCharAt(fixture.length());
    613 			fail("no SIOOBE, index equals length");
    614 		} catch (StringIndexOutOfBoundsException e) {
    615 			// Expected
    616 		}
    617 
    618 		try {
    619 			new StringBuilder(fixture).deleteCharAt(fixture.length() + 1);
    620 			fail("no SIOOBE, index exceeds length");
    621 		} catch (StringIndexOutOfBoundsException e) {
    622 			// Expected
    623 		}
    624 	}
    625 
    626 	/**
    627 	 * @tests java.lang.StringBuilder.ensureCapacity(int)'
    628 	 */
    629 	public void test_ensureCapacityI() {
    630 		StringBuilder sb = new StringBuilder(5);
    631 		assertEquals(5, sb.capacity());
    632 		sb.ensureCapacity(10);
    633 		assertEquals(12, sb.capacity());
    634 		sb.ensureCapacity(26);
    635 		assertEquals(26, sb.capacity());
    636 		sb.ensureCapacity(55);
    637 		assertEquals(55, sb.capacity());
    638 	}
    639 
    640 	/**
    641 	 * @tests java.lang.StringBuilder.getChars(int, int, char[], int)'
    642 	 */
    643 	public void test_getCharsII$CI() {
    644 		final String fixture = "0123456789";
    645 		StringBuilder sb = new StringBuilder(fixture);
    646 		char[] dst = new char[10];
    647 		sb.getChars(0, 10, dst, 0);
    648 		assertTrue(Arrays.equals(fixture.toCharArray(), dst));
    649 
    650 		Arrays.fill(dst, '\0');
    651 		sb.getChars(0, 5, dst, 0);
    652 		char[] fixtureChars = new char[10];
    653 		fixture.getChars(0, 5, fixtureChars, 0);
    654 		assertTrue(Arrays.equals(fixtureChars, dst));
    655 
    656 		Arrays.fill(dst, '\0');
    657 		Arrays.fill(fixtureChars, '\0');
    658 		sb.getChars(0, 5, dst, 5);
    659 		fixture.getChars(0, 5, fixtureChars, 5);
    660 		assertTrue(Arrays.equals(fixtureChars, dst));
    661 
    662 		Arrays.fill(dst, '\0');
    663 		Arrays.fill(fixtureChars, '\0');
    664 		sb.getChars(5, 10, dst, 1);
    665 		fixture.getChars(5, 10, fixtureChars, 1);
    666 		assertTrue(Arrays.equals(fixtureChars, dst));
    667 
    668 		try {
    669 			sb.getChars(0, 10, null, 0);
    670 			fail("no NPE");
    671 		} catch (NullPointerException e) {
    672 			// Expected
    673 		}
    674 
    675 		try {
    676 			sb.getChars(-1, 10, dst, 0);
    677 			fail("no IOOBE, srcBegin negative");
    678 		} catch (IndexOutOfBoundsException e) {
    679 			// Expected
    680 		}
    681 
    682 		try {
    683 			sb.getChars(0, 10, dst, -1);
    684 			fail("no IOOBE, dstBegin negative");
    685 		} catch (IndexOutOfBoundsException e) {
    686 			// Expected
    687 		}
    688 
    689 		try {
    690 			sb.getChars(5, 4, dst, 0);
    691 			fail("no IOOBE, srcBegin > srcEnd");
    692 		} catch (IndexOutOfBoundsException e) {
    693 			// Expected
    694 		}
    695 
    696 		try {
    697 			sb.getChars(0, 11, dst, 0);
    698 			fail("no IOOBE, srcEnd > length");
    699 		} catch (IndexOutOfBoundsException e) {
    700 			// Expected
    701 		}
    702 
    703 		try {
    704 			sb.getChars(0, 10, dst, 5);
    705 			fail("no IOOBE, dstBegin and src size too large for what's left in dst");
    706 		} catch (IndexOutOfBoundsException e) {
    707 			// Expected
    708 		}
    709 	}
    710 
    711 	/**
    712 	 * @tests java.lang.StringBuilder.indexOf(String)
    713 	 */
    714 	public void test_indexOfLjava_lang_String() {
    715 		final String fixture = "0123456789";
    716 		StringBuilder sb = new StringBuilder(fixture);
    717 		assertEquals(0, sb.indexOf("0"));
    718 		assertEquals(0, sb.indexOf("012"));
    719 		assertEquals(-1, sb.indexOf("02"));
    720 		assertEquals(8, sb.indexOf("89"));
    721 
    722 		try {
    723 			sb.indexOf(null);
    724 			fail("no NPE");
    725 		} catch (NullPointerException e) {
    726 			// Expected
    727 		}
    728 	}
    729 
    730 	/**
    731 	 * @tests java.lang.StringBuilder.indexOf(String, int)
    732 	 */
    733 	public void test_IndexOfStringInt() {
    734 		final String fixture = "0123456789";
    735 		StringBuilder sb = new StringBuilder(fixture);
    736 		assertEquals(0, sb.indexOf("0"));
    737 		assertEquals(0, sb.indexOf("012"));
    738 		assertEquals(-1, sb.indexOf("02"));
    739 		assertEquals(8, sb.indexOf("89"));
    740 
    741 		assertEquals(0, sb.indexOf("0"), 0);
    742 		assertEquals(0, sb.indexOf("012"), 0);
    743 		assertEquals(-1, sb.indexOf("02"), 0);
    744 		assertEquals(8, sb.indexOf("89"), 0);
    745 
    746 		assertEquals(-1, sb.indexOf("0"), 5);
    747 		assertEquals(-1, sb.indexOf("012"), 5);
    748 		assertEquals(-1, sb.indexOf("02"), 0);
    749 		assertEquals(8, sb.indexOf("89"), 5);
    750 
    751 		try {
    752 			sb.indexOf(null, 0);
    753 			fail("no NPE");
    754 		} catch (NullPointerException e) {
    755 			// Expected
    756 		}
    757 	}
    758 
    759 	/**
    760 	 * @tests java.lang.StringBuilder.insert(int, boolean)
    761 	 */
    762 	public void test_insertIZ() {
    763 		final String fixture = "0000";
    764 		StringBuilder sb = new StringBuilder(fixture);
    765 		assertSame(sb, sb.insert(0, true));
    766 		assertEquals("true0000", sb.toString());
    767 		assertEquals(8, sb.length());
    768 
    769 		sb = new StringBuilder(fixture);
    770 		assertSame(sb, sb.insert(0, false));
    771 		assertEquals("false0000", sb.toString());
    772 		assertEquals(9, sb.length());
    773 
    774 		sb = new StringBuilder(fixture);
    775 		assertSame(sb, sb.insert(2, false));
    776 		assertEquals("00false00", sb.toString());
    777 		assertEquals(9, sb.length());
    778 
    779 		sb = new StringBuilder(fixture);
    780 		assertSame(sb, sb.insert(4, false));
    781 		assertEquals("0000false", sb.toString());
    782 		assertEquals(9, sb.length());
    783 
    784 		try {
    785 			sb = new StringBuilder(fixture);
    786 			sb.insert(-1, false);
    787 			fail("no SIOOBE, negative index");
    788 		} catch (StringIndexOutOfBoundsException e) {
    789 			// Expected
    790 		}
    791 
    792 		try {
    793 			sb = new StringBuilder(fixture);
    794 			sb.insert(5, false);
    795 			fail("no SIOOBE, index too large index");
    796 		} catch (StringIndexOutOfBoundsException e) {
    797 			// Expected
    798 		}
    799 	}
    800 
    801 	/**
    802 	 * @tests java.lang.StringBuilder.insert(int, char)
    803 	 */
    804 	public void test_insertIC() {
    805 		final String fixture = "0000";
    806 		StringBuilder sb = new StringBuilder(fixture);
    807 		assertSame(sb, sb.insert(0, 'a'));
    808 		assertEquals("a0000", sb.toString());
    809 		assertEquals(5, sb.length());
    810 
    811 		sb = new StringBuilder(fixture);
    812 		assertSame(sb, sb.insert(0, 'b'));
    813 		assertEquals("b0000", sb.toString());
    814 		assertEquals(5, sb.length());
    815 
    816 		sb = new StringBuilder(fixture);
    817 		assertSame(sb, sb.insert(2, 'b'));
    818 		assertEquals("00b00", sb.toString());
    819 		assertEquals(5, sb.length());
    820 
    821 		sb = new StringBuilder(fixture);
    822 		assertSame(sb, sb.insert(4, 'b'));
    823 		assertEquals("0000b", sb.toString());
    824 		assertEquals(5, sb.length());
    825 
    826 		// FIXME this fails on Sun JRE 5.0_5
    827 //		try {
    828 //			sb = new StringBuilder(fixture);
    829 //			sb.insert(-1, 'a');
    830 //			fail("no SIOOBE, negative index");
    831 //		} catch (StringIndexOutOfBoundsException e) {
    832 //			// Expected
    833 //		}
    834 
    835 		/*
    836 		 * FIXME This fails on Sun JRE 5.0_5, but that seems like a bug, since
    837 		 * the 'insert(int, char[]) behaves this way.
    838 		 */
    839 //		try {
    840 //			sb = new StringBuilder(fixture);
    841 //			sb.insert(5, 'a');
    842 //			fail("no SIOOBE, index too large index");
    843 //		} catch (StringIndexOutOfBoundsException e) {
    844 //			// Expected
    845 //		}
    846 	}
    847 
    848     /**
    849      * @tests java.lang.StringBuilder.insert(int, char)
    850      */
    851     public void test_insertIC_2() {
    852         StringBuilder obj = new StringBuilder();
    853         try {
    854             obj.insert(-1, '?');
    855             fail("ArrayIndexOutOfBoundsException expected");
    856         } catch (ArrayIndexOutOfBoundsException e) {
    857             // expected
    858         }
    859     }
    860 
    861     /**
    862 	 * @tests java.lang.StringBuilder.insert(int, char[])'
    863 	 */
    864 	public void test_insertI$C() {
    865 		final String fixture = "0000";
    866 		StringBuilder sb = new StringBuilder(fixture);
    867 		assertSame(sb, sb.insert(0, new char[] { 'a', 'b' }));
    868 		assertEquals("ab0000", sb.toString());
    869 		assertEquals(6, sb.length());
    870 
    871 		sb = new StringBuilder(fixture);
    872 		assertSame(sb, sb.insert(2, new char[] { 'a', 'b' }));
    873 		assertEquals("00ab00", sb.toString());
    874 		assertEquals(6, sb.length());
    875 
    876 		sb = new StringBuilder(fixture);
    877 		assertSame(sb, sb.insert(4, new char[] { 'a', 'b' }));
    878 		assertEquals("0000ab", sb.toString());
    879 		assertEquals(6, sb.length());
    880 
    881 		/*
    882 		 * TODO This NPE is the behavior on Sun's JRE 5.0_5, but it's
    883 		 * undocumented. The assumption is that this method behaves like
    884 		 * String.valueOf(char[]), which does throw a NPE too, but that is also
    885 		 * undocumented.
    886 		 */
    887 
    888 		try {
    889 			sb.insert(0, (char[]) null);
    890 			fail("no NPE");
    891 		} catch (NullPointerException e) {
    892 			// Expected
    893 		}
    894 
    895 		try {
    896 			sb = new StringBuilder(fixture);
    897 			sb.insert(-1, new char[] { 'a', 'b' });
    898 			fail("no SIOOBE, negative index");
    899 		} catch (StringIndexOutOfBoundsException e) {
    900 			// Expected
    901 		}
    902 
    903 		try {
    904 			sb = new StringBuilder(fixture);
    905 			sb.insert(5, new char[] { 'a', 'b' });
    906 			fail("no SIOOBE, index too large index");
    907 		} catch (StringIndexOutOfBoundsException e) {
    908 			// Expected
    909 		}
    910 	}
    911 
    912 	/**
    913 	 * @tests java.lang.StringBuilder.insert(int, char[], int, int)
    914 	 */
    915 	public void test_insertI$CII() {
    916 		final String fixture = "0000";
    917 		StringBuilder sb = new StringBuilder(fixture);
    918 		assertSame(sb, sb.insert(0, new char[] { 'a', 'b' }, 0, 2));
    919 		assertEquals("ab0000", sb.toString());
    920 		assertEquals(6, sb.length());
    921 
    922 		sb = new StringBuilder(fixture);
    923 		assertSame(sb, sb.insert(0, new char[] { 'a', 'b' }, 0, 1));
    924 		assertEquals("a0000", sb.toString());
    925 		assertEquals(5, sb.length());
    926 
    927 		sb = new StringBuilder(fixture);
    928 		assertSame(sb, sb.insert(2, new char[] { 'a', 'b' }, 0, 2));
    929 		assertEquals("00ab00", sb.toString());
    930 		assertEquals(6, sb.length());
    931 
    932 		sb = new StringBuilder(fixture);
    933 		assertSame(sb, sb.insert(2, new char[] { 'a', 'b' }, 0, 1));
    934 		assertEquals("00a00", sb.toString());
    935 		assertEquals(5, sb.length());
    936 
    937 		sb = new StringBuilder(fixture);
    938 		assertSame(sb, sb.insert(4, new char[] { 'a', 'b' }, 0, 2));
    939 		assertEquals("0000ab", sb.toString());
    940 		assertEquals(6, sb.length());
    941 
    942 		sb = new StringBuilder(fixture);
    943 		assertSame(sb, sb.insert(4, new char[] { 'a', 'b' }, 0, 1));
    944 		assertEquals("0000a", sb.toString());
    945 		assertEquals(5, sb.length());
    946 
    947 		/*
    948 		 * TODO This NPE is the behavior on Sun's JRE 5.0_5, but it's
    949 		 * undocumented. The assumption is that this method behaves like
    950 		 * String.valueOf(char[]), which does throw a NPE too, but that is also
    951 		 * undocumented.
    952 		 */
    953 
    954 		try {
    955 			sb.insert(0, (char[]) null, 0, 2);
    956 			fail("no NPE");
    957 		} catch (NullPointerException e) {
    958 			// Expected
    959 		}
    960 
    961 		try {
    962 			sb = new StringBuilder(fixture);
    963 			sb.insert(-1, new char[] { 'a', 'b' }, 0, 2);
    964 			fail("no SIOOBE, negative index");
    965 		} catch (StringIndexOutOfBoundsException e) {
    966 			// Expected
    967 		}
    968 
    969 		try {
    970 			sb = new StringBuilder(fixture);
    971 			sb.insert(5, new char[] { 'a', 'b' }, 0, 2);
    972 			fail("no SIOOBE, index too large index");
    973 		} catch (StringIndexOutOfBoundsException e) {
    974 			// Expected
    975 		}
    976 
    977 		try {
    978 			sb = new StringBuilder(fixture);
    979 			sb.insert(5, new char[] { 'a', 'b' }, -1, 2);
    980 			fail("no SIOOBE, negative offset");
    981 		} catch (StringIndexOutOfBoundsException e) {
    982 			// Expected
    983 		}
    984 
    985 		try {
    986 			sb = new StringBuilder(fixture);
    987 			sb.insert(5, new char[] { 'a', 'b' }, 0, -1);
    988 			fail("no SIOOBE, negative length");
    989 		} catch (StringIndexOutOfBoundsException e) {
    990 			// Expected
    991 		}
    992 
    993 		try {
    994 			sb = new StringBuilder(fixture);
    995 			sb.insert(5, new char[] { 'a', 'b' }, 0, 3);
    996 			fail("no SIOOBE, too long");
    997 		} catch (StringIndexOutOfBoundsException e) {
    998 			// Expected
    999 		}
   1000 	}
   1001 
   1002 	/**
   1003 	 * @tests java.lang.StringBuilder.insert(int, CharSequence)
   1004 	 */
   1005 	public void test_insertILjava_lang_CharSequence() {
   1006 		final String fixture = "0000";
   1007 		StringBuilder sb = new StringBuilder(fixture);
   1008 		assertSame(sb, sb.insert(0, (CharSequence) "ab"));
   1009 		assertEquals("ab0000", sb.toString());
   1010 		assertEquals(6, sb.length());
   1011 
   1012 		sb = new StringBuilder(fixture);
   1013 		assertSame(sb, sb.insert(2, (CharSequence) "ab"));
   1014 		assertEquals("00ab00", sb.toString());
   1015 		assertEquals(6, sb.length());
   1016 
   1017 		sb = new StringBuilder(fixture);
   1018 		assertSame(sb, sb.insert(4, (CharSequence) "ab"));
   1019 		assertEquals("0000ab", sb.toString());
   1020 		assertEquals(6, sb.length());
   1021 
   1022 		sb = new StringBuilder(fixture);
   1023 		assertSame(sb, sb.insert(4, (CharSequence) null));
   1024 		assertEquals("0000null", sb.toString());
   1025 		assertEquals(8, sb.length());
   1026 
   1027 		try {
   1028 			sb = new StringBuilder(fixture);
   1029 			sb.insert(-1, (CharSequence) "ab");
   1030 			fail("no IOOBE, negative index");
   1031 		} catch (IndexOutOfBoundsException e) {
   1032 			// Expected
   1033 		}
   1034 
   1035 		try {
   1036 			sb = new StringBuilder(fixture);
   1037 			sb.insert(5, (CharSequence) "ab");
   1038 			fail("no IOOBE, index too large index");
   1039 		} catch (IndexOutOfBoundsException e) {
   1040 			// Expected
   1041 		}
   1042 	}
   1043 
   1044 	/**
   1045 	 * @tests java.lang.StringBuilder.insert(int, CharSequence, int, int)
   1046 	 */
   1047 	@SuppressWarnings("cast")
   1048     public void test_insertILjava_lang_CharSequenceII() {
   1049 		final String fixture = "0000";
   1050 		StringBuilder sb = new StringBuilder(fixture);
   1051 		assertSame(sb, sb.insert(0, (CharSequence) "ab", 0, 2));
   1052 		assertEquals("ab0000", sb.toString());
   1053 		assertEquals(6, sb.length());
   1054 
   1055 		sb = new StringBuilder(fixture);
   1056 		assertSame(sb, sb.insert(0, (CharSequence) "ab", 0, 1));
   1057 		assertEquals("a0000", sb.toString());
   1058 		assertEquals(5, sb.length());
   1059 
   1060 		sb = new StringBuilder(fixture);
   1061 		assertSame(sb, sb.insert(2, (CharSequence) "ab", 0, 2));
   1062 		assertEquals("00ab00", sb.toString());
   1063 		assertEquals(6, sb.length());
   1064 
   1065 		sb = new StringBuilder(fixture);
   1066 		assertSame(sb, sb.insert(2, (CharSequence) "ab", 0, 1));
   1067 		assertEquals("00a00", sb.toString());
   1068 		assertEquals(5, sb.length());
   1069 
   1070 		sb = new StringBuilder(fixture);
   1071 		assertSame(sb, sb.insert(4, (CharSequence) "ab", 0, 2));
   1072 		assertEquals("0000ab", sb.toString());
   1073 		assertEquals(6, sb.length());
   1074 
   1075 		sb = new StringBuilder(fixture);
   1076 		assertSame(sb, sb.insert(4, (CharSequence) "ab", 0, 1));
   1077 		assertEquals("0000a", sb.toString());
   1078 		assertEquals(5, sb.length());
   1079 
   1080 		sb = new StringBuilder(fixture);
   1081 		assertSame(sb, sb.insert(4, (CharSequence) null, 0, 2));
   1082 		assertEquals("0000nu", sb.toString());
   1083 		assertEquals(6, sb.length());
   1084 
   1085 		try {
   1086 			sb = new StringBuilder(fixture);
   1087 			sb.insert(-1, (CharSequence) "ab", 0, 2);
   1088 			fail("no IOOBE, negative index");
   1089 		} catch (IndexOutOfBoundsException e) {
   1090 			// Expected
   1091 		}
   1092 
   1093 		try {
   1094 			sb = new StringBuilder(fixture);
   1095 			sb.insert(5, (CharSequence) "ab", 0, 2);
   1096 			fail("no IOOBE, index too large index");
   1097 		} catch (IndexOutOfBoundsException e) {
   1098 			// Expected
   1099 		}
   1100 
   1101 		try {
   1102 			sb = new StringBuilder(fixture);
   1103 			sb.insert(5, (CharSequence) "ab", -1, 2);
   1104 			fail("no IOOBE, negative offset");
   1105 		} catch (IndexOutOfBoundsException e) {
   1106 			// Expected
   1107 		}
   1108 
   1109 		try {
   1110 			sb = new StringBuilder(fixture);
   1111 			sb.insert(5, new char[] { 'a', 'b' }, 0, -1);
   1112 			fail("no IOOBE, negative length");
   1113 		} catch (IndexOutOfBoundsException e) {
   1114 			// Expected
   1115 		}
   1116 
   1117 		try {
   1118 			sb = new StringBuilder(fixture);
   1119 			sb.insert(5, new char[] { 'a', 'b' }, 0, 3);
   1120 			fail("no IOOBE, too long");
   1121 		} catch (IndexOutOfBoundsException e) {
   1122 			// Expected
   1123 		}
   1124 	}
   1125 
   1126 	/**
   1127 	 * @tests java.lang.StringBuilder.insert(int, double)
   1128 	 */
   1129 	public void test_insertID() {
   1130 		final String fixture = "0000";
   1131 		StringBuilder sb = new StringBuilder(fixture);
   1132 		assertSame(sb, sb.insert(0, -1D));
   1133 		assertEquals("-1.00000", sb.toString());
   1134 		assertEquals(8, sb.length());
   1135 
   1136 		sb = new StringBuilder(fixture);
   1137 		assertSame(sb, sb.insert(0, 0D));
   1138 		assertEquals("0.00000", sb.toString());
   1139 		assertEquals(7, sb.length());
   1140 
   1141 		sb = new StringBuilder(fixture);
   1142 		assertSame(sb, sb.insert(2, 1D));
   1143 		assertEquals("001.000", sb.toString());
   1144 		assertEquals(7, sb.length());
   1145 
   1146 		sb = new StringBuilder(fixture);
   1147 		assertSame(sb, sb.insert(4, 2D));
   1148 		assertEquals("00002.0", sb.toString());
   1149 		assertEquals(7, sb.length());
   1150 
   1151 		try {
   1152 			sb = new StringBuilder(fixture);
   1153 			sb.insert(-1, 1D);
   1154 			fail("no IOOBE, negative index");
   1155 		} catch (IndexOutOfBoundsException e) {
   1156 			// Expected
   1157 		}
   1158 
   1159 		try {
   1160 			sb = new StringBuilder(fixture);
   1161 			sb.insert(5, 1D);
   1162 			fail("no IOOBE, index too large index");
   1163 		} catch (IndexOutOfBoundsException e) {
   1164 			// Expected
   1165 		}
   1166 	}
   1167 
   1168 	/**
   1169 	 * @tests java.lang.StringBuilder.insert(int, float)
   1170 	 */
   1171 	public void test_insertIF() {
   1172 		final String fixture = "0000";
   1173 		StringBuilder sb = new StringBuilder(fixture);
   1174 		assertSame(sb, sb.insert(0, -1F));
   1175 		assertEquals("-1.00000", sb.toString());
   1176 		assertEquals(8, sb.length());
   1177 
   1178 		sb = new StringBuilder(fixture);
   1179 		assertSame(sb, sb.insert(0, 0F));
   1180 		assertEquals("0.00000", sb.toString());
   1181 		assertEquals(7, sb.length());
   1182 
   1183 		sb = new StringBuilder(fixture);
   1184 		assertSame(sb, sb.insert(2, 1F));
   1185 		assertEquals("001.000", sb.toString());
   1186 		assertEquals(7, sb.length());
   1187 
   1188 		sb = new StringBuilder(fixture);
   1189 		assertSame(sb, sb.insert(4, 2F));
   1190 		assertEquals("00002.0", sb.toString());
   1191 		assertEquals(7, sb.length());
   1192 
   1193 		try {
   1194 			sb = new StringBuilder(fixture);
   1195 			sb.insert(-1, 1F);
   1196 			fail("no IOOBE, negative index");
   1197 		} catch (IndexOutOfBoundsException e) {
   1198 			// Expected
   1199 		}
   1200 
   1201 		try {
   1202 			sb = new StringBuilder(fixture);
   1203 			sb.insert(5, 1F);
   1204 			fail("no IOOBE, index too large index");
   1205 		} catch (IndexOutOfBoundsException e) {
   1206 			// Expected
   1207 		}
   1208 	}
   1209 
   1210 	/**
   1211 	 * @tests java.lang.StringBuilder.insert(int, int)
   1212 	 */
   1213 	public void test_insertII() {
   1214 		final String fixture = "0000";
   1215 		StringBuilder sb = new StringBuilder(fixture);
   1216 		assertSame(sb, sb.insert(0, -1));
   1217 		assertEquals("-10000", sb.toString());
   1218 		assertEquals(6, sb.length());
   1219 
   1220 		sb = new StringBuilder(fixture);
   1221 		assertSame(sb, sb.insert(0, 0));
   1222 		assertEquals("00000", sb.toString());
   1223 		assertEquals(5, sb.length());
   1224 
   1225 		sb = new StringBuilder(fixture);
   1226 		assertSame(sb, sb.insert(2, 1));
   1227 		assertEquals("00100", sb.toString());
   1228 		assertEquals(5, sb.length());
   1229 
   1230 		sb = new StringBuilder(fixture);
   1231 		assertSame(sb, sb.insert(4, 2));
   1232 		assertEquals("00002", sb.toString());
   1233 		assertEquals(5, sb.length());
   1234 
   1235 		try {
   1236 			sb = new StringBuilder(fixture);
   1237 			sb.insert(-1, 1);
   1238 			fail("no IOOBE, negative index");
   1239 		} catch (IndexOutOfBoundsException e) {
   1240 			// Expected
   1241 		}
   1242 
   1243 		try {
   1244 			sb = new StringBuilder(fixture);
   1245 			sb.insert(5, 1);
   1246 			fail("no IOOBE, index too large index");
   1247 		} catch (IndexOutOfBoundsException e) {
   1248 			// Expected
   1249 		}
   1250 	}
   1251 
   1252 	/**
   1253 	 * @tests java.lang.StringBuilder.insert(int, long)
   1254 	 */
   1255 	public void test_insertIJ() {
   1256 		final String fixture = "0000";
   1257 		StringBuilder sb = new StringBuilder(fixture);
   1258 		assertSame(sb, sb.insert(0, -1L));
   1259 		assertEquals("-10000", sb.toString());
   1260 		assertEquals(6, sb.length());
   1261 
   1262 		sb = new StringBuilder(fixture);
   1263 		assertSame(sb, sb.insert(0, 0L));
   1264 		assertEquals("00000", sb.toString());
   1265 		assertEquals(5, sb.length());
   1266 
   1267 		sb = new StringBuilder(fixture);
   1268 		assertSame(sb, sb.insert(2, 1L));
   1269 		assertEquals("00100", sb.toString());
   1270 		assertEquals(5, sb.length());
   1271 
   1272 		sb = new StringBuilder(fixture);
   1273 		assertSame(sb, sb.insert(4, 2L));
   1274 		assertEquals("00002", sb.toString());
   1275 		assertEquals(5, sb.length());
   1276 
   1277 		try {
   1278 			sb = new StringBuilder(fixture);
   1279 			sb.insert(-1, 1L);
   1280 			fail("no IOOBE, negative index");
   1281 		} catch (IndexOutOfBoundsException e) {
   1282 			// Expected
   1283 		}
   1284 
   1285 		try {
   1286 			sb = new StringBuilder(fixture);
   1287 			sb.insert(5, 1L);
   1288 			fail("no IOOBE, index too large index");
   1289 		} catch (IndexOutOfBoundsException e) {
   1290 			// Expected
   1291 		}
   1292 	}
   1293 
   1294 	/**
   1295 	 * @tests java.lang.StringBuilder.insert(int, Object)
   1296 	 */
   1297 	public void test_insertILjava_lang_Object() {
   1298 		final String fixture = "0000";
   1299 		StringBuilder sb = new StringBuilder(fixture);
   1300 		assertSame(sb, sb.insert(0, Fixture.INSTANCE));
   1301 		assertEquals("fixture0000", sb.toString());
   1302 		assertEquals(11, sb.length());
   1303 
   1304 		sb = new StringBuilder(fixture);
   1305 		assertSame(sb, sb.insert(2, Fixture.INSTANCE));
   1306 		assertEquals("00fixture00", sb.toString());
   1307 		assertEquals(11, sb.length());
   1308 
   1309 		sb = new StringBuilder(fixture);
   1310 		assertSame(sb, sb.insert(4, Fixture.INSTANCE));
   1311 		assertEquals("0000fixture", sb.toString());
   1312 		assertEquals(11, sb.length());
   1313 
   1314 		sb = new StringBuilder(fixture);
   1315 		assertSame(sb, sb.insert(4, (Object) null));
   1316 		assertEquals("0000null", sb.toString());
   1317 		assertEquals(8, sb.length());
   1318 
   1319 		try {
   1320 			sb = new StringBuilder(fixture);
   1321 			sb.insert(-1, Fixture.INSTANCE);
   1322 			fail("no IOOBE, negative index");
   1323 		} catch (IndexOutOfBoundsException e) {
   1324 			// Expected
   1325 		}
   1326 
   1327 		try {
   1328 			sb = new StringBuilder(fixture);
   1329 			sb.insert(5, Fixture.INSTANCE);
   1330 			fail("no IOOBE, index too large index");
   1331 		} catch (IndexOutOfBoundsException e) {
   1332 			// Expected
   1333 		}
   1334 	}
   1335 
   1336 	/**
   1337 	 * @tests java.lang.StringBuilder.insert(int, String)
   1338 	 */
   1339 	public void test_insertILjava_lang_String() {
   1340 		final String fixture = "0000";
   1341 		StringBuilder sb = new StringBuilder(fixture);
   1342 		assertSame(sb, sb.insert(0, "fixture"));
   1343 		assertEquals("fixture0000", sb.toString());
   1344 		assertEquals(11, sb.length());
   1345 
   1346 		sb = new StringBuilder(fixture);
   1347 		assertSame(sb, sb.insert(2, "fixture"));
   1348 		assertEquals("00fixture00", sb.toString());
   1349 		assertEquals(11, sb.length());
   1350 
   1351 		sb = new StringBuilder(fixture);
   1352 		assertSame(sb, sb.insert(4, "fixture"));
   1353 		assertEquals("0000fixture", sb.toString());
   1354 		assertEquals(11, sb.length());
   1355 
   1356 		sb = new StringBuilder(fixture);
   1357 		assertSame(sb, sb.insert(4, (Object) null));
   1358 		assertEquals("0000null", sb.toString());
   1359 		assertEquals(8, sb.length());
   1360 
   1361 		try {
   1362 			sb = new StringBuilder(fixture);
   1363 			sb.insert(-1, "fixture");
   1364 			fail("no IOOBE, negative index");
   1365 		} catch (IndexOutOfBoundsException e) {
   1366 			// Expected
   1367 		}
   1368 
   1369 		try {
   1370 			sb = new StringBuilder(fixture);
   1371 			sb.insert(5, "fixture");
   1372 			fail("no IOOBE, index too large index");
   1373 		} catch (IndexOutOfBoundsException e) {
   1374 			// Expected
   1375 		}
   1376 	}
   1377 
   1378 	/**
   1379 	 * @tests java.lang.StringBuilder.lastIndexOf(String)
   1380 	 */
   1381 	public void test_lastIndexOfLjava_lang_String() {
   1382 		final String fixture = "0123456789";
   1383 		StringBuilder sb = new StringBuilder(fixture);
   1384 		assertEquals(0, sb.lastIndexOf("0"));
   1385 		assertEquals(0, sb.lastIndexOf("012"));
   1386 		assertEquals(-1, sb.lastIndexOf("02"));
   1387 		assertEquals(8, sb.lastIndexOf("89"));
   1388 
   1389 		try {
   1390 			sb.lastIndexOf(null);
   1391 			fail("no NPE");
   1392 		} catch (NullPointerException e) {
   1393 			// Expected
   1394 		}
   1395 	}
   1396 
   1397 	/**
   1398 	 * @tests java.lang.StringBuilder.lastIndexOf(String, int)
   1399 	 */
   1400 	public void test_lastIndexOfLjava_lang_StringI() {
   1401 		final String fixture = "0123456789";
   1402 		StringBuilder sb = new StringBuilder(fixture);
   1403 		assertEquals(0, sb.lastIndexOf("0"));
   1404 		assertEquals(0, sb.lastIndexOf("012"));
   1405 		assertEquals(-1, sb.lastIndexOf("02"));
   1406 		assertEquals(8, sb.lastIndexOf("89"));
   1407 
   1408 		assertEquals(0, sb.lastIndexOf("0"), 0);
   1409 		assertEquals(0, sb.lastIndexOf("012"), 0);
   1410 		assertEquals(-1, sb.lastIndexOf("02"), 0);
   1411 		assertEquals(8, sb.lastIndexOf("89"), 0);
   1412 
   1413 		assertEquals(-1, sb.lastIndexOf("0"), 5);
   1414 		assertEquals(-1, sb.lastIndexOf("012"), 5);
   1415 		assertEquals(-1, sb.lastIndexOf("02"), 0);
   1416 		assertEquals(8, sb.lastIndexOf("89"), 5);
   1417 
   1418 		try {
   1419 			sb.lastIndexOf(null, 0);
   1420 			fail("no NPE");
   1421 		} catch (NullPointerException e) {
   1422 			// Expected
   1423 		}
   1424 	}
   1425 
   1426 	/**
   1427 	 * @tests java.lang.StringBuilder.length()
   1428 	 */
   1429 	public void test_length() {
   1430 		StringBuilder sb = new StringBuilder();
   1431 		assertEquals(0, sb.length());
   1432 		sb.append("0000");
   1433 		assertEquals(4, sb.length());
   1434 	}
   1435 
   1436 	/**
   1437 	 * @tests java.lang.StringBuilder.offsetByCodePoints(int, int)'
   1438 	 */
   1439 	public void test_offsetByCodePointsII() {
   1440         int result = new StringBuilder("a\uD800\uDC00b").offsetByCodePoints(0, 2);
   1441         assertEquals(3, result);
   1442 
   1443         result = new StringBuilder("abcd").offsetByCodePoints(3, -1);
   1444         assertEquals(2, result);
   1445 
   1446         result = new StringBuilder("a\uD800\uDC00b").offsetByCodePoints(0, 3);
   1447         assertEquals(4, result);
   1448 
   1449         result = new StringBuilder("a\uD800\uDC00b").offsetByCodePoints(3, -1);
   1450         assertEquals(1, result);
   1451 
   1452         result = new StringBuilder("a\uD800\uDC00b").offsetByCodePoints(3, 0);
   1453         assertEquals(3, result);
   1454 
   1455         result = new StringBuilder("\uD800\uDC00bc").offsetByCodePoints(3, 0);
   1456         assertEquals(3, result);
   1457 
   1458         result = new StringBuilder("a\uDC00bc").offsetByCodePoints(3, -1);
   1459         assertEquals(2, result);
   1460 
   1461         result = new StringBuilder("a\uD800bc").offsetByCodePoints(3, -1);
   1462         assertEquals(2, result);
   1463 
   1464         StringBuilder sb = new StringBuilder();
   1465         sb.append("abc");
   1466         try {
   1467             sb.offsetByCodePoints(-1, 1);
   1468             fail("No IOOBE for negative index.");
   1469         } catch (IndexOutOfBoundsException e) {
   1470 
   1471         }
   1472 
   1473         try {
   1474             sb.offsetByCodePoints(0, 4);
   1475             fail("No IOOBE for offset that's too large.");
   1476         } catch (IndexOutOfBoundsException e) {
   1477 
   1478         }
   1479 
   1480         try {
   1481             sb.offsetByCodePoints(3, -4);
   1482             fail("No IOOBE for offset that's too small.");
   1483         } catch (IndexOutOfBoundsException e) {
   1484 
   1485         }
   1486 
   1487         try {
   1488             sb.offsetByCodePoints(3, 1);
   1489             fail("No IOOBE for index that's too large.");
   1490         } catch (IndexOutOfBoundsException e) {
   1491 
   1492         }
   1493 
   1494         try {
   1495             sb.offsetByCodePoints(4, -1);
   1496             fail("No IOOBE for index that's too large.");
   1497         } catch (IndexOutOfBoundsException e) {
   1498 
   1499         }
   1500 	}
   1501 
   1502 	/**
   1503 	 * @tests java.lang.StringBuilder.replace(int, int, String)'
   1504 	 */
   1505 	public void test_replaceIILjava_lang_String() {
   1506 		final String fixture = "0000";
   1507 		StringBuilder sb = new StringBuilder(fixture);
   1508 		assertSame(sb, sb.replace(1, 3, "11"));
   1509 		assertEquals("0110", sb.toString());
   1510 		assertEquals(4, sb.length());
   1511 
   1512 		sb = new StringBuilder(fixture);
   1513 		assertSame(sb, sb.replace(1, 2, "11"));
   1514 		assertEquals("01100", sb.toString());
   1515 		assertEquals(5, sb.length());
   1516 
   1517 		sb = new StringBuilder(fixture);
   1518 		assertSame(sb, sb.replace(4, 5, "11"));
   1519 		assertEquals("000011", sb.toString());
   1520 		assertEquals(6, sb.length());
   1521 
   1522 		sb = new StringBuilder(fixture);
   1523 		assertSame(sb, sb.replace(4, 6, "11"));
   1524 		assertEquals("000011", sb.toString());
   1525 		assertEquals(6, sb.length());
   1526 
   1527 		// FIXME Undocumented NPE in Sun's JRE 5.0_5
   1528 		try {
   1529 			sb.replace(1, 2, null);
   1530 			fail("No NPE");
   1531 		} catch (NullPointerException e) {
   1532 			// Expected
   1533 		}
   1534 
   1535 		try {
   1536 			sb = new StringBuilder(fixture);
   1537 			sb.replace(-1, 2, "11");
   1538 			fail("No SIOOBE, negative start");
   1539 		} catch (StringIndexOutOfBoundsException e) {
   1540 			// Expected
   1541 		}
   1542 
   1543 		try {
   1544 			sb = new StringBuilder(fixture);
   1545 			sb.replace(5, 2, "11");
   1546 			fail("No SIOOBE, start > length");
   1547 		} catch (StringIndexOutOfBoundsException e) {
   1548 			// Expected
   1549 		}
   1550 
   1551 		try {
   1552 			sb = new StringBuilder(fixture);
   1553 			sb.replace(3, 2, "11");
   1554 			fail("No SIOOBE, start > end");
   1555 		} catch (StringIndexOutOfBoundsException e) {
   1556 			// Expected
   1557 		}
   1558 
   1559 		// Regression for HARMONY-348
   1560 		StringBuilder buffer = new StringBuilder("1234567");
   1561 		buffer.replace(2, 6, "XXX");
   1562 		assertEquals("12XXX7",buffer.toString());
   1563 	}
   1564 
   1565     private void reverseTest(String org, String rev, String back) {
   1566         // create non-shared StringBuilder
   1567         StringBuilder sb = new StringBuilder(org);
   1568         sb.reverse();
   1569         String reversed = sb.toString();
   1570         assertEquals(rev, reversed);
   1571         // create non-shared StringBuilder
   1572         sb = new StringBuilder(reversed);
   1573         sb.reverse();
   1574         reversed = sb.toString();
   1575         assertEquals(back, reversed);
   1576 
   1577         // test algorithm when StringBuilder is shared
   1578         sb = new StringBuilder(org);
   1579         String copy = sb.toString();
   1580         assertEquals(org, copy);
   1581         sb.reverse();
   1582         reversed = sb.toString();
   1583         assertEquals(rev, reversed);
   1584         sb = new StringBuilder(reversed);
   1585         copy = sb.toString();
   1586         assertEquals(rev, copy);
   1587         sb.reverse();
   1588         reversed = sb.toString();
   1589         assertEquals(back, reversed);
   1590     }
   1591 
   1592 	/**
   1593 	 * @tests java.lang.StringBuilder.reverse()
   1594 	 */
   1595 	public void test_reverse() {
   1596         final String fixture = "0123456789";
   1597         StringBuilder sb = new StringBuilder(fixture);
   1598         assertSame(sb, sb.reverse());
   1599         assertEquals("9876543210", sb.toString());
   1600 
   1601         sb = new StringBuilder("012345678");
   1602         assertSame(sb, sb.reverse());
   1603         assertEquals("876543210", sb.toString());
   1604 
   1605         sb.setLength(1);
   1606         assertSame(sb, sb.reverse());
   1607         assertEquals("8", sb.toString());
   1608 
   1609         sb.setLength(0);
   1610         assertSame(sb, sb.reverse());
   1611         assertEquals("", sb.toString());
   1612 
   1613         String str;
   1614         str = "a";
   1615         reverseTest(str, str, str);
   1616 
   1617         str = "ab";
   1618         reverseTest(str, "ba", str);
   1619 
   1620         str = "abcdef";
   1621         reverseTest(str, "fedcba", str);
   1622 
   1623         str = "abcdefg";
   1624         reverseTest(str, "gfedcba", str);
   1625 
   1626         str = "\ud800\udc00";
   1627         reverseTest(str, str, str);
   1628 
   1629         str = "\udc00\ud800";
   1630         reverseTest(str, "\ud800\udc00", "\ud800\udc00");
   1631 
   1632         str = "a\ud800\udc00";
   1633         reverseTest(str, "\ud800\udc00a", str);
   1634 
   1635         str = "ab\ud800\udc00";
   1636         reverseTest(str, "\ud800\udc00ba", str);
   1637 
   1638         str = "abc\ud800\udc00";
   1639         reverseTest(str, "\ud800\udc00cba", str);
   1640 
   1641         str = "\ud800\udc00\udc01\ud801\ud802\udc02";
   1642         reverseTest(str, "\ud802\udc02\ud801\udc01\ud800\udc00",
   1643                 "\ud800\udc00\ud801\udc01\ud802\udc02");
   1644 
   1645         str = "\ud800\udc00\ud801\udc01\ud802\udc02";
   1646         reverseTest(str, "\ud802\udc02\ud801\udc01\ud800\udc00", str);
   1647 
   1648         str = "\ud800\udc00\udc01\ud801a";
   1649         reverseTest(str, "a\ud801\udc01\ud800\udc00",
   1650                 "\ud800\udc00\ud801\udc01a");
   1651 
   1652         str = "a\ud800\udc00\ud801\udc01";
   1653         reverseTest(str, "\ud801\udc01\ud800\udc00a", str);
   1654 
   1655         str = "\ud800\udc00\udc01\ud801ab";
   1656         reverseTest(str, "ba\ud801\udc01\ud800\udc00",
   1657                 "\ud800\udc00\ud801\udc01ab");
   1658 
   1659         str = "ab\ud800\udc00\ud801\udc01";
   1660         reverseTest(str, "\ud801\udc01\ud800\udc00ba", str);
   1661 
   1662         str = "\ud800\udc00\ud801\udc01";
   1663         reverseTest(str, "\ud801\udc01\ud800\udc00", str);
   1664 
   1665         str = "a\ud800\udc00z\ud801\udc01";
   1666         reverseTest(str, "\ud801\udc01z\ud800\udc00a", str);
   1667 
   1668         str = "a\ud800\udc00bz\ud801\udc01";
   1669         reverseTest(str, "\ud801\udc01zb\ud800\udc00a", str);
   1670 
   1671         str = "abc\ud802\udc02\ud801\udc01\ud800\udc00";
   1672         reverseTest(str, "\ud800\udc00\ud801\udc01\ud802\udc02cba", str);
   1673 
   1674         str = "abcd\ud802\udc02\ud801\udc01\ud800\udc00";
   1675         reverseTest(str, "\ud800\udc00\ud801\udc01\ud802\udc02dcba", str);
   1676     }
   1677 
   1678 	/**
   1679 	 * @tests java.lang.StringBuilder.setCharAt(int, char)
   1680 	 */
   1681 	public void test_setCharAtIC() {
   1682 		final String fixture = "0000";
   1683 		StringBuilder sb = new StringBuilder(fixture);
   1684 		sb.setCharAt(0, 'A');
   1685 		assertEquals("A000", sb.toString());
   1686 		sb.setCharAt(1, 'B');
   1687 		assertEquals("AB00", sb.toString());
   1688 		sb.setCharAt(2, 'C');
   1689 		assertEquals("ABC0", sb.toString());
   1690 		sb.setCharAt(3, 'D');
   1691 		assertEquals("ABCD", sb.toString());
   1692 
   1693 		try {
   1694 			sb.setCharAt(-1, 'A');
   1695 			fail("No IOOBE, negative index");
   1696 		} catch (IndexOutOfBoundsException e) {
   1697 			// Expected
   1698 		}
   1699 
   1700 		try {
   1701 			sb.setCharAt(4, 'A');
   1702 			fail("No IOOBE, index == length");
   1703 		} catch (IndexOutOfBoundsException e) {
   1704 			// Expected
   1705 		}
   1706 
   1707 		try {
   1708 			sb.setCharAt(5, 'A');
   1709 			fail("No IOOBE, index > length");
   1710 		} catch (IndexOutOfBoundsException e) {
   1711 			// Expected
   1712 		}
   1713 	}
   1714 
   1715 	/**
   1716 	 * @tests java.lang.StringBuilder.setLength(int)'
   1717 	 */
   1718 	public void test_setLengthI() {
   1719 		final String fixture = "0123456789";
   1720 		StringBuilder sb = new StringBuilder(fixture);
   1721 		sb.setLength(5);
   1722 		assertEquals(5, sb.length());
   1723 		assertEquals("01234", sb.toString());
   1724 		sb.setLength(6);
   1725 		assertEquals(6, sb.length());
   1726 		assertEquals("01234\0", sb.toString());
   1727 		sb.setLength(0);
   1728 		assertEquals(0, sb.length());
   1729 		assertEquals("", sb.toString());
   1730 
   1731 		try {
   1732 			sb.setLength(-1);
   1733 			fail("No IOOBE, negative length.");
   1734 		} catch (IndexOutOfBoundsException e) {
   1735 			// Expected
   1736 		}
   1737 
   1738         sb = new StringBuilder("abcde");
   1739         assertEquals("abcde", sb.toString());
   1740         sb.setLength(1);
   1741         sb.append('g');
   1742         assertEquals("ag", sb.toString());
   1743 
   1744         sb = new StringBuilder("abcde");
   1745         sb.setLength(3);
   1746         sb.append('g');
   1747         assertEquals("abcg", sb.toString());
   1748 
   1749         sb = new StringBuilder("abcde");
   1750         sb.setLength(2);
   1751         try {
   1752             sb.charAt(3);
   1753             fail("should throw IndexOutOfBoundsException");
   1754         } catch (IndexOutOfBoundsException e) {
   1755             // Expected
   1756         }
   1757 
   1758         sb = new StringBuilder();
   1759         sb.append("abcdefg");
   1760         sb.setLength(2);
   1761         sb.setLength(5);
   1762         for (int i = 2; i < 5; i++) {
   1763             assertEquals(0, sb.charAt(i));
   1764         }
   1765 
   1766         sb = new StringBuilder();
   1767         sb.append("abcdefg");
   1768         sb.delete(2, 4);
   1769         sb.setLength(7);
   1770         assertEquals('a', sb.charAt(0));
   1771         assertEquals('b', sb.charAt(1));
   1772         assertEquals('e', sb.charAt(2));
   1773         assertEquals('f', sb.charAt(3));
   1774         assertEquals('g', sb.charAt(4));
   1775         for (int i = 5; i < 7; i++) {
   1776             assertEquals(0, sb.charAt(i));
   1777         }
   1778 
   1779         sb = new StringBuilder();
   1780         sb.append("abcdefg");
   1781         sb.replace(2, 5, "z");
   1782         sb.setLength(7);
   1783         for (int i = 5; i < 7; i++) {
   1784             assertEquals(0, sb.charAt(i));
   1785         }
   1786 	}
   1787 
   1788 	/**
   1789 	 * @tests java.lang.StringBuilder.subSequence(int, int)
   1790 	 */
   1791 	public void test_subSequenceII() {
   1792 		final String fixture = "0123456789";
   1793 		StringBuilder sb = new StringBuilder(fixture);
   1794 		CharSequence ss = sb.subSequence(0, 5);
   1795 		assertEquals("01234", ss.toString());
   1796 
   1797 		ss = sb.subSequence(0, 0);
   1798 		assertEquals("", ss.toString());
   1799 
   1800 		try {
   1801 			sb.subSequence(-1, 1);
   1802 			fail("No IOOBE, negative start.");
   1803 		} catch (IndexOutOfBoundsException e) {
   1804 			// Expected
   1805 		}
   1806 
   1807 		try {
   1808 			sb.subSequence(0, -1);
   1809 			fail("No IOOBE, negative end.");
   1810 		} catch (IndexOutOfBoundsException e) {
   1811 			// Expected
   1812 		}
   1813 
   1814 		try {
   1815 			sb.subSequence(0, fixture.length() + 1);
   1816 			fail("No IOOBE, end > length.");
   1817 		} catch (IndexOutOfBoundsException e) {
   1818 			// Expected
   1819 		}
   1820 
   1821 		try {
   1822 			sb.subSequence(3, 2);
   1823 			fail("No IOOBE, start > end.");
   1824 		} catch (IndexOutOfBoundsException e) {
   1825 			// Expected
   1826 		}
   1827 	}
   1828 
   1829 	/**
   1830 	 * @tests java.lang.StringBuilder.substring(int)
   1831 	 */
   1832 	public void test_substringI() {
   1833 		final String fixture = "0123456789";
   1834 		StringBuilder sb = new StringBuilder(fixture);
   1835 		String ss = sb.substring(0);
   1836 		assertEquals(fixture, ss);
   1837 
   1838 		ss = sb.substring(10);
   1839 		assertEquals("", ss);
   1840 
   1841 		try {
   1842 			sb.substring(-1);
   1843 			fail("No SIOOBE, negative start.");
   1844 		} catch (StringIndexOutOfBoundsException e) {
   1845 			// Expected
   1846 		}
   1847 
   1848 		try {
   1849 			sb.substring(0, -1);
   1850 			fail("No SIOOBE, negative end.");
   1851 		} catch (StringIndexOutOfBoundsException e) {
   1852 			// Expected
   1853 		}
   1854 
   1855 		try {
   1856 			sb.substring(fixture.length() + 1);
   1857 			fail("No SIOOBE, start > length.");
   1858 		} catch (StringIndexOutOfBoundsException e) {
   1859 			// Expected
   1860 		}
   1861 	}
   1862 
   1863 	/**
   1864 	 * @tests java.lang.StringBuilder.substring(int, int)
   1865 	 */
   1866 	public void test_substringII() {
   1867 		final String fixture = "0123456789";
   1868 		StringBuilder sb = new StringBuilder(fixture);
   1869 		String ss = sb.substring(0, 5);
   1870 		assertEquals("01234", ss);
   1871 
   1872 		ss = sb.substring(0, 0);
   1873 		assertEquals("", ss);
   1874 
   1875 		try {
   1876 			sb.substring(-1, 1);
   1877 			fail("No SIOOBE, negative start.");
   1878 		} catch (StringIndexOutOfBoundsException e) {
   1879 			// Expected
   1880 		}
   1881 
   1882 		try {
   1883 			sb.substring(0, -1);
   1884 			fail("No SIOOBE, negative end.");
   1885 		} catch (StringIndexOutOfBoundsException e) {
   1886 			// Expected
   1887 		}
   1888 
   1889 		try {
   1890 			sb.substring(0, fixture.length() + 1);
   1891 			fail("No SIOOBE, end > length.");
   1892 		} catch (StringIndexOutOfBoundsException e) {
   1893 			// Expected
   1894 		}
   1895 
   1896 		try {
   1897 			sb.substring(3, 2);
   1898 			fail("No SIOOBE, start > end.");
   1899 		} catch (StringIndexOutOfBoundsException e) {
   1900 			// Expected
   1901 		}
   1902 	}
   1903 
   1904     /**
   1905      * @tests java.lang.StringBuilder.toString()'
   1906      */
   1907     public void test_toString() throws Exception {
   1908         final String fixture = "0123456789";
   1909         StringBuilder sb = new StringBuilder(fixture);
   1910         assertEquals(fixture, sb.toString());
   1911 
   1912         sb.setLength(0);
   1913         sb.append("abcde");
   1914         assertEquals("abcde", sb.toString());
   1915         sb.setLength(1000);
   1916         byte[] bytes = sb.toString().getBytes("GB18030");
   1917         for (int i = 5; i < bytes.length; i++) {
   1918             assertEquals(0, bytes[i]);
   1919         }
   1920 
   1921         sb.setLength(5);
   1922         sb.append("fghij");
   1923         assertEquals("abcdefghij", sb.toString());
   1924     }
   1925 
   1926 	/**
   1927 	 * @tests java.lang.StringBuilder.trimToSize()'
   1928 	 */
   1929 	public void test_trimToSize() {
   1930 		final String fixture = "0123456789";
   1931 		StringBuilder sb = new StringBuilder(fixture);
   1932 		assertTrue(sb.capacity() > fixture.length());
   1933 		assertEquals(fixture.length(), sb.length());
   1934 		assertEquals(fixture, sb.toString());
   1935 		int prevCapacity = sb.capacity();
   1936 		sb.trimToSize();
   1937 		assertTrue(prevCapacity > sb.capacity());
   1938 		assertEquals(fixture.length(), sb.length());
   1939 		assertEquals(fixture, sb.toString());
   1940 	}
   1941 
   1942     // comparator for StringBuilder objects
   1943     private static final SerializableAssert STRING_BILDER_COMPARATOR = new SerializableAssert() {
   1944         public void assertDeserialized(Serializable initial,
   1945                 Serializable deserialized) {
   1946 
   1947             StringBuilder init = (StringBuilder) initial;
   1948             StringBuilder desr = (StringBuilder) deserialized;
   1949 
   1950             assertEquals("toString", init.toString(), desr.toString());
   1951         }
   1952     };
   1953 
   1954     /**
   1955      * @tests serialization/deserialization.
   1956      */
   1957     public void testSerializationSelf() throws Exception {
   1958 
   1959         SerializationTest.verifySelf(new StringBuilder("0123456789"),
   1960                 STRING_BILDER_COMPARATOR);
   1961     }
   1962 
   1963     /**
   1964      * @tests serialization/deserialization compatibility with RI.
   1965      */
   1966     public void testSerializationCompatibility() throws Exception {
   1967 
   1968         SerializationTest.verifyGolden(this, new StringBuilder("0123456789"),
   1969                 STRING_BILDER_COMPARATOR);
   1970     }
   1971 
   1972 	private static final class Fixture {
   1973 		static final Fixture INSTANCE = new Fixture();
   1974 
   1975 		private Fixture() {
   1976 			super();
   1977 		}
   1978 
   1979 		@Override
   1980         public String toString() {
   1981 			return "fixture";
   1982 		}
   1983 	}
   1984 }
   1985