Path: blob/master/test/jdk/java/lang/String/concat/ImplicitStringConcatShapesTestGen.java
41153 views
/*1* Copyright (c) 2015, 2020, 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.IOException;24import java.io.PrintWriter;25import java.nio.file.Files;26import java.nio.file.Paths;27import java.util.*;2829public class ImplicitStringConcatShapesTestGen {30public static String escapeToUnicode(String str) {31StringBuilder b = new StringBuilder();32for (char c : str.toCharArray()) {33if (c < 128) {34b.append(c);35} else {36b.append("\\u").append(String.format("%04X", (int) c));37}38}39return b.toString();40}4142public static void main(String... args) throws IOException {43PrintWriter pw = new PrintWriter(System.out);4445String[] types = {46"boolean",47"byte",48"byteMinus",49"char",50"short",51"shortMinus",52"int",53"intMinus",54"integer",55"integerNull",56"float",57"floatMinus",58"long",59"longMinus",60"double",61"doubleMinus",62"object",63"objectNull",64"objectNullToString",65"String",66"StringUTF16",67"StringU1",68"StringU2",69"intArrayNull",70"objectArrayNull",71};7273for (String t : Files.readAllLines(Paths.get("ImplicitStringConcatShapes-head.template"))) {74pw.println(t);75}7677Map<String, String> values = new HashMap<>();7879Random current = new Random(12345);80for (int mode = 0; mode <= 2; mode++) {81for (String type : types) {82int i = current.nextInt(100);83boolean isStatic = (mode | 1) == 1;84boolean isFinal = (mode | 2) == 2;85String fieldName = (isStatic ? "s" : "") + (isFinal ? "f" : "") + "_" + typeSig(type);86String value = initValue(type, i);87String stringValue = stringValue(type, i);88values.put(fieldName, stringValue);89pw.printf(" %s %s %s %s = %s;%n", isStatic ? "static" : "", isFinal ? "final" : "", typeValue(type, i), fieldName, value);90}91}9293pw.println();9495List<String> lines = new ArrayList<>();96List<String> l = new ArrayList<>(values.keySet());9798for (String l1 : l) {99lines.add(String.format("test(\"%s\", \"\" + %s);",100escapeToUnicode(values.get(l1)),101l1102));103lines.add(String.format("test(\"%s\", \"prefix\" + %s);",104escapeToUnicode("prefix" + values.get(l1)),105l1106));107lines.add(String.format("test(\"%s\", %s + \"suffix\");",108escapeToUnicode(values.get(l1) + "suffix"),109l1110));111lines.add(String.format("test(\"%s\", \"prefix\" + %s + \"suffix\");",112escapeToUnicode("prefix" + values.get(l1) + "suffix"),113l1114));115}116117for (String l1 : l) {118for (String l2 : l) {119lines.add(String.format("test(\"%s\", \"\" + %s + %s);",120escapeToUnicode(values.get(l1) + values.get(l2)),121l1, l2122));123lines.add(String.format("test(\"%s\", \"\" + %s + %s + \"suffix\");",124escapeToUnicode(values.get(l1) + values.get(l2) + "suffix"),125l1, l2126));127lines.add(String.format("test(\"%s\", \"prefix\" + %s + \"suffix1\" + %s + \"suffix2\");",128escapeToUnicode("prefix" + values.get(l1) + "suffix1" + values.get(l2) + "suffix2"),129l1, l2130));131}132}133134final int STRIDE = 1000;135int strides = lines.size() / STRIDE + 1;136137pw.println(" public void run() {");138for (int c = 0; c < strides; c++) {139pw.println(" run" + c + "();");140}141pw.println(" }");142pw.println();143144for (int c = 0; c < strides; c++) {145pw.println(" public void run" + c + "() {");146for (String line : lines.subList(c * STRIDE, Math.min(lines.size(), (c+1) * STRIDE))) {147pw.println(" " + line);148}149pw.println(" }");150pw.println();151}152153pw.println("}");154155pw.flush();156pw.close();157}158159private static String typeSig(String type) {160switch (type) {161case "boolean": return "bl";162case "byte": return "b";163case "byteMinus": return "bM";164case "short": return "s";165case "shortMinus": return "sM";166case "char": return "c";167case "int": return "i";168case "intMinus": return "iM";169case "integer": return "I";170case "integerNull": return "IN";171case "float": return "f";172case "floatMinus": return "fM";173case "long": return "l";174case "longMinus": return "lM";175case "double": return "d";176case "doubleMinus": return "dM";177case "String": return "str";178case "StringUTF16": return "strU";179case "StringU1": return "strU1";180case "StringU2": return "strU2";181case "object": return "o";182case "objectNull": return "oN";183case "objectNullToString": return "oNtS";184case "intArrayNull": return "iAN";185case "objectArrayNull": return "oAN";186default:187throw new IllegalStateException();188}189}190191private static String typeValue(String type, int i) {192switch (type) {193case "boolean":194case "byte":195case "byteMinus":196case "char":197case "short":198case "shortMinus":199case "int":200case "intMinus":201case "float":202case "floatMinus":203case "long":204case "longMinus":205case "double":206case "doubleMinus":207return type.replace("Minus", "");208case "String":209case "StringUTF16":210case "StringU1":211case "StringU2":212return "String";213case "object":214case "objectNull":215case "objectNullToString":216return "Object";217case "integer":218case "integerNull":219return "Integer";220case "intArrayNull":221return "int[]";222case "objectArrayNull":223return "Object[]";224default:225throw new IllegalStateException();226}227}228229private static String initValue(String type, int i) {230switch (type) {231case "boolean":232return String.valueOf((i & 1) == 1);233case "byte":234return String.valueOf(i);235case "byteMinus":236return String.valueOf(-i);237case "short":238return String.valueOf(i*100);239case "shortMinus":240return String.valueOf(-i*100);241case "intMinus":242return String.valueOf(-i*1_000_000);243case "int":244case "integer":245return String.valueOf(i*1_000_000);246case "long":247return String.valueOf(i*1_000_000_000) + "L";248case "longMinus":249return String.valueOf(-i*1_000_000_000) + "L";250case "char":251return "'" + (char)(i % 26 + 65) + "'";252case "double":253return String.valueOf(i) + ".0d";254case "doubleMinus":255return "-" + String.valueOf(i) + ".0d";256case "float":257return String.valueOf(i) + ".0f";258case "floatMinus":259return "-" + String.valueOf(i) + ".0f";260case "object":261return "new MyClass(" + i + ")";262case "objectNullToString":263return "new MyClassNullToString()";264case "integerNull":265case "objectNull":266case "intArrayNull":267case "objectArrayNull":268return "null";269case "String":270return "\"" + i + "\"";271case "StringUTF16":272return "\"\\u0451" + i + "\"";273case "StringU1":274return "\"\\u0001" + i + "\"";275case "StringU2":276return "\"\\u0002" + i + "\"";277default:278throw new IllegalStateException();279}280}281282private static String stringValue(String type, int i) {283switch (type) {284case "boolean":285return String.valueOf((i & 1) == 1);286case "byte":287return String.valueOf(i);288case "byteMinus":289return String.valueOf(-i);290case "short":291return String.valueOf(i*100);292case "shortMinus":293return String.valueOf(-i*100);294case "intMinus":295return String.valueOf(-i*1_000_000);296case "int":297case "integer":298return String.valueOf(i*1_000_000);299case "long":300return String.valueOf(i*1_000_000_000);301case "longMinus":302return String.valueOf(-i*1_000_000_000);303case "char":304return String.valueOf((char) (i % 26 + 65));305case "double":306case "float":307return String.valueOf(i) + ".0";308case "doubleMinus":309case "floatMinus":310return "-" + String.valueOf(i) + ".0";311case "object":312return "C(" + i + ")";313case "integerNull":314case "objectNull":315case "objectNullToString":316case "intArrayNull":317case "objectArrayNull":318return "null";319case "String":320return "" + i;321case "StringUTF16":322return "\u0451" + i;323case "StringU1":324return "\u0001" + i;325case "StringU2":326return "\u0002" + i;327default:328throw new IllegalStateException();329}330}331332}333334335