Path: blob/master/test/hotspot/jtreg/vmTestbase/vm/jit/LongTransitions/JniArmHFTestGenerator.java.txt
41159 views
/*1* Copyright (c) 2012, 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*/2223/* This code generate an LTTest.java and LTTest.c files with corresponding *.cfg files which containt test defenition24* for JNI testing.25*26*/27import java.io.File;28import java.io.FileWriter;29import java.io.IOException;30import java.util.ArrayList;31import java.util.Arrays;32import java.util.Random;3334//Java and C file generator for JNI tests35public class JniArmHFTestGenerator {3637private final String JAVA_CLASS_NAME = "LTTest";38private final String C_FNC_NAME_PREFIX = "Java_vm_jit_LongTransitions_" + JAVA_CLASS_NAME + "_";39private final String JAVA_PACKAGE_NAME = "vm.jit.LongTransitions";40private final String TEST_LIST_PREFIX = "vm/jit/LongTransitions";41private final String TEST_LIST_NAME = "vm.jit.long.testlist";42//Maximal line length for some SRC generation function43private final int LINE_LENGTH = 70;44//127 is maximal value for JAVA parameters list45private final int PARAMS_COUNTER = 127;46StringBuilder javaFileSrc;47StringBuilder cFileSrc;48//StringBuilder cfgFileSrc;49private String javaTxtFileName;50private String cTxtFileName;51private File outputDir;52private ArrayList<String> javaFncNames = new ArrayList<String>();5354public static void main(String[] args) throws IOException {55new JniArmHFTestGenerator().makeSomeTest();56}5758public void makeSomeTest() throws IOException {5960makeJavaIntro(JAVA_CLASS_NAME);61makeCIntro();62int cnt = PARAMS_COUNTER;6364makeOneTest(cnt, ParamType.EASY_F, TestType.RANDOM, "nativeFnc1");65makeOneTest(cnt, ParamType.EASY_D, TestType.RANDOM, "nativeFnc2");66makeOneTest(cnt, ParamType.MIXED_FI1, TestType.RANDOM, "nativeFnc3");67makeOneTest(cnt, ParamType.MIXED_FB1, TestType.RANDOM, "nativeFnc4");68makeOneTest(cnt, ParamType.MIXED_FBI1, TestType.RANDOM, "nativeFnc5");69makeOneTest(cnt, ParamType.MIXED_DI1, TestType.RANDOM, "nativeFnc6");70makeOneTest(cnt, ParamType.MIXED_DB1, TestType.RANDOM, "nativeFnc7");71makeOneTest(cnt, ParamType.MIXED_DBI1, TestType.RANDOM, "nativeFnc8");72makeOneTest(cnt, ParamType.MIXED_DFBI1, TestType.RANDOM, "nativeFnc9");73makeOneTest(cnt, ParamType.MIXED_DF1, TestType.RANDOM, "nativeFnc10");74makeOneTest(cnt, ParamType.MIXED_DFI1, TestType.RANDOM, "nativeFnc11");75makeOneTest(cnt, ParamType.MIXED_DFB1, TestType.RANDOM, "nativeFnc12");7677makeOneTest(cnt, ParamType.MIXED_FI2, TestType.RANDOM, "nativeFnc13");78makeOneTest(cnt, ParamType.MIXED_FB2, TestType.RANDOM, "nativeFnc14");79makeOneTest(cnt, ParamType.MIXED_FBI2, TestType.RANDOM, "nativeFnc15");80makeOneTest(cnt, ParamType.MIXED_DI2, TestType.RANDOM, "nativeFnc16");81makeOneTest(cnt, ParamType.MIXED_DB2, TestType.RANDOM, "nativeFnc17");82makeOneTest(cnt, ParamType.MIXED_DBI2, TestType.RANDOM, "nativeFnc18");83makeOneTest(cnt, ParamType.MIXED_DFBI2, TestType.RANDOM, "nativeFnc19");84makeOneTest(cnt, ParamType.MIXED_DF2, TestType.RANDOM, "nativeFnc20");85makeOneTest(cnt, ParamType.MIXED_DFI2, TestType.RANDOM, "nativeFnc21");86makeOneTest(cnt, ParamType.MIXED_DFB2, TestType.RANDOM, "nativeFnc22");8788makeOneTest(cnt, ParamType.MIXED_FI3, TestType.RANDOM, "nativeFnc23");89makeOneTest(cnt, ParamType.MIXED_FB3, TestType.RANDOM, "nativeFnc24");90makeOneTest(cnt, ParamType.MIXED_FBI3, TestType.RANDOM, "nativeFnc25");91makeOneTest(cnt, ParamType.MIXED_DI3, TestType.RANDOM, "nativeFnc26");92makeOneTest(cnt, ParamType.MIXED_DB3, TestType.RANDOM, "nativeFnc27");93makeOneTest(cnt, ParamType.MIXED_DBI3, TestType.RANDOM, "nativeFnc28");94makeOneTest(cnt, ParamType.MIXED_DFBI3, TestType.RANDOM, "nativeFnc29");95makeOneTest(cnt, ParamType.MIXED_DF3, TestType.RANDOM, "nativeFnc30");96makeOneTest(cnt, ParamType.MIXED_DFI3, TestType.RANDOM, "nativeFnc31");97makeOneTest(cnt, ParamType.MIXED_DFB3, TestType.RANDOM, "nativeFnc32");9899makeOneTest(cnt, ParamType.MIXED_FI4, TestType.RANDOM, "nativeFnc33");100makeOneTest(cnt, ParamType.MIXED_FB4, TestType.RANDOM, "nativeFnc34");101makeOneTest(cnt, ParamType.MIXED_FBI4, TestType.RANDOM, "nativeFnc35");102makeOneTest(cnt, ParamType.MIXED_DI4, TestType.RANDOM, "nativeFnc36");103makeOneTest(cnt, ParamType.MIXED_DB4, TestType.RANDOM, "nativeFnc37");104makeOneTest(cnt, ParamType.MIXED_DBI4, TestType.RANDOM, "nativeFnc38");105makeOneTest(cnt, ParamType.MIXED_DFBI4, TestType.RANDOM, "nativeFnc39");106makeOneTest(cnt, ParamType.MIXED_DF4, TestType.RANDOM, "nativeFnc40");107makeOneTest(cnt, ParamType.MIXED_DFI4, TestType.RANDOM, "nativeFnc41");108makeOneTest(cnt, ParamType.MIXED_DFB4, TestType.RANDOM, "nativeFnc42");109110makeOneTest(cnt, ParamType.MIXED_FI5, TestType.RANDOM, "nativeFnc43");111makeOneTest(cnt, ParamType.MIXED_FB5, TestType.RANDOM, "nativeFnc44");112makeOneTest(cnt, ParamType.MIXED_FBI5, TestType.RANDOM, "nativeFnc45");113makeOneTest(cnt, ParamType.MIXED_DI5, TestType.RANDOM, "nativeFnc46");114makeOneTest(cnt, ParamType.MIXED_DB5, TestType.RANDOM, "nativeFnc47");115makeOneTest(cnt, ParamType.MIXED_DBI5, TestType.RANDOM, "nativeFnc48");116makeOneTest(cnt, ParamType.MIXED_DFBI5, TestType.RANDOM, "nativeFnc49");117makeOneTest(cnt, ParamType.MIXED_DF5, TestType.RANDOM, "nativeFnc50");118makeOneTest(cnt, ParamType.MIXED_DFI5, TestType.RANDOM, "nativeFnc51");119makeOneTest(cnt, ParamType.MIXED_DFB5, TestType.RANDOM, "nativeFnc52");120makeJavaInvoke();121makeJavaOutro();122123writeToJavaFile(JAVA_CLASS_NAME);124writeToCFile(JAVA_CLASS_NAME);125//writeCmpFile();126127writeTestListFile();128writeCfgFile();129}130131private void makeJavaInvoke() {132appendToJava(" public static void main(String[] args) throws Exception");133appendToJava(" {");134appendToJava(" if ( System.getProperty(\"os.name\").matches(\".*[Ww][Ii][Nn].*\") )");135appendToJava(" {");136appendToJava(" System.out.println(\"TEST PASSED! Dummy execution on Windows* OS!\");");137appendToJava(" return;");138appendToJava(" }");139140appendToJava(" deleteFiles();");141appendToJavaN(" PrintStream ps=new PrintStream(new File(\"");142appendToJavaN(javaTxtFileName);143appendToJava("\"));");144145appendToJava(" if (args.length>0)");146appendToJava(" switch(args[0])");147appendToJava(" {");148149for (String s : javaFncNames) {150appendToJava(" case \"" + s + "\":");151appendToJavaN(" ");152appendToJavaN(s);153appendToJava("_invoke(ps);");154appendToJava(" break;");155156}157appendToJava(" default:");158appendToJava(" throw new Exception(\"FAIL: invalid args!\");");159appendToJava(" }");160appendToJava(" else");161appendToJava(" {");162appendToJava(" throw new Exception(\"FAIL: invalid args!\");");163appendToJava(" }");164165166}167168private void makeCIntro() {169//appendToC(" //------------------------C----------------------------");170//appendToC("#include \""+className+".h\"");171appendToC("#include <jni.h>");172appendToC("#include <stdio.h>");173}174175private void makeJavaIntro(String className) {176177cFileSrc = new StringBuilder();178javaFileSrc = new StringBuilder();179180181File outputDirL1 = new File("vm" + File.separatorChar + "jit" + File.separatorChar + "LongTransitions");182//outputDir=new File(outputDirL1,className);183outputDir = outputDirL1;184outputDir.mkdirs();185186javaTxtFileName = className + "_java.txt";187cTxtFileName = className + "_c.txt";188189appendToJava("package " + JAVA_PACKAGE_NAME + ";");190appendToJava("import java.io.*;");191appendToJava("import java.util.Random;");192appendToJava("import jdk.test.lib.Utils;");193appendToJava("public class " + className);194appendToJava("{");195appendToJava(" public static boolean flag = false;");196appendToJava(" static Random rnd;");197appendToJava(" static{");198appendToJava(" rnd=Utils.getRandomInstance();");199appendToJava(" System.loadLibrary(\"" + className + "\");");200appendToJava(" }");201//Different randoms202appendToJava(" public static int getRndInt(){return rnd.nextInt(Integer.MAX_VALUE);}");203appendToJava(" public static float getRndFloat(){return rnd.nextFloat()*Float.MAX_VALUE;}");204appendToJava(" public static double getRndDouble(){return rnd.nextDouble()*Double.MAX_VALUE;}");205appendToJava(" public static byte getRndByte(){return (byte)rnd.nextInt(Byte.MAX_VALUE);}");206207//deleteFiles method208appendToJava(" private static void deleteFiles()");209appendToJava(" {");210appendToJavaN(" File f=new File(\"");211appendToJavaN(javaTxtFileName);212appendToJava("\");");213appendToJava(" if ( f.exists())");214appendToJava(" f.delete();");215appendToJavaN(" f=new File(\"");216appendToJavaN(cTxtFileName);217appendToJava("\");");218appendToJava(" if ( f.exists())");219appendToJava(" f.delete();");220appendToJava(" }");221}222223private void makeJavaOutro() {224appendToJava(" flag=chkFile();");225appendToJava(" if(!flag)");226appendToJava(" throw new Exception(\"FAIL:Tests failed!\"); ");227appendToJava(" }");228appendToJava(" private static boolean chkFile()");229appendToJava(" {");230appendToJava(" File javaFile=new File(\"" + javaTxtFileName + "\");");231appendToJava(" if (! javaFile.exists())");232appendToJava(" {");233appendToJava(" System.out.println(\"FAIL:Failed to open file " + javaTxtFileName + " - file not exists!\");");234appendToJava(" return false;");235appendToJava(" }");236appendToJava(" File cFile=new File(\"" + cTxtFileName + "\");");237appendToJava(" if (! cFile.exists())");238appendToJava(" {");239appendToJava(" System.out.println(\"FAIL:Failed to open file " + cTxtFileName + " - file not exists!\");");240appendToJava(" return false;");241appendToJava(" }");242appendToJava(" if ( cFile.length()!=javaFile.length() )");243appendToJava(" {");244appendToJava(" System.out.println(\"FAIL:File length not equal!\");");245appendToJava(" return false;");246appendToJava(" }");247appendToJava(" long byteCount=cFile.length();");248249250appendToJava(" try{");251appendToJava(" FileInputStream fisC=new FileInputStream(cFile);");252appendToJava(" FileInputStream fisJava=new FileInputStream(javaFile);");253appendToJava(" byte[] cData=new byte[fisC.available()];");254appendToJava(" fisC.read(cData);");255appendToJava(" byte[] javaData=new byte[fisJava.available()];");256appendToJava(" fisJava.read(javaData);");257258appendToJava(" for ( int cnt=0;cnt<byteCount;++cnt)");259appendToJava(" {");260appendToJava(" if ( cData[cnt]!=javaData[cnt] )");261appendToJava(" {");262appendToJava(" System.out.println(\"FAIL:Test failed! \"+cnt+\" byte are wrong! C file - \" + cData[cnt] + \" Java file - \"+javaData[cnt] );");263appendToJava(" return false;");264appendToJava(" }");265appendToJava(" }");266appendToJava(" }");267appendToJava(" catch (FileNotFoundException ex)");268appendToJava(" {");269appendToJava(" System.out.println(\"FAIL:Some of files not found!\");");270appendToJava(" return false;");271appendToJava(" }");272appendToJava(" catch (IOException ex)");273appendToJava(" {");274appendToJava(" System.out.println(\"FAIL:Failed to read files!\");");275appendToJava(" return false;");276appendToJava(" }");277appendToJava(" System.out.println(\"PASS: all data passed correctly!\");");278appendToJava(" return true;");279280281282appendToJava(" }");283284appendToJava("}");285286287}288289private void makeOneTest(int paramCounter, ParamType paramType, TestType testType, String fncName) throws IOException {290291javaFncNames.add(fncName);292SrcGenerator gen = new SrcGenerator(paramCounter, 1, paramType, testType, fncName, LINE_LENGTH);293generateJava(gen);294generateCpp(gen);295296297}298299/*300* Create Java file containing code to call C native method. Method301* arguments list generated randomly.302*303*/304private void generateJava(SrcGenerator srcGen) throws IOException {305306//native method307appendToJavaN(" native public static void " + srcGen.getFncName() + "(");308//appendToJavaN(srcGen.getJParm().toString());309appendToJavaN(srcGen.getJParm().toFormatString(" ", LINE_LENGTH));310appendToJava(" );");311//main312//appendToJava(srcGen.getJExecVarCreation());313appendToJava(" private static void " + srcGen.getFncName() + "_invoke(PrintStream ps)");314appendToJava(srcGen.getJExec(" "));315}316317private void writeToJavaFile(String className) throws IOException {318319File javaFile = new File(outputDir, className + ".java");320try (FileWriter javaFileWriter = new FileWriter(javaFile)) {321javaFileWriter.write(javaFileSrc.toString());322}323}324325private void writeToCFile(String className) throws IOException {326327File cFile = new File(outputDir, className + ".c");328try (FileWriter cFileWriter = new FileWriter(cFile)) {329cFileWriter.write(cFileSrc.toString());330}331}332333private void writeTestListFile() {334335StringBuilder cfg = new StringBuilder();336337for (String fncName : javaFncNames) {338cfg.append(TEST_LIST_PREFIX).append("/").append(fncName);339cfg.append(" ").append("execute_positive\n");340}341342File cfgFile = new File(outputDir, TEST_LIST_NAME);343try (FileWriter fw = new FileWriter(cfgFile)) {344fw.write(cfg.toString());345} catch (Exception e) {346}347348}349350private void writeCfgFile() {351352for (String fncName : javaFncNames) {353354StringBuilder cfg = new StringBuilder();355356cfg.append("LD_LIBRARY_PATH=${COMMON_LIBS_LOCATION}/lib/${ARCH}/vm/jit/LongTransitions${PS}$LD_LIBRARY_PATH\n");357cfg.append("export LD_LIBRARY_PATH\n");358cfg.append("JAVA_OPTS=${JAVA_OPTS} ${JIT_OPTS}\n");359cfg.append("export JAVA_OPTS\n");360cfg.append("EXECUTE_CLASS=" + JAVA_PACKAGE_NAME + "." + JAVA_CLASS_NAME + "\n");361cfg.append("TEST_ARGS=" + fncName);362363File tdir = new File(outputDir, fncName);364tdir.mkdirs();365File cfgFile = new File(tdir, fncName + ".cfg");366try (FileWriter fw = new FileWriter(cfgFile)) {367fw.write(cfg.toString());368} catch (Exception e) {369}370}371}372373/*374* Generate C file. This file containing instructions to put passed375* arguments into output file for further comparsion with java output *376*/377private void generateCpp(SrcGenerator srcGen) throws IOException {378379appendToC("JNIEXPORT void JNICALL " + C_FNC_NAME_PREFIX + srcGen.getFncName() + "(JNIEnv *e, jclass c");380appendToCN(srcGen.getCParm().toFormatString(" ", LINE_LENGTH));381appendToCN(")");382appendToC("\n{");383384appendToCN(" FILE *file=fopen(\"");385appendToCN(cTxtFileName);386appendToCN("\",\"a\");");387388appendToC(srcGen.getCExec(LINE_LENGTH," "));389appendToC(" fclose(file);");390appendToC("}");391}392393private void appendToJava(String s) {394javaFileSrc.append(s);395javaFileSrc.append("\n");396System.out.println(s);397}398399private void appendToJavaN(String s) {400javaFileSrc.append(s);401System.out.print(s);402}403404private void appendToC(String s) {405cFileSrc.append(s);406cFileSrc.append("\n");407System.out.println(s);408}409410private void appendToCN(String s) {411cFileSrc.append(s);412System.out.print(s);413414}415}416417enum NumberType {418419INT("int ", "getRndInt()", "jint ", "%d", "%d"),420DOUBLE("double ", "getRndDouble()", "jdouble ", "%e", "%e"),421FLOAT("float ", "getRndFloat()", "jfloat ", "%e", "%e"),422BYTE("byte ", "getRndByte()", "jbyte ", "%d", "%d");423private String cType;424private String jType;425private String cConv;426private String jConv;427private String rndFnc;428429NumberType(String jType, String rndFnc, String cType, String jConv, String cConv) {430this.cType = cType;431this.jType = jType;432this.cConv = cConv;433this.jConv = jConv;434this.rndFnc = rndFnc;435}436437public String getСType() {438return cType;439}440441public String getJType() {442return jType;443}444445public String getСConv() {446return cConv;447}448449public String getJConv() {450return jConv;451}452453public String getFnc() {454return rndFnc;455}456}457458//Types for testing459enum ParamType {460//DFBI461462MIXED_DFBI1(NumberType.DOUBLE, NumberType.FLOAT, NumberType.BYTE, NumberType.INT),463MIXED_DFBI2(NumberType.DOUBLE, NumberType.FLOAT, NumberType.DOUBLE, NumberType.FLOAT, NumberType.BYTE, NumberType.INT),464MIXED_DFBI3(NumberType.DOUBLE, NumberType.FLOAT, NumberType.DOUBLE, NumberType.FLOAT, NumberType.DOUBLE, NumberType.FLOAT, NumberType.BYTE, NumberType.INT),465MIXED_DFBI4(NumberType.DOUBLE, NumberType.FLOAT, NumberType.DOUBLE, NumberType.FLOAT, NumberType.DOUBLE, NumberType.FLOAT, NumberType.DOUBLE, NumberType.FLOAT, NumberType.BYTE, NumberType.INT),466MIXED_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),467//DFB468MIXED_DFB1(NumberType.DOUBLE, NumberType.FLOAT, NumberType.BYTE),469MIXED_DFB2(NumberType.DOUBLE, NumberType.FLOAT, NumberType.DOUBLE, NumberType.FLOAT, NumberType.BYTE),470MIXED_DFB3(NumberType.DOUBLE, NumberType.FLOAT, NumberType.DOUBLE, NumberType.FLOAT, NumberType.DOUBLE, NumberType.FLOAT, NumberType.BYTE),471MIXED_DFB4(NumberType.DOUBLE, NumberType.FLOAT, NumberType.DOUBLE, NumberType.FLOAT, NumberType.DOUBLE, NumberType.FLOAT, NumberType.DOUBLE, NumberType.FLOAT, NumberType.BYTE),472MIXED_DFB5(NumberType.DOUBLE, NumberType.FLOAT, NumberType.DOUBLE, NumberType.FLOAT, NumberType.DOUBLE, NumberType.FLOAT, NumberType.DOUBLE, NumberType.FLOAT, NumberType.DOUBLE, NumberType.FLOAT, NumberType.BYTE),473//DFI474MIXED_DFI1(NumberType.DOUBLE, NumberType.FLOAT, NumberType.INT),475MIXED_DFI2(NumberType.DOUBLE, NumberType.FLOAT, NumberType.DOUBLE, NumberType.FLOAT, NumberType.INT),476MIXED_DFI3(NumberType.DOUBLE, NumberType.FLOAT, NumberType.DOUBLE, NumberType.FLOAT, NumberType.DOUBLE, NumberType.FLOAT, NumberType.INT),477MIXED_DFI4(NumberType.DOUBLE, NumberType.FLOAT, NumberType.DOUBLE, NumberType.FLOAT, NumberType.DOUBLE, NumberType.FLOAT, NumberType.DOUBLE, NumberType.FLOAT, NumberType.INT),478MIXED_DFI5(NumberType.DOUBLE, NumberType.FLOAT, NumberType.DOUBLE, NumberType.FLOAT, NumberType.DOUBLE, NumberType.FLOAT, NumberType.DOUBLE, NumberType.FLOAT, NumberType.DOUBLE, NumberType.FLOAT, NumberType.INT),479//480MIXED_DF1(NumberType.DOUBLE, NumberType.FLOAT),481MIXED_DF2(NumberType.DOUBLE, NumberType.FLOAT, NumberType.FLOAT),482MIXED_DF3(NumberType.DOUBLE, NumberType.FLOAT, NumberType.FLOAT, NumberType.FLOAT),483MIXED_DF4(NumberType.DOUBLE, NumberType.DOUBLE, NumberType.FLOAT),484MIXED_DF5(NumberType.DOUBLE, NumberType.DOUBLE, NumberType.DOUBLE, NumberType.FLOAT),485//486EASY_D(NumberType.DOUBLE),487EASY_F(NumberType.FLOAT),488//Not needed489EASY_I(NumberType.INT),490EASY_B(NumberType.BYTE),491MIXED_IB(NumberType.INT, NumberType.BYTE),492//493MIXED_FBI1(NumberType.FLOAT, NumberType.BYTE, NumberType.INT),494MIXED_FBI2(NumberType.FLOAT, NumberType.FLOAT, NumberType.BYTE, NumberType.INT),495MIXED_FBI3(NumberType.FLOAT, NumberType.FLOAT, NumberType.FLOAT, NumberType.BYTE, NumberType.INT),496MIXED_FBI4(NumberType.FLOAT, NumberType.FLOAT, NumberType.FLOAT, NumberType.FLOAT, NumberType.BYTE, NumberType.INT),497MIXED_FBI5(NumberType.FLOAT, NumberType.FLOAT, NumberType.FLOAT, NumberType.FLOAT, NumberType.FLOAT, NumberType.BYTE, NumberType.INT),498//499MIXED_FB1(NumberType.FLOAT, NumberType.BYTE),500MIXED_FB2(NumberType.FLOAT, NumberType.FLOAT, NumberType.BYTE),501MIXED_FB3(NumberType.FLOAT, NumberType.FLOAT, NumberType.FLOAT, NumberType.BYTE),502MIXED_FB4(NumberType.FLOAT, NumberType.FLOAT, NumberType.FLOAT, NumberType.FLOAT, NumberType.BYTE),503MIXED_FB5(NumberType.FLOAT, NumberType.FLOAT, NumberType.FLOAT, NumberType.FLOAT, NumberType.FLOAT, NumberType.BYTE),504//505MIXED_DBI1(NumberType.DOUBLE, NumberType.BYTE, NumberType.INT),506MIXED_DBI2(NumberType.DOUBLE, NumberType.DOUBLE, NumberType.BYTE, NumberType.INT),507MIXED_DBI3(NumberType.DOUBLE, NumberType.DOUBLE, NumberType.DOUBLE, NumberType.BYTE, NumberType.INT),508MIXED_DBI4(NumberType.DOUBLE, NumberType.DOUBLE, NumberType.DOUBLE, NumberType.DOUBLE, NumberType.BYTE, NumberType.INT),509MIXED_DBI5(NumberType.DOUBLE, NumberType.DOUBLE, NumberType.DOUBLE, NumberType.DOUBLE, NumberType.DOUBLE, NumberType.BYTE, NumberType.INT),510//511MIXED_DB1(NumberType.DOUBLE, NumberType.BYTE),512MIXED_DB2(NumberType.DOUBLE, NumberType.DOUBLE, NumberType.BYTE),513MIXED_DB3(NumberType.DOUBLE, NumberType.DOUBLE, NumberType.DOUBLE, NumberType.BYTE),514MIXED_DB4(NumberType.DOUBLE, NumberType.DOUBLE, NumberType.DOUBLE, NumberType.DOUBLE, NumberType.BYTE),515MIXED_DB5(NumberType.DOUBLE, NumberType.DOUBLE, NumberType.DOUBLE, NumberType.DOUBLE, NumberType.DOUBLE, NumberType.BYTE),516//517MIXED_FI1(NumberType.FLOAT, NumberType.INT),518MIXED_FI2(NumberType.FLOAT, NumberType.FLOAT, NumberType.INT),519MIXED_FI3(NumberType.FLOAT, NumberType.FLOAT, NumberType.FLOAT, NumberType.INT),520MIXED_FI4(NumberType.FLOAT, NumberType.FLOAT, NumberType.FLOAT, NumberType.FLOAT, NumberType.INT),521MIXED_FI5(NumberType.FLOAT, NumberType.FLOAT, NumberType.FLOAT, NumberType.FLOAT, NumberType.FLOAT, NumberType.INT),522//523MIXED_DI1(NumberType.DOUBLE, NumberType.INT),524MIXED_DI2(NumberType.DOUBLE, NumberType.DOUBLE, NumberType.INT),525MIXED_DI3(NumberType.DOUBLE, NumberType.DOUBLE, NumberType.DOUBLE, NumberType.INT),526MIXED_DI4(NumberType.DOUBLE, NumberType.DOUBLE, NumberType.DOUBLE, NumberType.DOUBLE, NumberType.INT),527MIXED_DI5(NumberType.DOUBLE, NumberType.DOUBLE, NumberType.DOUBLE, NumberType.DOUBLE, NumberType.DOUBLE, NumberType.INT);528ArrayList<NumberType> value = new ArrayList();529530ParamType(NumberType... type) {531value.addAll(Arrays.asList(type));532}533534public ArrayList<NumberType> getValue() {535return value;536}537}538539class GeneratorLogic {540541public String generateJava(String fncName, ParameterList parmOut, ParameterList parmType, int maxLength, String prefix) {542StringBuilder sb = new StringBuilder();543544sb.append(" {\n").append(prefix);545int lineLength = 0;546for (ParameterItem p : parmType.getList()) {547sb.append(p.value1);548sb.append(" ");549sb.append(p.value2);550sb.append("=");551sb.append(p.value3);552sb.append(";");553if (sb.length() - lineLength > maxLength) {554sb.append("\n").append(prefix);555lineLength = sb.length();556}557}558559sb.append("\n");560sb.append(prefix);561for (ParameterItem p : parmOut.getList()) {562sb.append("ps.format(\"");563sb.append(p.value2);564sb.append("=");565sb.append(p.value1);566sb.append("\\n\",");567568569sb.append(p.value2);570sb.append(");");571if (sb.length() - lineLength > maxLength) {572sb.append("\n").append(prefix);573lineLength = sb.length();574}575576}577578sb.append("\n").append(prefix);579580sb.append(fncName);581sb.append("(");582for (ParameterItem p : parmOut.getList()) {583sb.append(p.getDelim());584sb.append(p.value2);585if (sb.length() - lineLength > maxLength) {586sb.append("\n").append(prefix);587lineLength = sb.length();588}589}590sb.append(");\n}\n");591592return sb.toString();593}594}595596//Test types597enum TestType {598599RANDOM(new GeneratorLogic());600private GeneratorLogic genLogic;601602TestType(GeneratorLogic genLogic) {603this.genLogic = genLogic;604}605606public GeneratorLogic getLogic() {607return genLogic;608}609}610611//One item for ParameterList (delimiter and value to build strings)612class ParameterItem {613614private String delimiter;615String value1;616String value2;617String value3;618//private String endVal="";619620public ParameterItem(String delimiter, String value) {621this.delimiter = delimiter;622this.value1 = value;623value2 = "";624value3 = "";625}626627public ParameterItem(String delimiter, String value1, String value2) {628this.delimiter = delimiter;629this.value1 = value1;630this.value2 = value2;631value3 = "";632}633634public ParameterItem(String delimiter, String value1, String value2, String value3) {635this.delimiter = delimiter;636this.value1 = value1;637this.value2 = value2;638this.value3 = value3;639}640641public String toString() {642return delimiter + value1 + value2 + value3;643}644645public String getDelim() {646return delimiter;647}648}649//Delimiters and values to generate calls, etc.650class ParameterList {651652ArrayList<ParameterItem> list = new ArrayList();653private String initDelim;654private String delim;655boolean lineBreak;656657public ParameterList(String initialDelimiter, String delimiter, boolean lineBreak) {658initDelim = initialDelimiter;659delim = delimiter;660this.lineBreak = lineBreak;661}662663public ArrayList<ParameterItem> getList() {664return list;665}666667public void add(String value) {668list.add(new ParameterItem(initDelim, value));669initDelim = delim;670}671672public void add(String value1, String value2) {673list.add(new ParameterItem(initDelim, value1, value2));674initDelim = delim;675}676677public void add(String value1, String value2, String value3) {678list.add(new ParameterItem(initDelim, value1, value2, value3));679initDelim = delim;680}681682public ParameterItem get(int id) {683return list.get(id);684}685686public String toString() {687StringBuilder sb = new StringBuilder();688for (ParameterItem p : list) {689sb.append(p.toString());690if (lineBreak) {691sb.append("\n");692}693694}695return sb.toString();696}697698public String toFormatString(String prefix, int maxLength) {699StringBuilder sb = new StringBuilder();700int charCount = 0;701for (ParameterItem p : list) {702sb.append(p.toString());703if (sb.length() - charCount > maxLength) {704sb.append("\n").append(prefix);705charCount = sb.length();706}707}708return sb.toString();709}710711public int size() {712return list.size();713}714715public String getAllItemExclude(int excludeId) {716StringBuilder sb = new StringBuilder();717int cnt = list.size();718719for (int id = 0; id < cnt; ++id) {720ParameterItem p = list.get(id);721if (id == excludeId) {722sb.append(p.getDelim());723sb.append("0");724} else {725sb.append(p.toString());726727}728}729730return sb.toString();731732}733734public String getAllItemExcludeNot(int excludeId) {735StringBuilder sb = new StringBuilder();736int cnt = list.size();737738for (int id = 0; id < cnt; ++id) {739ParameterItem p = list.get(id);740if (id != excludeId) {741sb.append(p.getDelim());742sb.append("0");743// sb.append(p.getEnd());744} else {745sb.append(p.toString());746747}748}749750return sb.toString();751}752}753754class ParameterListGenerator {755756private ArrayList<NumberType> list = new ArrayList();757private Random random;758private int typeCnt;759ParameterList cParms = new ParameterList(",", ",", true);760ParameterList rParms = new ParameterList("", ",", true);761ParameterList jParms = new ParameterList("", ",", true);762ParameterList cExec = new ParameterList("", "", true);763ParameterList jExecParm = new ParameterList("", ",", true);764ParameterList jExecOut = new ParameterList("", ",", true);765766public ParameterListGenerator(int length, ParamType paramType) {767generateRndTest(paramType, length);768}769770private void add(ParameterList list, String s1) {771list.add(s1);772}773774private void add(ParameterList list, String s1, String s2) {775list.add(s1, s2);776}777778private void add(ParameterList list, String s1, String s2, String s3) {779list.add(s1, s2, s3);780}781782private void generateRndTest(ParamType paramType, int length) {783generateTypeList(paramType);784785typeCnt = list.size();786random = new Random();787random.setSeed(System.currentTimeMillis());788789for (int cnt = 0; cnt < length; ++cnt) {790int type = random.nextInt(typeCnt);791792String randomVal = list.get(type).getFnc();793794String ctype = list.get(type).getСType();795String jtype = list.get(type).getJType();796String cconv = list.get(type).getСConv();797String jconv = list.get(type).getJConv();798799String varName = "p" + cnt;800add(jParms, jtype, varName);801//jParmGen.add(jtype + varName);802803//cParms.add(ctype + varName);804add(cParms, ctype, varName);805806807//rParms.add(varName);808add(rParms, varName);809810add(cExec, varName, cconv);811812add(jExecParm, jtype, varName, randomVal);813//jExecOut.add(new PairString(jconv,varName,jtype));814add(jExecOut, jconv, varName, jtype);815}816817}818819public ParameterList getCExec() {820return cExec;821}822823public ParameterList getCParm() {824return cParms;825}826827//Return generated java text828public ParameterList getJExecParameters() {829return jExecParm;830}831832public ParameterList getJExecOut() {833return jExecOut;834}835836/*837* Return string containing parameters for Java838*/839public ParameterList getJParm() {840return jParms;841}842843public ParameterList getRParm() {844return rParms;845}846847private void generateTypeList(ParamType paramType) {848list.addAll(paramType.getValue());849}850}851852class SrcGenerator {853854ParameterListGenerator parmListGen;855GeneratorLogic genLogic;856int iterationCounter;857int parametersCounter;858ParamType paramType;859TestType testType;860String fncName;861//SrcGenerator g1=new SrcGenerator(3,1,ParamType.MIXED_DFIB,TestType.RANDOM,"callRandom");862int maxLength;863864public SrcGenerator(int parmCounter, int iterCounter, ParamType parType, TestType testType, String fncName, int maxLength) {865this.maxLength = maxLength;866parametersCounter = parmCounter;867iterationCounter = iterCounter;868paramType = parType;869this.testType = testType;870this.fncName = fncName;871parmListGen = new ParameterListGenerator(parametersCounter, paramType);872genLogic = testType.getLogic();873874}875876public String getFncName() {877return fncName;878}879880public ParameterList getJParm() {881return parmListGen.getJParm();882}883884public ParameterList getCParm() {885return parmListGen.getCParm();886}887888public String getCExec() {889890StringBuilder sb = new StringBuilder();891for (ParameterItem p : parmListGen.getCExec().getList()) {892sb.append("fprintf(file,\"");893sb.append(p.value1);894sb.append("=");895sb.append(p.value2);896sb.append("\\n\",");897sb.append(p.value1);898sb.append(");\n");899}900return sb.toString();901}902903public String getCExec(int maxLength,String prefix) {904905int lineLength = 0;906StringBuilder sb = new StringBuilder();907for (ParameterItem p : parmListGen.getCExec().getList()) {908sb.append("fprintf(file,\"");909sb.append(p.value1);910sb.append("=");911sb.append(p.value2);912sb.append("\\n\",");913sb.append(p.value1);914sb.append(");");915if (sb.length() - lineLength > maxLength) {916lineLength = sb.length();917sb.append("\n").append(prefix);918}919}920return sb.toString();921}922923public String getJExec(String prefix) {924return genLogic.generateJava(fncName, parmListGen.getJExecOut(), parmListGen.getJExecParameters(), maxLength, prefix);925926}927}928929930