Path: blob/master/test/jdk/java/lang/String/CompactString/CompactString.java
41152 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.io.UnsupportedEncodingException;24import java.nio.charset.Charset;25import java.util.HashMap;26import java.util.Map;2728import org.testng.annotations.BeforeClass;2930/*31* Base class of tests for Compact String.32*33*/34public class CompactString {3536final Map<String, Map<String, String>> map = new HashMap<>();3738enum StringSources {39EMPTY(STRING_EMPTY, BYTE_ARRAY_EMTPY, CHAR_ARRAY_EMPTY,40POINT_ARRAY_EMTPY), LDUPLICATE(STRING_LDUPLICATE,41BYTE_ARRAY_LDUPLICATE, CHAR_ARRAY_LDUPLICATE,42POINT_ARRAY_LDUPLICATE), LLONG(STRING_LLONG, BYTE_ARRAY_LLONG,43CHAR_ARRAY_LLONG, POINT_ARRAY_LLONG), L1(STRING_L1,44BYTE_ARRAY_L1, CHAR_ARRAY_L1, POINT_ARRAY_L1), L2(STRING_L2,45BYTE_ARRAY_L2, CHAR_ARRAY_L2, POINT_ARRAY_L2), L4(STRING_L4,46BYTE_ARRAY_L4, CHAR_ARRAY_L4, POINT_ARRAY_L4), UDUPLICATE(47STRING_UDUPLICATE, BYTE_ARRAY_UDUPLICATE,48CHAR_ARRAY_UDUPLICATE, POINT_ARRAY_UDUPLICATE), U1(STRING_U1,49BYTE_ARRAY_U1, CHAR_ARRAY_U1, POINT_ARRAY_U1), U2(STRING_U2,50BYTE_ARRAY_U2, CHAR_ARRAY_U2, POINT_ARRAY_U2), MDUPLICATE1(51STRING_MDUPLICATE1, BYTE_ARRAY_MDUPLICATE1,52CHAR_ARRAY_MDUPLICATE1, POINT_ARRAY_MDUPLICATE1), MDUPLICATE2(53STRING_MDUPLICATE2, BYTE_ARRAY_MDUPLICATE2,54CHAR_ARRAY_MDUPLICATE2, POINT_ARRAY_MDUPLICATE2), MLONG1(55STRING_MLONG1, BYTE_ARRAY_MLONG1, CHAR_ARRAY_MLONG1,56POINT_ARRAY_MLONG1), MLONG2(STRING_MLONG2, BYTE_ARRAY_MLONG2,57CHAR_ARRAY_MLONG2, POINT_ARRAY_MLONG2), M11(STRING_M11,58BYTE_ARRAY_M11, CHAR_ARRAY_M11, POINT_ARRAY_M11), M12(59STRING_M12, BYTE_ARRAY_M12, CHAR_ARRAY_M12, POINT_ARRAY_M12), SUPPLEMENTARY(60STRING_SUPPLEMENTARY, BYTE_ARRAY_SUPPLEMENTARY,61CHAR_ARRAY_SUPPLEMENTARY, POINT_ARRAY_SUPPLEMENTARY), SUPPLEMENTARY_LOWERCASE(62STRING_SUPPLEMENTARY_LOWERCASE,63BYTE_ARRAY_SUPPLEMENTARY_LOWERCASE,64CHAR_ARRAY_SUPPLEMENTARY_LOWERCASE,65POINT_ARRAY_SUPPLEMENTARY_LOWERCASE);6667private StringSources(String s, byte[] b, char[] c, int[] i) {68str = s;69ba = b;70ca = c;71ia = i;72}7374String getString() {75return str;76}7778byte[] getByteArray() {79return ba;80}8182char[] getCharArray() {83return ca;84}8586int[] getIntArray() {87return ia;88}8990private final String str;91private final byte[] ba;92private final char[] ca;93private final int[] ia;94}9596protected static final String DEFAULT_CHARSET_NAME = "UTF-8";97protected static final Charset DEFAULT_CHARSET = Charset98.forName(DEFAULT_CHARSET_NAME);99100protected static final String STRING_EMPTY = "";101protected static final byte[] BYTE_ARRAY_EMTPY = new byte[0];102protected static final char[] CHAR_ARRAY_EMPTY = new char[0];103protected static final int[] POINT_ARRAY_EMTPY = new int[0];104105protected static final String STRING_LDUPLICATE = "ABABABABAB";106protected static final byte[] BYTE_ARRAY_LDUPLICATE = new byte[] { 'A', 'B',107'A', 'B', 'A', 'B', 'A', 'B', 'A', 'B' };108protected static final char[] CHAR_ARRAY_LDUPLICATE = new char[] { 'A', 'B',109'A', 'B', 'A', 'B', 'A', 'B', 'A', 'B' };110protected static final int[] POINT_ARRAY_LDUPLICATE = new int[] { 'A', 'B',111'A', 'B', 'A', 'B', 'A', 'B', 'A', 'B' };112113protected static final String STRING_LLONG = "ABCDEFGH";114protected static final byte[] BYTE_ARRAY_LLONG = new byte[] { 'A', 'B', 'C',115'D', 'E', 'F', 'G', 'H' };116protected static final char[] CHAR_ARRAY_LLONG = new char[] { 'A', 'B', 'C',117'D', 'E', 'F', 'G', 'H' };118protected static final int[] POINT_ARRAY_LLONG = new int[] { 'A', 'B', 'C',119'D', 'E', 'F', 'G', 'H' };120121protected static final String STRING_L1 = "A";122protected static final byte[] BYTE_ARRAY_L1 = new byte[] { 'A' };123protected static final char[] CHAR_ARRAY_L1 = new char[] { 'A' };124protected static final int[] POINT_ARRAY_L1 = new int[] { 'A' };125126protected static final String STRING_L2 = "AB";127protected static final byte[] BYTE_ARRAY_L2 = new byte[] { 'A', 'B' };128protected static final char[] CHAR_ARRAY_L2 = new char[] { 'A', 'B' };129protected static final int[] POINT_ARRAY_L2 = new int[] { 'A', 'B' };130131protected static final String STRING_L4 = "ABCD";132protected static final byte[] BYTE_ARRAY_L4 = new byte[] { 'A', 'B', 'C', 'D' };133protected static final char[] CHAR_ARRAY_L4 = new char[] { 'A', 'B', 'C', 'D' };134protected static final int[] POINT_ARRAY_L4 = new int[] { 'A', 'B', 'C', 'D' };135136/*137* Because right now ASCII is the default encoding parameter for source code138* in JDK build environment, so we escape them. same as below.139*/140protected static final String STRING_UDUPLICATE = "\uFF21\uFF22\uFF21\uFF22\uFF21\uFF22\uFF21\uFF22\uFF21\uFF22";141protected static final byte[] BYTE_ARRAY_UDUPLICATE = getBytes(STRING_UDUPLICATE);142protected static final char[] CHAR_ARRAY_UDUPLICATE = new char[] { '\uFF21',143'\uFF22', '\uFF21', '\uFF22', '\uFF21', '\uFF22', '\uFF21',144'\uFF22', '\uFF21', '\uFF22' };145protected static final int[] POINT_ARRAY_UDUPLICATE = new int[] { '\uFF21',146'\uFF22', '\uFF21', '\uFF22', '\uFF21', '\uFF22', '\uFF21',147'\uFF22', '\uFF21', '\uFF22' };148149protected static final String STRING_U1 = "\uFF21";150protected static final byte[] BYTE_ARRAY_U1 = getBytes(STRING_U1);151protected static final char[] CHAR_ARRAY_U1 = new char[] { '\uFF21' };152protected static final int[] POINT_ARRAY_U1 = new int[] { '\uFF21' };153154protected static final String STRING_U2 = "\uFF21\uFF22";155protected static final byte[] BYTE_ARRAY_U2 = getBytes(STRING_U2);156protected static final char[] CHAR_ARRAY_U2 = new char[] { '\uFF21', '\uFF22' };157protected static final int[] POINT_ARRAY_U2 = new int[] { '\uFF21', '\uFF22' };158159protected static final String STRING_MDUPLICATE1 = "\uFF21A\uFF21A\uFF21A\uFF21A\uFF21A";160protected static final byte[] BYTE_ARRAY_MDUPLICATE1 = getBytes(STRING_MDUPLICATE1);161protected static final char[] CHAR_ARRAY_MDUPLICATE1 = new char[] { '\uFF21',162'A', '\uFF21', 'A', '\uFF21', 'A', '\uFF21', 'A', '\uFF21', 'A' };163protected static final int[] POINT_ARRAY_MDUPLICATE1 = new int[] { '\uFF21',164'A', '\uFF21', 'A', '\uFF21', 'A', '\uFF21', 'A', '\uFF21', 'A' };165166protected static final String STRING_MDUPLICATE2 = "A\uFF21A\uFF21A\uFF21A\uFF21A\uFF21";167protected static final byte[] BYTE_ARRAY_MDUPLICATE2 = getBytes(STRING_MDUPLICATE2);168protected static final char[] CHAR_ARRAY_MDUPLICATE2 = new char[] { 'A',169'\uFF21', 'A', '\uFF21', 'A', '\uFF21', 'A', '\uFF21', 'A',170'\uFF21' };171protected static final int[] POINT_ARRAY_MDUPLICATE2 = new int[] { 'A',172'\uFF21', 'A', '\uFF21', 'A', '\uFF21', 'A', '\uFF21', 'A',173'\uFF21' };174175protected static final String STRING_MLONG1 = "A\uFF21B\uFF22C\uFF23D\uFF24E\uFF25F\uFF26G\uFF27H\uFF28";176protected static final byte[] BYTE_ARRAY_MLONG1 = getBytes(STRING_MLONG1);177protected static final char[] CHAR_ARRAY_MLONG1 = new char[] { 'A', '\uFF21',178'B', '\uFF22', 'C', '\uFF23', 'D', '\uFF24', 'E', '\uFF25', 'F',179'\uFF26', 'G', '\uFF27', 'H', '\uFF28' };180protected static final int[] POINT_ARRAY_MLONG1 = new int[] { 'A', '\uFF21',181'B', '\uFF22', 'C', '\uFF23', 'D', '\uFF24', 'E', '\uFF25', 'F',182'\uFF26', 'G', '\uFF27', 'H', '\uFF28' };183184protected static final String STRING_MLONG2 = "\uFF21A\uFF22B\uFF23C\uFF24D\uFF25E\uFF26F\uFF27G\uFF28H";185protected static final byte[] BYTE_ARRAY_MLONG2 = getBytes(STRING_MLONG2);186protected static final char[] CHAR_ARRAY_MLONG2 = new char[] { '\uFF21', 'A',187'\uFF22', 'B', '\uFF23', 'C', '\uFF24', 'D', '\uFF25', 'E',188'\uFF26', 'F', '\uFF27', 'G', '\uFF28', 'H' };189protected static final int[] POINT_ARRAY_MLONG2 = new int[] { '\uFF21', 'A',190'\uFF22', 'B', '\uFF23', 'C', '\uFF24', 'D', '\uFF25', 'E',191'\uFF26', 'F', '\uFF27', 'G', '\uFF28', 'H' };192193protected static final String STRING_M11 = "A\uFF21";194protected static final byte[] BYTE_ARRAY_M11 = getBytes(STRING_M11);195protected static final char[] CHAR_ARRAY_M11 = new char[] { 'A', '\uFF21' };196protected static final int[] POINT_ARRAY_M11 = new int[] { 'A', '\uFF21' };197198protected static final String STRING_M12 = "\uFF21A";199protected static final byte[] BYTE_ARRAY_M12 = getBytes(STRING_M12);200protected static final char[] CHAR_ARRAY_M12 = new char[] { '\uFF21', 'A' };201protected static final int[] POINT_ARRAY_M12 = new int[] { '\uFF21', 'A' };202203protected static final String STRING_SUPPLEMENTARY = "\uD801\uDC00\uD801\uDC01\uFF21A";204protected static final byte[] BYTE_ARRAY_SUPPLEMENTARY = getBytes(STRING_SUPPLEMENTARY);205protected static final char[] CHAR_ARRAY_SUPPLEMENTARY = new char[] {206'\uD801', '\uDC00', '\uD801', '\uDC01', '\uFF21', 'A' };207protected static final int[] POINT_ARRAY_SUPPLEMENTARY = new int[] {208'\uD801', '\uDC00', '\uD801', '\uDC01', '\uFF21', 'A' };209210protected static final String STRING_SUPPLEMENTARY_LOWERCASE = "\uD801\uDC28\uD801\uDC29\uFF41a";211protected static final byte[] BYTE_ARRAY_SUPPLEMENTARY_LOWERCASE = getBytes(STRING_SUPPLEMENTARY_LOWERCASE);212protected static final char[] CHAR_ARRAY_SUPPLEMENTARY_LOWERCASE = new char[] {213'\uD801', '\uDC28', '\uD801', '\uDC29', '\uFF41', 'a' };214protected static final int[] POINT_ARRAY_SUPPLEMENTARY_LOWERCASE = new int[] {215'\uD801', '\uDC28', '\uD801', '\uDC29', '\uFF41', 'a' };216217protected static final String SRC_BYTE_ARRAY_WITH_CHARSETNAME = "source from byte array with charset name";218protected static final String SRC_BYTE_ARRAY_WITH_CHARSET = "source from byte array with charset";219protected static final String SRC_CHAR_ARRAY = "source from char array";220protected static final String SRC_POINT_ARRAY = "source from code point array";221protected static final String SRC_STRING = "source from String";222protected static final String SRC_STRINGBUFFER = "source from StringBuffer";223protected static final String SRC_STRINGBUILDER = "source from StringBuilder";224protected static final String SRC_COPYVALUEOF = "source from copyValueOf from char array";225protected static final String SRC_VALUEOF = "source from valueOf from char array";226227static {228System.out229.println(String230.format("====== The platform's default charset is \"%s\", we're using \"%s\" for testing.",231Charset.defaultCharset().name(),232DEFAULT_CHARSET_NAME));233}234235private static byte[] getBytes(String str) {236byte[] res = null;237try {238res = str.getBytes(DEFAULT_CHARSET_NAME);239} catch (UnsupportedEncodingException e) {240e.printStackTrace();241throw new RuntimeException("caught UnsupportedEncodingException!!!", e);242}243return res;244}245246private void setUpOneString(String content, byte[] ba, char[] ca, int[] cpa)247throws UnsupportedEncodingException {248final Map<String, String> m = new HashMap<>();249m.put(SRC_BYTE_ARRAY_WITH_CHARSETNAME, new String(ba,250DEFAULT_CHARSET_NAME));251m.put(SRC_BYTE_ARRAY_WITH_CHARSET, new String(ba, DEFAULT_CHARSET));252m.put(SRC_CHAR_ARRAY, new String(ca));253m.put(SRC_POINT_ARRAY, new String(cpa, 0, cpa.length));254m.put(SRC_STRING, new String(content));255m.put(SRC_STRINGBUFFER, new String(new StringBuffer(content)));256m.put(SRC_STRINGBUILDER, new String(new StringBuilder(content)));257m.put(SRC_COPYVALUEOF, String.copyValueOf(ca));258m.put(SRC_VALUEOF, String.valueOf(ca));259map.put(content, m);260}261262/*263* Set up the test data, use 9 ways to construct one String.264*265* @throws UnsupportedEncodingException266* If the named charset is not supported in setUpOneString(xxx).267*/268@BeforeClass269public void setUp() throws UnsupportedEncodingException {270for (StringSources src : StringSources.values()) {271setUpOneString(src.getString(), src.getByteArray(),272src.getCharArray(), src.getIntArray());273}274}275276/*277* Escape non-ASCII characters since not all systems support them.278*/279protected String escapeNonASCIIs(String str) {280StringBuilder sb = new StringBuilder();281for (int i = 0; i < str.length(); i++) {282char c = str.charAt(i);283if (c > 0x7F) {284sb.append("\\u").append(Integer.toHexString((int) c));285} else {286sb.append(c);287}288}289return sb.toString();290}291292/*293* Escape non-ASCII characters since not all systems support them.294*/295protected String escapeNonASCII(char c) {296StringBuilder sb = new StringBuilder();297if (c > 0x7F) {298sb.append("\\u").append(Integer.toHexString((int) c));299} else {300sb.append(c);301}302return sb.toString();303}304}305306307