Path: blob/master/test/jdk/java/lang/StringBuffer/CompactStringBuffer.java
41149 views
/*1* Copyright (c) 2015, 2019, Oracle and/or its affiliates. All rights reserved.2* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.3*4* This code is free software; you can redistribute it and/or modify it5* under the terms of the GNU General Public License version 2 only, as6* published by the Free Software Foundation.7*8* This code is distributed in the hope that it will be useful, but WITHOUT9* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or10* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License11* version 2 for more details (a copy is included in the LICENSE file that12* accompanied this code).13*14* You should have received a copy of the GNU General Public License version15* 2 along with this work; if not, write to the Free Software Foundation,16* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.17*18* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA19* or visit www.oracle.com if you need additional information or have any20* questions.21*/2223import java.util.Arrays;2425import org.testng.annotations.Test;2627import static org.testng.Assert.assertEquals;28import static org.testng.Assert.assertTrue;2930/*31* @test32* @bug 8077559 822143033* @summary Tests Compact String. This test is testing StringBuffer34* behavior related to Compact String.35* @run testng/othervm -XX:+CompactStrings CompactStringBuffer36* @run testng/othervm -XX:-CompactStrings CompactStringBuffer37*/3839public class CompactStringBuffer {4041/*42* Tests for "A"43*/44@Test45public void testCompactStringBufferForLatinA() {46final String ORIGIN = "A";47/*48* Because right now ASCII is the default encoding parameter for source49* code in JDK build environment, so we escape them. same as below.50*/51check(new StringBuffer(ORIGIN).append(new char[] { '\uFF21' }),52"A\uFF21");53check(new StringBuffer(ORIGIN).append(new StringBuffer("\uFF21")),54"A\uFF21");55check(new StringBuffer(ORIGIN).append("\uFF21"), "A\uFF21");56check(new StringBuffer(ORIGIN).append(new StringBuffer("\uFF21")),57"A\uFF21");58check(new StringBuffer(ORIGIN).delete(0, 1), "");59check(new StringBuffer(ORIGIN).delete(0, 0), "A");60check(new StringBuffer(ORIGIN).deleteCharAt(0), "");61assertEquals(new StringBuffer(ORIGIN).indexOf("A", 0), 0);62assertEquals(new StringBuffer(ORIGIN).indexOf("\uFF21", 0), -1);63assertEquals(new StringBuffer(ORIGIN).indexOf("", 0), 0);64assertEquals(new StringBuffer(ORIGIN).insert(1, "\uD801\uDC00")65.indexOf("A", 0), 0);66assertEquals(new StringBuffer(ORIGIN).insert(0, "\uD801\uDC00")67.indexOf("A", 0), 2);68check(new StringBuffer(ORIGIN).insert(0, new char[] {}), "A");69check(new StringBuffer(ORIGIN).insert(1, new char[] { '\uFF21' }),70"A\uFF21");71check(new StringBuffer(ORIGIN).insert(0, new char[] { '\uFF21' }),72"\uFF21A");73check(new StringBuffer(ORIGIN).insert(0, new StringBuffer("\uFF21")),74"\uFF21A");75check(new StringBuffer(ORIGIN).insert(1, new StringBuffer("\uFF21")),76"A\uFF21");77check(new StringBuffer(ORIGIN).insert(0, ""), "A");78check(new StringBuffer(ORIGIN).insert(0, "\uFF21"), "\uFF21A");79check(new StringBuffer(ORIGIN).insert(1, "\uFF21"), "A\uFF21");80assertEquals(new StringBuffer(ORIGIN).lastIndexOf("A"), 0);81assertEquals(new StringBuffer(ORIGIN).lastIndexOf("\uFF21"), -1);82assertEquals(new StringBuffer(ORIGIN).lastIndexOf(""), 1);83check(new StringBuffer(ORIGIN).replace(0, 0, "\uFF21"), "\uFF21A");84check(new StringBuffer(ORIGIN).replace(0, 1, "\uFF21"), "\uFF21");85checkSetCharAt(new StringBuffer(ORIGIN), 0, '\uFF21', "\uFF21");86checkSetLength(new StringBuffer(ORIGIN), 0, "");87checkSetLength(new StringBuffer(ORIGIN), 1, "A");88check(new StringBuffer(ORIGIN).substring(0), "A");89check(new StringBuffer(ORIGIN).substring(1), "");90}9192/*93* Tests for "\uFF21"94*/95@Test96public void testCompactStringBufferForNonLatinA() {97final String ORIGIN = "\uFF21";98check(new StringBuffer(ORIGIN).append(new char[] { 'A' }), "\uFF21A");99check(new StringBuffer(ORIGIN).append(new StringBuffer("A")), "\uFF21A");100check(new StringBuffer(ORIGIN).append("A"), "\uFF21A");101check(new StringBuffer(ORIGIN).append(new StringBuffer("A")), "\uFF21A");102check(new StringBuffer(ORIGIN).delete(0, 1), "");103check(new StringBuffer(ORIGIN).delete(0, 0), "\uFF21");104check(new StringBuffer(ORIGIN).deleteCharAt(0), "");105assertEquals(new StringBuffer(ORIGIN).indexOf("A", 0), -1);106assertEquals(new StringBuffer(ORIGIN).indexOf("\uFF21", 0), 0);107assertEquals(new StringBuffer(ORIGIN).indexOf("", 0), 0);108check(new StringBuffer(ORIGIN).insert(0, new char[] {}), "\uFF21");109check(new StringBuffer(ORIGIN).insert(1, new char[] { 'A' }), "\uFF21A");110check(new StringBuffer(ORIGIN).insert(0, new char[] { 'A' }), "A\uFF21");111check(new StringBuffer(ORIGIN).insert(0, new StringBuffer("A")),112"A\uFF21");113check(new StringBuffer(ORIGIN).insert(1, new StringBuffer("A")),114"\uFF21A");115check(new StringBuffer(ORIGIN).insert(0, ""), "\uFF21");116check(new StringBuffer(ORIGIN).insert(0, "A"), "A\uFF21");117check(new StringBuffer(ORIGIN).insert(1, "A"), "\uFF21A");118assertEquals(new StringBuffer(ORIGIN).lastIndexOf("A"), -1);119assertEquals(new StringBuffer(ORIGIN).lastIndexOf("\uFF21"), 0);120assertEquals(new StringBuffer(ORIGIN).lastIndexOf(""), 1);121check(new StringBuffer(ORIGIN).replace(0, 0, "A"), "A\uFF21");122check(new StringBuffer(ORIGIN).replace(0, 1, "A"), "A");123checkSetCharAt(new StringBuffer(ORIGIN), 0, 'A', "A");124checkSetLength(new StringBuffer(ORIGIN), 0, "");125checkSetLength(new StringBuffer(ORIGIN), 1, "\uFF21");126check(new StringBuffer(ORIGIN).substring(0), "\uFF21");127check(new StringBuffer(ORIGIN).substring(1), "");128}129130/*131* Tests for "\uFF21A"132*/133@Test134public void testCompactStringBufferForMixedA1() {135final String ORIGIN = "\uFF21A";136check(new StringBuffer(ORIGIN).delete(0, 1), "A");137check(new StringBuffer(ORIGIN).delete(1, 2), "\uFF21");138check(new StringBuffer(ORIGIN).deleteCharAt(1), "\uFF21");139check(new StringBuffer(ORIGIN).deleteCharAt(0), "A");140assertEquals(new StringBuffer(ORIGIN).indexOf("A", 0), 1);141assertEquals(new StringBuffer(ORIGIN).indexOf("\uFF21", 0), 0);142assertEquals(new StringBuffer(ORIGIN).indexOf("", 0), 0);143check(new StringBuffer(ORIGIN).insert(1, new char[] { 'A' }), "\uFF21AA");144check(new StringBuffer(ORIGIN).insert(0, new char[] { '\uFF21' }),145"\uFF21\uFF21A");146assertEquals(new StringBuffer(ORIGIN).lastIndexOf("A"), 1);147assertEquals(new StringBuffer(ORIGIN).lastIndexOf("\uFF21"), 0);148assertEquals(new StringBuffer(ORIGIN).lastIndexOf(""), 2);149check(new StringBuffer(ORIGIN).replace(0, 0, "A"), "A\uFF21A");150check(new StringBuffer(ORIGIN).replace(0, 1, "A"), "AA");151checkSetCharAt(new StringBuffer(ORIGIN), 0, 'A', "AA");152checkSetLength(new StringBuffer(ORIGIN), 0, "");153checkSetLength(new StringBuffer(ORIGIN), 1, "\uFF21");154check(new StringBuffer(ORIGIN).substring(0), "\uFF21A");155check(new StringBuffer(ORIGIN).substring(1), "A");156}157158/*159* Tests for "A\uFF21"160*/161@Test162public void testCompactStringBufferForMixedA2() {163final String ORIGIN = "A\uFF21";164check(new StringBuffer(ORIGIN).replace(1, 2, "A"), "AA");165checkSetLength(new StringBuffer(ORIGIN), 1, "A");166check(new StringBuffer(ORIGIN).substring(0), "A\uFF21");167check(new StringBuffer(ORIGIN).substring(1), "\uFF21");168check(new StringBuffer(ORIGIN).substring(0, 1), "A");169}170171/*172* Tests for "\uFF21A\uFF21A\uFF21A\uFF21A\uFF21A"173*/174@Test175public void testCompactStringBufferForDuplicatedMixedA1() {176final String ORIGIN = "\uFF21A\uFF21A\uFF21A\uFF21A\uFF21A";177checkSetLength(new StringBuffer(ORIGIN), 1, "\uFF21");178assertEquals(new StringBuffer(ORIGIN).indexOf("A", 5), 5);179assertEquals(new StringBuffer(ORIGIN).indexOf("\uFF21", 5), 6);180assertEquals(new StringBuffer(ORIGIN).lastIndexOf("A"), 9);181assertEquals(new StringBuffer(ORIGIN).lastIndexOf("\uFF21"), 8);182assertEquals(new StringBuffer(ORIGIN).lastIndexOf(""), 10);183check(new StringBuffer(ORIGIN).substring(9), "A");184check(new StringBuffer(ORIGIN).substring(8), "\uFF21A");185}186187/*188* Tests for "A\uFF21A\uFF21A\uFF21A\uFF21A\uFF21"189*/190@Test191public void testCompactStringBufferForDuplicatedMixedA2() {192final String ORIGIN = "A\uFF21A\uFF21A\uFF21A\uFF21A\uFF21";193checkSetLength(new StringBuffer(ORIGIN), 1, "A");194assertEquals(new StringBuffer(ORIGIN).indexOf("A", 5), 6);195assertEquals(new StringBuffer(ORIGIN).indexOf("\uFF21", 5), 5);196assertEquals(new StringBuffer(ORIGIN).lastIndexOf("A"), 8);197assertEquals(new StringBuffer(ORIGIN).lastIndexOf("\uFF21"), 9);198check(new StringBuffer(ORIGIN).substring(9), "\uFF21");199check(new StringBuffer(ORIGIN).substring(8), "A\uFF21");200}201202/*203* Tests for "\uD801\uDC00\uD801\uDC01"204*/205@Test206public void testCompactStringForSupplementaryCodePoint() {207final String ORIGIN = "\uD801\uDC00\uD801\uDC01";208check(new StringBuffer(ORIGIN).append("A"), "\uD801\uDC00\uD801\uDC01A");209check(new StringBuffer(ORIGIN).append("\uFF21"),210"\uD801\uDC00\uD801\uDC01\uFF21");211check(new StringBuffer(ORIGIN).appendCodePoint('A'),212"\uD801\uDC00\uD801\uDC01A");213check(new StringBuffer(ORIGIN).appendCodePoint('\uFF21'),214"\uD801\uDC00\uD801\uDC01\uFF21");215assertEquals(new StringBuffer(ORIGIN).charAt(0), '\uD801');216assertEquals(new StringBuffer(ORIGIN).codePointAt(0),217Character.codePointAt(ORIGIN, 0));218assertEquals(new StringBuffer(ORIGIN).codePointAt(1),219Character.codePointAt(ORIGIN, 1));220assertEquals(new StringBuffer(ORIGIN).codePointBefore(2),221Character.codePointAt(ORIGIN, 0));222assertEquals(new StringBuffer(ORIGIN).codePointCount(1, 3), 2);223check(new StringBuffer(ORIGIN).delete(0, 2), "\uD801\uDC01");224check(new StringBuffer(ORIGIN).delete(0, 3), "\uDC01");225check(new StringBuffer(ORIGIN).deleteCharAt(1), "\uD801\uD801\uDC01");226checkGetChars(new StringBuffer(ORIGIN), 0, 3, new char[] { '\uD801',227'\uDC00', '\uD801' });228assertEquals(new StringBuffer(ORIGIN).indexOf("\uD801\uDC01"), 2);229assertEquals(new StringBuffer(ORIGIN).indexOf("\uDC01"), 3);230assertEquals(new StringBuffer(ORIGIN).indexOf("\uFF21"), -1);231assertEquals(new StringBuffer(ORIGIN).indexOf("A"), -1);232check(new StringBuffer(ORIGIN).insert(0, "\uFF21"),233"\uFF21\uD801\uDC00\uD801\uDC01");234check(new StringBuffer(ORIGIN).insert(1, "\uFF21"),235"\uD801\uFF21\uDC00\uD801\uDC01");236check(new StringBuffer(ORIGIN).insert(1, "A"),237"\uD801A\uDC00\uD801\uDC01");238assertEquals(new StringBuffer(ORIGIN).lastIndexOf("\uDC00\uD801"), 1);239assertEquals(new StringBuffer(ORIGIN).lastIndexOf("\uD801"), 2);240assertEquals(new StringBuffer(ORIGIN).lastIndexOf("\uFF21"), -1);241assertEquals(new StringBuffer(ORIGIN).lastIndexOf("A"), -1);242assertEquals(new StringBuffer(ORIGIN).length(), 4);243assertEquals(new StringBuffer(ORIGIN).offsetByCodePoints(1, 1), 2);244assertEquals(new StringBuffer(ORIGIN).offsetByCodePoints(0, 1), 2);245check(new StringBuffer(ORIGIN).replace(0, 2, "A"), "A\uD801\uDC01");246check(new StringBuffer(ORIGIN).replace(0, 3, "A"), "A\uDC01");247check(new StringBuffer(ORIGIN).replace(0, 2, "\uFF21"),248"\uFF21\uD801\uDC01");249check(new StringBuffer(ORIGIN).replace(0, 3, "\uFF21"), "\uFF21\uDC01");250check(new StringBuffer(ORIGIN).reverse(), "\uD801\uDC01\uD801\uDC00");251checkSetCharAt(new StringBuffer(ORIGIN), 1, '\uDC01',252"\uD801\uDC01\uD801\uDC01");253checkSetCharAt(new StringBuffer(ORIGIN), 1, 'A', "\uD801A\uD801\uDC01");254checkSetLength(new StringBuffer(ORIGIN), 2, "\uD801\uDC00");255checkSetLength(new StringBuffer(ORIGIN), 3, "\uD801\uDC00\uD801");256check(new StringBuffer(ORIGIN).substring(1, 3), "\uDC00\uD801");257}258259/*260* Tests for "A\uD801\uDC00\uFF21"261*/262@Test263public void testCompactStringForSupplementaryCodePointMixed1() {264final String ORIGIN = "A\uD801\uDC00\uFF21";265assertEquals(new StringBuffer(ORIGIN).codePointBefore(3),266Character.codePointAt(ORIGIN, 1));267assertEquals(new StringBuffer(ORIGIN).codePointBefore(2), '\uD801');268assertEquals(new StringBuffer(ORIGIN).codePointBefore(1), 'A');269assertEquals(new StringBuffer(ORIGIN).codePointCount(0, 3), 2);270assertEquals(new StringBuffer(ORIGIN).codePointCount(0, 4), 3);271check(new StringBuffer(ORIGIN).delete(0, 1), "\uD801\uDC00\uFF21");272check(new StringBuffer(ORIGIN).delete(0, 1).delete(2, 3), "\uD801\uDC00");273check(new StringBuffer(ORIGIN).deleteCharAt(3).deleteCharAt(0),274"\uD801\uDC00");275assertEquals(new StringBuffer(ORIGIN).indexOf("\uFF21"), 3);276assertEquals(new StringBuffer(ORIGIN).indexOf("A"), 0);277assertEquals(new StringBuffer(ORIGIN).lastIndexOf("\uFF21"), 3);278assertEquals(new StringBuffer(ORIGIN).lastIndexOf("A"), 0);279assertEquals(new StringBuffer(ORIGIN).offsetByCodePoints(0, 1), 1);280assertEquals(new StringBuffer(ORIGIN).offsetByCodePoints(1, 1), 3);281check(new StringBuffer(ORIGIN).replace(1, 3, "A"), "AA\uFF21");282check(new StringBuffer(ORIGIN).replace(1, 4, "A"), "AA");283check(new StringBuffer(ORIGIN).replace(1, 4, ""), "A");284check(new StringBuffer(ORIGIN).reverse(), "\uFF21\uD801\uDC00A");285checkSetLength(new StringBuffer(ORIGIN), 1, "A");286check(new StringBuffer(ORIGIN).substring(0, 1), "A");287}288289/*290* Tests for "\uD801\uDC00\uFF21A"291*/292@Test293public void testCompactStringForSupplementaryCodePointMixed2() {294final String ORIGIN = "\uD801\uDC00\uFF21A";295assertEquals(new StringBuffer(ORIGIN).codePointBefore(3),296Character.codePointAt(ORIGIN, 2));297assertEquals(new StringBuffer(ORIGIN).codePointBefore(2),298Character.codePointAt(ORIGIN, 0));299assertEquals(new StringBuffer(ORIGIN).codePointBefore(1), '\uD801');300assertEquals(new StringBuffer(ORIGIN).codePointCount(0, 3), 2);301assertEquals(new StringBuffer(ORIGIN).codePointCount(0, 4), 3);302check(new StringBuffer(ORIGIN).delete(0, 2), "\uFF21A");303check(new StringBuffer(ORIGIN).delete(0, 3), "A");304check(new StringBuffer(ORIGIN).deleteCharAt(0).deleteCharAt(0)305.deleteCharAt(0), "A");306assertEquals(new StringBuffer(ORIGIN).indexOf("A"), 3);307assertEquals(new StringBuffer(ORIGIN).delete(0, 3).indexOf("A"), 0);308assertEquals(new StringBuffer(ORIGIN).replace(0, 3, "B").indexOf("A"),3091);310assertEquals(new StringBuffer(ORIGIN).substring(3, 4).indexOf("A"), 0);311assertEquals(new StringBuffer(ORIGIN).offsetByCodePoints(1, 1), 2);312assertEquals(new StringBuffer(ORIGIN).offsetByCodePoints(0, 1), 2);313assertEquals(new StringBuffer(ORIGIN).offsetByCodePoints(2, 1), 3);314check(new StringBuffer(ORIGIN).replace(0, 3, "B"), "BA");315check(new StringBuffer(ORIGIN).reverse(), "A\uFF21\uD801\uDC00");316}317318/*319* Tests for "\uD801A\uDC00\uFF21"320*/321@Test322public void testCompactStringForSupplementaryCodePointMixed3() {323final String ORIGIN = "\uD801A\uDC00\uFF21";324assertEquals(new StringBuffer(ORIGIN).codePointAt(1), 'A');325assertEquals(new StringBuffer(ORIGIN).codePointAt(3), '\uFF21');326assertEquals(new StringBuffer(ORIGIN).codePointBefore(1), '\uD801');327assertEquals(new StringBuffer(ORIGIN).codePointBefore(2), 'A');328assertEquals(new StringBuffer(ORIGIN).codePointBefore(3), '\uDC00');329assertEquals(new StringBuffer(ORIGIN).codePointCount(0, 3), 3);330assertEquals(new StringBuffer(ORIGIN).codePointCount(1, 3), 2);331assertEquals(new StringBuffer(ORIGIN).delete(0, 1).delete(1, 3)332.indexOf("A"), 0);333assertEquals(334new StringBuffer(ORIGIN).replace(0, 1, "B").replace(2, 4, "C")335.indexOf("A"), 1);336assertEquals(new StringBuffer(ORIGIN).substring(1, 4).substring(0, 1)337.indexOf("A"), 0);338assertEquals(new StringBuffer(ORIGIN).offsetByCodePoints(0, 1), 1);339assertEquals(new StringBuffer(ORIGIN).offsetByCodePoints(1, 1), 2);340assertEquals(new StringBuffer(ORIGIN).offsetByCodePoints(2, 1), 3);341check(new StringBuffer(ORIGIN).reverse(), "\uFF21\uDC00A\uD801");342}343344/*345* Tests for "A\uDC01\uFF21\uD801"346*/347@Test348public void testCompactStringForSupplementaryCodePointMixed4() {349final String ORIGIN = "A\uDC01\uFF21\uD801";350assertEquals(new StringBuffer(ORIGIN).codePointAt(1), '\uDC01');351assertEquals(new StringBuffer(ORIGIN).codePointAt(3), '\uD801');352assertEquals(new StringBuffer(ORIGIN).codePointBefore(1), 'A');353assertEquals(new StringBuffer(ORIGIN).codePointBefore(2), '\uDC01');354assertEquals(new StringBuffer(ORIGIN).codePointBefore(3), '\uFF21');355assertEquals(new StringBuffer(ORIGIN).codePointCount(0, 3), 3);356assertEquals(new StringBuffer(ORIGIN).codePointCount(1, 3), 2);357assertEquals(new StringBuffer(ORIGIN).delete(1, 4).indexOf("A"), 0);358assertEquals(new StringBuffer(ORIGIN).replace(1, 4, "B").indexOf("A"),3590);360assertEquals(new StringBuffer(ORIGIN).substring(0, 1).indexOf("A"), 0);361assertEquals(new StringBuffer(ORIGIN).offsetByCodePoints(0, 1), 1);362assertEquals(new StringBuffer(ORIGIN).offsetByCodePoints(1, 1), 2);363assertEquals(new StringBuffer(ORIGIN).offsetByCodePoints(2, 1), 3);364check(new StringBuffer(ORIGIN).reverse(), "\uD801\uFF21\uDC01A");365}366367@Test368public void testCompactStringMisc() {369String ascii = "abcdefgh";370String asciiMixed = "abc" + "\u4e00\u4e01\u4e02" + "fgh";371String bmp = "\u4e00\u4e01\u4e02\u4e03\u4e04\u4e05\u4e06\u4e07\u4e08";372String bmpMixed = "\u4e00\u4e01\u4e02" + "ABC" + "\u4e06\u4e07\u4e08";373374check(new StringBuffer().append(ascii).delete(0, 20).toString(),375"");376check(new StringBuffer().append(ascii).delete(3, 20).toString(),377"abc");378check(new StringBuffer().append(ascii).delete(3, 6).toString(),379"abcgh");380check(new StringBuffer().append(ascii).deleteCharAt(0).toString(),381"bcdefgh");382check(new StringBuffer().append(ascii).deleteCharAt(3).toString(),383"abcefgh");384check(new StringBuffer().append(asciiMixed).delete(3, 6).toString(),385"abcfgh");386check(new StringBuffer().append(asciiMixed).deleteCharAt(3).toString(),387"abc\u4e01\u4e02fgh");388check(new StringBuffer().append(asciiMixed).deleteCharAt(3)389.deleteCharAt(3)390.deleteCharAt(3).toString(),391"abcfgh");392check(new StringBuffer().append(bmp).delete(0, 20).toString(),393"");394check(new StringBuffer().append(bmp).delete(3, 20).toString(),395"\u4e00\u4e01\u4e02");396check(new StringBuffer().append(bmp).delete(3, 6).toString(),397"\u4e00\u4e01\u4e02\u4e06\u4e07\u4e08");398check(new StringBuffer().append(bmp).deleteCharAt(0).toString(),399"\u4e01\u4e02\u4e03\u4e04\u4e05\u4e06\u4e07\u4e08");400check(new StringBuffer().append(bmp).deleteCharAt(3).toString(),401"\u4e00\u4e01\u4e02\u4e04\u4e05\u4e06\u4e07\u4e08");402check(new StringBuffer().append(bmpMixed).delete(3, 6).toString(),403"\u4e00\u4e01\u4e02\u4e06\u4e07\u4e08");404405////////////////////////////////////////////////////////////////////406check(new StringBuffer().append(ascii).replace(3, 6, "AB").toString(),407"abcABgh");408check(new StringBuffer().append(asciiMixed).replace(3, 6, "AB").toString(),409"abcABfgh");410check(new StringBuffer().append(bmp).replace(3, 6, "AB").toString(),411"\u4e00\u4e01\u4e02AB\u4e06\u4e07\u4e08");412413check(new StringBuffer().append(bmpMixed).replace(3, 6, "").toString(),414"\u4e00\u4e01\u4e02\u4e06\u4e07\u4e08");415416check(new StringBuffer().append(ascii).replace(3, 6, "\u4e01\u4e02").toString(),417"abc\u4e01\u4e02gh");418419////////////////////////////////////////////////////////////////////420check(new StringBuffer().append(ascii).insert(3, "").toString(),421"abcdefgh");422check(new StringBuffer().append(ascii).insert(3, "AB").toString(),423"abcABdefgh");424check(new StringBuffer().append(ascii).insert(3, "\u4e01\u4e02").toString(),425"abc\u4e01\u4e02defgh");426427check(new StringBuffer().append(asciiMixed).insert(0, 'A').toString(),428"Aabc\u4e00\u4e01\u4e02fgh");429check(new StringBuffer().append(asciiMixed).insert(3, "A").toString(),430"abcA\u4e00\u4e01\u4e02fgh");431432check(new StringBuffer().append(ascii).insert(3, 1234567).toString(),433"abc1234567defgh");434check(new StringBuffer().append(bmp).insert(3, 1234567).toString(),435"\u4e00\u4e01\u4e021234567\u4e03\u4e04\u4e05\u4e06\u4e07\u4e08");436437////////////////////////////////////////////////////////////////////438check(new StringBuffer().append(ascii).append(1.23456).toString(),439"abcdefgh1.23456");440check(new StringBuffer().append(bmp).append(1.23456).toString(),441"\u4e00\u4e01\u4e02\u4e03\u4e04\u4e05\u4e06\u4e07\u4e081.23456");442443////////////////////////////////////////////////////////////////////444check(new StringBuffer((CharSequence)new StringBuffer(ascii)).toString(),445ascii);446check(new StringBuffer((CharSequence)new StringBuffer(asciiMixed)).toString(),447asciiMixed);448}449450private void checkGetChars(StringBuffer sb, int srcBegin, int srcEnd,451char expected[]) {452char[] dst = new char[srcEnd - srcBegin];453sb.getChars(srcBegin, srcEnd, dst, 0);454assertTrue(Arrays.equals(dst, expected));455}456457private void checkSetCharAt(StringBuffer sb, int index, char ch,458String expected) {459sb.setCharAt(index, ch);460check(sb, expected);461}462463private void checkSetLength(StringBuffer sb, int newLength, String expected) {464sb.setLength(newLength);465check(sb, expected);466}467468private void check(StringBuffer sb, String expected) {469check(sb.toString(), expected);470}471472private void check(String str, String expected) {473assertTrue(str.equals(expected), String.format(474"Get (%s) but expect (%s), ", escapeNonASCIIs(str),475escapeNonASCIIs(expected)));476}477478/*479* Escape non-ASCII characters since not all systems support them.480*/481private String escapeNonASCIIs(String str) {482StringBuilder sb = new StringBuilder();483for (int i = 0; i < str.length(); i++) {484char c = str.charAt(i);485if (c > 0x7F) {486sb.append("\\u").append(Integer.toHexString((int) c));487} else {488sb.append(c);489}490}491return sb.toString();492}493}494495496