Path: blob/master/test/jdk/java/lang/StringBuilder/CompactStringBuilder.java
41149 views
/*1* Copyright (c) 2015, 2018, 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 8054307 807755933* @summary Tests Compact String. This test is testing StringBuilder34* behavior related to Compact String.35* @run testng/othervm -XX:+CompactStrings CompactStringBuilder36* @run testng/othervm -XX:-CompactStrings CompactStringBuilder37*/3839public class CompactStringBuilder {4041/*42* Tests for "A"43*/44@Test45public void testCompactStringBuilderForLatinA() {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 StringBuilder(ORIGIN).append(new char[] { '\uFF21' }),52"A\uFF21");53check(new StringBuilder(ORIGIN).append(new StringBuffer("\uFF21")),54"A\uFF21");55check(new StringBuilder(ORIGIN).append("\uFF21"), "A\uFF21");56check(new StringBuilder(ORIGIN).append(new StringBuffer("\uFF21")),57"A\uFF21");58check(new StringBuilder(ORIGIN).delete(0, 1), "");59check(new StringBuilder(ORIGIN).delete(0, 0), "A");60check(new StringBuilder(ORIGIN).deleteCharAt(0), "");61assertEquals(new StringBuilder(ORIGIN).indexOf("A", 0), 0);62assertEquals(new StringBuilder(ORIGIN).indexOf("\uFF21", 0), -1);63assertEquals(new StringBuilder(ORIGIN).indexOf("", 0), 0);64assertEquals(new StringBuilder(ORIGIN).insert(1, "\uD801\uDC00")65.indexOf("A", 0), 0);66assertEquals(new StringBuilder(ORIGIN).insert(0, "\uD801\uDC00")67.indexOf("A", 0), 2);68check(new StringBuilder(ORIGIN).insert(0, new char[] {}), "A");69check(new StringBuilder(ORIGIN).insert(1, new char[] { '\uFF21' }),70"A\uFF21");71check(new StringBuilder(ORIGIN).insert(0, new char[] { '\uFF21' }),72"\uFF21A");73check(new StringBuilder(ORIGIN).insert(0, new StringBuffer("\uFF21")),74"\uFF21A");75check(new StringBuilder(ORIGIN).insert(1, new StringBuffer("\uFF21")),76"A\uFF21");77check(new StringBuilder(ORIGIN).insert(0, ""), "A");78check(new StringBuilder(ORIGIN).insert(0, "\uFF21"), "\uFF21A");79check(new StringBuilder(ORIGIN).insert(1, "\uFF21"), "A\uFF21");80assertEquals(new StringBuilder(ORIGIN).lastIndexOf("A"), 0);81assertEquals(new StringBuilder(ORIGIN).lastIndexOf("\uFF21"), -1);82assertEquals(new StringBuilder(ORIGIN).lastIndexOf(""), 1);83check(new StringBuilder(ORIGIN).replace(0, 0, "\uFF21"), "\uFF21A");84check(new StringBuilder(ORIGIN).replace(0, 1, "\uFF21"), "\uFF21");85checkSetCharAt(new StringBuilder(ORIGIN), 0, '\uFF21', "\uFF21");86checkSetLength(new StringBuilder(ORIGIN), 0, "");87checkSetLength(new StringBuilder(ORIGIN), 1, "A");88check(new StringBuilder(ORIGIN).substring(0), "A");89check(new StringBuilder(ORIGIN).substring(1), "");90}9192/*93* Tests for "\uFF21"94*/95@Test96public void testCompactStringBuilderForNonLatinA() {97final String ORIGIN = "\uFF21";98check(new StringBuilder(ORIGIN).append(new char[] { 'A' }), "\uFF21A");99check(new StringBuilder(ORIGIN).append(new StringBuffer("A")), "\uFF21A");100check(new StringBuilder(ORIGIN).append("A"), "\uFF21A");101check(new StringBuilder(ORIGIN).append(new StringBuffer("A")), "\uFF21A");102check(new StringBuilder(ORIGIN).delete(0, 1), "");103check(new StringBuilder(ORIGIN).delete(0, 0), "\uFF21");104check(new StringBuilder(ORIGIN).deleteCharAt(0), "");105assertEquals(new StringBuilder(ORIGIN).indexOf("A", 0), -1);106assertEquals(new StringBuilder(ORIGIN).indexOf("\uFF21", 0), 0);107assertEquals(new StringBuilder(ORIGIN).indexOf("", 0), 0);108check(new StringBuilder(ORIGIN).insert(0, new char[] {}), "\uFF21");109check(new StringBuilder(ORIGIN).insert(1, new char[] { 'A' }), "\uFF21A");110check(new StringBuilder(ORIGIN).insert(0, new char[] { 'A' }), "A\uFF21");111check(new StringBuilder(ORIGIN).insert(0, new StringBuffer("A")),112"A\uFF21");113check(new StringBuilder(ORIGIN).insert(1, new StringBuffer("A")),114"\uFF21A");115check(new StringBuilder(ORIGIN).insert(0, ""), "\uFF21");116check(new StringBuilder(ORIGIN).insert(0, "A"), "A\uFF21");117check(new StringBuilder(ORIGIN).insert(1, "A"), "\uFF21A");118assertEquals(new StringBuilder(ORIGIN).lastIndexOf("A"), -1);119assertEquals(new StringBuilder(ORIGIN).lastIndexOf("\uFF21"), 0);120assertEquals(new StringBuilder(ORIGIN).lastIndexOf(""), 1);121check(new StringBuilder(ORIGIN).replace(0, 0, "A"), "A\uFF21");122check(new StringBuilder(ORIGIN).replace(0, 1, "A"), "A");123checkSetCharAt(new StringBuilder(ORIGIN), 0, 'A', "A");124checkSetLength(new StringBuilder(ORIGIN), 0, "");125checkSetLength(new StringBuilder(ORIGIN), 1, "\uFF21");126check(new StringBuilder(ORIGIN).substring(0), "\uFF21");127check(new StringBuilder(ORIGIN).substring(1), "");128}129130/*131* Tests for "\uFF21A"132*/133@Test134public void testCompactStringBuilderForMixedA1() {135final String ORIGIN = "\uFF21A";136check(new StringBuilder(ORIGIN).delete(0, 1), "A");137check(new StringBuilder(ORIGIN).delete(1, 2), "\uFF21");138check(new StringBuilder(ORIGIN).deleteCharAt(1), "\uFF21");139check(new StringBuilder(ORIGIN).deleteCharAt(0), "A");140assertEquals(new StringBuilder(ORIGIN).indexOf("A", 0), 1);141assertEquals(new StringBuilder(ORIGIN).indexOf("\uFF21", 0), 0);142assertEquals(new StringBuilder(ORIGIN).indexOf("", 0), 0);143check(new StringBuilder(ORIGIN).insert(1, new char[] { 'A' }),144"\uFF21AA");145check(new StringBuilder(ORIGIN).insert(0, new char[] { '\uFF21' }),146"\uFF21\uFF21A");147assertEquals(new StringBuilder(ORIGIN).lastIndexOf("A"), 1);148assertEquals(new StringBuilder(ORIGIN).lastIndexOf("\uFF21"), 0);149assertEquals(new StringBuilder(ORIGIN).lastIndexOf(""), 2);150check(new StringBuilder(ORIGIN).replace(0, 0, "A"), "A\uFF21A");151check(new StringBuilder(ORIGIN).replace(0, 1, "A"), "AA");152checkSetCharAt(new StringBuilder(ORIGIN), 0, 'A', "AA");153checkSetLength(new StringBuilder(ORIGIN), 0, "");154checkSetLength(new StringBuilder(ORIGIN), 1, "\uFF21");155check(new StringBuilder(ORIGIN).substring(0), "\uFF21A");156check(new StringBuilder(ORIGIN).substring(1), "A");157}158159/*160* Tests for "A\uFF21"161*/162@Test163public void testCompactStringBuilderForMixedA2() {164final String ORIGIN = "A\uFF21";165check(new StringBuilder(ORIGIN).replace(1, 2, "A"), "AA");166checkSetLength(new StringBuilder(ORIGIN), 1, "A");167check(new StringBuilder(ORIGIN).substring(0), "A\uFF21");168check(new StringBuilder(ORIGIN).substring(1), "\uFF21");169check(new StringBuilder(ORIGIN).substring(0, 1), "A");170}171172/*173* Tests for "\uFF21A\uFF21A\uFF21A\uFF21A\uFF21A"174*/175@Test176public void testCompactStringBuilderForDuplicatedMixedA1() {177final String ORIGIN = "\uFF21A\uFF21A\uFF21A\uFF21A\uFF21A";178checkSetLength(new StringBuilder(ORIGIN), 1, "\uFF21");179assertEquals(new StringBuilder(ORIGIN).indexOf("A", 5), 5);180assertEquals(new StringBuilder(ORIGIN).indexOf("\uFF21", 5), 6);181assertEquals(new StringBuilder(ORIGIN).lastIndexOf("A"), 9);182assertEquals(new StringBuilder(ORIGIN).lastIndexOf("\uFF21"), 8);183assertEquals(new StringBuilder(ORIGIN).lastIndexOf(""), 10);184check(new StringBuilder(ORIGIN).substring(9), "A");185check(new StringBuilder(ORIGIN).substring(8), "\uFF21A");186}187188/*189* Tests for "A\uFF21A\uFF21A\uFF21A\uFF21A\uFF21"190*/191@Test192public void testCompactStringBuilderForDuplicatedMixedA2() {193final String ORIGIN = "A\uFF21A\uFF21A\uFF21A\uFF21A\uFF21";194checkSetLength(new StringBuilder(ORIGIN), 1, "A");195assertEquals(new StringBuilder(ORIGIN).indexOf("A", 5), 6);196assertEquals(new StringBuilder(ORIGIN).indexOf("\uFF21", 5), 5);197assertEquals(new StringBuilder(ORIGIN).lastIndexOf("A"), 8);198assertEquals(new StringBuilder(ORIGIN).lastIndexOf("\uFF21"), 9);199check(new StringBuilder(ORIGIN).substring(9), "\uFF21");200check(new StringBuilder(ORIGIN).substring(8), "A\uFF21");201}202203/*204* Tests for "\uD801\uDC00\uD801\uDC01"205*/206@Test207public void testCompactStringForSupplementaryCodePoint() {208final String ORIGIN = "\uD801\uDC00\uD801\uDC01";209check(new StringBuilder(ORIGIN).append("A"), "\uD801\uDC00\uD801\uDC01A");210check(new StringBuilder(ORIGIN).append("\uFF21"),211"\uD801\uDC00\uD801\uDC01\uFF21");212check(new StringBuilder(ORIGIN).appendCodePoint('A'),213"\uD801\uDC00\uD801\uDC01A");214check(new StringBuilder(ORIGIN).appendCodePoint('\uFF21'),215"\uD801\uDC00\uD801\uDC01\uFF21");216assertEquals(new StringBuilder(ORIGIN).charAt(0), '\uD801');217assertEquals(new StringBuilder(ORIGIN).codePointAt(0),218Character.codePointAt(ORIGIN, 0));219assertEquals(new StringBuilder(ORIGIN).codePointAt(1),220Character.codePointAt(ORIGIN, 1));221assertEquals(new StringBuilder(ORIGIN).codePointBefore(2),222Character.codePointAt(ORIGIN, 0));223assertEquals(new StringBuilder(ORIGIN).codePointCount(1, 3), 2);224check(new StringBuilder(ORIGIN).delete(0, 2), "\uD801\uDC01");225check(new StringBuilder(ORIGIN).delete(0, 3), "\uDC01");226check(new StringBuilder(ORIGIN).deleteCharAt(1), "\uD801\uD801\uDC01");227checkGetChars(new StringBuilder(ORIGIN), 0, 3, new char[] { '\uD801',228'\uDC00', '\uD801' });229assertEquals(new StringBuilder(ORIGIN).indexOf("\uD801\uDC01"), 2);230assertEquals(new StringBuilder(ORIGIN).indexOf("\uDC01"), 3);231assertEquals(new StringBuilder(ORIGIN).indexOf("\uFF21"), -1);232assertEquals(new StringBuilder(ORIGIN).indexOf("A"), -1);233check(new StringBuilder(ORIGIN).insert(0, "\uFF21"),234"\uFF21\uD801\uDC00\uD801\uDC01");235check(new StringBuilder(ORIGIN).insert(1, "\uFF21"),236"\uD801\uFF21\uDC00\uD801\uDC01");237check(new StringBuilder(ORIGIN).insert(1, "A"),238"\uD801A\uDC00\uD801\uDC01");239assertEquals(new StringBuilder(ORIGIN).lastIndexOf("\uDC00\uD801"), 1);240assertEquals(new StringBuilder(ORIGIN).lastIndexOf("\uD801"), 2);241assertEquals(new StringBuilder(ORIGIN).lastIndexOf("\uFF21"), -1);242assertEquals(new StringBuilder(ORIGIN).lastIndexOf("A"), -1);243assertEquals(new StringBuilder(ORIGIN).length(), 4);244assertEquals(new StringBuilder(ORIGIN).offsetByCodePoints(1, 1), 2);245assertEquals(new StringBuilder(ORIGIN).offsetByCodePoints(0, 1), 2);246check(new StringBuilder(ORIGIN).replace(0, 2, "A"), "A\uD801\uDC01");247check(new StringBuilder(ORIGIN).replace(0, 3, "A"), "A\uDC01");248check(new StringBuilder(ORIGIN).replace(0, 2, "\uFF21"),249"\uFF21\uD801\uDC01");250check(new StringBuilder(ORIGIN).replace(0, 3, "\uFF21"), "\uFF21\uDC01");251check(new StringBuilder(ORIGIN).reverse(), "\uD801\uDC01\uD801\uDC00");252checkSetCharAt(new StringBuilder(ORIGIN), 1, '\uDC01',253"\uD801\uDC01\uD801\uDC01");254checkSetCharAt(new StringBuilder(ORIGIN), 1, 'A', "\uD801A\uD801\uDC01");255checkSetLength(new StringBuilder(ORIGIN), 2, "\uD801\uDC00");256checkSetLength(new StringBuilder(ORIGIN), 3, "\uD801\uDC00\uD801");257check(new StringBuilder(ORIGIN).substring(1, 3), "\uDC00\uD801");258}259260/*261* Tests for "A\uD801\uDC00\uFF21"262*/263@Test264public void testCompactStringForSupplementaryCodePointMixed1() {265final String ORIGIN = "A\uD801\uDC00\uFF21";266assertEquals(new StringBuilder(ORIGIN).codePointBefore(3),267Character.codePointAt(ORIGIN, 1));268assertEquals(new StringBuilder(ORIGIN).codePointBefore(2), '\uD801');269assertEquals(new StringBuilder(ORIGIN).codePointBefore(1), 'A');270assertEquals(new StringBuilder(ORIGIN).codePointCount(0, 3), 2);271assertEquals(new StringBuilder(ORIGIN).codePointCount(0, 4), 3);272check(new StringBuilder(ORIGIN).delete(0, 1), "\uD801\uDC00\uFF21");273check(new StringBuilder(ORIGIN).delete(0, 1).delete(2, 3),274"\uD801\uDC00");275check(new StringBuilder(ORIGIN).deleteCharAt(3).deleteCharAt(0),276"\uD801\uDC00");277assertEquals(new StringBuilder(ORIGIN).indexOf("\uFF21"), 3);278assertEquals(new StringBuilder(ORIGIN).indexOf("A"), 0);279assertEquals(new StringBuilder(ORIGIN).lastIndexOf("\uFF21"), 3);280assertEquals(new StringBuilder(ORIGIN).lastIndexOf("A"), 0);281assertEquals(new StringBuilder(ORIGIN).offsetByCodePoints(0, 1), 1);282assertEquals(new StringBuilder(ORIGIN).offsetByCodePoints(1, 1), 3);283check(new StringBuilder(ORIGIN).replace(1, 3, "A"), "AA\uFF21");284check(new StringBuilder(ORIGIN).replace(1, 4, "A"), "AA");285check(new StringBuilder(ORIGIN).replace(1, 4, ""), "A");286check(new StringBuilder(ORIGIN).reverse(), "\uFF21\uD801\uDC00A");287checkSetLength(new StringBuilder(ORIGIN), 1, "A");288check(new StringBuilder(ORIGIN).substring(0, 1), "A");289}290291/*292* Tests for "\uD801\uDC00\uFF21A"293*/294@Test295public void testCompactStringForSupplementaryCodePointMixed2() {296final String ORIGIN = "\uD801\uDC00\uFF21A";297assertEquals(new StringBuilder(ORIGIN).codePointBefore(3),298Character.codePointAt(ORIGIN, 2));299assertEquals(new StringBuilder(ORIGIN).codePointBefore(2),300Character.codePointAt(ORIGIN, 0));301assertEquals(new StringBuilder(ORIGIN).codePointBefore(1), '\uD801');302assertEquals(new StringBuilder(ORIGIN).codePointCount(0, 3), 2);303assertEquals(new StringBuilder(ORIGIN).codePointCount(0, 4), 3);304check(new StringBuilder(ORIGIN).delete(0, 2), "\uFF21A");305check(new StringBuilder(ORIGIN).delete(0, 3), "A");306check(new StringBuilder(ORIGIN).deleteCharAt(0).deleteCharAt(0)307.deleteCharAt(0), "A");308assertEquals(new StringBuilder(ORIGIN).indexOf("A"), 3);309assertEquals(new StringBuilder(ORIGIN).delete(0, 3).indexOf("A"), 0);310assertEquals(new StringBuilder(ORIGIN).replace(0, 3, "B").indexOf("A"),3111);312assertEquals(new StringBuilder(ORIGIN).substring(3, 4).indexOf("A"), 0);313assertEquals(new StringBuilder(ORIGIN).offsetByCodePoints(1, 1), 2);314assertEquals(new StringBuilder(ORIGIN).offsetByCodePoints(0, 1), 2);315assertEquals(new StringBuilder(ORIGIN).offsetByCodePoints(2, 1), 3);316check(new StringBuilder(ORIGIN).replace(0, 3, "B"), "BA");317check(new StringBuilder(ORIGIN).reverse(), "A\uFF21\uD801\uDC00");318}319320/*321* Tests for "\uD801A\uDC00\uFF21"322*/323@Test324public void testCompactStringForSupplementaryCodePointMixed3() {325final String ORIGIN = "\uD801A\uDC00\uFF21";326assertEquals(new StringBuilder(ORIGIN).codePointAt(1), 'A');327assertEquals(new StringBuilder(ORIGIN).codePointAt(3), '\uFF21');328assertEquals(new StringBuilder(ORIGIN).codePointBefore(1), '\uD801');329assertEquals(new StringBuilder(ORIGIN).codePointBefore(2), 'A');330assertEquals(new StringBuilder(ORIGIN).codePointBefore(3), '\uDC00');331assertEquals(new StringBuilder(ORIGIN).codePointCount(0, 3), 3);332assertEquals(new StringBuilder(ORIGIN).codePointCount(1, 3), 2);333assertEquals(new StringBuilder(ORIGIN).delete(0, 1).delete(1, 3)334.indexOf("A"), 0);335assertEquals(336new StringBuilder(ORIGIN).replace(0, 1, "B").replace(2, 4, "C")337.indexOf("A"), 1);338assertEquals(new StringBuilder(ORIGIN).substring(1, 4).substring(0, 1)339.indexOf("A"), 0);340assertEquals(new StringBuilder(ORIGIN).offsetByCodePoints(0, 1), 1);341assertEquals(new StringBuilder(ORIGIN).offsetByCodePoints(1, 1), 2);342assertEquals(new StringBuilder(ORIGIN).offsetByCodePoints(2, 1), 3);343check(new StringBuilder(ORIGIN).reverse(), "\uFF21\uDC00A\uD801");344}345346/*347* Tests for "A\uDC01\uFF21\uD801"348*/349@Test350public void testCompactStringForSupplementaryCodePointMixed4() {351final String ORIGIN = "A\uDC01\uFF21\uD801";352assertEquals(new StringBuilder(ORIGIN).codePointAt(1), '\uDC01');353assertEquals(new StringBuilder(ORIGIN).codePointAt(3), '\uD801');354assertEquals(new StringBuilder(ORIGIN).codePointBefore(1), 'A');355assertEquals(new StringBuilder(ORIGIN).codePointBefore(2), '\uDC01');356assertEquals(new StringBuilder(ORIGIN).codePointBefore(3), '\uFF21');357assertEquals(new StringBuilder(ORIGIN).codePointCount(0, 3), 3);358assertEquals(new StringBuilder(ORIGIN).codePointCount(1, 3), 2);359assertEquals(new StringBuilder(ORIGIN).delete(1, 4).indexOf("A"), 0);360assertEquals(new StringBuilder(ORIGIN).replace(1, 4, "B").indexOf("A"),3610);362assertEquals(new StringBuilder(ORIGIN).substring(0, 1).indexOf("A"), 0);363assertEquals(new StringBuilder(ORIGIN).offsetByCodePoints(0, 1), 1);364assertEquals(new StringBuilder(ORIGIN).offsetByCodePoints(1, 1), 2);365assertEquals(new StringBuilder(ORIGIN).offsetByCodePoints(2, 1), 3);366check(new StringBuilder(ORIGIN).reverse(), "\uD801\uFF21\uDC01A");367}368369private void checkGetChars(StringBuilder sb, int srcBegin, int srcEnd,370char expected[]) {371char[] dst = new char[srcEnd - srcBegin];372sb.getChars(srcBegin, srcEnd, dst, 0);373assertTrue(Arrays.equals(dst, expected));374}375376private void checkSetCharAt(StringBuilder sb, int index, char ch,377String expected) {378sb.setCharAt(index, ch);379check(sb, expected);380}381382private void checkSetLength(StringBuilder sb, int newLength, String expected) {383sb.setLength(newLength);384check(sb, expected);385}386387private void check(StringBuilder sb, String expected) {388check(sb.toString(), expected);389}390391private void check(String str, String expected) {392assertTrue(str.equals(expected), String.format(393"Get (%s) but expect (%s), ", escapeNonASCIIs(str),394escapeNonASCIIs(expected)));395}396397/*398* Escape non-ASCII characters since not all systems support them.399*/400private String escapeNonASCIIs(String str) {401StringBuilder sb = new StringBuilder();402for (int i = 0; i < str.length(); i++) {403char c = str.charAt(i);404if (c > 0x7F) {405sb.append("\\u").append(Integer.toHexString((int) c));406} else {407sb.append(c);408}409}410return sb.toString();411}412}413414415