jdk-24/test/hotspot/jtreg/vmTestbase/vm/jit/LongTransitions/JniArmHFTestGenerator.java.txt
2020-04-30 08:07:36 -07:00

929 lines
35 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
* Copyright (c) 2012, 2020, 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("import jdk.test.lib.Utils;");
appendToJava("public class " + className);
appendToJava("{");
appendToJava(" public static boolean flag = false;");
appendToJava(" static Random rnd;");
appendToJava(" static{");
appendToJava(" rnd=Utils.getRandomInstance();");
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);
}
}