package scribtest;
import java.io.File;
import java.io.IOException;
import java.util.Collection;
import java.util.LinkedList;
import java.util.List;
import java.util.concurrent.ExecutionException;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;
import org.scribble.cli.CommandLine;
import org.scribble.cli.CommandLineArgParser;
import org.scribble.cli.CommandLineException;
import org.scribble.main.ScribbleException;
import org.scribble.util.ScribParserException;
/**
* Runs all tests under good and bad root directories in Scribble.
*/
//@RunWith(value = Parameterized.class)
@RunWith(Parameterized.class)
public class AllTest
{
protected static final boolean GOOD_TEST = false;
protected static final boolean BAD_TEST = !GOOD_TEST;
protected final String example;
protected final boolean isBadTest;
// relative to cli/src/test/resources (or target/test-classes/)
protected static final String ALL_ROOT = ".";
protected static final String GOOD_ROOT = "good";
protected static final String BAD_ROOT = "bad";
public AllTest(String example, boolean isBadTest)
{
this.example = example;
this.isBadTest = isBadTest;
}
@Parameters(name = "{0}")
public static Collection<Object[]> data()
{
// Test all tests under good and bad root directories
String dir_good = ClassLoader.getSystemResource(GoodTest.GOOD_ROOT).getFile();
String dir_bad = ClassLoader.getSystemResource(BadTest.BAD_ROOT).getFile();
List<Object[]> result = new LinkedList<>();
result.addAll(Harness.makeTests(GOOD_TEST, dir_good));
result.addAll(Harness.makeTests(BAD_TEST, dir_bad));
return result;
}
@Test
public void tests() throws IOException, InterruptedException, ExecutionException
{
try
{
// TODO: For now just locate classpath for resources -- later maybe directly execute job
/*URL url = ClassLoader.getSystemResource(AllTest.GOOD_ROOT); // Assume good/bad have same parent
String dir = url.getFile().substring(0, url.getFile().length() - ("/" + AllTest.GOOD_ROOT).length());*/
String dir = ClassLoader.getSystemResource(AllTest.ALL_ROOT).getFile();
if (File.separator.equals("\\")) // HACK: Windows
{
dir = dir.substring(1).replace("/", "\\");
}
// FIXME: read runtime arguments from a config file, e.g. -oldwf, -fair, etc
// Also need a way to specify expected tool output (e.g. projections/EFSMs for good, errors for bad)
new CommandLine(this.example, CommandLineArgParser.JUNIT_FLAG, CommandLineArgParser.IMPORT_PATH_FLAG, dir).run();
// Added JUNIT flag -- but for some reason only bad DoArgList01.scr was breaking without it...
Assert.assertFalse("Expecting exception", this.isBadTest);
}
catch (ScribbleException e)
{
Assert.assertTrue("Unexpected exception '" + e.getMessage() + "'", this.isBadTest);
}
catch (ScribParserException | CommandLineException e)
{
throw new RuntimeException(e);
}
}
}