[271320] Support operation overriding in extended module
diff --git a/tests/org.eclipse.m2m.tests.qvt.oml/parserTestData/models/operation_override/LibForExtends.qvto b/tests/org.eclipse.m2m.tests.qvt.oml/parserTestData/models/operation_override/LibForExtends.qvto
new file mode 100644
index 0000000..e655e73
--- /dev/null
+++ b/tests/org.eclipse.m2m.tests.qvt.oml/parserTestData/models/operation_override/LibForExtends.qvto
@@ -0,0 +1,11 @@
+library LibForExtends;
+
+
+query query_LibForExtends() : String {
+	return "LibForExtends-query_LibForExtends";
+}
+
+query callQuery_LibForExtends() : String {
+	return query_LibForExtends();
+}
+
diff --git a/tests/org.eclipse.m2m.tests.qvt.oml/parserTestData/models/operation_override/RootTransfForExtends.qvto b/tests/org.eclipse.m2m.tests.qvt.oml/parserTestData/models/operation_override/RootTransfForExtends.qvto
new file mode 100644
index 0000000..8d21b72
--- /dev/null
+++ b/tests/org.eclipse.m2m.tests.qvt.oml/parserTestData/models/operation_override/RootTransfForExtends.qvto
@@ -0,0 +1,49 @@
+modeltype ECORE "strict" uses ecore('http://www.eclipse.org/emf/2002/Ecore');
+	
+transformation RootTransfForExtends(in eModel : ECORE, out outModel : ECORE);
+ 
+property prop_TransfForExtends : String = "prop_TransfForExtends";
+
+main() {
+	object EPackage {
+		name := "should never be executed";
+	};
+}
+
+
+helper EClass::decorateName() : String {
+	return "RootTransfForExtends-" + self.name;
+}
+
+helper non_ContextualDecorate(c : EClass) : String {
+	return "RootTransfForExtends-" + c.name;
+}
+
+mapping EClass::customCopy() : EClass {
+	name := "RootTransfForExtends-" + self.name;
+}
+
+mapping customCopy(in eClass : EClass) : EClass {
+	name := "RootTransfForExtends-" + eClass.name;
+}
+
+helper rootModuleQuery() : String {
+	return "RootTransfForExtends";
+}
+
+mapping createOverridenCallsPackage(in pckgName : String) : EPackage {
+	init {
+		var c:EClass := object EClass { name := pckgName };
+		c.eStructuralFeatures += object EAttribute {
+			name := c.decorateName();
+		};
+		c.eStructuralFeatures += object EAttribute {
+			name := non_ContextualDecorate(c);
+		};
+	}
+
+	name := pckgName;
+	eClassifiers += c;
+	eClassifiers += c.map customCopy();
+	eClassifiers += map customCopy(c);	
+}
\ No newline at end of file
diff --git a/tests/org.eclipse.m2m.tests.qvt.oml/parserTestData/models/operation_override/TransfForAccess.qvto b/tests/org.eclipse.m2m.tests.qvt.oml/parserTestData/models/operation_override/TransfForAccess.qvto
new file mode 100644
index 0000000..0e931b0
--- /dev/null
+++ b/tests/org.eclipse.m2m.tests.qvt.oml/parserTestData/models/operation_override/TransfForAccess.qvto
@@ -0,0 +1,7 @@
+modeltype ECORE "strict" uses ecore('http://www.eclipse.org/emf/2002/Ecore');
+	
+transformation TransfForAccess(in eModel : ECORE, out outModel : ECORE);
+ 
+query queryStringForAccess() : String {
+	return "TransfForAccess-queryStringForAccess";
+}
diff --git a/tests/org.eclipse.m2m.tests.qvt.oml/parserTestData/models/operation_override/TransfForExtends.qvto b/tests/org.eclipse.m2m.tests.qvt.oml/parserTestData/models/operation_override/TransfForExtends.qvto
new file mode 100644
index 0000000..2caffd1
--- /dev/null
+++ b/tests/org.eclipse.m2m.tests.qvt.oml/parserTestData/models/operation_override/TransfForExtends.qvto
@@ -0,0 +1,42 @@
+import RootTransfForExtends;
+	
+modeltype ECORE "strict" uses ecore('http://www.eclipse.org/emf/2002/Ecore');
+	
+transformation TransfForExtends(in eModel : ECORE, out outModel : ECORE) 
+	extends transformation RootTransfForExtends;
+ 
+
+helper EClass::decorateName() : String {
+	return "TransfForExtends-" + self.name;
+}
+
+helper non_ContextualDecorate(c : EClass) : String {
+	return "TransfForExtends->" + this.RootTransfForExtends::non_ContextualDecorate(c);
+}
+
+mapping EClass::customCopy() : EClass {
+	name := "TransfForExtends-EClass::customCopy()" + self.name;
+}
+
+mapping customCopy(in eClass : EClass) : EClass {
+	name := "TransfForExtends-customCopy(in eClass : EClass)" + eClass.name;
+}
+
+/*
+ Intentionally not overridden here but only by the bottom most sub-module
+*/
+//helper rootModuleQuery() : String {
+//	return "RootTransfForExtends";
+//}
+
+query callRootModuleQuery() : String {
+	return rootModuleQuery();
+}
+
+query reusableQuery() : String {
+	return 	"TransfForExtends::reusableQuery";
+}
+
+helper callOverridenPackageResult() : EPackage {
+	return map createOverridenCallsPackage("result-in-TransfForExtends");
+}
diff --git a/tests/org.eclipse.m2m.tests.qvt.oml/parserTestData/models/operation_override/expected.ecore b/tests/org.eclipse.m2m.tests.qvt.oml/parserTestData/models/operation_override/expected.ecore
new file mode 100644
index 0000000..b6228ac
--- /dev/null
+++ b/tests/org.eclipse.m2m.tests.qvt.oml/parserTestData/models/operation_override/expected.ecore
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ecore:EPackage xmi:version="2.0"
+    xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" name="mainModule-RootTransfForExtends">
+  <eClassifiers xsi:type="ecore:EClass" name="mainModule->LibForExtends-query_LibForExtends"/>
+  <eSubpackages name="mainModule-RootTransfForExtends">
+    <eClassifiers xsi:type="ecore:EClass" name="mainModule-queryStringForAccess"/>
+  </eSubpackages>
+  <eSubpackages name="RootTransfForExtends"/>
+  <eSubpackages name="result-in-MainModule">
+    <eClassifiers xsi:type="ecore:EClass" name="result-in-MainModule">
+      <eStructuralFeatures xsi:type="ecore:EAttribute" name="TransfForExtends-result-in-MainModule"/>
+      <eStructuralFeatures xsi:type="ecore:EAttribute" name="TransfForExtends->RootTransfForExtends-result-in-MainModule"/>
+    </eClassifiers>
+    <eClassifiers xsi:type="ecore:EClass" name="TransfForExtends-EClass::customCopy()result-in-MainModule"/>
+    <eClassifiers xsi:type="ecore:EClass" name="TransfForExtends-customCopy(in eClass : EClass)result-in-MainModule"/>
+  </eSubpackages>
+  <eSubpackages name="result-in-TransfForExtends">
+    <eClassifiers xsi:type="ecore:EClass" name="result-in-TransfForExtends">
+      <eStructuralFeatures xsi:type="ecore:EAttribute" name="TransfForExtends-result-in-TransfForExtends"/>
+      <eStructuralFeatures xsi:type="ecore:EAttribute" name="TransfForExtends->RootTransfForExtends-result-in-TransfForExtends"/>
+    </eClassifiers>
+    <eClassifiers xsi:type="ecore:EClass" name="TransfForExtends-EClass::customCopy()result-in-TransfForExtends"/>
+    <eClassifiers xsi:type="ecore:EClass" name="TransfForExtends-customCopy(in eClass : EClass)result-in-TransfForExtends"/>
+  </eSubpackages>
+</ecore:EPackage>
diff --git a/tests/org.eclipse.m2m.tests.qvt.oml/parserTestData/models/operation_override/in.ecore b/tests/org.eclipse.m2m.tests.qvt.oml/parserTestData/models/operation_override/in.ecore
new file mode 100644
index 0000000..5511a6b
--- /dev/null
+++ b/tests/org.eclipse.m2m.tests.qvt.oml/parserTestData/models/operation_override/in.ecore
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ecore:EPackage xmi:version="2.0"
+    xmlns:xmi="http://www.omg.org/XMI" xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" name="root"
+    nsURI="x" nsPrefix="x"/>
diff --git a/tests/org.eclipse.m2m.tests.qvt.oml/parserTestData/models/operation_override/operation_override.qvto b/tests/org.eclipse.m2m.tests.qvt.oml/parserTestData/models/operation_override/operation_override.qvto
new file mode 100644
index 0000000..e267389
--- /dev/null
+++ b/tests/org.eclipse.m2m.tests.qvt.oml/parserTestData/models/operation_override/operation_override.qvto
@@ -0,0 +1,54 @@
+import TransfForAccess;
+import LibForExtends;
+import TransfForExtends;	
+
+modeltype ECORE "strict" uses ecore('http://www.eclipse.org/emf/2002/Ecore');
+
+transformation operation_override(in eModel : ECORE, out outModel : ECORE) 
+	extends TransfForExtends, LibForExtends
+	access transformation TransfForAccess; 
+    
+    
+main() {
+	var e : EPackage := object EPackage {
+		name := rootModuleQuery();
+
+		eSubpackages += object EPackage {
+			name := callRootModuleQuery();	
+	
+			var c: EClass;
+			eClassifiers += object c:EClass {
+				name := queryStringForAccess();
+			};
+		};
+		
+		eSubpackages += object EPackage {
+			name := this.RootTransfForExtends::rootModuleQuery();
+		};   
+	};
+		
+	e.eSubpackages += map createOverridenCallsPackage("result-in-MainModule");	
+	e.eSubpackages += callOverridenPackageResult();
+	 
+	e.eClassifiers += object EClass { 
+		name := callQuery_LibForExtends();
+	}	
+}
+
+
+helper rootModuleQuery() : String {
+	return "mainModule-RootTransfForExtends";
+}
+
+// non-overriding query local hiding of accessed query 
+query queryStringForAccess() : String {
+	return "mainModule-queryStringForAccess";
+}
+
+query reusableQuery() : String {
+	return 	"mainModule->" + this.TransfForExtends::reusableQuery();
+}
+
+query query_LibForExtends() : String {
+	return "mainModule->LibForExtends-query_LibForExtends";
+}
diff --git a/tests/org.eclipse.m2m.tests.qvt.oml/src/org/eclipse/m2m/tests/qvt/oml/transform/TransformTests.java b/tests/org.eclipse.m2m.tests.qvt.oml/src/org/eclipse/m2m/tests/qvt/oml/transform/TransformTests.java
index d39d274..81a69a9 100644
--- a/tests/org.eclipse.m2m.tests.qvt.oml/src/org/eclipse/m2m/tests/qvt/oml/transform/TransformTests.java
+++ b/tests/org.eclipse.m2m.tests.qvt.oml/src/org/eclipse/m2m/tests/qvt/oml/transform/TransformTests.java
@@ -78,6 +78,7 @@
     
     public static ModelTestData[] createTestData() {
         return new ModelTestData[] {        		        		
+        		new FileToFileData("operation_override"), //$NON-NLS-1$
         		new FileToFileData("fqnMainCalls_272937"), //$NON-NLS-1$        		
         		new FileToFileData("fqnMainCalls_271987"), //$NON-NLS-1$        		
         		new FileToFileData("fqnOperationCalls_271789"), //$NON-NLS-1$        		
@@ -292,7 +293,7 @@
             "primtypesecore", // uses getDataTypeInstance() defined on ecore //$NON-NLS-1$
             // tests using imports are excluded as the compiler never resolved imported unit
             // to unitName.qvto.javaless (patched original sources)
-            "import_access_extends", "import_access_extends_cfgprop", "importedvirtuals", "imports_transformations", "imports", "virt", "full", "fqntraces", // TODO import other files //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ //$NON-NLS-8$
+            "operation_override", "import_access_extends", "import_access_extends_cfgprop", "importedvirtuals", "imports_transformations", "imports", "virt", "full", "fqntraces", // TODO import other files //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ //$NON-NLS-8$
             "importedInstances", "fqnOperationCalls_271789", "fqnMainCalls_271987", "fqnMainCalls_272937", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
             
             "libraryWithModuleElements_257184", "libraryHeaderWithSignature_257575",// TODO import other files //$NON-NLS-1$ //$NON-NLS-2$