Fix + test.
441027: Enum type in 'from' section of lazy rules
https://bugs.eclipse.org/bugs/show_bug.cgi?id=441027
diff --git a/plugins/org.eclipse.m2m.atl.emftvm/src/org/eclipse/m2m/atl/emftvm/impl/RuleImpl.java b/plugins/org.eclipse.m2m.atl.emftvm/src/org/eclipse/m2m/atl/emftvm/impl/RuleImpl.java
index 64e23c0..0ce6078 100644
--- a/plugins/org.eclipse.m2m.atl.emftvm/src/org/eclipse/m2m/atl/emftvm/impl/RuleImpl.java
+++ b/plugins/org.eclipse.m2m.atl.emftvm/src/org/eclipse/m2m/atl/emftvm/impl/RuleImpl.java
@@ -26,6 +26,8 @@
 import org.eclipse.emf.common.notify.NotificationChain;
 import org.eclipse.emf.common.util.EList;
 import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.EClassifier;
+import org.eclipse.emf.ecore.EEnum;
 import org.eclipse.emf.ecore.EObject;
 import org.eclipse.emf.ecore.InternalEObject;
 import org.eclipse.emf.ecore.impl.ENotificationImpl;
@@ -52,6 +54,7 @@
 import org.eclipse.m2m.atl.emftvm.trace.TraceLink;
 import org.eclipse.m2m.atl.emftvm.trace.TraceLinkSet;
 import org.eclipse.m2m.atl.emftvm.trace.TracedRule;
+import org.eclipse.m2m.atl.emftvm.util.EnumLiteral;
 import org.eclipse.m2m.atl.emftvm.util.FieldContainer;
 import org.eclipse.m2m.atl.emftvm.util.LazySet;
 import org.eclipse.m2m.atl.emftvm.util.StackFrame;
@@ -2103,7 +2106,13 @@
 						"Cannot match rule input element %s against null value for %s", 
 						re, this));
 			}
-			if (!re.getEType().isInstance(value)) {
+			EClassifier eType = re.getEType();
+			if (eType instanceof EEnum) {
+				// Fix for Bug # 441027
+				if (!(value instanceof EnumLiteral)) {
+					return false;
+				}
+			} else if (!eType.isInstance(value)) {
 				return false;
 			}
 			EList<Model> inmodels = re.getEModels();
diff --git a/tests/org.eclipse.m2m.atl.emftvm.tests/src/org/eclipse/m2m/atl/emftvm/tests/integration/IntegrationTest.java b/tests/org.eclipse.m2m.atl.emftvm.tests/src/org/eclipse/m2m/atl/emftvm/tests/integration/IntegrationTest.java
index e955d2a..4efbaf2 100644
--- a/tests/org.eclipse.m2m.atl.emftvm.tests/src/org/eclipse/m2m/atl/emftvm/tests/integration/IntegrationTest.java
+++ b/tests/org.eclipse.m2m.atl.emftvm.tests/src/org/eclipse/m2m/atl/emftvm/tests/integration/IntegrationTest.java
@@ -320,6 +320,27 @@
 	}
 
 	/**
+	 * Tests regression of <a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=441027">Bug # 441027</a>.
+	 */
+	public void testBug441027() {
+		final ResourceSet rs = new ResourceSetImpl();
+		final ExecEnv env = EmftvmFactory.eINSTANCE.createExecEnv();
+		final TimingData td = new TimingData();
+		final Model in = loadTestModel(rs, "/test-data/Regression/Bug441027.emftvm");
+		final Model out = createTestModel(rs, "/test-data/Regression/Bug441027-out.xmi");
+		env.registerInputModel("IN", in);
+		env.registerOutputModel("OUT", out);
+		env.loadModule(createTestModuleResolver(), "Regression::Bug441027");
+		td.finishLoading();
+		env.run(td);
+		td.finish();
+
+		final ResourceSet refRs = new ResourceSetImpl();
+		final Model refOut = loadTestModel(refRs, "/test-data/Regression/Bug441027-out.xmi");
+		assertEquals(refOut.getResource(), out.getResource());
+	}
+
+	/**
 	 * Tests "ToStringTest.atl".
 	 */
 	public void testToString() {
diff --git a/tests/org.eclipse.m2m.atl.emftvm.tests/test-data/Regression/Bug441027-out.xmi b/tests/org.eclipse.m2m.atl.emftvm.tests/test-data/Regression/Bug441027-out.xmi
new file mode 100644
index 0000000..c0efaf4
--- /dev/null
+++ b/tests/org.eclipse.m2m.atl.emftvm.tests/test-data/Regression/Bug441027-out.xmi
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="ASCII"?>
+<emftvm:Module xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:emftvm="http://www.eclipse.org/m2m/atl/2011/EMFTVM">
+  <features xsi:type="emftvm:Operation" name="FINDTYPE"/>
+  <features xsi:type="emftvm:Operation" name="NEW"/>
+  <features xsi:type="emftvm:Operation" name="STORE"/>
+  <features xsi:type="emftvm:Operation" name="LOAD"/>
+  <features xsi:type="emftvm:Operation" name="FINDTYPE"/>
+  <features xsi:type="emftvm:Operation" name="PUSH"/>
+  <features xsi:type="emftvm:Operation" name="INVOKE"/>
+  <features xsi:type="emftvm:Operation" name="GETCB"/>
+  <features xsi:type="emftvm:Operation" name="INVOKE"/>
+  <features xsi:type="emftvm:Operation" name="INVOKE"/>
+  <features xsi:type="emftvm:Operation" name="SET"/>
+  <features xsi:type="emftvm:Operation" name="GETENVTYPE"/>
+  <features xsi:type="emftvm:Operation" name="LOAD"/>
+  <features xsi:type="emftvm:Operation" name="GET"/>
+  <features xsi:type="emftvm:Operation" name="PUSH"/>
+  <features xsi:type="emftvm:Operation" name="INVOKE"/>
+  <features xsi:type="emftvm:Operation" name="INVOKE_STATIC"/>
+  <features xsi:type="emftvm:Operation" name="GETENVTYPE"/>
+  <features xsi:type="emftvm:Operation" name="INVOKE_STATIC"/>
+  <features xsi:type="emftvm:Operation" name="LOAD"/>
+  <features xsi:type="emftvm:Operation" name="LOAD"/>
+  <features xsi:type="emftvm:Operation" name="INVOKE"/>
+  <features xsi:type="emftvm:Operation" name="INVOKE"/>
+  <features xsi:type="emftvm:Operation" name="SET"/>
+  <features xsi:type="emftvm:Operation" name="LOAD"/>
+  <features xsi:type="emftvm:Operation" name="LOAD"/>
+</emftvm:Module>
diff --git a/tests/org.eclipse.m2m.atl.emftvm.tests/test-data/Regression/Bug441027.atl b/tests/org.eclipse.m2m.atl.emftvm.tests/test-data/Regression/Bug441027.atl
new file mode 100644
index 0000000..a4e333d
--- /dev/null
+++ b/tests/org.eclipse.m2m.atl.emftvm.tests/test-data/Regression/Bug441027.atl
@@ -0,0 +1,24 @@
+-- @atlcompiler emftvm
+-- @nsURI EMFTVM=http://www.eclipse.org/m2m/atl/2011/EMFTVM
+module "Regression::Bug441027";
+
+create OUT : EMFTVM from IN : EMFTVM;
+
+lazy rule OpcodeToOperation {
+	from s : EMFTVM!Opcode
+	to t : EMFTVM!Operation (
+		name <- s.getName()
+	)
+	do {
+		t;
+	}
+}
+
+endpoint rule Module() {
+	to t : EMFTVM!Module (
+		features <- EMFTVM!Instruction.allInstancesFrom('IN')
+			->collect(i | 
+				thisModule.OpcodeToOperation(i.opcode.debug('opcode'))
+			)
+	)
+}
diff --git a/tests/org.eclipse.m2m.atl.emftvm.tests/test-data/Regression/Bug441027.emftvm b/tests/org.eclipse.m2m.atl.emftvm.tests/test-data/Regression/Bug441027.emftvm
new file mode 100644
index 0000000..c136b66
--- /dev/null
+++ b/tests/org.eclipse.m2m.atl.emftvm.tests/test-data/Regression/Bug441027.emftvm
Binary files differ