/**
* Copyright (c) 2009-2011, The HATS Consortium. All rights reserved.
* This file is licensed under the terms of the Modified BSD License.
*/
package abs.backend.common;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import java.io.File;
import java.io.IOException;
import java.util.Collection;
import java.util.LinkedList;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;
import abs.ABSTest;
import abs.ABSTest.Config;
import abs.backend.BackendTestDriver;
import abs.backend.erlang.ErlangTestDriver;
import abs.backend.java.JavaTestDriver;
// import abs.backend.java.dynamic.JavaDynamicTestDriver;
import abs.backend.maude.MaudeCompiler;
import abs.backend.maude.MaudeTestDriver;
import abs.common.WrongProgramArgumentException;
import abs.frontend.ast.Model;
@RunWith(Parameterized.class)
public abstract class SemanticTests {
final protected BackendTestDriver driver;
public SemanticTests(BackendTestDriver d) {
driver = d;
}
public static boolean checkMaude() {
return checkProg("maude");
}
public static boolean checkErlang() {
return checkProg("erl");
}
public static boolean checkProg(String... prog) {
ProcessBuilder pb = new ProcessBuilder();
pb.command(prog);
try {
Process p = pb.start();
p.destroy();
return true;
} catch (IOException e) {
return false;
}
}
@Parameters(name = "{0}")
public static Collection<Object[]> data() {
final Collection<Object[]> data = new LinkedList<Object[]>();
/* TODO: Mark Maude tests as ignored instead of just missing them */
/*
* TODO: For the Java backend, we just use different RUNTIME options,
* not code-gen options. So we could actually just compile the code to
* Java once, and then run it with the different options.
*/
/*
* Append new tests to the end, so that we can aggregate relative
* differences in CI
*/
data.add(new Object[] { new JavaTestDriver() });
data.add(new Object[] { new JavaTestDriver(1) });
/* XXX [stolz] Disabled due to non-deterministic test-runs.
* Switch back on when Radu comes back.
*/
// data.add(new Object[] { new JavaDynamicTestDriver() });
if (checkMaude()) {
data.add(new Object[] { new MaudeTestDriver(MaudeCompiler.SIMULATOR.RL) });
data.add(new Object[] { new MaudeTestDriver(MaudeCompiler.SIMULATOR.EQ_TIMED) });
}
if (checkErlang()) {
data.add(new Object[] { new ErlangTestDriver() });
}
// FIXME: enable after #302 is done, {new
// JavaTestDriver(){{absArgs.add("-taskScheduler=simple");}} }
return data;
}
public void assertEvalTrue(String absCode) {
try {
driver.assertEvalTrue("module BackendTest; " + absCode);
} catch (RuntimeException e) {
throw e;
} catch (Exception e) {
throw new RuntimeException(e); // TODO: remove; too many too handle
// for now.
}
}
public void assertEvalTrue(Model m) {
try {
assertNotNull(m.lookupModule("BackendTest"));
driver.assertEvalTrue(m);
} catch (RuntimeException e) {
throw e;
} catch (Exception e) {
throw new RuntimeException(e); // TODO: remove; too many too handle
// for now.
}
}
public void assertEvalTrue(File f) {
Model m;
try {
m = ABSTest.assertParseFileOk(f.getPath(), Config.WITH_STD_LIB);
assertNotNull(m.lookupModule("BackendTest"));
assertFalse(m.hasParserErrors());
assertFalse(m.hasTypeErrors());
assertEvalTrue(m);
} catch (RuntimeException e) {
throw e;
} catch (Exception e) {
throw new RuntimeException(e); // TODO: remove; too many too handle
// for now.
}
}
public void assertEvalFails(String absCode) throws Exception {
driver.assertEvalFails("module BackendTest; " + absCode);
}
}