package test; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.PrintStream; import java.util.ArrayList; import java.util.LinkedList; import java.util.List; public class Jml2Code { static private boolean dotests = true; // Change this to enable/disable tests ByteArrayOutputStream berr; ByteArrayOutputStream bout; PrintStream savederr; PrintStream savedout; static String eol = System.getProperty("line.separator"); static String z = java.io.File.pathSeparator; boolean print = false; boolean capture = false; protected void setUp() throws Exception { capture = false; print = true; super.setUp(); savederr = System.err; savedout = System.out; if (capture) System.setErr(new PrintStream(berr=new ByteArrayOutputStream(10000))); if (capture) System.setOut(new PrintStream(bout=new ByteArrayOutputStream(10000))); } protected void tearDown() { berr = null; bout = null; System.setErr(savederr); System.setOut(savedout); } /** This is a helper method that runs the compiler on the given set of * command-line arguments, checking the result * @param args the command-line arguments * @param exitcode the expected exit code (0=OK, 1=completed with error messages * 2=command-line problems, 3=system errors, 4=abort) * @param all whether the expected output is all of (0) or just the prefix * of (1) or a part of (2) the actual output * @param output the expected output as one string */ public void helper(String[] args, int exitcode, int all, String ... output) { int e = org.jmlspecs.openjml.Main.execute(args,false); // Put to standard out System.setErr(savederr); System.setOut(savedout); if (capture) { try { if (print) System.out.println("TEST: " + getName() + " exit=" + e + eol + berr.toString()); if (all==0) assertEquals("The error message is wrong",output[0],berr.toString()); else if (all == 1 && !berr.toString().startsWith(output[0])) { fail("Output does not begin with: " + output[0] + eol + "Instead is: " + berr.toString()); } else if (all == 2 && berr.toString().indexOf(output[0]) == -1) { fail("Output does not end with: " + output[0] + eol + "Instead is: " + berr.toString()); } if (output.length > 1) { if (print) System.out.println("TEST: " + getName() + " STANDARD OUT: " + eol + bout.toString()); if (all == 0) { assertEquals("The standard out is wrong",output[1],bout.toString()); } else if (all == 2 && bout.toString().indexOf(output[1]) == -1) { fail("Output does not end with: " + output[1] + eol + "Instead is: " + bout.toString()); } } assertEquals("The exit code is wrong",exitcode,e); } catch (AssertionFailedError ex) { if (!print) System.out.println("TEST: " + getName() + " exit=" + e + eol + berr.toString()); throw ex; } } else { assertEquals("The exit code is wrong",exitcode,e); } } public void testESCTest() throws Exception { String sp = "C:/home/projects/JML4/ESCTools/Utils;C:/home/projects/JML4/ESCTools/Escjava/java;C:/home/projects/JML4/ESCTools/Javafe/java;C:/home/projects/JML4/ESCTools/Escjava/mochalib/java"; String cp = "C:/home/projects/JML4/ESCTools/Utils;C:/home/projects/JML4/ESCTools/Utils/junit.jar;C:/home/projects/JML4/ESCTools/Utils/ant.jar;C:/home/projects/JML4/ESCTools/Utils/BCEL/bcel-5.2/bcel-5.2.jar;C:/home/projects/JML4/ESCTools/Escjava/xmlrpc-1.2-b1-modified.jar;C:/home/projects/JML4/ESCTools/Javafe/java;C:/home/projects/JML4/ESCTools/Escjava/java;C:/home/projects/JML4/ESCTools/Escjava/mochalib/java"; String[] args = { "-noPurityCheck", "-specspath","$SY"+";"+sp, //"-specspath","C:/home/projects/Specs/trunk/java6;C:/home/projects/Specs/trunk/java5;C:/home/projects/Specs/trunk/java4;C:/home/projects/OpenJML/trunk/OpenJML/runtime", "-classpath", cp, //"-jmlverbose", "-nullableByDefault", "-esc"}; String[] files = { "C:/home/projects/JML4/ESCTools/Escjava/java/escjava/ant/ESCJavaTask.java", //"C:/home/projects/JML4/ESCTools/Escjava/java/escjava/sortedProver/Lifter.java", //"C:/home/projects/JML4/ESCTools/Javafe/java/javafe/filespace/TreeWalker.java", }; List<String> f = expand(files); for (int i=0; i< args.length; i++) f.add(i,args[i]); args = f.toArray(new String[f.size()]); helper(args,0,1,""); } public void testESCTOOLS() throws Exception { String sp = "C:/home/projects/JML4/ESCTools/Utils;C:/home/projects/JML4/ESCTools/Escjava/java;C:/home/projects/JML4/ESCTools/Javafe/java;C:/home/projects/JML4/ESCTools/Escjava/mochalib/java"; String cp = "C:/home/projects/JML4/ESCTools/Utils;C:/home/projects/JML4/ESCTools/Utils/junit.jar;C:/home/projects/JML4/ESCTools/Utils/ant.jar;C:/home/projects/JML4/ESCTools/Utils/BCEL/bcel-5.2/bcel-5.2.jar;C:/home/projects/JML4/ESCTools/Escjava/xmlrpc-1.2-b1-modified.jar;C:/home/projects/JML4/ESCTools/Javafe/java;C:/home/projects/JML4/ESCTools/Escjava/java;C:/home/projects/JML4/ESCTools/Escjava/mochalib/java"; String[] args = { "-noPurityCheck", "-specspath","$SY"+";"+sp, //"-specspath","C:/home/projects/Specs/trunk/java6;C:/home/projects/Specs/trunk/java5;C:/home/projects/Specs/trunk/java4;C:/home/projects/OpenJML/trunk/OpenJML/runtime", "-classpath", cp, "-nullableByDefault", //"-jmlverbose", "-esc"}; String[] files = { "C:/home/projects/JML4/ESCTools/Escjava/java/escjava/*.java", "C:/home/projects/JML4/ESCTools/Escjava/java/escjava/*/*.java", "C:/home/projects/JML4/ESCTools/Utils/junitutils/*.java", "C:/home/projects/JML4/ESCTools/Javafe/java/javafe/*.java", "C:/home/projects/JML4/ESCTools/Javafe/java/javafe/*/*.java", }; List<String> f = expand(files); for (int i=0; i< args.length; i++) f.add(i,args[i]); args = f.toArray(new String[f.size()]); helper(args,0,1,""); } public void testESCTOOLSindividually() throws Exception { String sp = "C:/home/projects/JML4/ESCTools/Utils;C:/home/projects/JML4/ESCTools/Escjava/java;C:/home/projects/JML4/ESCTools/Javafe/java;C:/home/projects/JML4/ESCTools/Escjava/mochalib/java"; String[] args = { "-Xmaxerrs","10000", "-Xmaxwarns","10000", "-noPurityCheck", "-nullableByDefault", "-specspath","$SY"+";"+sp, //"-specspath","C:/home/projects/Specs/trunk/java6;C:/home/projects/Specs/trunk/java5;C:/home/projects/Specs/trunk/java4;C:/home/projects/OpenJML/trunk/OpenJML/runtime", "-classpath", "C:/home/projects/JML4/ESCTools/Utils;C:/home/projects/JML4/ESCTools/Utils/junit.jar;C:/home/projects/JML4/ESCTools/Utils/ant.jar;C:/home/projects/JML4/ESCTools/Utils/BCEL/bcel-5.2/bcel-5.2.jar;C:/home/projects/JML4/ESCTools/Escjava/xmlrpc-1.2-b1-modified.jar;C:/home/projects/JML4/ESCTools/Javafe/java;C:/home/projects/JML4/ESCTools/Escjava/java;C:/home/projects/JML4/ESCTools/Escjava/mochalib/java", //"-jmlverbose",//"-jmldebug", "-esc", ""}; String[] files = { "C:/home/projects/JML4/ESCTools/Escjava/java/escjava/*.java", "C:/home/projects/JML4/ESCTools/Escjava/java/escjava/*/*.java", "C:/home/projects/JML4/ESCTools/Utils/junitutils/*.java", "C:/home/projects/JML4/ESCTools/Javafe/java/javafe/*.java", "C:/home/projects/JML4/ESCTools/Javafe/java/javafe/*/*.java", }; List<String> f = expand(files); loop: for (String fn : f) { for (String o: omit) { if (fn.endsWith(o)) continue loop; } System.out.println("DOING " + fn); args[args.length-1] = fn; helper(args,0,1,""); } } String[] omit = { "ModifierPragmaVec.java" }; public List<String> expand(String[] args) { List<String> list = new LinkedList<String>(); for (String arg: args) expand(arg,list); return list; } public void expand(String arg, List<String> list) { if (!arg.endsWith("*.java")) { list.add(arg); return; } String darg = arg.substring(0,arg.length()-"*.java".length()); List<String> dirs = expandDir(darg); for (String sdir: dirs) { File dir = new File(sdir); if (!dir.exists()) System.out.println("NOT EXIST " + dir); else for (String f: dir.list()) { if (f.endsWith(".java")) list.add(sdir+f); } } } public List<String> expandDir(String darg) { List<String> list = new LinkedList<String>(); int k = darg.lastIndexOf('*'); if (k == -1) { list.add(darg); return list; } String ddarg = darg.substring(0,k); File dir = new File(ddarg); if (!dir.exists()) System.out.println("NOT EXIST " + dir); else for (File f: dir.listFiles()) { if (f.isDirectory()) list.add(f+"/"); } return list; } }