[465895] Added validation tests.

Bug: 465895
Change-Id: Ie2b4c7f5b23fd91580ab6bd4e7f0688ddb3bc080
diff --git a/query/plugins/org.eclipse.acceleo.query/src/org/eclipse/acceleo/query/services/CollectionServices.java b/query/plugins/org.eclipse.acceleo.query/src/org/eclipse/acceleo/query/services/CollectionServices.java
index 937229b..49997fc 100644
--- a/query/plugins/org.eclipse.acceleo.query/src/org/eclipse/acceleo/query/services/CollectionServices.java
+++ b/query/plugins/org.eclipse.acceleo.query/src/org/eclipse/acceleo/query/services/CollectionServices.java
@@ -631,8 +631,13 @@
 			}
 
 			if (result.isEmpty()) {
-				result.add(new SetType(queryEnvironment, services.nothing("Nothing left after intersection:"
-						+ builder.toString())));
+				if (List.class.isAssignableFrom(getServiceMethod().getReturnType())) {
+					result.add(new SequenceType(queryEnvironment, services
+							.nothing("Nothing left after intersection:" + builder.toString())));
+				} else if (Set.class.isAssignableFrom(getServiceMethod().getReturnType())) {
+					result.add(new SetType(queryEnvironment, services
+							.nothing("Nothing left after intersection:" + builder.toString())));
+				}
 			}
 
 			return result;
diff --git a/query/tests/org.eclipse.acceleo.query.tests/src/org/eclipse/acceleo/query/services/tests/CollectionServicesValidationTest.java b/query/tests/org.eclipse.acceleo.query.tests/src/org/eclipse/acceleo/query/services/tests/CollectionServicesValidationTest.java
index 1180184..95395c2 100644
--- a/query/tests/org.eclipse.acceleo.query.tests/src/org/eclipse/acceleo/query/services/tests/CollectionServicesValidationTest.java
+++ b/query/tests/org.eclipse.acceleo.query.tests/src/org/eclipse/acceleo/query/services/tests/CollectionServicesValidationTest.java
@@ -329,7 +329,7 @@
 	}
 
 	@Test
-	public void testIntersectionNothingLeft() {
+	public void testIntersectionSetSetNothingLeft() {
 		final EPackage ePkg = EcorePackage.eINSTANCE.getEcoreFactory().createEPackage();
 		ePkg.setName("ePkg");
 		ePkg.setNsPrefix("ePkg");
@@ -355,7 +355,7 @@
 	}
 
 	@Test
-	public void testIntersectionTopSubType() {
+	public void testIntersectionSetSetTopSubType() {
 		final EPackage ePkg = EcorePackage.eINSTANCE.getEcoreFactory().createEPackage();
 		ePkg.setName("ePkg");
 		ePkg.setNsPrefix("ePkg");
@@ -391,7 +391,7 @@
 	}
 
 	@Test
-	public void testIntersectionSameType() {
+	public void testIntersectionSetSetSameType() {
 		final IType[] parameterTypes = new IType[] {setType(classType(String.class)),
 				setType(classType(String.class)) };
 		final IType[] expectedReturnTypes = new IType[] {setType(classType(String.class)) };
@@ -400,7 +400,7 @@
 	}
 
 	@Test
-	public void testIntersectionEClassEClassifier() {
+	public void testIntersectionSetSetEClassEClassifier() {
 		final IType[] parameterTypes = new IType[] {setType(classType(EClass.class)),
 				setType(classType(EClassifier.class)) };
 		final IType[] expectedReturnTypes = new IType[] {setType(classType(EClass.class)) };
@@ -409,7 +409,7 @@
 	}
 
 	@Test
-	public void testIntersectionEClassifierEClass() {
+	public void testIntersectionSetSetEClassifierEClass() {
 		final IType[] parameterTypes = new IType[] {setType(classType(EClassifier.class)),
 				setType(classType(EClass.class)) };
 		final IType[] expectedReturnTypes = new IType[] {setType(classType(EClass.class)) };
@@ -418,6 +418,273 @@
 	}
 
 	@Test
+	public void testIntersectionListListNothingLeft() {
+		final EPackage ePkg = EcorePackage.eINSTANCE.getEcoreFactory().createEPackage();
+		ePkg.setName("ePkg");
+		ePkg.setNsPrefix("ePkg");
+		final EClass eCls1 = EcorePackage.eINSTANCE.getEcoreFactory().createEClass();
+		eCls1.setName("eCls1");
+		ePkg.getEClassifiers().add(eCls1);
+		final EClass eCls2 = EcorePackage.eINSTANCE.getEcoreFactory().createEClass();
+		eCls2.setName("eCls2");
+		ePkg.getEClassifiers().add(eCls2);
+
+		try {
+			getQueryEnvironment().registerEPackage(ePkg);
+
+			final IType[] parameterTypes = new IType[] {sequenceType(eClassifierType(eCls1)),
+					sequenceType(eClassifierType(eCls2)) };
+			final IType[] expectedReturnTypes = new IType[] {sequenceType(nothingType("Nothing left after intersection of Sequence(EClassifier=eCls1) and Sequence(EClassifier=eCls2)")) };
+			final IType[] expectedAllReturnTypes = new IType[] {sequenceType(nothingType("Nothing left after intersection:\n Nothing left after intersection of Sequence(EClassifier=eCls1) and Sequence(EClassifier=eCls2)")) };
+
+			assertValidation(expectedReturnTypes, expectedAllReturnTypes, "intersection", parameterTypes);
+		} finally {
+			getQueryEnvironment().removeEPackage(ePkg.getNsPrefix());
+		}
+	}
+
+	@Test
+	public void testIntersectionListListTopSubType() {
+		final EPackage ePkg = EcorePackage.eINSTANCE.getEcoreFactory().createEPackage();
+		ePkg.setName("ePkg");
+		ePkg.setNsPrefix("ePkg");
+		final EClass eCls1 = EcorePackage.eINSTANCE.getEcoreFactory().createEClass();
+		eCls1.setName("eCls1");
+		ePkg.getEClassifiers().add(eCls1);
+		final EClass eCls2 = EcorePackage.eINSTANCE.getEcoreFactory().createEClass();
+		eCls2.setName("eCls2");
+		ePkg.getEClassifiers().add(eCls2);
+		final EClass eCls3 = EcorePackage.eINSTANCE.getEcoreFactory().createEClass();
+		eCls3.setName("eCls3");
+		eCls3.getESuperTypes().add(eCls1);
+		eCls3.getESuperTypes().add(eCls2);
+		ePkg.getEClassifiers().add(eCls3);
+		final EClass eCls4 = EcorePackage.eINSTANCE.getEcoreFactory().createEClass();
+		eCls4.setName("eCls4");
+		eCls4.getESuperTypes().add(eCls1);
+		eCls4.getESuperTypes().add(eCls2);
+		eCls4.getESuperTypes().add(eCls3);
+		ePkg.getEClassifiers().add(eCls4);
+
+		try {
+			getQueryEnvironment().registerEPackage(ePkg);
+
+			final IType[] parameterTypes = new IType[] {sequenceType(eClassifierType(eCls1)),
+					sequenceType(eClassifierType(eCls2)) };
+			final IType[] expectedReturnTypes = new IType[] {sequenceType(eClassifierType(eCls3)) };
+
+			assertValidation(expectedReturnTypes, "intersection", parameterTypes);
+		} finally {
+			getQueryEnvironment().removeEPackage(ePkg.getNsPrefix());
+		}
+	}
+
+	@Test
+	public void testIntersectionListListSameType() {
+		final IType[] parameterTypes = new IType[] {sequenceType(classType(String.class)),
+				sequenceType(classType(String.class)) };
+		final IType[] expectedReturnTypes = new IType[] {sequenceType(classType(String.class)) };
+
+		assertValidation(expectedReturnTypes, "intersection", parameterTypes);
+	}
+
+	@Test
+	public void testIntersectionListListEClassEClassifier() {
+		final IType[] parameterTypes = new IType[] {sequenceType(classType(EClass.class)),
+				sequenceType(classType(EClassifier.class)) };
+		final IType[] expectedReturnTypes = new IType[] {sequenceType(classType(EClass.class)) };
+
+		assertValidation(expectedReturnTypes, "intersection", parameterTypes);
+	}
+
+	@Test
+	public void testIntersectionListListEClassifierEClass() {
+		final IType[] parameterTypes = new IType[] {sequenceType(classType(EClassifier.class)),
+				sequenceType(classType(EClass.class)) };
+		final IType[] expectedReturnTypes = new IType[] {sequenceType(classType(EClass.class)) };
+
+		assertValidation(expectedReturnTypes, "intersection", parameterTypes);
+	}
+
+	@Test
+	public void testIntersectionListSetNothingLeft() {
+		final EPackage ePkg = EcorePackage.eINSTANCE.getEcoreFactory().createEPackage();
+		ePkg.setName("ePkg");
+		ePkg.setNsPrefix("ePkg");
+		final EClass eCls1 = EcorePackage.eINSTANCE.getEcoreFactory().createEClass();
+		eCls1.setName("eCls1");
+		ePkg.getEClassifiers().add(eCls1);
+		final EClass eCls2 = EcorePackage.eINSTANCE.getEcoreFactory().createEClass();
+		eCls2.setName("eCls2");
+		ePkg.getEClassifiers().add(eCls2);
+
+		try {
+			getQueryEnvironment().registerEPackage(ePkg);
+
+			final IType[] parameterTypes = new IType[] {sequenceType(eClassifierType(eCls1)),
+					setType(eClassifierType(eCls2)) };
+			final IType[] expectedReturnTypes = new IType[] {sequenceType(nothingType("Nothing left after intersection of Sequence(EClassifier=eCls1) and Set(EClassifier=eCls2)")) };
+			final IType[] expectedAllReturnTypes = new IType[] {sequenceType(nothingType("Nothing left after intersection:\n Nothing left after intersection of Sequence(EClassifier=eCls1) and Set(EClassifier=eCls2)")) };
+
+			assertValidation(expectedReturnTypes, expectedAllReturnTypes, "intersection", parameterTypes);
+		} finally {
+			getQueryEnvironment().removeEPackage(ePkg.getNsPrefix());
+		}
+	}
+
+	@Test
+	public void testIntersectionListSetTopSubType() {
+		final EPackage ePkg = EcorePackage.eINSTANCE.getEcoreFactory().createEPackage();
+		ePkg.setName("ePkg");
+		ePkg.setNsPrefix("ePkg");
+		final EClass eCls1 = EcorePackage.eINSTANCE.getEcoreFactory().createEClass();
+		eCls1.setName("eCls1");
+		ePkg.getEClassifiers().add(eCls1);
+		final EClass eCls2 = EcorePackage.eINSTANCE.getEcoreFactory().createEClass();
+		eCls2.setName("eCls2");
+		ePkg.getEClassifiers().add(eCls2);
+		final EClass eCls3 = EcorePackage.eINSTANCE.getEcoreFactory().createEClass();
+		eCls3.setName("eCls3");
+		eCls3.getESuperTypes().add(eCls1);
+		eCls3.getESuperTypes().add(eCls2);
+		ePkg.getEClassifiers().add(eCls3);
+		final EClass eCls4 = EcorePackage.eINSTANCE.getEcoreFactory().createEClass();
+		eCls4.setName("eCls4");
+		eCls4.getESuperTypes().add(eCls1);
+		eCls4.getESuperTypes().add(eCls2);
+		eCls4.getESuperTypes().add(eCls3);
+		ePkg.getEClassifiers().add(eCls4);
+
+		try {
+			getQueryEnvironment().registerEPackage(ePkg);
+
+			final IType[] parameterTypes = new IType[] {sequenceType(eClassifierType(eCls1)),
+					setType(eClassifierType(eCls2)) };
+			final IType[] expectedReturnTypes = new IType[] {sequenceType(eClassifierType(eCls3)) };
+
+			assertValidation(expectedReturnTypes, "intersection", parameterTypes);
+		} finally {
+			getQueryEnvironment().removeEPackage(ePkg.getNsPrefix());
+		}
+	}
+
+	@Test
+	public void testIntersectionListSetSameType() {
+		final IType[] parameterTypes = new IType[] {sequenceType(classType(String.class)),
+				setType(classType(String.class)) };
+		final IType[] expectedReturnTypes = new IType[] {sequenceType(classType(String.class)) };
+
+		assertValidation(expectedReturnTypes, "intersection", parameterTypes);
+	}
+
+	@Test
+	public void testIntersectionListSetEClassEClassifier() {
+		final IType[] parameterTypes = new IType[] {sequenceType(classType(EClass.class)),
+				setType(classType(EClassifier.class)) };
+		final IType[] expectedReturnTypes = new IType[] {sequenceType(classType(EClass.class)) };
+
+		assertValidation(expectedReturnTypes, "intersection", parameterTypes);
+	}
+
+	@Test
+	public void testIntersectionListSetEClassifierEClass() {
+		final IType[] parameterTypes = new IType[] {sequenceType(classType(EClassifier.class)),
+				setType(classType(EClass.class)) };
+		final IType[] expectedReturnTypes = new IType[] {sequenceType(classType(EClass.class)) };
+
+		assertValidation(expectedReturnTypes, "intersection", parameterTypes);
+	}
+
+	@Test
+	public void testIntersectionSetListNothingLeft() {
+		final EPackage ePkg = EcorePackage.eINSTANCE.getEcoreFactory().createEPackage();
+		ePkg.setName("ePkg");
+		ePkg.setNsPrefix("ePkg");
+		final EClass eCls1 = EcorePackage.eINSTANCE.getEcoreFactory().createEClass();
+		eCls1.setName("eCls1");
+		ePkg.getEClassifiers().add(eCls1);
+		final EClass eCls2 = EcorePackage.eINSTANCE.getEcoreFactory().createEClass();
+		eCls2.setName("eCls2");
+		ePkg.getEClassifiers().add(eCls2);
+
+		try {
+			getQueryEnvironment().registerEPackage(ePkg);
+
+			final IType[] parameterTypes = new IType[] {setType(eClassifierType(eCls1)),
+					sequenceType(eClassifierType(eCls2)) };
+			final IType[] expectedReturnTypes = new IType[] {setType(nothingType("Nothing left after intersection of Set(EClassifier=eCls1) and Sequence(EClassifier=eCls2)")) };
+			final IType[] expectedAllReturnTypes = new IType[] {setType(nothingType("Nothing left after intersection:\n Nothing left after intersection of Set(EClassifier=eCls1) and Sequence(EClassifier=eCls2)")) };
+
+			assertValidation(expectedReturnTypes, expectedAllReturnTypes, "intersection", parameterTypes);
+		} finally {
+			getQueryEnvironment().removeEPackage(ePkg.getNsPrefix());
+		}
+	}
+
+	@Test
+	public void testIntersectionSetListTopSubType() {
+		final EPackage ePkg = EcorePackage.eINSTANCE.getEcoreFactory().createEPackage();
+		ePkg.setName("ePkg");
+		ePkg.setNsPrefix("ePkg");
+		final EClass eCls1 = EcorePackage.eINSTANCE.getEcoreFactory().createEClass();
+		eCls1.setName("eCls1");
+		ePkg.getEClassifiers().add(eCls1);
+		final EClass eCls2 = EcorePackage.eINSTANCE.getEcoreFactory().createEClass();
+		eCls2.setName("eCls2");
+		ePkg.getEClassifiers().add(eCls2);
+		final EClass eCls3 = EcorePackage.eINSTANCE.getEcoreFactory().createEClass();
+		eCls3.setName("eCls3");
+		eCls3.getESuperTypes().add(eCls1);
+		eCls3.getESuperTypes().add(eCls2);
+		ePkg.getEClassifiers().add(eCls3);
+		final EClass eCls4 = EcorePackage.eINSTANCE.getEcoreFactory().createEClass();
+		eCls4.setName("eCls4");
+		eCls4.getESuperTypes().add(eCls1);
+		eCls4.getESuperTypes().add(eCls2);
+		eCls4.getESuperTypes().add(eCls3);
+		ePkg.getEClassifiers().add(eCls4);
+
+		try {
+			getQueryEnvironment().registerEPackage(ePkg);
+
+			final IType[] parameterTypes = new IType[] {setType(eClassifierType(eCls1)),
+					sequenceType(eClassifierType(eCls2)) };
+			final IType[] expectedReturnTypes = new IType[] {setType(eClassifierType(eCls3)) };
+
+			assertValidation(expectedReturnTypes, "intersection", parameterTypes);
+		} finally {
+			getQueryEnvironment().removeEPackage(ePkg.getNsPrefix());
+		}
+	}
+
+	@Test
+	public void testIntersectionSetListSameType() {
+		final IType[] parameterTypes = new IType[] {setType(classType(String.class)),
+				sequenceType(classType(String.class)) };
+		final IType[] expectedReturnTypes = new IType[] {setType(classType(String.class)) };
+
+		assertValidation(expectedReturnTypes, "intersection", parameterTypes);
+	}
+
+	@Test
+	public void testIntersectionSetListEClassEClassifier() {
+		final IType[] parameterTypes = new IType[] {setType(classType(EClass.class)),
+				sequenceType(classType(EClassifier.class)) };
+		final IType[] expectedReturnTypes = new IType[] {setType(classType(EClass.class)) };
+
+		assertValidation(expectedReturnTypes, "intersection", parameterTypes);
+	}
+
+	@Test
+	public void testIntersectionSetListEClassifierEClass() {
+		final IType[] parameterTypes = new IType[] {setType(classType(EClassifier.class)),
+				sequenceType(classType(EClass.class)) };
+		final IType[] expectedReturnTypes = new IType[] {setType(classType(EClass.class)) };
+
+		assertValidation(expectedReturnTypes, "intersection", parameterTypes);
+	}
+
+	@Test
 	public void testIsEmptyList() {
 		final IType[] parameterTypes = new IType[] {sequenceType(classType(String.class)) };
 		final IType[] expectedReturnTypes = new IType[] {classType(Boolean.class) };