package org.jmlspecs.openjmltest.testcases;
import static org.junit.Assert.fail;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.PrintWriter;
import java.util.Arrays;
import java.util.Collection;
import java.util.LinkedList;
import java.util.List;
import org.jmlspecs.openjml.JmlOption;
import org.jmlspecs.openjml.Utils;
import org.jmlspecs.openjmltest.EscBase;
import org.junit.Assume;
import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.ParameterizedWithNames;
import org.junit.runners.ParameterizedIgnorable;
import org.junit.runners.Parameterized.Parameters;
/** These tests check running ESC on files in the file system, comparing the
* output against expected files. These tests are a bit easier to create, since
* the file and output do not have to be converted into Strings; however, they
* are not as easily read, since the content is tucked away in files, rather
* than immediately there in the test class.
* <P>
* To add a new test:
* <UL>
* <LI> create a directory containing the test files as a subdirectory of
* 'test'
* <LI> add a test to this class - typically named similarly to the folder
* containing the source data
* </UL>
*/
@Ignore
@RunWith(ParameterizedWithNames.class)
public class escnonpublic extends EscBase {
String dir = "../../OpenJMLDemoNonPublic/";
boolean enableSubexpressions = false;
public escnonpublic(String options, String solver) {
super(options,solver);
Assume.assumeTrue( new File(dir).exists() );
}
@Parameters
static public Collection<String[]> parameters() {
return minQuantAndSolvers(solvers);
}
public java.util.List<String> setupForFiles(String sourceDirname, String outDir, String ... opts) {
new File(outDir).mkdirs();
java.util.List<String> args = new LinkedList<String>();
File source = new File(sourceDirname);
args.add("-cp");
if (source.isDirectory()) args.add(sourceDirname);
else args.add(source.getParent());
args.add("-esc");
args.add("-jmltesting");
args.add("-no-purityCheck");
args.add("-code-math=java");
if (new File(sourceDirname).isDirectory()) args.add("-dir");
args.add(sourceDirname);
if (solver != null) args.add("-prover="+solver);
addOptionsToArgs(options,args);
args.addAll(Arrays.asList(opts));
return args;
}
public void helpTCF(String sourceDirname, String outDir, String ... opts) {
escOnFiles(sourceDirname,outDir,opts);
}
/** This method does the running of a RAC test. No output is
* expected from running openjml to produce the RACed program;
* the number of expected diagnostics is set by 'expectedErrors'.
* @param sourceDirname The directory or file containing the subject material
* @param outDir the directory in which to write the results (actual files)
* @param list any expected diagnostics from openjml, followed by the error messages from the RACed program, line by line
*/
// public void helpTCF(String sourceDirname, String outDir, String ... opts) {
// boolean print = false;
// try {
// new File(outDir).mkdirs();
// String actCompile = outDir + "/actual";
// new File(actCompile).delete();
// List<String> args = new LinkedList<String>();
// File source = new File(sourceDirname);
// args.add("-cp");
// if (source.isDirectory()) args.add(sourceDirname);
// else args.add(source.getParent());
// args.add("-esc");
// args.add("-jmltesting");
// args.add("-no-purityCheck");
// args.add("-code-math=java");
// if (source.isDirectory()) args.add("-dir");
// args.add(sourceDirname);
// if (solver != null) args.add(JmlOption.PROVER.optionName() +"="+ solver);
// addOptionsToArgs(options,args);
//
// args.addAll(Arrays.asList(opts));
//
// PrintWriter pw = new PrintWriter(actCompile);
// int ex = org.jmlspecs.openjml.Main.execute(pw,null,null,args.toArray(new String[args.size()]));
// pw.close();
//
// String diffs = compareFiles(outDir + "/expected", actCompile);
// int n = 0;
// while (diffs != null) {
// n++;
// String name = outDir + "/expected" + n;
// if (!new File(name).exists()) break;
// diffs = compareFiles(name, actCompile);
// }
// if (diffs != null) {
// System.out.println(diffs);
// fail("Files differ: " + diffs);
// }
// new File(actCompile).delete();
// if (ex != expectedExit) fail("Compile ended with exit code " + ex);
//
// } catch (Exception e) {
// e.printStackTrace(System.out);
// fail("Exception thrown while processing test: " + e);
// } catch (AssertionError e) {
// throw e;
// } finally {
// // Should close open objects
// }
// }
@Test
public void testEscStaticModel() {
expectedExit = 0;
helpTCF(dir + "src/escStaticModel",dir + "src/escStaticModel","-progress");
}
@Test
public void testDMZ() {
expectedExit = 0;
helpTCF(dir + "src/dmz",dir + "src/dmz","-progress");
}
@Test
public void testDMZ2() {
expectedExit = 0;
helpTCF(dir + "src/dmz2",dir + "src/dmz2","-progress");
}
@Test
public void testDMZ3() {
expectedExit = 0;
helpTCF(dir + "src/dmz3",dir + "src/dmz3","-progress");
}
@Test
public void escSokoban() { // FIXME
//helpTCF("../../../OpenJMLDemoNonPublic/src/sokoban/Game.java","test/sokoban","-classpath","test/sokoban","-progress","-escMaxWarnings=10","-method=main","-show");
helpTCF(dir + "src/sokoban/src",dir + "src/sokoban/src","-no-minQuant","-progress","-timeout=120");
}
@Test
public void escSokoban2() {
helpTCF(dir + "src/sokoban2/src",dir + "src/sokoban2/src","-no-minQuant","-progress","-timeout=120");//,"-escMaxWarnings=1","-method=Game.Game(Board,Player)","-subexpressions","-show");
}
@Test
public void escSokoban2MQ() {
helpTCF(dir + "src/sokoban2/src",dir + "src/sokoban2/mq","-minQuant","-progress","-timeout=120","-escMaxWarnings=1"); // "-method=movePlayer","-subexpressions","-show");
}
@Test
public void escSokoban3() {
helpTCF(dir + "src/sokoban3/src",dir + "src/sokoban3/src","-no-minQuant","-progress","-timeout=120"); //,"-subexpressions","-show");
}
@Test
public void escSokoban3MQ() {
helpTCF(dir + "src/sokoban3/src",dir + "src/sokoban3/mq","-minQuant","-progress","-timeout=120","-escMaxWarnings=1"); //,"-subexpressions","-show");
}
}