package org.overture.vdm2jml.tests;
import java.io.File;
import java.io.IOException;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import org.apache.commons.io.FileUtils;
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.overture.codegen.utils.GeneralUtils;
import org.overture.codegen.vdm2jml.JmlGenMain;
import org.overture.test.framework.Properties;
import org.overture.vdm2jml.tests.exec.JmlExecTestBase;
import org.overture.vdm2jml.tests.exec.JmlInvariantForExecTests;
import org.overture.vdm2jml.tests.util.TestUtil;
@RunWith(Parameterized.class)
public class JmlOutputTests extends JmlGenTestBase
{
private static final String PROPERTY_ID = "output";
public JmlOutputTests(File inputFile)
{
super(inputFile);
}
@Test
public void run()
{
JmlGenMain.main(getJmlGenMainProcessArgs(genJavaFolder));
try
{
configureResultGeneration();
if (Properties.recordTestResults)
{
storeGeneratedJml();
} else
{
checkGenJavaJml();
}
} finally
{
unconfigureResultGeneration();
}
}
@Parameters(name = "{index}: {0}")
public static Collection<Object[]> data()
{
return TestUtil.collectVdmslFiles(GeneralUtils.getFilesRecursively(new File(JmlExecTestBase.TEST_RES_DYNAMIC_ANALYSIS_ROOT)));
}
protected void storeGeneratedJml()
{
for (File file : TestUtil.collectStoredJavaJmlFiles(getTestDataFolder()))
{
Assert.assertTrue("Problems deleting stored Java/JML file", file.exists()
&& file.delete());
}
try
{
List<File> filesToStore = TestUtil.collectGenJavaJmlFiles(genJavaFolder);
File testFolder = getTestDataFolder();
for (File file : filesToStore)
{
File javaFile = new File(testFolder, file.getName());
FileUtils.copyFile(file, javaFile);
}
} catch (IOException e)
{
e.printStackTrace();
Assert.assertTrue("Problems storing generated JML: "
+ e.getMessage(), false);
}
}
protected void checkGenJavaJml()
{
List<File> storedJavaJmlFiles = TestUtil.collectStoredJavaJmlFiles(getTestDataFolder());
List<File> genJavaJmlFiles = TestUtil.collectGenJavaJmlFiles(genJavaFolder);
Assert.assertTrue("The number of stored Java/JML files differs "
+ "from the number of generated Java/JML files", storedJavaJmlFiles.size() == genJavaJmlFiles.size());
Comparator<File> comp = new Comparator<File>()
{
@Override
public int compare(File f1, File f2)
{
// Reverse paths because root folders differ
String f1PathRev = new StringBuilder(f1.getAbsolutePath()).reverse().toString();
String f2PathRev = new StringBuilder(f2.getAbsolutePath()).reverse().toString();
return f1PathRev.compareTo(f2PathRev);
}
};
Collections.sort(storedJavaJmlFiles, comp);
Collections.sort(genJavaJmlFiles, comp);
for (int i = 0; i < storedJavaJmlFiles.size(); i++)
{
try
{
String storedContent = GeneralUtils.readFromFile(storedJavaJmlFiles.get(i)).trim();
String genContent = GeneralUtils.readFromFile(genJavaJmlFiles.get(i)).trim();
Assert.assertEquals("Stored Java/JML is different from generared Java/JML", storedContent, genContent);
} catch (IOException e)
{
Assert.fail("Problems comparing stored and generated Java/JML");
e.printStackTrace();
}
}
}
@Override
public String[] getJmlGenMainProcessArgs(File outputFolder)
{
if (inputFile.getAbsolutePath().contains(JmlInvariantForExecTests.TEST_DIR))
{
String[] stdArgs = super.getJmlGenMainProcessArgs(outputFolder);
String[] invariantForArg = new String[] {
JmlGenMain.INVARIANT_FOR };
return GeneralUtils.concat(stdArgs, invariantForArg);
} else
{
return super.getJmlGenMainProcessArgs(outputFolder);
}
}
@Override
protected String getPropertyId()
{
return PROPERTY_ID;
}
}