jdk-24/test/hotspot/jtreg/vmTestbase/vm/jit/LongTransitions/JniArmHFTestGenerator.java.txt

928 lines
35 KiB
Plaintext
Raw Normal View History

/*
* Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
/* This code generate an LTTest.java and LTTest.c files with corresponding *.cfg files which containt test defenition
* for JNI testing.
*
*/
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Random;
//Java and C file generator for JNI tests
public class JniArmHFTestGenerator {
private final String JAVA_CLASS_NAME = "LTTest";
private final String C_FNC_NAME_PREFIX = "Java_vm_jit_LongTransitions_" + JAVA_CLASS_NAME + "_";
private final String JAVA_PACKAGE_NAME = "vm.jit.LongTransitions";
private final String TEST_LIST_PREFIX = "vm/jit/LongTransitions";
private final String TEST_LIST_NAME = "vm.jit.long.testlist";
//Maximal line length for some SRC generation function
private final int LINE_LENGTH = 70;
//127 is maximal value for JAVA parameters list
private final int PARAMS_COUNTER = 127;
StringBuilder javaFileSrc;
StringBuilder cFileSrc;
//StringBuilder cfgFileSrc;
private String javaTxtFileName;
private String cTxtFileName;
private File outputDir;
private ArrayList<String> javaFncNames = new ArrayList<String>();
public static void main(String[] args) throws IOException {
new JniArmHFTestGenerator().makeSomeTest();
}
public void makeSomeTest() throws IOException {
makeJavaIntro(JAVA_CLASS_NAME);
makeCIntro();
int cnt = PARAMS_COUNTER;
makeOneTest(cnt, ParamType.EASY_F, TestType.RANDOM, "nativeFnc1");
makeOneTest(cnt, ParamType.EASY_D, TestType.RANDOM, "nativeFnc2");
makeOneTest(cnt, ParamType.MIXED_FI1, TestType.RANDOM, "nativeFnc3");
makeOneTest(cnt, ParamType.MIXED_FB1, TestType.RANDOM, "nativeFnc4");
makeOneTest(cnt, ParamType.MIXED_FBI1, TestType.RANDOM, "nativeFnc5");
makeOneTest(cnt, ParamType.MIXED_DI1, TestType.RANDOM, "nativeFnc6");
makeOneTest(cnt, ParamType.MIXED_DB1, TestType.RANDOM, "nativeFnc7");
makeOneTest(cnt, ParamType.MIXED_DBI1, TestType.RANDOM, "nativeFnc8");
makeOneTest(cnt, ParamType.MIXED_DFBI1, TestType.RANDOM, "nativeFnc9");
makeOneTest(cnt, ParamType.MIXED_DF1, TestType.RANDOM, "nativeFnc10");
makeOneTest(cnt, ParamType.MIXED_DFI1, TestType.RANDOM, "nativeFnc11");
makeOneTest(cnt, ParamType.MIXED_DFB1, TestType.RANDOM, "nativeFnc12");
makeOneTest(cnt, ParamType.MIXED_FI2, TestType.RANDOM, "nativeFnc13");
makeOneTest(cnt, ParamType.MIXED_FB2, TestType.RANDOM, "nativeFnc14");
makeOneTest(cnt, ParamType.MIXED_FBI2, TestType.RANDOM, "nativeFnc15");
makeOneTest(cnt, ParamType.MIXED_DI2, TestType.RANDOM, "nativeFnc16");
makeOneTest(cnt, ParamType.MIXED_DB2, TestType.RANDOM, "nativeFnc17");
makeOneTest(cnt, ParamType.MIXED_DBI2, TestType.RANDOM, "nativeFnc18");
makeOneTest(cnt, ParamType.MIXED_DFBI2, TestType.RANDOM, "nativeFnc19");
makeOneTest(cnt, ParamType.MIXED_DF2, TestType.RANDOM, "nativeFnc20");
makeOneTest(cnt, ParamType.MIXED_DFI2, TestType.RANDOM, "nativeFnc21");
makeOneTest(cnt, ParamType.MIXED_DFB2, TestType.RANDOM, "nativeFnc22");
makeOneTest(cnt, ParamType.MIXED_FI3, TestType.RANDOM, "nativeFnc23");
makeOneTest(cnt, ParamType.MIXED_FB3, TestType.RANDOM, "nativeFnc24");
makeOneTest(cnt, ParamType.MIXED_FBI3, TestType.RANDOM, "nativeFnc25");
makeOneTest(cnt, ParamType.MIXED_DI3, TestType.RANDOM, "nativeFnc26");
makeOneTest(cnt, ParamType.MIXED_DB3, TestType.RANDOM, "nativeFnc27");
makeOneTest(cnt, ParamType.MIXED_DBI3, TestType.RANDOM, "nativeFnc28");
makeOneTest(cnt, ParamType.MIXED_DFBI3, TestType.RANDOM, "nativeFnc29");
makeOneTest(cnt, ParamType.MIXED_DF3, TestType.RANDOM, "nativeFnc30");
makeOneTest(cnt, ParamType.MIXED_DFI3, TestType.RANDOM, "nativeFnc31");
makeOneTest(cnt, ParamType.MIXED_DFB3, TestType.RANDOM, "nativeFnc32");
makeOneTest(cnt, ParamType.MIXED_FI4, TestType.RANDOM, "nativeFnc33");
makeOneTest(cnt, ParamType.MIXED_FB4, TestType.RANDOM, "nativeFnc34");
makeOneTest(cnt, ParamType.MIXED_FBI4, TestType.RANDOM, "nativeFnc35");
makeOneTest(cnt, ParamType.MIXED_DI4, TestType.RANDOM, "nativeFnc36");
makeOneTest(cnt, ParamType.MIXED_DB4, TestType.RANDOM, "nativeFnc37");
makeOneTest(cnt, ParamType.MIXED_DBI4, TestType.RANDOM, "nativeFnc38");
makeOneTest(cnt, ParamType.MIXED_DFBI4, TestType.RANDOM, "nativeFnc39");
makeOneTest(cnt, ParamType.MIXED_DF4, TestType.RANDOM, "nativeFnc40");
makeOneTest(cnt, ParamType.MIXED_DFI4, TestType.RANDOM, "nativeFnc41");
makeOneTest(cnt, ParamType.MIXED_DFB4, TestType.RANDOM, "nativeFnc42");
makeOneTest(cnt, ParamType.MIXED_FI5, TestType.RANDOM, "nativeFnc43");
makeOneTest(cnt, ParamType.MIXED_FB5, TestType.RANDOM, "nativeFnc44");
makeOneTest(cnt, ParamType.MIXED_FBI5, TestType.RANDOM, "nativeFnc45");
makeOneTest(cnt, ParamType.MIXED_DI5, TestType.RANDOM, "nativeFnc46");
makeOneTest(cnt, ParamType.MIXED_DB5, TestType.RANDOM, "nativeFnc47");
makeOneTest(cnt, ParamType.MIXED_DBI5, TestType.RANDOM, "nativeFnc48");
makeOneTest(cnt, ParamType.MIXED_DFBI5, TestType.RANDOM, "nativeFnc49");
makeOneTest(cnt, ParamType.MIXED_DF5, TestType.RANDOM, "nativeFnc50");
makeOneTest(cnt, ParamType.MIXED_DFI5, TestType.RANDOM, "nativeFnc51");
makeOneTest(cnt, ParamType.MIXED_DFB5, TestType.RANDOM, "nativeFnc52");
makeJavaInvoke();
makeJavaOutro();
writeToJavaFile(JAVA_CLASS_NAME);
writeToCFile(JAVA_CLASS_NAME);
//writeCmpFile();
writeTestListFile();
writeCfgFile();
}
private void makeJavaInvoke() {
appendToJava(" public static void main(String[] args) throws Exception");
appendToJava(" {");
appendToJava(" if ( System.getProperty(\"os.name\").matches(\".*[Ww][Ii][Nn].*\") )");
appendToJava(" {");
appendToJava(" System.out.println(\"TEST PASSED! Dummy execution on Windows* OS!\");");
appendToJava(" return;");
appendToJava(" }");
appendToJava(" deleteFiles();");
appendToJavaN(" PrintStream ps=new PrintStream(new File(\"");
appendToJavaN(javaTxtFileName);
appendToJava("\"));");
appendToJava(" if (args.length>0)");
appendToJava(" switch(args[0])");
appendToJava(" {");
for (String s : javaFncNames) {
appendToJava(" case \"" + s + "\":");
appendToJavaN(" ");
appendToJavaN(s);
appendToJava("_invoke(ps);");
appendToJava(" break;");
}
appendToJava(" default:");
appendToJava(" throw new Exception(\"FAIL: invalid args!\");");
appendToJava(" }");
appendToJava(" else");
appendToJava(" {");
appendToJava(" throw new Exception(\"FAIL: invalid args!\");");
appendToJava(" }");
}
private void makeCIntro() {
//appendToC(" //------------------------C----------------------------");
//appendToC("#include \""+className+".h\"");
appendToC("#include <jni.h>");
appendToC("#include <stdio.h>");
}
private void makeJavaIntro(String className) {
cFileSrc = new StringBuilder();
javaFileSrc = new StringBuilder();
File outputDirL1 = new File("vm" + File.separatorChar + "jit" + File.separatorChar + "LongTransitions");
//outputDir=new File(outputDirL1,className);
outputDir = outputDirL1;
outputDir.mkdirs();
javaTxtFileName = className + "_java.txt";
cTxtFileName = className + "_c.txt";
appendToJava("package " + JAVA_PACKAGE_NAME + ";");
appendToJava("import java.io.*;");
appendToJava("import java.util.Random;");
appendToJava("public class " + className);
appendToJava("{");
appendToJava(" public static boolean flag = false;");
appendToJava(" static Random rnd;");
appendToJava(" static{");
appendToJava(" rnd=new Random();");
appendToJava(" System.loadLibrary(\"" + className + "\");");
appendToJava(" }");
//Different randoms
appendToJava(" public static int getRndInt(){return rnd.nextInt(Integer.MAX_VALUE);}");
appendToJava(" public static float getRndFloat(){return rnd.nextFloat()*Float.MAX_VALUE;}");
appendToJava(" public static double getRndDouble(){return rnd.nextDouble()*Double.MAX_VALUE;}");
appendToJava(" public static byte getRndByte(){return (byte)rnd.nextInt(Byte.MAX_VALUE);}");
//deleteFiles method
appendToJava(" private static void deleteFiles()");
appendToJava(" {");
appendToJavaN(" File f=new File(\"");
appendToJavaN(javaTxtFileName);
appendToJava("\");");
appendToJava(" if ( f.exists())");
appendToJava(" f.delete();");
appendToJavaN(" f=new File(\"");
appendToJavaN(cTxtFileName);
appendToJava("\");");
appendToJava(" if ( f.exists())");
appendToJava(" f.delete();");
appendToJava(" }");
}
private void makeJavaOutro() {
appendToJava(" flag=chkFile();");
appendToJava(" if(!flag)");
appendToJava(" throw new Exception(\"FAIL:Tests failed!\"); ");
appendToJava(" }");
appendToJava(" private static boolean chkFile()");
appendToJava(" {");
appendToJava(" File javaFile=new File(\"" + javaTxtFileName + "\");");
appendToJava(" if (! javaFile.exists())");
appendToJava(" {");
appendToJava(" System.out.println(\"FAIL:Failed to open file " + javaTxtFileName + " - file not exists!\");");
appendToJava(" return false;");
appendToJava(" }");
appendToJava(" File cFile=new File(\"" + cTxtFileName + "\");");
appendToJava(" if (! cFile.exists())");
appendToJava(" {");
appendToJava(" System.out.println(\"FAIL:Failed to open file " + cTxtFileName + " - file not exists!\");");
appendToJava(" return false;");
appendToJava(" }");
appendToJava(" if ( cFile.length()!=javaFile.length() )");
appendToJava(" {");
appendToJava(" System.out.println(\"FAIL:File length not equal!\");");
appendToJava(" return false;");
appendToJava(" }");
appendToJava(" long byteCount=cFile.length();");
appendToJava(" try{");
appendToJava(" FileInputStream fisC=new FileInputStream(cFile);");
appendToJava(" FileInputStream fisJava=new FileInputStream(javaFile);");
appendToJava(" byte[] cData=new byte[fisC.available()];");
appendToJava(" fisC.read(cData);");
appendToJava(" byte[] javaData=new byte[fisJava.available()];");
appendToJava(" fisJava.read(javaData);");
appendToJava(" for ( int cnt=0;cnt<byteCount;++cnt)");
appendToJava(" {");
appendToJava(" if ( cData[cnt]!=javaData[cnt] )");
appendToJava(" {");
appendToJava(" System.out.println(\"FAIL:Test failed! \"+cnt+\" byte are wrong! C file - \" + cData[cnt] + \" Java file - \"+javaData[cnt] );");
appendToJava(" return false;");
appendToJava(" }");
appendToJava(" }");
appendToJava(" }");
appendToJava(" catch (FileNotFoundException ex)");
appendToJava(" {");
appendToJava(" System.out.println(\"FAIL:Some of files not found!\");");
appendToJava(" return false;");
appendToJava(" }");
appendToJava(" catch (IOException ex)");
appendToJava(" {");
appendToJava(" System.out.println(\"FAIL:Failed to read files!\");");
appendToJava(" return false;");
appendToJava(" }");
appendToJava(" System.out.println(\"PASS: all data passed correctly!\");");
appendToJava(" return true;");
appendToJava(" }");
appendToJava("}");
}
private void makeOneTest(int paramCounter, ParamType paramType, TestType testType, String fncName) throws IOException {
javaFncNames.add(fncName);
SrcGenerator gen = new SrcGenerator(paramCounter, 1, paramType, testType, fncName, LINE_LENGTH);
generateJava(gen);
generateCpp(gen);
}
/*
* Create Java file containing code to call C native method. Method
* arguments list generated randomly.
*
*/
private void generateJava(SrcGenerator srcGen) throws IOException {
//native method
appendToJavaN(" native public static void " + srcGen.getFncName() + "(");
//appendToJavaN(srcGen.getJParm().toString());
appendToJavaN(srcGen.getJParm().toFormatString(" ", LINE_LENGTH));
appendToJava(" );");
//main
//appendToJava(srcGen.getJExecVarCreation());
appendToJava(" private static void " + srcGen.getFncName() + "_invoke(PrintStream ps)");
appendToJava(srcGen.getJExec(" "));
}
private void writeToJavaFile(String className) throws IOException {
File javaFile = new File(outputDir, className + ".java");
try (FileWriter javaFileWriter = new FileWriter(javaFile)) {
javaFileWriter.write(javaFileSrc.toString());
}
}
private void writeToCFile(String className) throws IOException {
File cFile = new File(outputDir, className + ".c");
try (FileWriter cFileWriter = new FileWriter(cFile)) {
cFileWriter.write(cFileSrc.toString());
}
}
private void writeTestListFile() {
StringBuilder cfg = new StringBuilder();
for (String fncName : javaFncNames) {
cfg.append(TEST_LIST_PREFIX).append("/").append(fncName);
cfg.append(" ").append("execute_positive\n");
}
File cfgFile = new File(outputDir, TEST_LIST_NAME);
try (FileWriter fw = new FileWriter(cfgFile)) {
fw.write(cfg.toString());
} catch (Exception e) {
}
}
private void writeCfgFile() {
for (String fncName : javaFncNames) {
StringBuilder cfg = new StringBuilder();
cfg.append("LD_LIBRARY_PATH=${COMMON_LIBS_LOCATION}/lib/${ARCH}/vm/jit/LongTransitions${PS}$LD_LIBRARY_PATH\n");
cfg.append("export LD_LIBRARY_PATH\n");
cfg.append("JAVA_OPTS=${JAVA_OPTS} ${JIT_OPTS}\n");
cfg.append("export JAVA_OPTS\n");
cfg.append("EXECUTE_CLASS=" + JAVA_PACKAGE_NAME + "." + JAVA_CLASS_NAME + "\n");
cfg.append("TEST_ARGS=" + fncName);
File tdir = new File(outputDir, fncName);
tdir.mkdirs();
File cfgFile = new File(tdir, fncName + ".cfg");
try (FileWriter fw = new FileWriter(cfgFile)) {
fw.write(cfg.toString());
} catch (Exception e) {
}
}
}
/*
* Generate C file. This file containing instructions to put passed
* arguments into output file for further comparsion with java output *
*/
private void generateCpp(SrcGenerator srcGen) throws IOException {
appendToC("JNIEXPORT void JNICALL " + C_FNC_NAME_PREFIX + srcGen.getFncName() + "(JNIEnv *e, jclass c");
appendToCN(srcGen.getCParm().toFormatString(" ", LINE_LENGTH));
appendToCN(")");
appendToC("\n{");
appendToCN(" FILE *file=fopen(\"");
appendToCN(cTxtFileName);
appendToCN("\",\"a\");");
appendToC(srcGen.getCExec(LINE_LENGTH," "));
appendToC(" fclose(file);");
appendToC("}");
}
private void appendToJava(String s) {
javaFileSrc.append(s);
javaFileSrc.append("\n");
System.out.println(s);
}
private void appendToJavaN(String s) {
javaFileSrc.append(s);
System.out.print(s);
}
private void appendToC(String s) {
cFileSrc.append(s);
cFileSrc.append("\n");
System.out.println(s);
}
private void appendToCN(String s) {
cFileSrc.append(s);
System.out.print(s);
}
}
enum NumberType {
INT("int ", "getRndInt()", "jint ", "%d", "%d"),
DOUBLE("double ", "getRndDouble()", "jdouble ", "%e", "%e"),
FLOAT("float ", "getRndFloat()", "jfloat ", "%e", "%e"),
BYTE("byte ", "getRndByte()", "jbyte ", "%d", "%d");
private String cType;
private String jType;
private String cConv;
private String jConv;
private String rndFnc;
NumberType(String jType, String rndFnc, String cType, String jConv, String cConv) {
this.cType = cType;
this.jType = jType;
this.cConv = cConv;
this.jConv = jConv;
this.rndFnc = rndFnc;
}
public String getСType() {
return cType;
}
public String getJType() {
return jType;
}
public String getСConv() {
return cConv;
}
public String getJConv() {
return jConv;
}
public String getFnc() {
return rndFnc;
}
}
//Types for testing
enum ParamType {
//DFBI
MIXED_DFBI1(NumberType.DOUBLE, NumberType.FLOAT, NumberType.BYTE, NumberType.INT),
MIXED_DFBI2(NumberType.DOUBLE, NumberType.FLOAT, NumberType.DOUBLE, NumberType.FLOAT, NumberType.BYTE, NumberType.INT),
MIXED_DFBI3(NumberType.DOUBLE, NumberType.FLOAT, NumberType.DOUBLE, NumberType.FLOAT, NumberType.DOUBLE, NumberType.FLOAT, NumberType.BYTE, NumberType.INT),
MIXED_DFBI4(NumberType.DOUBLE, NumberType.FLOAT, NumberType.DOUBLE, NumberType.FLOAT, NumberType.DOUBLE, NumberType.FLOAT, NumberType.DOUBLE, NumberType.FLOAT, NumberType.BYTE, NumberType.INT),
MIXED_DFBI5(NumberType.DOUBLE, NumberType.FLOAT, NumberType.DOUBLE, NumberType.FLOAT, NumberType.DOUBLE, NumberType.FLOAT, NumberType.DOUBLE, NumberType.FLOAT, NumberType.DOUBLE, NumberType.FLOAT, NumberType.BYTE, NumberType.INT),
//DFB
MIXED_DFB1(NumberType.DOUBLE, NumberType.FLOAT, NumberType.BYTE),
MIXED_DFB2(NumberType.DOUBLE, NumberType.FLOAT, NumberType.DOUBLE, NumberType.FLOAT, NumberType.BYTE),
MIXED_DFB3(NumberType.DOUBLE, NumberType.FLOAT, NumberType.DOUBLE, NumberType.FLOAT, NumberType.DOUBLE, NumberType.FLOAT, NumberType.BYTE),
MIXED_DFB4(NumberType.DOUBLE, NumberType.FLOAT, NumberType.DOUBLE, NumberType.FLOAT, NumberType.DOUBLE, NumberType.FLOAT, NumberType.DOUBLE, NumberType.FLOAT, NumberType.BYTE),
MIXED_DFB5(NumberType.DOUBLE, NumberType.FLOAT, NumberType.DOUBLE, NumberType.FLOAT, NumberType.DOUBLE, NumberType.FLOAT, NumberType.DOUBLE, NumberType.FLOAT, NumberType.DOUBLE, NumberType.FLOAT, NumberType.BYTE),
//DFI
MIXED_DFI1(NumberType.DOUBLE, NumberType.FLOAT, NumberType.INT),
MIXED_DFI2(NumberType.DOUBLE, NumberType.FLOAT, NumberType.DOUBLE, NumberType.FLOAT, NumberType.INT),
MIXED_DFI3(NumberType.DOUBLE, NumberType.FLOAT, NumberType.DOUBLE, NumberType.FLOAT, NumberType.DOUBLE, NumberType.FLOAT, NumberType.INT),
MIXED_DFI4(NumberType.DOUBLE, NumberType.FLOAT, NumberType.DOUBLE, NumberType.FLOAT, NumberType.DOUBLE, NumberType.FLOAT, NumberType.DOUBLE, NumberType.FLOAT, NumberType.INT),
MIXED_DFI5(NumberType.DOUBLE, NumberType.FLOAT, NumberType.DOUBLE, NumberType.FLOAT, NumberType.DOUBLE, NumberType.FLOAT, NumberType.DOUBLE, NumberType.FLOAT, NumberType.DOUBLE, NumberType.FLOAT, NumberType.INT),
//
MIXED_DF1(NumberType.DOUBLE, NumberType.FLOAT),
MIXED_DF2(NumberType.DOUBLE, NumberType.FLOAT, NumberType.FLOAT),
MIXED_DF3(NumberType.DOUBLE, NumberType.FLOAT, NumberType.FLOAT, NumberType.FLOAT),
MIXED_DF4(NumberType.DOUBLE, NumberType.DOUBLE, NumberType.FLOAT),
MIXED_DF5(NumberType.DOUBLE, NumberType.DOUBLE, NumberType.DOUBLE, NumberType.FLOAT),
//
EASY_D(NumberType.DOUBLE),
EASY_F(NumberType.FLOAT),
//Not needed
EASY_I(NumberType.INT),
EASY_B(NumberType.BYTE),
MIXED_IB(NumberType.INT, NumberType.BYTE),
//
MIXED_FBI1(NumberType.FLOAT, NumberType.BYTE, NumberType.INT),
MIXED_FBI2(NumberType.FLOAT, NumberType.FLOAT, NumberType.BYTE, NumberType.INT),
MIXED_FBI3(NumberType.FLOAT, NumberType.FLOAT, NumberType.FLOAT, NumberType.BYTE, NumberType.INT),
MIXED_FBI4(NumberType.FLOAT, NumberType.FLOAT, NumberType.FLOAT, NumberType.FLOAT, NumberType.BYTE, NumberType.INT),
MIXED_FBI5(NumberType.FLOAT, NumberType.FLOAT, NumberType.FLOAT, NumberType.FLOAT, NumberType.FLOAT, NumberType.BYTE, NumberType.INT),
//
MIXED_FB1(NumberType.FLOAT, NumberType.BYTE),
MIXED_FB2(NumberType.FLOAT, NumberType.FLOAT, NumberType.BYTE),
MIXED_FB3(NumberType.FLOAT, NumberType.FLOAT, NumberType.FLOAT, NumberType.BYTE),
MIXED_FB4(NumberType.FLOAT, NumberType.FLOAT, NumberType.FLOAT, NumberType.FLOAT, NumberType.BYTE),
MIXED_FB5(NumberType.FLOAT, NumberType.FLOAT, NumberType.FLOAT, NumberType.FLOAT, NumberType.FLOAT, NumberType.BYTE),
//
MIXED_DBI1(NumberType.DOUBLE, NumberType.BYTE, NumberType.INT),
MIXED_DBI2(NumberType.DOUBLE, NumberType.DOUBLE, NumberType.BYTE, NumberType.INT),
MIXED_DBI3(NumberType.DOUBLE, NumberType.DOUBLE, NumberType.DOUBLE, NumberType.BYTE, NumberType.INT),
MIXED_DBI4(NumberType.DOUBLE, NumberType.DOUBLE, NumberType.DOUBLE, NumberType.DOUBLE, NumberType.BYTE, NumberType.INT),
MIXED_DBI5(NumberType.DOUBLE, NumberType.DOUBLE, NumberType.DOUBLE, NumberType.DOUBLE, NumberType.DOUBLE, NumberType.BYTE, NumberType.INT),
//
MIXED_DB1(NumberType.DOUBLE, NumberType.BYTE),
MIXED_DB2(NumberType.DOUBLE, NumberType.DOUBLE, NumberType.BYTE),
MIXED_DB3(NumberType.DOUBLE, NumberType.DOUBLE, NumberType.DOUBLE, NumberType.BYTE),
MIXED_DB4(NumberType.DOUBLE, NumberType.DOUBLE, NumberType.DOUBLE, NumberType.DOUBLE, NumberType.BYTE),
MIXED_DB5(NumberType.DOUBLE, NumberType.DOUBLE, NumberType.DOUBLE, NumberType.DOUBLE, NumberType.DOUBLE, NumberType.BYTE),
//
MIXED_FI1(NumberType.FLOAT, NumberType.INT),
MIXED_FI2(NumberType.FLOAT, NumberType.FLOAT, NumberType.INT),
MIXED_FI3(NumberType.FLOAT, NumberType.FLOAT, NumberType.FLOAT, NumberType.INT),
MIXED_FI4(NumberType.FLOAT, NumberType.FLOAT, NumberType.FLOAT, NumberType.FLOAT, NumberType.INT),
MIXED_FI5(NumberType.FLOAT, NumberType.FLOAT, NumberType.FLOAT, NumberType.FLOAT, NumberType.FLOAT, NumberType.INT),
//
MIXED_DI1(NumberType.DOUBLE, NumberType.INT),
MIXED_DI2(NumberType.DOUBLE, NumberType.DOUBLE, NumberType.INT),
MIXED_DI3(NumberType.DOUBLE, NumberType.DOUBLE, NumberType.DOUBLE, NumberType.INT),
MIXED_DI4(NumberType.DOUBLE, NumberType.DOUBLE, NumberType.DOUBLE, NumberType.DOUBLE, NumberType.INT),
MIXED_DI5(NumberType.DOUBLE, NumberType.DOUBLE, NumberType.DOUBLE, NumberType.DOUBLE, NumberType.DOUBLE, NumberType.INT);
ArrayList<NumberType> value = new ArrayList();
ParamType(NumberType... type) {
value.addAll(Arrays.asList(type));
}
public ArrayList<NumberType> getValue() {
return value;
}
}
class GeneratorLogic {
public String generateJava(String fncName, ParameterList parmOut, ParameterList parmType, int maxLength, String prefix) {
StringBuilder sb = new StringBuilder();
sb.append(" {\n").append(prefix);
int lineLength = 0;
for (ParameterItem p : parmType.getList()) {
sb.append(p.value1);
sb.append(" ");
sb.append(p.value2);
sb.append("=");
sb.append(p.value3);
sb.append(";");
if (sb.length() - lineLength > maxLength) {
sb.append("\n").append(prefix);
lineLength = sb.length();
}
}
sb.append("\n");
sb.append(prefix);
for (ParameterItem p : parmOut.getList()) {
sb.append("ps.format(\"");
sb.append(p.value2);
sb.append("=");
sb.append(p.value1);
sb.append("\\n\",");
sb.append(p.value2);
sb.append(");");
if (sb.length() - lineLength > maxLength) {
sb.append("\n").append(prefix);
lineLength = sb.length();
}
}
sb.append("\n").append(prefix);
sb.append(fncName);
sb.append("(");
for (ParameterItem p : parmOut.getList()) {
sb.append(p.getDelim());
sb.append(p.value2);
if (sb.length() - lineLength > maxLength) {
sb.append("\n").append(prefix);
lineLength = sb.length();
}
}
sb.append(");\n}\n");
return sb.toString();
}
}
//Test types
enum TestType {
RANDOM(new GeneratorLogic());
private GeneratorLogic genLogic;
TestType(GeneratorLogic genLogic) {
this.genLogic = genLogic;
}
public GeneratorLogic getLogic() {
return genLogic;
}
}
//One item for ParameterList (delimiter and value to build strings)
class ParameterItem {
private String delimiter;
String value1;
String value2;
String value3;
//private String endVal="";
public ParameterItem(String delimiter, String value) {
this.delimiter = delimiter;
this.value1 = value;
value2 = "";
value3 = "";
}
public ParameterItem(String delimiter, String value1, String value2) {
this.delimiter = delimiter;
this.value1 = value1;
this.value2 = value2;
value3 = "";
}
public ParameterItem(String delimiter, String value1, String value2, String value3) {
this.delimiter = delimiter;
this.value1 = value1;
this.value2 = value2;
this.value3 = value3;
}
public String toString() {
return delimiter + value1 + value2 + value3;
}
public String getDelim() {
return delimiter;
}
}
//Delimiters and values to generate calls, etc.
class ParameterList {
ArrayList<ParameterItem> list = new ArrayList();
private String initDelim;
private String delim;
boolean lineBreak;
public ParameterList(String initialDelimiter, String delimiter, boolean lineBreak) {
initDelim = initialDelimiter;
delim = delimiter;
this.lineBreak = lineBreak;
}
public ArrayList<ParameterItem> getList() {
return list;
}
public void add(String value) {
list.add(new ParameterItem(initDelim, value));
initDelim = delim;
}
public void add(String value1, String value2) {
list.add(new ParameterItem(initDelim, value1, value2));
initDelim = delim;
}
public void add(String value1, String value2, String value3) {
list.add(new ParameterItem(initDelim, value1, value2, value3));
initDelim = delim;
}
public ParameterItem get(int id) {
return list.get(id);
}
public String toString() {
StringBuilder sb = new StringBuilder();
for (ParameterItem p : list) {
sb.append(p.toString());
if (lineBreak) {
sb.append("\n");
}
}
return sb.toString();
}
public String toFormatString(String prefix, int maxLength) {
StringBuilder sb = new StringBuilder();
int charCount = 0;
for (ParameterItem p : list) {
sb.append(p.toString());
if (sb.length() - charCount > maxLength) {
sb.append("\n").append(prefix);
charCount = sb.length();
}
}
return sb.toString();
}
public int size() {
return list.size();
}
public String getAllItemExclude(int excludeId) {
StringBuilder sb = new StringBuilder();
int cnt = list.size();
for (int id = 0; id < cnt; ++id) {
ParameterItem p = list.get(id);
if (id == excludeId) {
sb.append(p.getDelim());
sb.append("0");
} else {
sb.append(p.toString());
}
}
return sb.toString();
}
public String getAllItemExcludeNot(int excludeId) {
StringBuilder sb = new StringBuilder();
int cnt = list.size();
for (int id = 0; id < cnt; ++id) {
ParameterItem p = list.get(id);
if (id != excludeId) {
sb.append(p.getDelim());
sb.append("0");
// sb.append(p.getEnd());
} else {
sb.append(p.toString());
}
}
return sb.toString();
}
}
class ParameterListGenerator {
private ArrayList<NumberType> list = new ArrayList();
private Random random;
private int typeCnt;
ParameterList cParms = new ParameterList(",", ",", true);
ParameterList rParms = new ParameterList("", ",", true);
ParameterList jParms = new ParameterList("", ",", true);
ParameterList cExec = new ParameterList("", "", true);
ParameterList jExecParm = new ParameterList("", ",", true);
ParameterList jExecOut = new ParameterList("", ",", true);
public ParameterListGenerator(int length, ParamType paramType) {
generateRndTest(paramType, length);
}
private void add(ParameterList list, String s1) {
list.add(s1);
}
private void add(ParameterList list, String s1, String s2) {
list.add(s1, s2);
}
private void add(ParameterList list, String s1, String s2, String s3) {
list.add(s1, s2, s3);
}
private void generateRndTest(ParamType paramType, int length) {
generateTypeList(paramType);
typeCnt = list.size();
random = new Random();
random.setSeed(System.currentTimeMillis());
for (int cnt = 0; cnt < length; ++cnt) {
int type = random.nextInt(typeCnt);
String randomVal = list.get(type).getFnc();
String ctype = list.get(type).getСType();
String jtype = list.get(type).getJType();
String cconv = list.get(type).getСConv();
String jconv = list.get(type).getJConv();
String varName = "p" + cnt;
add(jParms, jtype, varName);
//jParmGen.add(jtype + varName);
//cParms.add(ctype + varName);
add(cParms, ctype, varName);
//rParms.add(varName);
add(rParms, varName);
add(cExec, varName, cconv);
add(jExecParm, jtype, varName, randomVal);
//jExecOut.add(new PairString(jconv,varName,jtype));
add(jExecOut, jconv, varName, jtype);
}
}
public ParameterList getCExec() {
return cExec;
}
public ParameterList getCParm() {
return cParms;
}
//Return generated java text
public ParameterList getJExecParameters() {
return jExecParm;
}
public ParameterList getJExecOut() {
return jExecOut;
}
/*
* Return string containing parameters for Java
*/
public ParameterList getJParm() {
return jParms;
}
public ParameterList getRParm() {
return rParms;
}
private void generateTypeList(ParamType paramType) {
list.addAll(paramType.getValue());
}
}
class SrcGenerator {
ParameterListGenerator parmListGen;
GeneratorLogic genLogic;
int iterationCounter;
int parametersCounter;
ParamType paramType;
TestType testType;
String fncName;
//SrcGenerator g1=new SrcGenerator(3,1,ParamType.MIXED_DFIB,TestType.RANDOM,"callRandom");
int maxLength;
public SrcGenerator(int parmCounter, int iterCounter, ParamType parType, TestType testType, String fncName, int maxLength) {
this.maxLength = maxLength;
parametersCounter = parmCounter;
iterationCounter = iterCounter;
paramType = parType;
this.testType = testType;
this.fncName = fncName;
parmListGen = new ParameterListGenerator(parametersCounter, paramType);
genLogic = testType.getLogic();
}
public String getFncName() {
return fncName;
}
public ParameterList getJParm() {
return parmListGen.getJParm();
}
public ParameterList getCParm() {
return parmListGen.getCParm();
}
public String getCExec() {
StringBuilder sb = new StringBuilder();
for (ParameterItem p : parmListGen.getCExec().getList()) {
sb.append("fprintf(file,\"");
sb.append(p.value1);
sb.append("=");
sb.append(p.value2);
sb.append("\\n\",");
sb.append(p.value1);
sb.append(");\n");
}
return sb.toString();
}
public String getCExec(int maxLength,String prefix) {
int lineLength = 0;
StringBuilder sb = new StringBuilder();
for (ParameterItem p : parmListGen.getCExec().getList()) {
sb.append("fprintf(file,\"");
sb.append(p.value1);
sb.append("=");
sb.append(p.value2);
sb.append("\\n\",");
sb.append(p.value1);
sb.append(");");
if (sb.length() - lineLength > maxLength) {
lineLength = sb.length();
sb.append("\n").append(prefix);
}
}
return sb.toString();
}
public String getJExec(String prefix) {
return genLogic.generateJava(fncName, parmListGen.getJExecOut(), parmListGen.getJExecParameters(), maxLength, prefix);
}
}