package cmu.defect4j; import java.io.FileWriter; import java.io.IOException; import java.lang.reflect.Method; import java.lang.reflect.Modifier; import java.util.LinkedList; import junit.framework.TestCase; /** * @author: chupanw */ public abstract class TestGenerator { public String pathPrefix = "/Users/chupanw/IdeaProjects/VarexJ/src/defects4j-tests/cmu/defect4j/"; public String packageNamePrefix = "cmu.defect4j."; public int timeout = 120000; public abstract void searchTest(); public void printNewTestCaseJunit4(FileWriter writer, String classname, String methodname, String before, String expected) throws IOException { writer.write(" @Test(timeout=" + timeout + ")\n" + " public void " + methodname + "() throws Exception {\n"); if(expected==null) { writer.write( " if (verifyNoPropertyViolation(config)) {\n" ); } else { writer.write( " if (verifyUnhandledException(" + "\"" + expected + "\"" + ", config)) {\n" ); } // create test object writer.write( " " + classname + " object = new " + classname + "();\n" ); if (before != null) { writer.write( " object." + before + "();\n" ); } writer.write( " object." + methodname + "();\n" + " }\n" + " }\n\n"); } public void printNewTestCaseJunit3(FileWriter writer, String classname, String methodname) throws IOException { writer.write("\t@Test(timeout=" + timeout + ")\n"); writer.write("\tpublic void " + methodname + "() throws Exception {\n"); writer.write("\t\tif (verifyNoPropertyViolation(config)) {\n"); writer.write("\t\t\t" + "TestCase" + " testcase = new " + classname + "(\"" + methodname + "\");\n"); writer.write("\t\t\ttestcase.run();\n"); writer.write("\t\t}\n" + "\t}\n\n"); } public void printNewTestCaseJunit3Null(FileWriter writer, String classname, String methodname) throws IOException{ writer.write("\t@Test(timeout=" + timeout + ")\n"); writer.write("\tpublic void " + methodname + "() throws Exception {\n"); writer.write("\t\tif (verifyNoPropertyViolation(config)) {\n"); writer.write("\t\t\t" + "TestCase" + " testcase = new " + classname + "() {\n"); writer.write("\t\t\t\t" + "public void runTest() throws Exception {\n"); writer.write("\t\t\t\t\t" + methodname + "();\n"); writer.write("\t\t\t\t" + "}\n"); writer.write("\t\t\t" + "};\n"); writer.write("\t\t\ttestcase.run();\n"); writer.write("\t\t}\n" + "\t}\n\n"); } public void printRunMain(FileWriter writer, String classname) throws IOException { writer.write("\t//Don't know how to run each test case separately for this class\n"); writer.write("\t@Test(timeout=" + timeout + ")\n"); writer.write("\tpublic void " + "Main" + "() throws Exception {\n"); writer.write("\t\tif (verifyNoPropertyViolation(config)) {\n"); writer.write("\t\t\t" + classname + "." + "main(null);\n"); writer.write("\t\t}\n" + "\t}\n\n"); } public void printHeaderJunit4(FileWriter writer, String packageNameSuffix, String className, String config) throws IOException { writer.write("package cmu.defect4j." + packageNameSuffix + ";\n" + "\n" + "import gov.nasa.jpf.util.test.TestJPF;\n" + "import org.junit.Test;\n" + "\n" + "public class " + className + " extends TestJPF {\n" + "\n" + " private final String[] config = {"+config+"};" + "\n" + " public static void main(String[] testMethods){\n" + " runTestsOfThisClass(testMethods);\n" + " }\n"); } public void printHeaderJunit3(FileWriter writer, String packageNameSuffix, String className, String config) throws IOException { writer.write("package cmu.defect4j." + packageNameSuffix + ";\n" + "\n" + "import gov.nasa.jpf.util.test.TestJPF;\n" + "import org.junit.Test;\n" + "import junit.framework.TestCase;" + "\n" + "public class " + className + " extends TestJPF {\n" + "\n" + " private final String[] config = {"+config+"};" + "\n\n" + " public static void main(String[] testMethods){\n" + " runTestsOfThisClass(testMethods);\n" + " }\n"); } public void printFooter(FileWriter writer) throws IOException { writer.write("}"); } public boolean haveTestJunit3(String full_class_name){ boolean haveTest = false; boolean extendTestCase = false; Class<?> c = null; try{ c = Class.forName(full_class_name); } catch (ClassNotFoundException e){ e.printStackTrace(); } LinkedList<Class<?>> l = new LinkedList<>(); getSuperClasses(c, l); if (l.contains(TestCase.class)){ extendTestCase = true; } if(extendTestCase){ LinkedList<Method> methods = getDeclaredPublicMethods(c); for (Method method : methods){ if (method.getName().startsWith("test")){ haveTest = true; } } } return haveTest; } public void getSuperClasses(Class<?> c, LinkedList<Class<?>> l){ Class<?> ancestor = c.getSuperclass(); if (ancestor != null){ l.add(ancestor); getSuperClasses(ancestor, l); } } public LinkedList<Method> getDeclaredPublicMethods(Class<?> c){ LinkedList<Method> l = new LinkedList<>(); Method[] methods = c.getDeclaredMethods(); for (Method method : methods){ if(Modifier.toString(method.getModifiers()).contains("public")){ l.add(method); } } return l; } public boolean hasParameters(Method m){ if(m.getParameterTypes().length!=0){ return true; } return false; } }