/*
* #%~
* Combinatorial Testing
* %%
* Copyright (C) 2008 - 2014 Overture
* %%
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public
* License along with this program. If not, see
* <http://www.gnu.org/licenses/gpl-3.0.html>.
* #~%
*/
package org.overture.ide.plugins.combinatorialtesting.internal;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Vector;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.console.ConsolePlugin;
import org.eclipse.ui.console.IConsole;
import org.eclipse.ui.console.IConsoleManager;
import org.eclipse.ui.console.MessageConsole;
import org.eclipse.ui.console.MessageConsoleStream;
import org.overture.ast.definitions.ANamedTraceDefinition;
import org.overture.ast.node.INode;
import org.overture.ide.core.resources.IVdmProject;
import org.overture.ide.core.resources.IVdmSourceUnit;
import org.overture.ide.plugins.combinatorialtesting.TracesXmlStoreReader;
import org.overture.ide.plugins.combinatorialtesting.views.TraceAstUtility;
import org.overture.interpreter.traces.TraceReductionType;
public class VdmjTracesHelper
{
final String COVERAGE_DIR_NAME = "generated/coverage";
public final IVdmProject project;
Map<String, TracesXmlStoreReader> classTraceReaders = new HashMap<String, TracesXmlStoreReader>();
Shell shell;
public VdmjTracesHelper(Shell shell, IVdmProject vdmProject)
throws Exception
{
this.project = vdmProject;
this.shell = shell;
}
public File getCTRunCoverageDir()
{
DateFormat dateFormat = new SimpleDateFormat("yyyy_MM_dd_HH_mm_ss");
File coverageDir = new File(project.getModelBuildPath().getOutput().getLocation().toFile(), "CT_"
+ dateFormat.format(new Date()));
if (!coverageDir.exists())
{
coverageDir.mkdirs();
}
return coverageDir;
}
private void copySourceFilesForCoverage(File coverageDir)
throws IOException, CoreException
{
for (IVdmSourceUnit source : this.project.getSpecFiles())
{
String name = source.getSystemFile().getName();
writeFile(coverageDir, name + "cov", getContent(source));
}
}
private String getContent(IVdmSourceUnit source) throws CoreException,
IOException
{
InputStreamReader reader = new InputStreamReader(source.getFile().getContents());
StringBuilder sb = new StringBuilder();
int inLine;
while ((inLine = reader.read()) != -1)
{
sb.append((char) inLine);
}
return sb.toString();
}
public static void writeFile(File outputFolder, String fileName,
String content) throws IOException
{
FileWriter outputFileReader = new FileWriter(new File(outputFolder, fileName));
BufferedWriter outputStream = new BufferedWriter(outputFileReader);
outputStream.write(content);
outputStream.close();
}
public void consolePrint(String message)
{
MessageConsole myConsole = findConsole("Combinatorial Testing");
MessageConsoleStream out = myConsole.newMessageStream();
out.println(message);
}
public static MessageConsole findConsole(String name)
{
ConsolePlugin plugin = ConsolePlugin.getDefault();
IConsoleManager conMan = plugin.getConsoleManager();
IConsole[] existing = conMan.getConsoles();
for (int i = 0; i < existing.length; i++)
{
if (name.equals(existing[i].getName()))
{
return (MessageConsole) existing[i];
}
}
// no console found, so create a new one
MessageConsole myConsole = new MessageConsole(name, null);
conMan.addConsoles(new IConsole[] { myConsole });
return myConsole;
}
public void evaluateTraces(INode container, ANamedTraceDefinition traceDef,
IProgressMonitor monitor, ITracesDisplay display)
throws IOException, CoreException
{
evaluateTraces(container, traceDef, 0, null, 0, monitor, display, false);
}
public void evaluateTraces(INode container, ANamedTraceDefinition traceDef,
float subset, TraceReductionType traceReductionType, long seed,
IProgressMonitor monitor, ITracesDisplay display)
throws IOException, CoreException
{
evaluateTraces(container, traceDef, subset, traceReductionType, seed, monitor, display, true);
}
private void evaluateTraces(INode container,
ANamedTraceDefinition traceDef, float subset,
TraceReductionType traceReductionType, long seed,
IProgressMonitor monitor, ITracesDisplay display,
boolean useReduction) throws IOException, CoreException
{
List<TraceExecutionSetup> traceSetups = new Vector<TraceExecutionSetup>();
if (container != null)
{
if (traceDef != null)
{
TraceExecutionSetup texe = new TraceExecutionSetup(project, TraceAstUtility.getContainerName(container), traceDef.getName().getName(), getCTRunCoverageDir(), subset, traceReductionType, seed, useReduction);
traceSetups.add(texe);
} else
{
for (ANamedTraceDefinition tDef : TraceAstUtility.getTraceDefinitions(container))
{
TraceExecutionSetup texe = new TraceExecutionSetup(project, TraceAstUtility.getContainerName(container), tDef.getName().getName(), getCTRunCoverageDir(), subset, traceReductionType, seed, useReduction);
traceSetups.add(texe);
}
}
} else
{
for (INode c : TraceAstUtility.getTraceContainers(project))
{
if (traceDef != null)
{
TraceExecutionSetup texe = new TraceExecutionSetup(project, TraceAstUtility.getContainerName(c), traceDef.getName().getName(), getCTRunCoverageDir(), subset, traceReductionType, seed, useReduction);
traceSetups.add(texe);
} else
{
for (ANamedTraceDefinition tDef : TraceAstUtility.getTraceDefinitions(c))
{
TraceExecutionSetup texe = new TraceExecutionSetup(project, TraceAstUtility.getContainerName(c), tDef.getName().getName(), getCTRunCoverageDir(), subset, traceReductionType, seed, useReduction);
traceSetups.add(texe);
}
}
}
}
execute(monitor, display, traceSetups);
}
private void execute(IProgressMonitor monitor, ITracesDisplay display,
List<TraceExecutionSetup> texe) throws IOException, CoreException
{
IProject p = (IProject) project.getAdapter(IProject.class);
MessageConsole myConsole = findConsole("TracesConsole");
MessageConsoleStream out = myConsole.newMessageStream();
out.setEncoding(p.getDefaultCharset());
myConsole.activate();
for (TraceExecutionSetup traceExecutionSetup : texe)
{
new TraceTestEngine().launch(traceExecutionSetup, out, display);
copySourceFilesForCoverage(traceExecutionSetup.coverageFolder);
}
try
{
p.refreshLocal(IResource.DEPTH_INFINITE, null);
} catch (CoreException e)
{
}
}
}