Bug 513736: [UnitTest] Iassertion should support throwOnError()

Change-Id: Ifb0f6d4fa5f68f9d0da9f8713bbf4e75e3a004e8
diff --git a/plugins/org.eclipse.ease.modules.unittest/src/org/eclipse/ease/modules/unittest/modules/DefaultAssertion.java b/plugins/org.eclipse.ease.modules.unittest/src/org/eclipse/ease/modules/unittest/modules/DefaultAssertion.java
index 8bb590e..e8792d0 100644
--- a/plugins/org.eclipse.ease.modules.unittest/src/org/eclipse/ease/modules/unittest/modules/DefaultAssertion.java
+++ b/plugins/org.eclipse.ease.modules.unittest/src/org/eclipse/ease/modules/unittest/modules/DefaultAssertion.java
@@ -12,7 +12,11 @@
 
 import java.util.List;
 
+import org.eclipse.ease.AbstractScriptEngine;
+import org.eclipse.ease.IScriptEngine;
 import org.eclipse.ease.debugging.IScriptDebugFrame;
+import org.eclipse.ease.modules.AbstractEnvironment;
+import org.eclipse.ease.modules.IEnvironment;
 
 /**
  * A default implementation for {@link IAssertion} that adds support for error messages.
@@ -20,14 +24,14 @@
 public class DefaultAssertion implements IAssertion {
 
 	/** Optional error message. */
-	private final String fDescription;
+	private final String fErrorMessage;
 	private final boolean fValid;
 	private final List<IScriptDebugFrame> fStackTrace;
 
 	public DefaultAssertion(final List<IScriptDebugFrame> stackTrace, final boolean valid, final String errorDescription) {
 		fStackTrace = stackTrace;
 		fValid = valid;
-		fDescription = errorDescription;
+		fErrorMessage = errorDescription;
 	}
 
 	public DefaultAssertion(final boolean valid, final String errorDescription) {
@@ -58,9 +62,30 @@
 		if (isValid())
 			return IAssertion.VALID.toString();
 
-		if (fDescription != null)
-			return fDescription;
+		if (fErrorMessage != null)
+			return fErrorMessage;
 
 		return IAssertion.INVALID.toString();
 	}
+
+	@Override
+	public void throwOnError() throws Exception {
+		if (!isValid()) {
+			// are we running within the unit test framework?
+			final IScriptEngine scriptEngine = AbstractScriptEngine.getCurrentScriptEngine();
+			if (scriptEngine != null) {
+				final IEnvironment environment = AbstractEnvironment.getEnvironment(scriptEngine);
+				if (environment != null) {
+					final UnitTestModule module = environment.getModule(UnitTestModule.class);
+					if (module != null) {
+						if (module.getTestFile() != null)
+							// running within unit test framework
+							return;
+					}
+				}
+			}
+
+			throw new Exception(toString());
+		}
+	}
 }
diff --git a/plugins/org.eclipse.ease.modules.unittest/src/org/eclipse/ease/modules/unittest/modules/IAssertion.java b/plugins/org.eclipse.ease.modules.unittest/src/org/eclipse/ease/modules/unittest/modules/IAssertion.java
index 2b4d07e..7587617 100644
--- a/plugins/org.eclipse.ease.modules.unittest/src/org/eclipse/ease/modules/unittest/modules/IAssertion.java
+++ b/plugins/org.eclipse.ease.modules.unittest/src/org/eclipse/ease/modules/unittest/modules/IAssertion.java
@@ -10,6 +10,11 @@
  *******************************************************************************/
 package org.eclipse.ease.modules.unittest.modules;
 
+import org.eclipse.ease.AbstractScriptEngine;
+import org.eclipse.ease.IScriptEngine;
+import org.eclipse.ease.modules.AbstractEnvironment;
+import org.eclipse.ease.modules.IEnvironment;
+
 /**
  * Return value type that can be checked for validity.
  */
@@ -28,6 +33,11 @@
 		public String toString() {
 			return "OK";
 		}
+
+		@Override
+		public void throwOnError() throws Exception {
+			// nothing to do
+		}
 	};
 
 	/**
@@ -44,6 +54,25 @@
 		public String toString() {
 			return "Assertion failed";
 		}
+
+		@Override
+		public void throwOnError() throws Exception {
+			// are we running within the unit test framework?
+			final IScriptEngine scriptEngine = AbstractScriptEngine.getCurrentScriptEngine();
+			if (scriptEngine != null) {
+				final IEnvironment environment = AbstractEnvironment.getEnvironment(scriptEngine);
+				if (environment != null) {
+					final UnitTestModule module = environment.getModule(UnitTestModule.class);
+					if (module != null) {
+						if (module.getTestFile() != null)
+							// running within unit test framework
+							return;
+					}
+				}
+			}
+
+			throw new Exception(toString());
+		}
 	};
 
 	/**
@@ -52,4 +81,13 @@
 	 * @return <code>true</code> on valid assertion
 	 */
 	boolean isValid();
+
+	/**
+	 * Throws an exception when the assertion is not valid and run outside of the unit test framework. When run within the unit test framework this method is
+	 * not evaluated and will do nothing.
+	 *
+	 * @throws Exception
+	 *             thrown when assertion is not valid
+	 */
+	void throwOnError() throws Exception;
 }
diff --git a/plugins/org.eclipse.ease.modules.unittest/src/org/eclipse/ease/modules/unittest/modules/MergedAssertion.java b/plugins/org.eclipse.ease.modules.unittest/src/org/eclipse/ease/modules/unittest/modules/MergedAssertion.java
index 6e12527..ff73545 100644
--- a/plugins/org.eclipse.ease.modules.unittest/src/org/eclipse/ease/modules/unittest/modules/MergedAssertion.java
+++ b/plugins/org.eclipse.ease.modules.unittest/src/org/eclipse/ease/modules/unittest/modules/MergedAssertion.java
@@ -19,26 +19,15 @@
 /**
  * An assertion that merges the results of other assertions.
  */
-public class MergedAssertion implements IAssertion {
+public class MergedAssertion extends DefaultAssertion {
 
 	/** Child assertions. */
-	private final Collection<IAssertion> fAssertions = new ArrayList<IAssertion>();
-
-	/** Merged error message. */
-	private final String fErrorMessage;
+	private final Collection<IAssertion> fAssertions = new ArrayList<>();
 
 	/** Merged valid message. */
 	private final String fValidMessage;
 
 	/**
-	 * Constructor. Uses default message for valid case and the first error message from all stored assertion in an error case.
-	 */
-	public MergedAssertion() {
-		fValidMessage = IAssertion.VALID.toString();
-		fErrorMessage = null;
-	}
-
-	/**
 	 * Constructor. Accepts messages for the valid and for the error case.
 	 *
 	 * @param validMessage
@@ -47,8 +36,15 @@
 	 *            message for error case
 	 */
 	public MergedAssertion(final String validMessage, final String errorMessage) {
+		super(errorMessage);
 		fValidMessage = validMessage;
-		fErrorMessage = errorMessage;
+	}
+
+	/**
+	 * Constructor. Uses default message for valid case and the first error message from all stored assertion in an error case.
+	 */
+	public MergedAssertion() {
+		this(IAssertion.VALID.toString(), IAssertion.INVALID.toString());
 	}
 
 	/**
@@ -58,8 +54,7 @@
 	 *            message for error case
 	 */
 	public MergedAssertion(final String errorMessage) {
-		fValidMessage = IAssertion.VALID.toString();
-		fErrorMessage = errorMessage;
+		this(IAssertion.VALID.toString(), errorMessage);
 	}
 
 	/**
@@ -86,8 +81,9 @@
 		if (isValid())
 			return fValidMessage;
 
-		if (fErrorMessage != null)
-			return fErrorMessage;
+		// take user defied error message if set by user
+		if (!IAssertion.INVALID.toString().equals(super.toString()))
+			return super.toString();
 
 		final StringBuilder message = new StringBuilder();
 		for (final IAssertion assertion : fAssertions) {