EUnit Ant task: add savemodeldeltas="true|false" option
diff --git a/plugins/org.eclipse.epsilon.workflow/ant/org/eclipse/epsilon/workflow/tasks/EUnitTask.java b/plugins/org.eclipse.epsilon.workflow/ant/org/eclipse/epsilon/workflow/tasks/EUnitTask.java
index 9bb755e..b45381e 100644
--- a/plugins/org.eclipse.epsilon.workflow/ant/org/eclipse/epsilon/workflow/tasks/EUnitTask.java
+++ b/plugins/org.eclipse.epsilon.workflow/ant/org/eclipse/epsilon/workflow/tasks/EUnitTask.java
@@ -11,6 +11,7 @@
 package org.eclipse.epsilon.workflow.tasks;

 

 import java.io.File;

+import java.io.IOException;

 import java.io.PrintStream;

 import java.lang.reflect.Constructor;

 import java.util.ArrayList;

@@ -35,6 +36,7 @@
 import org.eclipse.epsilon.eunit.EUnitTestListener;

 import org.eclipse.epsilon.eunit.EUnitTestResultType;

 import org.eclipse.epsilon.eunit.extensions.IModelComparator;

+import org.eclipse.epsilon.eunit.operations.EUnitFailedModelComparisonException;

 import org.eclipse.epsilon.workflow.tasks.hosts.HostManager;

 
 /**
@@ -157,6 +159,7 @@
 	private File fReportDirectory;
 	private String fPackage = EUnitModule.DEFAULT_PACKAGE;
 	private boolean fGenerateReport = true;

+	private boolean fSaveModelDeltas = false;

 	private TaskCollection modelLoadingTasks;

 	private ComparatorReferenceList comparatorRefs;
 	private ModelRepository oldProjectRepository;
@@ -286,8 +289,11 @@
 		}

 		else {

 			err.print(testDescription + " failed with status " + test.getResult());

-			final Exception testException = test.getException();

+			final Throwable testException = test.getUnwrappedInternalException();

 			if (testException != null) {

+				if (isSaveModelDeltas() && test.isLeafTest() && testException instanceof EUnitFailedModelComparisonException) {

+					saveModelDeltas(module, test, err, testException);

+				}

 				err.println(": " + testException.getMessage());

 			}

 			else {

@@ -296,6 +302,21 @@
 		}

 	}

 

+	protected void saveModelDeltas(EUnitModule module, EUnitTest test, final PrintStream err,

+			final Throwable testException) {

+		EUnitFailedModelComparisonException ex = (EUnitFailedModelComparisonException) testException;

+		if (ex.getComparator() != null && ex.getDelta() != null) {

+			File fBasename = new File(getToDir() != null ? getToDir() : getProject().getBaseDir(),

+				String.format("DELTA-%s.%s.%s", module.getPackage(), module.getClassName(), test.getCaseName())

+			);

+			try {

+				ex.getComparator().saveDeltaToFile(ex.getDelta(), fBasename);

+			} catch (IOException e) {

+				e.printStackTrace(err);

+			}

+		}

+	}

+

 	// NESTED ELEMENTS
 
 	public TaskCollection createModelTasks() {
@@ -360,4 +381,21 @@
 		this.fGenerateReport = generate;

 	}

 

+	/**

+	 * Returns <code>true</code> if any detected model differences will be saved to a file, named after the

+	 * test suite package, test suite class, and test name. The extension will depend on the comparator being

+	 * used.

+	 */

+	public boolean isSaveModelDeltas() {

+		return fSaveModelDeltas;

+	}

+

+	/**

+	 * Changes whether model differences will be saved to a file (when set to <code>true</code>) or not (when

+	 * set to <code>false</code>).

+	 */

+	public void setSaveModelDeltas(boolean save) {

+		this.fSaveModelDeltas = save;

+	}

+

 }