epl context and fixed test, eunit module interface
diff --git a/plugins/org.eclipse.epsilon.epl.engine/META-INF/MANIFEST.MF b/plugins/org.eclipse.epsilon.epl.engine/META-INF/MANIFEST.MF
index 3193203..0818170 100644
--- a/plugins/org.eclipse.epsilon.epl.engine/META-INF/MANIFEST.MF
+++ b/plugins/org.eclipse.epsilon.epl.engine/META-INF/MANIFEST.MF
@@ -12,5 +12,6 @@
  org.eclipse.epsilon.epl.combinations,
  org.eclipse.epsilon.epl.dom,
  org.eclipse.epsilon.epl.execute,
+ org.eclipse.epsilon.epl.execute.context,
  org.eclipse.epsilon.epl.parse
 Automatic-Module-Name: org.eclipse.epsilon.epl.engine
diff --git a/plugins/org.eclipse.epsilon.epl.engine/src/org/eclipse/epsilon/epl/EplModule.java b/plugins/org.eclipse.epsilon.epl.engine/src/org/eclipse/epsilon/epl/EplModule.java
index 231bbc9..46d4b05 100644
--- a/plugins/org.eclipse.epsilon.epl.engine/src/org/eclipse/epsilon/epl/EplModule.java
+++ b/plugins/org.eclipse.epsilon.epl.engine/src/org/eclipse/epsilon/epl/EplModule.java
@@ -12,6 +12,7 @@
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
+import java.util.Optional;
 
 import org.antlr.runtime.ANTLRInputStream;
 import org.antlr.runtime.Lexer;
@@ -24,14 +25,14 @@
 import org.eclipse.epsilon.eol.dom.ExecutableBlock;
 import org.eclipse.epsilon.eol.dom.Import;
 import org.eclipse.epsilon.eol.exceptions.EolRuntimeException;
-import org.eclipse.epsilon.eol.execute.context.EolContext;
-import org.eclipse.epsilon.eol.execute.context.IEolContext;
 import org.eclipse.epsilon.epl.dom.Cardinality;
 import org.eclipse.epsilon.epl.dom.Domain;
 import org.eclipse.epsilon.epl.dom.Pattern;
 import org.eclipse.epsilon.epl.dom.Role;
 import org.eclipse.epsilon.epl.execute.PatternMatchModel;
 import org.eclipse.epsilon.epl.execute.PatternMatcher;
+import org.eclipse.epsilon.epl.execute.context.EplContext;
+import org.eclipse.epsilon.epl.execute.context.IEplContext;
 import org.eclipse.epsilon.epl.parse.EplLexer;
 import org.eclipse.epsilon.epl.parse.EplParser;
 import org.eclipse.epsilon.erl.ErlModule;
@@ -53,6 +54,14 @@
 		module.execute();
 	}
 	
+	public EplModule() {
+		this(null);
+	}
+	
+	protected EplModule(IEplContext context) {
+		super(context != null ? context : new EplContext());
+	}
+	
 	@Override
 	protected Lexer createLexer(ANTLRInputStream inputStream) {
 		return new EplLexer(inputStream);
@@ -132,7 +141,14 @@
 	public Object executeImpl() throws EolRuntimeException {
 		execute(getPre(), getContext());
 		
-		PatternMatcher patternMatcher = new PatternMatcher();
+		PatternMatcher patternMatcher = null;
+		if (getContext().getPatternMatcher() == null) {
+			patternMatcher = new PatternMatcher();
+			getContext().setPatternMatcher(patternMatcher);
+		} else {
+			patternMatcher = getContext().getPatternMatcher();
+		}
+		
 		PatternMatchModel matchModel = null;
 		try {
 			int loops = 1;
@@ -154,6 +170,8 @@
 		
 		execute(getPost(), getContext());
 		
+		getContext().setPatternMatchTrace(matchModel);
+		
 		return matchModel;
 	}
 	
@@ -206,4 +224,9 @@
 		this.patternMatchModelName = patternMatchModelName;
 	}
 	
+	@Override
+	public IEplContext getContext() {
+		return (IEplContext) super.getContext();
+	}
+	
 }
diff --git a/plugins/org.eclipse.epsilon.epl.engine/src/org/eclipse/epsilon/epl/execute/context/EplContext.java b/plugins/org.eclipse.epsilon.epl.engine/src/org/eclipse/epsilon/epl/execute/context/EplContext.java
new file mode 100644
index 0000000..2f397a1
--- /dev/null
+++ b/plugins/org.eclipse.epsilon.epl.engine/src/org/eclipse/epsilon/epl/execute/context/EplContext.java
@@ -0,0 +1,32 @@
+package org.eclipse.epsilon.epl.execute.context;
+
+import org.eclipse.epsilon.epl.execute.PatternMatchModel;
+import org.eclipse.epsilon.epl.execute.PatternMatcher;
+import org.eclipse.epsilon.erl.execute.context.ErlContext;
+
+public class EplContext extends ErlContext implements IEplContext {
+
+	protected PatternMatcher matcher;
+	protected PatternMatchModel matchModel;
+	
+	@Override
+	public void setPatternMatcher(PatternMatcher matcher) {
+		this.matcher = matcher;
+	}
+	
+	@Override
+	public void setPatternMatchTrace(PatternMatchModel model) {
+		this.matchModel = model;
+	}
+
+	@Override
+	public PatternMatcher getPatternMatcher() {
+		return this.matcher;
+	}
+
+	@Override
+	public PatternMatchModel getPatternMatchTrace() {
+		return this.matchModel;
+	}
+
+}
diff --git a/plugins/org.eclipse.epsilon.epl.engine/src/org/eclipse/epsilon/epl/execute/context/IEplContext.java b/plugins/org.eclipse.epsilon.epl.engine/src/org/eclipse/epsilon/epl/execute/context/IEplContext.java
new file mode 100644
index 0000000..db9388d
--- /dev/null
+++ b/plugins/org.eclipse.epsilon.epl.engine/src/org/eclipse/epsilon/epl/execute/context/IEplContext.java
@@ -0,0 +1,16 @@
+package org.eclipse.epsilon.epl.execute.context;
+
+import org.eclipse.epsilon.epl.execute.PatternMatchModel;
+import org.eclipse.epsilon.epl.execute.PatternMatcher;
+import org.eclipse.epsilon.erl.execute.context.IErlContext;
+
+public interface IEplContext extends IErlContext {
+
+	void setPatternMatcher(PatternMatcher matcher);
+	
+	PatternMatcher getPatternMatcher();
+	
+	PatternMatchModel getPatternMatchTrace();
+
+	void setPatternMatchTrace(PatternMatchModel model);
+}
diff --git a/plugins/org.eclipse.epsilon.eunit.engine/src/org/eclipse/epsilon/eunit/EUnitModule.java b/plugins/org.eclipse.epsilon.eunit.engine/src/org/eclipse/epsilon/eunit/EUnitModule.java
index 9fafe04..7a0d2f0 100644
--- a/plugins/org.eclipse.epsilon.eunit.engine/src/org/eclipse/epsilon/eunit/EUnitModule.java
+++ b/plugins/org.eclipse.epsilon.eunit.engine/src/org/eclipse/epsilon/eunit/EUnitModule.java
@@ -39,7 +39,7 @@
 import org.eclipse.epsilon.internal.eunit.util.Pair;
 import org.eclipse.epsilon.internal.eunit.xml.EUnitXMLFormatter;
 
-public class EUnitModule extends EolModule {
+public class EUnitModule extends EolModule implements IEUnitModule {
 
 	private static final String MODEL_EXCLUSIVE_BINDING_ANNOTATION_NAME = "onlyWith";
 	private static final String MODEL_BINDING_ANNOTATION_NAME = "with";
@@ -67,30 +67,37 @@
 		this.getContext().getOperationContributorRegistry().add(new ExtraEUnitOperationContributor());
 	}
 
+	@Override
 	public ArrayList<Operation> getTests() {
 		return collectOperationsAnnotatedWith("Test", getOperationsAnnotatedWith("test"));
 	}
 
+	@Override
 	public ArrayList<Operation> getInlineModelOperations() {
 		return collectOperationsAnnotatedWith("Model", getOperationsAnnotatedWith("model"));
 	}
 
+	@Override
 	public ArrayList<Operation> getSetups() {
 		return collectOperationsAnnotatedWith("Before", getOperationsAnnotatedWith("setup"));
 	}
 	
+	@Override
 	public ArrayList<Operation> getTeardowns() {
 		return collectOperationsAnnotatedWith("After", getOperationsAnnotatedWith("teardown"));
 	}
 
+	@Override
 	public ArrayList<Operation> getSuiteSetups() {
 		return collectOperationsAnnotatedWith("BeforeClass", getOperationsAnnotatedWith("suitesetup"));
 	}
 
+	@Override
 	public ArrayList<Operation> getSuiteTeardowns() {
 		return collectOperationsAnnotatedWith("AfterClass", getOperationsAnnotatedWith("suiteteardown"));
 	}
 
+	@Override
 	public List<Pair<Operation, String>> getDataVariableNames() {
 		final List<Pair<Operation, String>> results = new ArrayList<>();
 		for (Operation op : getOperations()) {
@@ -109,6 +116,7 @@
 		return results;
 	}
 
+	@Override
 	public boolean isAnnotatedAs(Operation operation, String annotation) {
 		try {
 			return operation.hasAnnotation(annotation);
@@ -130,6 +138,7 @@
 		return null;
 	}
 
+	@Override
 	public EUnitTest getSuiteRoot() throws EolRuntimeException {
 		// We're stricter when running EUnit than with the other E*L languages:
 		// we will abort test execution if the EUnit module had any parse problems
@@ -153,6 +162,7 @@
 		return suiteRoot;
 	}
 
+	@Override
 	public void runSuite(EUnitTest node) throws EolRuntimeException {
 		if (node.getResult().equals(EUnitTestResultType.SKIPPED)) {
 			// The test case is to be skipped
@@ -521,10 +531,12 @@
 
 	/* EVENT NOTIFICATION METHODS */
 
+	@Override
 	public boolean addTestListener(EUnitTestListener listener) {
 		return testListeners.add(listener);
 	}
 
+	@Override
 	public boolean removeTestListener(EUnitTestListener listener) {
 		return testListeners.remove(listener);
 	}
@@ -543,13 +555,13 @@
 
 	/* OPERATION FILTERING */
 
-	@SuppressWarnings("rawtypes")
-	public List getSelectedOperations() {
+	@Override
+	public List<?> getSelectedOperations() {
 		return selectedOperations;
 	}
 
-	@SuppressWarnings("rawtypes")
-	public void setSelectedOperations(List attribute) throws EolRuntimeException {
+	@Override
+	public void setSelectedOperations(List<?> attribute) throws EolRuntimeException {
 		this.selectedOperations = attribute;
 
 		// Scan the test tree and mark entries as skipped as necessary
@@ -597,6 +609,7 @@
 	 * By default, it is the current directory. If <code>null</code>,
 	 * no report will be written.
 	 */
+	@Override
 	public void setReportDirectory(File reportFile) {
 		this.reportDirectory = reportFile;
 	}
@@ -605,6 +618,7 @@
 	 * Returns the destination directory for the JUnit-style XML report.
 	 * For details about possible values, see {@link #setReportDirectory(File)}.
 	 */
+	@Override
 	public File getReportDirectory() {
 		return reportDirectory;
 	}
@@ -620,6 +634,7 @@
 	 * Returns the "class name" to be used for this module in JUnit-style reports.
 	 * It is the basename of the .eunit file, without the extension.
 	 */
+	@Override
 	public String getClassName() {
 		final String filename = EUnitModule.getBasename(this);
 		final int lastDot = filename.lastIndexOf('.');
@@ -629,6 +644,7 @@
 	/**
 	 * Returns the package name to use in the reports. By default, it is {@link #DEFAULT_PACKAGE}.
 	 */
+	@Override
 	public String getPackage() {
 		return packageName;
 	}
@@ -636,6 +652,7 @@
 	/**
 	 * Changes the package name to use in the reports. By default, it is {@link #DEFAULT_PACKAGE}.
 	 */
+	@Override
 	public void setPackage(String packageName) {
 		this.packageName = packageName;
 	}
@@ -643,6 +660,7 @@
 	/**
 	 * Returns the logical name of this module as if it was a Java class, for the JUnit-style reports.
 	 */
+	@Override
 	public String getQualifiedName() {
 		return getPackage() + "." + getClassName();
 	}
diff --git a/plugins/org.eclipse.epsilon.eunit.engine/src/org/eclipse/epsilon/eunit/IEUnitModule.java b/plugins/org.eclipse.epsilon.eunit.engine/src/org/eclipse/epsilon/eunit/IEUnitModule.java
new file mode 100644
index 0000000..ce3d518
--- /dev/null
+++ b/plugins/org.eclipse.epsilon.eunit.engine/src/org/eclipse/epsilon/eunit/IEUnitModule.java
@@ -0,0 +1,54 @@
+package org.eclipse.epsilon.eunit;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.epsilon.eol.IEolModule;
+import org.eclipse.epsilon.eol.dom.Operation;
+import org.eclipse.epsilon.eol.exceptions.EolRuntimeException;
+import org.eclipse.epsilon.internal.eunit.util.Pair;
+
+public interface IEUnitModule extends IEolModule {
+
+	void runSuite(EUnitTest node) throws EolRuntimeException;
+
+	EUnitTest getSuiteRoot() throws EolRuntimeException;
+
+	boolean isAnnotatedAs(Operation operation, String annotation);
+
+	List<Pair<Operation, String>> getDataVariableNames();
+
+	ArrayList<Operation> getSuiteTeardowns();
+
+	ArrayList<Operation> getSuiteSetups();
+
+	ArrayList<Operation> getTeardowns();
+
+	ArrayList<Operation> getSetups();
+
+	ArrayList<Operation> getInlineModelOperations();
+
+	ArrayList<Operation> getTests();
+
+	String getQualifiedName();
+
+	void setPackage(String packageName);
+
+	String getPackage();
+
+	File getReportDirectory();
+
+	void setReportDirectory(File reportFile);
+
+	void setSelectedOperations(List<?> attribute) throws EolRuntimeException;
+
+	List<?> getSelectedOperations();
+
+	boolean removeTestListener(EUnitTestListener listener);
+
+	boolean addTestListener(EUnitTestListener listener);
+
+	String getClassName();
+
+}
diff --git a/tests/org.eclipse.epsilon.epl.engine.test.acceptance/src/org/eclipse/epsilon/epl/engine/test/acceptance/EplTests.java b/tests/org.eclipse.epsilon.epl.engine.test.acceptance/src/org/eclipse/epsilon/epl/engine/test/acceptance/EplTests.java
index 4a50b76..11012ad 100644
--- a/tests/org.eclipse.epsilon.epl.engine.test.acceptance/src/org/eclipse/epsilon/epl/engine/test/acceptance/EplTests.java
+++ b/tests/org.eclipse.epsilon.epl.engine.test.acceptance/src/org/eclipse/epsilon/epl/engine/test/acceptance/EplTests.java
@@ -20,7 +20,6 @@
 import org.eclipse.epsilon.epl.execute.PatternMatchModel;
 import org.junit.Test;
 
-@SuppressWarnings("unchecked")
 public class EplTests {
 	
 	protected PatternMatchModel patternMatchModel = null;
@@ -36,7 +35,7 @@
 		
 		PlainXmlModel model = new PlainXmlModel();
 		model.setName("M");
-		model.setFile(new File(EplTests.class.getResource("test.xml").toURI()));
+		model.setFile(new File(EplTests.class.getResource("test.xml").getFile()));
 		model.load();
 		
 		module.getContext().getModelRepository().addModel(model);