Remove registration checks for EClassifiers from the services

The responsibility to check whether types are registered or not does not
lie with the service implementation but should be handled higher up at
validation time. This validation now take place in
AstValidator.checkWarningsAndErrors()

Change-Id: I92b324721947f12e8772507fe020b7aa92c88850
diff --git a/query/plugins/org.eclipse.acceleo.query/src/org/eclipse/acceleo/query/parser/AstValidator.java b/query/plugins/org.eclipse.acceleo.query/src/org/eclipse/acceleo/query/parser/AstValidator.java
index e7fe1bc..44b5d55 100644
--- a/query/plugins/org.eclipse.acceleo.query/src/org/eclipse/acceleo/query/parser/AstValidator.java
+++ b/query/plugins/org.eclipse.acceleo.query/src/org/eclipse/acceleo/query/parser/AstValidator.java
@@ -84,6 +84,11 @@
 	private static final String VARIABLE_OVERRIDES_AN_EXISTING_VALUE = "Variable %s overrides an existing value.";
 
 	/**
+	 * Message used when an {@link EClassifierType} is not registered.
+	 */
+	private static final String ECLASSIFIER_NOT_REGISTERED = "%s is not registered in the current environment";
+
+	/**
 	 * Should never happen message.
 	 */
 	private static final String SHOULD_NEVER_HAPPEN = "should never happen";
@@ -134,20 +139,28 @@
 		final Set<IType> validationTypes = new LinkedHashSet<IType>();
 		final List<ValidationMessage> msgs = new ArrayList<ValidationMessage>();
 		for (IType type : types) {
-			if (type instanceof NothingType) {
-				final AstResult astResult = validationResult.getAstResult();
-				final int startPostion;
-				if (expression instanceof Call) {
-					startPostion = astResult.getEndPosition(((Call)expression).getArguments().get(0));
-				} else if (expression instanceof FeatureAccess) {
-					startPostion = astResult.getEndPosition(((FeatureAccess)expression).getTarget());
-				} else {
-					startPostion = astResult.getStartPosition(expression);
-				}
-				final int endPosition = astResult.getEndPosition(expression);
+			final AstResult astResult = validationResult.getAstResult();
+			final int startPostion;
+			if (expression instanceof Call) {
+				startPostion = astResult.getEndPosition(((Call)expression).getArguments().get(0));
+			} else if (expression instanceof FeatureAccess) {
+				startPostion = astResult.getEndPosition(((FeatureAccess)expression).getTarget());
+			} else {
+				startPostion = astResult.getStartPosition(expression);
+			}
+			final int endPosition = astResult.getEndPosition(expression);
 
+			if (type instanceof NothingType) {
 				msgs.add(new ValidationMessage(ValidationMessageLevel.WARNING, ((NothingType)type)
 						.getMessage(), startPostion, endPosition));
+			} else if (type instanceof EClassifierType) {
+				if (services.getQueryEnvironment().getEPackageProvider().isRegistered(((EClassifierType)type)
+						.getType())) {
+					result.add(type);
+				} else {
+					msgs.add(new ValidationMessage(ValidationMessageLevel.WARNING, String.format(
+							ECLASSIFIER_NOT_REGISTERED, type), startPostion, endPosition));
+				}
 			} else {
 				result.add(type);
 			}
@@ -165,6 +178,7 @@
 		validationResult.addTypes(expression, validationTypes);
 
 		return result;
+
 	}
 
 	/**
@@ -472,8 +486,8 @@
 											.getVariableName(), originalType, argType));
 						} else {
 							messageWhenTrue.append(String.format(
-									"\nNothing inferred when %s (%s) is type of %s",
-									varRef.getVariableName(), originalType, argType));
+									"\nNothing inferred when %s (%s) is type of %s", varRef.getVariableName(),
+									originalType, argType));
 							inferredFalseTypes.add(originalType);
 						}
 					}
@@ -552,7 +566,8 @@
 	private Map<String, Set<IType>> unionInferredTypes(Map<String, Set<IType>> inferredLeftVariableTypes,
 			Map<String, Set<IType>> inferredRightVariableTypes) {
 		final Map<String, Set<IType>> result = new HashMap<String, Set<IType>>();
-		final Map<String, Set<IType>> rightLocal = new HashMap<String, Set<IType>>(inferredRightVariableTypes);
+		final Map<String, Set<IType>> rightLocal = new HashMap<String, Set<IType>>(
+				inferredRightVariableTypes);
 
 		for (Entry<String, Set<IType>> entry : inferredLeftVariableTypes.entrySet()) {
 			final Set<IType> inferredTypes = new LinkedHashSet<IType>(entry.getValue());
@@ -616,7 +631,8 @@
 			final Map<String, Set<IType>> inferredRightVariableTypes) {
 		final Map<String, Set<IType>> result = new HashMap<String, Set<IType>>();
 
-		final Map<String, Set<IType>> rightLocal = new HashMap<String, Set<IType>>(inferredRightVariableTypes);
+		final Map<String, Set<IType>> rightLocal = new HashMap<String, Set<IType>>(
+				inferredRightVariableTypes);
 		for (Entry<String, Set<IType>> entry : inferredLeftVariableTypes.entrySet()) {
 			final Set<IType> inferredTypes = new LinkedHashSet<IType>();
 			final Set<IType> inferredRightTypes = rightLocal.remove(entry.getKey());
@@ -666,8 +682,8 @@
 	@Override
 	public Set<IType> caseEnumLiteral(EnumLiteral object) {
 		final Set<IType> possibleTypes = new LinkedHashSet<IType>();
-		possibleTypes
-				.add(new EClassifierType(services.getQueryEnvironment(), object.getLiteral().getEEnum()));
+		possibleTypes.add(new EClassifierType(services.getQueryEnvironment(), object.getLiteral()
+				.getEEnum()));
 		return checkWarningsAndErrors(object, possibleTypes);
 	}
 
@@ -928,8 +944,8 @@
 				}
 			}
 		} else {
-			possibleTypes.add(new SetType(services.getQueryEnvironment(), services
-					.nothing("Empty OrderedSet defined in extension")));
+			possibleTypes.add(new SetType(services.getQueryEnvironment(), services.nothing(
+					"Empty OrderedSet defined in extension")));
 		}
 
 		return checkWarningsAndErrors(object, possibleTypes);
@@ -951,8 +967,8 @@
 				}
 			}
 		} else {
-			possibleTypes.add(new SetType(services.getQueryEnvironment(), services
-					.nothing("Empty Sequence defined in extension")));
+			possibleTypes.add(new SetType(services.getQueryEnvironment(), services.nothing(
+					"Empty Sequence defined in extension")));
 		}
 
 		return checkWarningsAndErrors(object, possibleTypes);
@@ -1015,8 +1031,8 @@
 			final IType booleanObjectType = new ClassType(services.getQueryEnvironment(), Boolean.class);
 			final IType booleanType = new ClassType(services.getQueryEnvironment(), boolean.class);
 			for (IType type : selectorTypes) {
-				final boolean assignableFrom = booleanObjectType.isAssignableFrom(type)
-						|| booleanType.isAssignableFrom(type);
+				final boolean assignableFrom = booleanObjectType.isAssignableFrom(type) || booleanType
+						.isAssignableFrom(type);
 				onlyBoolean = onlyBoolean && assignableFrom;
 				onlyNotBoolean = onlyNotBoolean && !assignableFrom;
 				if (!onlyBoolean && !onlyNotBoolean) {
diff --git a/query/plugins/org.eclipse.acceleo.query/src/org/eclipse/acceleo/query/services/AnyServices.java b/query/plugins/org.eclipse.acceleo.query/src/org/eclipse/acceleo/query/services/AnyServices.java
index d346c0e..3391079 100644
--- a/query/plugins/org.eclipse.acceleo.query/src/org/eclipse/acceleo/query/services/AnyServices.java
+++ b/query/plugins/org.eclipse.acceleo.query/src/org/eclipse/acceleo/query/services/AnyServices.java
@@ -44,7 +44,6 @@
 import org.eclipse.emf.ecore.EEnumLiteral;
 import org.eclipse.emf.ecore.EObject;
 import org.eclipse.emf.ecore.EPackage;
-import org.eclipse.emf.ecore.impl.DynamicEObjectImpl;
 
 //@formatter:off
 @ServiceProvider(
@@ -237,9 +236,6 @@
 	// @formatter:on
 	public Boolean oclIsKindOf(Object object, Object type) {
 		Boolean result;
-		if (type instanceof EClassifier && !(object instanceof DynamicEObjectImpl)) {
-			checkRegistered((EClassifier)type);
-		}
 		if (object == null && type != null) {
 			// OCL considers "null" (OclVoid) to be compatible with everything.
 			// AQL considers it incompatible with anything.
@@ -287,9 +283,6 @@
 	// @formatter:on
 	public Boolean oclIsTypeOf(Object object, Object type) {
 		Boolean result;
-		if (type instanceof EClassifier && !(object instanceof DynamicEObjectImpl)) {
-			checkRegistered((EClassifier)type);
-		}
 		if (object == null && type != null) {
 			// OCL considers "null" (OclVoid) to be compatible with everything.
 			// AQL considers it incompatible with anything.
@@ -320,21 +313,6 @@
 		return result;
 	}
 
-	/**
-	 * Checks if the given {@link EClassifier} is registered.
-	 * 
-	 * @param type
-	 *            the {@link EClassifier} to check
-	 * @throws IllegalArgumentException
-	 *             if the {@link EClassifier} is not registered
-	 */
-	private void checkRegistered(EClassifier type) throws IllegalArgumentException {
-		if (!queryEnvironment.getEPackageProvider().isRegistered(type)) {
-			throw new IllegalArgumentException(String.format(
-					"%s is not registered in the current environment", type));
-		}
-	}
-
 	// @formatter:off
 	@Documentation(
 		value = "Returns a string representation of the current object.",
diff --git a/query/plugins/org.eclipse.acceleo.query/src/org/eclipse/acceleo/query/services/FilterService.java b/query/plugins/org.eclipse.acceleo.query/src/org/eclipse/acceleo/query/services/FilterService.java
index 427aa7a..2baf23a 100644
--- a/query/plugins/org.eclipse.acceleo.query/src/org/eclipse/acceleo/query/services/FilterService.java
+++ b/query/plugins/org.eclipse.acceleo.query/src/org/eclipse/acceleo/query/services/FilterService.java
@@ -10,11 +10,7 @@
  *******************************************************************************/
 package org.eclipse.acceleo.query.services;
 
-import com.google.common.collect.ImmutableSet;
-import com.google.common.collect.Sets;
-
 import java.lang.reflect.Method;
-import java.util.Collection;
 import java.util.LinkedHashSet;
 import java.util.List;
 import java.util.Map;
@@ -24,16 +20,11 @@
 import org.eclipse.acceleo.query.runtime.IReadOnlyQueryEnvironment;
 import org.eclipse.acceleo.query.runtime.impl.JavaMethodService;
 import org.eclipse.acceleo.query.runtime.impl.ValidationServices;
-import org.eclipse.acceleo.query.validation.type.AbstractCollectionType;
-import org.eclipse.acceleo.query.validation.type.EClassifierLiteralType;
-import org.eclipse.acceleo.query.validation.type.EClassifierSetLiteralType;
-import org.eclipse.acceleo.query.validation.type.EClassifierType;
 import org.eclipse.acceleo.query.validation.type.ICollectionType;
 import org.eclipse.acceleo.query.validation.type.IType;
 import org.eclipse.acceleo.query.validation.type.NothingType;
 import org.eclipse.acceleo.query.validation.type.SequenceType;
 import org.eclipse.acceleo.query.validation.type.SetType;
-import org.eclipse.emf.ecore.EClassifier;
 
 /**
  * {@link org.eclipse.acceleo.query.runtime.IService#validateAllType(org.eclipse.acceleo.query.runtime.impl.ValidationServices, org.eclipse.acceleo.query.runtime.impl.EPackageProvider, java.util.Map)
@@ -77,69 +68,31 @@
 	}
 
 	@Override
-	public Set<IType> validateAllType(ValidationServices services,
-			IReadOnlyQueryEnvironment queryEnvironment, Map<List<IType>, Set<IType>> allTypes) {
+	public Set<IType> validateAllType(ValidationServices services, IReadOnlyQueryEnvironment queryEnvironment,
+			Map<List<IType>, Set<IType>> allTypes) {
 		final Set<IType> result = new LinkedHashSet<IType>();
 		final StringBuilder builder = new StringBuilder();
 
 		for (Entry<List<IType>, Set<IType>> entry : allTypes.entrySet()) {
-			final Set<EClassifier> eClassEClasses = ImmutableSet.copyOf(queryEnvironment
-					.getEPackageProvider().getTypes("ecore", "EClass"));
-			if (entry.getKey().size() > filterIndex) {
-				final Set<IType> filterTypes = Sets.newLinkedHashSet();
-				if (entry.getKey().get(filterIndex) instanceof EClassifierSetLiteralType) {
-					for (EClassifier eClassifier : ((EClassifierSetLiteralType)entry.getKey()
-							.get(filterIndex)).getEClassifiers()) {
-						filterTypes.add(new EClassifierType(queryEnvironment, eClassifier));
-					}
-				} else if (entry.getKey().get(filterIndex) instanceof EClassifierLiteralType) {
-					filterTypes.add(entry.getKey().get(filterIndex));
-				} else if (eClassEClasses.contains(entry.getKey().get(filterIndex).getType())
-						|| ((entry.getKey().get(filterIndex) instanceof SetType && eClassEClasses
-								.contains(((AbstractCollectionType)entry.getKey().get(filterIndex))
-										.getCollectionType().getType())))) {
-					final Collection<EClassifier> eObjectEClasses = queryEnvironment.getEPackageProvider()
-							.getTypes("ecore", "EObject");
-					for (EClassifier eObjectEClass : eObjectEClasses) {
-						filterTypes.add(new EClassifierType(queryEnvironment, eObjectEClass));
-					}
+			for (IType possibleType : entry.getValue()) {
+				final IType rawType;
+				if (possibleType instanceof ICollectionType) {
+					rawType = ((ICollectionType)possibleType).getCollectionType();
 				} else {
-					filterTypes.add(entry.getKey().get(filterIndex));
+					rawType = possibleType;
 				}
-				for (IType filterType : filterTypes) {
-					for (IType possibleType : entry.getValue()) {
-						final IType rawType;
-						if (possibleType instanceof ICollectionType) {
-							rawType = ((ICollectionType)possibleType).getCollectionType();
-						} else {
-							rawType = possibleType;
-						}
-						if (rawType instanceof NothingType) {
-							builder.append("\n");
-							builder.append(((NothingType)rawType).getMessage());
-						} else {
-							final IType loweredType = services.lower(filterType, rawType);
-							if (loweredType != null) {
-								result.add(unrawType(queryEnvironment, possibleType, loweredType));
-							}
-						}
-					}
-				}
-			} else {
-				for (IType possibleType : entry.getValue()) {
-					if (possibleType instanceof NothingType) {
-						builder.append("\n");
-						builder.append(((NothingType)possibleType).getMessage());
-					} else {
-						result.add(possibleType);
-					}
+				if (rawType instanceof NothingType) {
+					builder.append("\n");
+					builder.append(((NothingType)rawType).getMessage());
+				} else {
+					result.add(possibleType);
 				}
 			}
 		}
 
 		if (result.isEmpty()) {
-			final NothingType nothing = services.nothing("Nothing will be left after calling %s:"
-					+ builder.toString(), getName());
+			final NothingType nothing = services.nothing("Nothing will be left after calling %s:" + builder
+					.toString(), getName());
 			if (List.class.isAssignableFrom(getMethod().getReturnType())) {
 				result.add(new SequenceType(queryEnvironment, nothing));
 			} else if (Set.class.isAssignableFrom(getMethod().getReturnType())) {
@@ -152,31 +105,4 @@
 		return result;
 	}
 
-	/**
-	 * Puts the given raw type into an {@link ICollectionType} or leave it raw according to the given original
-	 * {@link IType}.
-	 * 
-	 * @param queryEnvironment
-	 *            the {@link IReadOnlyQueryEnvironment}
-	 * @param originalType
-	 *            the original {@link IType}
-	 * @param rawType
-	 *            the raw {@link IType}
-	 * @return the given raw type into an {@link ICollectionType} or leave it raw according to the given
-	 *         original {@link IType}
-	 */
-	private IType unrawType(IReadOnlyQueryEnvironment queryEnvironment, IType originalType, IType rawType) {
-		final IType result;
-
-		if (originalType instanceof SequenceType) {
-			result = new SequenceType(queryEnvironment, rawType);
-		} else if (originalType instanceof SetType) {
-			result = new SetType(queryEnvironment, rawType);
-		} else {
-			result = rawType;
-		}
-
-		return result;
-	}
-
 }
diff --git a/query/plugins/org.eclipse.acceleo.query/src/org/eclipse/acceleo/query/validation/type/EClassifierSetLiteralType.java b/query/plugins/org.eclipse.acceleo.query/src/org/eclipse/acceleo/query/validation/type/EClassifierSetLiteralType.java
index d81697f..813ec73 100644
--- a/query/plugins/org.eclipse.acceleo.query/src/org/eclipse/acceleo/query/validation/type/EClassifierSetLiteralType.java
+++ b/query/plugins/org.eclipse.acceleo.query/src/org/eclipse/acceleo/query/validation/type/EClassifierSetLiteralType.java
@@ -10,6 +10,8 @@
  *******************************************************************************/
 package org.eclipse.acceleo.query.validation.type;
 
+import com.google.common.base.Joiner;
+
 import java.util.Set;
 
 import org.eclipse.acceleo.query.runtime.IReadOnlyQueryEnvironment;
@@ -51,4 +53,14 @@
 		return eClassifiers;
 	}
 
+	/**
+	 * {@inheritDoc}
+	 *
+	 * @see org.eclipse.acceleo.query.validation.type.SetType#toString()
+	 */
+	@Override
+	public String toString() {
+		return "Set(" + Joiner.on(',').join(eClassifiers) + ")";
+	}
+
 }
diff --git a/query/tests/org.eclipse.acceleo.query.tests/src/org/eclipse/acceleo/query/parser/tests/ValidationTest.java b/query/tests/org.eclipse.acceleo.query.tests/src/org/eclipse/acceleo/query/parser/tests/ValidationTest.java
index 4d89cd3..6cfc3b7 100644
--- a/query/tests/org.eclipse.acceleo.query.tests/src/org/eclipse/acceleo/query/parser/tests/ValidationTest.java
+++ b/query/tests/org.eclipse.acceleo.query.tests/src/org/eclipse/acceleo/query/parser/tests/ValidationTest.java
@@ -120,6 +120,24 @@
 	}
 
 	@Test
+	public void variableNotRegisteredEClassifierTest() {
+		queryEnvironment.removeEPackage(EcorePackage.eINSTANCE.getName());
+
+		final IValidationResult validationResult = engine.validate("self", variableTypes);
+		final Expression ast = validationResult.getAstResult().getAst();
+		final Set<IType> possibleTypes = validationResult.getPossibleTypes(ast);
+
+		assertEquals(1, possibleTypes.size());
+		final Iterator<IType> it = possibleTypes.iterator();
+		IType possibleType = it.next();
+		assertTrue(possibleType instanceof EClassifierType);
+		assertEquals(EcorePackage.eINSTANCE.getEClass(), possibleType.getType());
+		assertEquals(1, validationResult.getMessages().size());
+		assertValidationMessage(validationResult.getMessages().get(0), ValidationMessageLevel.ERROR,
+				"EClassifier=EClass is not registered in the current environment", 0, 4);
+	}
+
+	@Test
 	public void variableNotExistingTest() {
 		final IValidationResult validationResult = engine.validate("notExisting", variableTypes);
 		final Expression ast = validationResult.getAstResult().getAst();
@@ -298,9 +316,7 @@
 		assertEquals(1, stripNothingTypes(possibleTypes).size());
 		assertEquals(0, possibleTypes.size());
 		assertEquals(1, validationResult.getMessages().size());
-		assertValidationMessage(
-				validationResult.getMessages().get(0),
-				ValidationMessageLevel.ERROR,
+		assertValidationMessage(validationResult.getMessages().get(0), ValidationMessageLevel.ERROR,
 				"Couldn't find the someService(EClassifier=EClass,EClassifier=EBooleanObject) service or EOperation",
 				4, 22);
 	}
@@ -333,9 +349,7 @@
 		assertTrue(possibleType instanceof EClassifierType);
 		assertEquals(EcorePackage.eINSTANCE.getEClassifier(), possibleType.getType());
 		assertEquals(1, validationResult.getMessages().size());
-		assertValidationMessage(
-				validationResult.getMessages().get(0),
-				ValidationMessageLevel.WARNING,
+		assertValidationMessage(validationResult.getMessages().get(0), ValidationMessageLevel.WARNING,
 				"Couldn't find the getEClassifier(EClassifier=EPackage,EClassifier=SingleString) service or EOperation",
 				5, 30);
 	}
@@ -349,9 +363,7 @@
 		assertEquals(1, stripNothingTypes(possibleTypes).size());
 		assertEquals(0, possibleTypes.size());
 		assertEquals(1, validationResult.getMessages().size());
-		assertValidationMessage(
-				validationResult.getMessages().get(0),
-				ValidationMessageLevel.ERROR,
+		assertValidationMessage(validationResult.getMessages().get(0), ValidationMessageLevel.ERROR,
 				"Couldn't find the getEClassifier(EClassifier=EPackage,EClassifier=EIntegerObject) service or EOperation",
 				5, 23);
 	}
@@ -427,8 +439,8 @@
 
 	@Test
 	public void enumLiteralError() {
-		final IValidationResult validationResult = engine
-				.validate("anydsl::Part::NotExisting", variableTypes);
+		final IValidationResult validationResult = engine.validate("anydsl::Part::NotExisting",
+				variableTypes);
 		final Expression ast = validationResult.getAstResult().getAst();
 
 		Set<IType> possibleTypes = validationResult.getPossibleTypes(ast);
@@ -645,9 +657,7 @@
 		assertTrue(possibleType instanceof EClassifierType);
 		assertEquals(EcorePackage.eINSTANCE.getEPackage(), possibleType.getType());
 		assertEquals(1, validationResult.getMessages().size());
-		assertValidationMessage(
-				validationResult.getMessages().get(0),
-				ValidationMessageLevel.WARNING,
+		assertValidationMessage(validationResult.getMessages().get(0), ValidationMessageLevel.WARNING,
 				"The predicate may evaluate to a value that is not a boolean type ([java.lang.Boolean, java.lang.Object]).",
 				0, 38);
 		assertNotNull(validationResult.getPossibleTypes(((Conditional)ast).getTrueBranch()));
@@ -656,8 +666,8 @@
 
 	@Test
 	public void testLetMaskingVariable() {
-		final IValidationResult validationResult = engine
-				.validate("let stuff = self in stuff", variableTypes);
+		final IValidationResult validationResult = engine.validate("let stuff = self in stuff",
+				variableTypes);
 
 		final Expression ast = validationResult.getAstResult().getAst();
 
@@ -879,10 +889,11 @@
 
 	@Test
 	public void eOperationLookupNoEClassifierForClassType() {
-		queryEnvironment.removeEPackage(EcorePackage.eINSTANCE.getName());
-		queryEnvironment.removeEPackage(AnydslPackage.eINSTANCE.getName());
+		final Set<IType> nonEMFTypes = new LinkedHashSet<IType>();
+		nonEMFTypes.add(new ClassType(queryEnvironment, Query.class));
+		variableTypes.put("nonEMF", nonEMFTypes);
 
-		final IValidationResult validationResult = engine.validate("self.triggerEOperationLookUp('')",
+		final IValidationResult validationResult = engine.validate("self.triggerEOperationLookUp(nonEMF)",
 				variableTypes);
 
 		final Expression ast = validationResult.getAstResult().getAst();
@@ -891,11 +902,9 @@
 		assertEquals(1, stripNothingTypes(possibleTypes).size());
 		assertEquals(0, possibleTypes.size());
 		assertEquals(1, validationResult.getMessages().size());
-		assertValidationMessage(
-				validationResult.getMessages().get(0),
-				ValidationMessageLevel.ERROR,
-				"Couldn't create EClassifier type for triggerEOperationLookUp(EClassifier=EClass,java.lang.String) parameter java.lang.String",
-				4, 32);
+		assertValidationMessage(validationResult.getMessages().get(0), ValidationMessageLevel.ERROR,
+				"Couldn't create EClassifier type for triggerEOperationLookUp(EClassifier=EClass,org.eclipse.acceleo.query.runtime.Query) parameter org.eclipse.acceleo.query.runtime.Query",
+				4, 36);
 	}
 
 	@Test
diff --git a/query/tests/org.eclipse.acceleo.query.tests/src/org/eclipse/acceleo/query/services/tests/AnyServicesTest.java b/query/tests/org.eclipse.acceleo.query.tests/src/org/eclipse/acceleo/query/services/tests/AnyServicesTest.java
index 4ffe044..292185d 100644
--- a/query/tests/org.eclipse.acceleo.query.tests/src/org/eclipse/acceleo/query/services/tests/AnyServicesTest.java
+++ b/query/tests/org.eclipse.acceleo.query.tests/src/org/eclipse/acceleo/query/services/tests/AnyServicesTest.java
@@ -200,8 +200,14 @@
 		assertEquals(self, any.oclAsType(self, EcorePackage.eINSTANCE.getEClass()));
 	}
 
-	@Test(expected = IllegalArgumentException.class)
-	public void oclAsTypeEClassEClassifierUnregistered() {
+	@Test
+	public void oclAsTypeEclassToEClassEClassifierUnregistered() {
+		final Object self = EcoreFactory.eINSTANCE.createEClass();
+		assertEquals(self, any.oclAsType(self, EcorePackage.eINSTANCE.getEClass()));
+	}
+
+	@Test(expected = ClassCastException.class)
+	public void oclAsTypeObjectToEClassifierUnregistered() {
 		final Object self = new Object();
 		any.oclAsType(self, EcorePackage.eINSTANCE.getEClass());
 	}
@@ -213,7 +219,7 @@
 		any.oclAsType(self, EcorePackage.eINSTANCE.getEInt());
 	}
 
-	@Test(expected = IllegalArgumentException.class)
+	@Test(expected = ClassCastException.class)
 	public void oclAsTypeObjectToEIntUnregistered() {
 		final Object self = new Object();
 		any.oclAsType(self, EcorePackage.eINSTANCE.getEInt());
@@ -232,10 +238,10 @@
 		assertEquals(Integer.valueOf(1), any.oclAsType(i, EcorePackage.eINSTANCE.getEInt()));
 	}
 
-	@Test(expected = IllegalArgumentException.class)
+	@Test
 	public void oclAsTypeIntToEIntUnregistered() {
 		final Integer i = Integer.valueOf(1);
-		any.oclAsType(i, EcorePackage.eINSTANCE.getEInt());
+		assertEquals(Integer.valueOf(1), any.oclAsType(i, EcorePackage.eINSTANCE.getEInt()));
 	}
 
 	@Test
@@ -245,10 +251,10 @@
 		assertEquals(eClass, any.oclAsType(eClass, EcorePackage.eINSTANCE.getEClass()));
 	}
 
-	@Test(expected = IllegalArgumentException.class)
+	@Test
 	public void oclAsTypeCompatibleClassifiersUnregistered() {
 		final EClass eClass = EcoreFactory.eINSTANCE.createEClass();
-		any.oclAsType(eClass, EcorePackage.eINSTANCE.getEClass());
+		assertEquals(eClass, any.oclAsType(eClass, EcorePackage.eINSTANCE.getEClass()));
 	}
 
 	@Test(expected = ClassCastException.class)
@@ -258,7 +264,7 @@
 		any.oclAsType(eClass, EcorePackage.eINSTANCE.getEPackage());
 	}
 
-	@Test(expected = IllegalArgumentException.class)
+	@Test(expected = ClassCastException.class)
 	public void oclAsTypeIncompatibleTypesUnregistered() {
 		final EClass eClass = EcoreFactory.eINSTANCE.createEClass();
 		any.oclAsType(eClass, EcorePackage.eINSTANCE.getEPackage());
@@ -329,7 +335,7 @@
 		assertFalse(any.oclIsKindOf(null, null));
 	}
 
-	@Test(expected = java.lang.IllegalArgumentException.class)
+	@Test
 	public void oclIsKindOfNullEClassNotRegistered() {
 		assertFalse(any.oclIsKindOf(null, EcorePackage.eINSTANCE.getEClass()));
 	}
@@ -340,9 +346,9 @@
 		assertFalse(any.oclIsKindOf(null, EcorePackage.eINSTANCE.getEClass()));
 	}
 
-	@Test(expected = java.lang.IllegalArgumentException.class)
+	@Test
 	public void oclIsKindOfNullEEnumNotRegistered() {
-		any.oclIsKindOf(null, AnydslPackage.eINSTANCE.getCaliber());
+		assertFalse(any.oclIsKindOf(null, AnydslPackage.eINSTANCE.getCaliber()));
 	}
 
 	@Test
@@ -351,9 +357,9 @@
 		assertFalse(any.oclIsKindOf(null, AnydslPackage.eINSTANCE.getCaliber()));
 	}
 
-	@Test(expected = java.lang.IllegalArgumentException.class)
+	@Test
 	public void oclIsKindOfNullEDataTypeNotRegistered() {
-		any.oclIsKindOf(null, EcorePackage.eINSTANCE.getEString());
+		assertFalse(any.oclIsKindOf(null, EcorePackage.eINSTANCE.getEString()));
 	}
 
 	@Test
@@ -367,9 +373,12 @@
 		assertFalse(any.oclIsKindOf(new Object(), null));
 	}
 
-	@Test(expected = java.lang.IllegalArgumentException.class)
+	@Test
 	public void oclIsKindOfObjectEClassNotRegistered() {
-		any.oclIsKindOf(new Object(), EcorePackage.eINSTANCE.getEClass());
+		assertFalse(any.oclIsKindOf(new Object(), EcorePackage.eINSTANCE.getEClass()));
+		assertTrue(any.oclIsKindOf(EcorePackage.eINSTANCE.getEClass(), EcorePackage.eINSTANCE.getEClass()));
+		assertTrue(any.oclIsKindOf(EcorePackage.eINSTANCE.getEClass(), EcorePackage.eINSTANCE
+				.getEClassifier()));
 	}
 
 	@Test
@@ -381,14 +390,10 @@
 				.getEClassifier()));
 	}
 
-	@Test(expected = java.lang.IllegalArgumentException.class)
-	public void oclIsKindOfObjectEEnumNotRegistered_enumLiteral() {
-		any.oclIsKindOf(Caliber.L, AnydslPackage.eINSTANCE.getCaliber());
-	}
-
-	@Test(expected = java.lang.IllegalArgumentException.class)
-	public void oclIsKindOfObjectEEnumNotRegistered_Object() {
-		any.oclIsKindOf(new Object(), AnydslPackage.eINSTANCE.getCaliber());
+	@Test
+	public void oclIsKindOfObjectEEnumNotRegistered() {
+		assertFalse(any.oclIsKindOf(new Object(), AnydslPackage.eINSTANCE.getCaliber()));
+		assertTrue(any.oclIsKindOf(Caliber.L, AnydslPackage.eINSTANCE.getCaliber()));
 	}
 
 	@Test
@@ -398,14 +403,10 @@
 		assertTrue(any.oclIsKindOf(Caliber.L, AnydslPackage.eINSTANCE.getCaliber()));
 	}
 
-	@Test(expected = java.lang.IllegalArgumentException.class)
-	public void oclIsKindOfObjectEDataTypeNotRegistered_String() {
-		any.oclIsKindOf("a string", EcorePackage.eINSTANCE.getEString());
-	}
-
-	@Test(expected = java.lang.IllegalArgumentException.class)
+	@Test
 	public void oclIsKindOfObjectEDataTypeNotRegistered_Object() {
-		any.oclIsKindOf(new Object(), EcorePackage.eINSTANCE.getEString());
+		assertFalse(any.oclIsKindOf(new Object(), EcorePackage.eINSTANCE.getEString()));
+		assertTrue(any.oclIsKindOf("a string", EcorePackage.eINSTANCE.getEString()));
 	}
 
 	@Test
@@ -427,9 +428,9 @@
 		assertFalse(any.oclIsTypeOf(null, null));
 	}
 
-	@Test(expected = java.lang.IllegalArgumentException.class)
+	@Test
 	public void oclIsTypeOfNullEClassNotRegistered() {
-		any.oclIsTypeOf(null, EcorePackage.eINSTANCE.getEClass());
+		assertFalse(any.oclIsTypeOf(null, EcorePackage.eINSTANCE.getEClass()));
 	}
 
 	@Test
@@ -438,9 +439,9 @@
 		assertFalse(any.oclIsTypeOf(null, EcorePackage.eINSTANCE.getEClass()));
 	}
 
-	@Test(expected = java.lang.IllegalArgumentException.class)
+	@Test
 	public void oclIsTypeOfNullEEnumNotRegistered() {
-		any.oclIsTypeOf(null, AnydslPackage.eINSTANCE.getCaliber());
+		assertFalse(any.oclIsTypeOf(null, AnydslPackage.eINSTANCE.getCaliber()));
 	}
 
 	@Test
@@ -449,9 +450,9 @@
 		assertFalse(any.oclIsTypeOf(null, AnydslPackage.eINSTANCE.getCaliber()));
 	}
 
-	@Test(expected = java.lang.IllegalArgumentException.class)
+	@Test
 	public void oclIsTypeOfNullEDataTypeNotRegistered() {
-		any.oclIsTypeOf(null, EcorePackage.eINSTANCE.getEString());
+		assertFalse(any.oclIsTypeOf(null, EcorePackage.eINSTANCE.getEString()));
 	}
 
 	@Test
@@ -465,9 +466,12 @@
 		assertFalse(any.oclIsTypeOf(new Object(), null));
 	}
 
-	@Test(expected = java.lang.IllegalArgumentException.class)
+	@Test
 	public void oclIsTypeOfObjectEClassNotRegistered() {
-		any.oclIsTypeOf(new Object(), EcorePackage.eINSTANCE.getEClass());
+		assertFalse(any.oclIsTypeOf(new Object(), EcorePackage.eINSTANCE.getEClass()));
+		assertTrue(any.oclIsTypeOf(EcorePackage.eINSTANCE.getEClass(), EcorePackage.eINSTANCE.getEClass()));
+		assertFalse(any.oclIsTypeOf(EcorePackage.eINSTANCE.getEClass(), EcorePackage.eINSTANCE
+				.getEClassifier()));
 	}
 
 	@Test
@@ -479,9 +483,10 @@
 				.getEClassifier()));
 	}
 
-	@Test(expected = java.lang.IllegalArgumentException.class)
+	@Test
 	public void oclIsTypeOfObjectEEnumNotRegistered() {
-		any.oclIsTypeOf(new Object(), AnydslPackage.eINSTANCE.getCaliber());
+		assertFalse(any.oclIsTypeOf(new Object(), AnydslPackage.eINSTANCE.getCaliber()));
+		assertTrue(any.oclIsTypeOf(Caliber.L, AnydslPackage.eINSTANCE.getCaliber()));
 	}
 
 	@Test
@@ -491,9 +496,10 @@
 		assertTrue(any.oclIsTypeOf(Caliber.L, AnydslPackage.eINSTANCE.getCaliber()));
 	}
 
-	@Test(expected = java.lang.IllegalArgumentException.class)
+	@Test
 	public void oclIsTypeOfObjectEDataTypeNotRegistered() {
-		any.oclIsTypeOf(new Object(), EcorePackage.eINSTANCE.getEString());
+		assertFalse(any.oclIsTypeOf(new Object(), EcorePackage.eINSTANCE.getEString()));
+		assertTrue(any.oclIsTypeOf("a string", EcorePackage.eINSTANCE.getEString()));
 	}
 
 	@Test
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 3300691..2af68c3 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
@@ -1039,7 +1039,6 @@
 
 	@Test
 	public void testFilterList() {
-		// FIXME test this without the registration as well to make sure it fails
 		getQueryEnvironment().registerEPackage(EcorePackage.eINSTANCE);
 		final IType[] parameterTypes = new IType[] {
 				sequenceType(eClassifierType(EcorePackage.eINSTANCE.getEClassifier())),
@@ -1052,7 +1051,6 @@
 
 	@Test
 	public void testFilterSet() {
-		// FIXME test this without the registration as well to make sure it fails
 		getQueryEnvironment().registerEPackage(EcorePackage.eINSTANCE);
 		final IType[] parameterTypes = new IType[] {
 				setType(eClassifierType(EcorePackage.eINSTANCE.getEClassifier())),
@@ -1065,7 +1063,6 @@
 
 	@Test
 	public void testFilterListEClassifierSet() {
-		// FIXME test this without the registration as well to make sure it fails
 		getQueryEnvironment().registerEPackage(EcorePackage.eINSTANCE);
 		final IType[] parameterTypes = new IType[] {
 				sequenceType(eClassifierType(EcorePackage.eINSTANCE.getEClassifier())),
@@ -1078,9 +1075,9 @@
 		assertValidation(expectedReturnTypes, "filter", parameterTypes);
 	}
 
+
 	@Test
 	public void testFilterSetEClassifierSet() {
-		// FIXME test this without the registration as well to make sure it fails
 		getQueryEnvironment().registerEPackage(EcorePackage.eINSTANCE);
 		final IType[] parameterTypes = new IType[] {
 				setType(eClassifierType(EcorePackage.eINSTANCE.getEClassifier())),
@@ -1095,7 +1092,6 @@
 
 	@Test
 	public void testFilterListEInt() {
-		// FIXME test this without the registration as well to make sure it fails
 		getQueryEnvironment().registerEPackage(EcorePackage.eINSTANCE);
 		final IType[] parameterTypes = new IType[] {sequenceType(classType(Integer.class)),
 				eClassifierLiteralType(EcorePackage.eINSTANCE.getEInt()) };
@@ -1107,7 +1103,6 @@
 
 	@Test
 	public void testFilterSetEInt() {
-		// FIXME test this without the registration as well to make sure it fails
 		getQueryEnvironment().registerEPackage(EcorePackage.eINSTANCE);
 		final IType[] parameterTypes = new IType[] {setType(classType(Integer.class)),
 				eClassifierLiteralType(EcorePackage.eINSTANCE.getEInt()) };
@@ -1119,7 +1114,6 @@
 
 	@Test
 	public void testFilterSetIncompatibleTypes() {
-		// FIXME test this without the registration as well to make sure it fails
 		getQueryEnvironment().registerEPackage(EcorePackage.eINSTANCE);
 		final IType[] parameterTypes = new IType[] {
 				setType(eClassifierType(EcorePackage.eINSTANCE.getEClass())),
@@ -1129,4 +1123,18 @@
 
 		assertValidation(expectedReturnTypes, "filter", parameterTypes);
 	}
+
+	@Test
+	public void testFilterSetCompatibleAndIncompatibleTypes() {
+		getQueryEnvironment().registerEPackage(EcorePackage.eINSTANCE);
+		final IType[] parameterTypes = new IType[] {
+				setType(eClassifierType(EcorePackage.eINSTANCE.getEClass())),
+				eClassifierSetLiteralType(EcorePackage.eINSTANCE.getEClass(), EcorePackage.eINSTANCE
+						.getEPackage()) };
+		final IType[] expectedReturnTypes = new IType[] {
+				setType(eClassifierType(EcorePackage.eINSTANCE.getEClass())),
+				setType(eClassifierType(EcorePackage.eINSTANCE.getEPackage())) };
+
+		assertValidation(expectedReturnTypes, "filter", parameterTypes);
+	}
 }
diff --git a/query/tests/org.eclipse.acceleo.query.tests/src/org/eclipse/acceleo/query/services/tests/EObjectServicesValidationTest.java b/query/tests/org.eclipse.acceleo.query.tests/src/org/eclipse/acceleo/query/services/tests/EObjectServicesValidationTest.java
index 15f2e43..3d10a36 100644
--- a/query/tests/org.eclipse.acceleo.query.tests/src/org/eclipse/acceleo/query/services/tests/EObjectServicesValidationTest.java
+++ b/query/tests/org.eclipse.acceleo.query.tests/src/org/eclipse/acceleo/query/services/tests/EObjectServicesValidationTest.java
@@ -66,8 +66,9 @@
 
 			final IType[] parameterTypes = new IType[] {eClassifierType(eCls1) };
 			final IType[] expectedReturnTypes = new IType[] {sequenceType(nothingType("EClassifier=eCls1 doesn't contain any other EClass")) };
+			final IType[] expectedReturnAllTypes = new IType[] {sequenceType(nothingType("Nothing will be left after calling eAllContents:\nEClassifier=eCls1 doesn't contain any other EClass")) };
 
-			assertValidation(expectedReturnTypes, "eAllContents", parameterTypes);
+			assertValidation(expectedReturnTypes, expectedReturnAllTypes, "eAllContents", parameterTypes);
 		} finally {
 			getQueryEnvironment().removeEPackage(ePkg.getName());
 		}
@@ -669,8 +670,9 @@
 
 			final IType[] parameterTypes = new IType[] {eClassifierType(eCls1) };
 			final IType[] expectedReturnTypes = new IType[] {sequenceType(nothingType("EClassifier=eCls1 doesn't contain any other EClass")) };
+			final IType[] expectedReturnAllTypes = new IType[] {sequenceType(nothingType("Nothing will be left after calling eContents:\nEClassifier=eCls1 doesn't contain any other EClass")) };
 
-			assertValidation(expectedReturnTypes, "eContents", parameterTypes);
+			assertValidation(expectedReturnTypes, expectedReturnAllTypes, "eContents", parameterTypes);
 		} finally {
 			getQueryEnvironment().removeEPackage(ePkg.getName());
 		}
@@ -1094,8 +1096,9 @@
 			final IType[] parameterTypes = new IType[] {eClassifierLiteralType(EcorePackage.eINSTANCE
 					.getEAttribute()) };
 			final IType[] expectedReturnTypes = new IType[] {sequenceType(nothingType("No IRootEObjectProvider registered")) };
+			final IType[] expectedReturnAllTypes = new IType[] {sequenceType(nothingType("Nothing will be left after calling allInstances:\nNo IRootEObjectProvider registered")) };
 
-			assertValidation(expectedReturnTypes, "allInstances", parameterTypes);
+			assertValidation(expectedReturnTypes, expectedReturnAllTypes, "allInstances", parameterTypes);
 		} finally {
 			getQueryEnvironment().removeEPackage(EcorePackage.eINSTANCE.getName());
 		}
@@ -1108,8 +1111,9 @@
 
 			final IType[] parameterTypes = new IType[] {eClassifierType(EcorePackage.eINSTANCE.getEClass()) };
 			final IType[] expectedReturnTypes = new IType[] {sequenceType(nothingType("No IRootEObjectProvider registered")) };
+			final IType[] expectedReturnAllTypes = new IType[] {sequenceType(nothingType("Nothing will be left after calling allInstances:\nNo IRootEObjectProvider registered")) };
 
-			assertValidation(expectedReturnTypes, "allInstances", parameterTypes);
+			assertValidation(expectedReturnTypes, expectedReturnAllTypes, "allInstances", parameterTypes);
 		} finally {
 			getQueryEnvironment().removeEPackage(EcorePackage.eINSTANCE.getName());
 		}
@@ -1123,8 +1127,9 @@
 			final IType[] parameterTypes = new IType[] {eClassifierSetLiteralType(EcorePackage.eINSTANCE
 					.getEAttribute(), EcorePackage.eINSTANCE.getEReference()) };
 			final IType[] expectedReturnTypes = new IType[] {sequenceType(nothingType("No IRootEObjectProvider registered")) };
+			final IType[] expectedReturnAllTypes = new IType[] {sequenceType(nothingType("Nothing will be left after calling allInstances:\nNo IRootEObjectProvider registered")) };
 
-			assertValidation(expectedReturnTypes, "allInstances", parameterTypes);
+			assertValidation(expectedReturnTypes, expectedReturnAllTypes, "allInstances", parameterTypes);
 		} finally {
 			getQueryEnvironment().removeEPackage(EcorePackage.eINSTANCE.getName());
 		}
@@ -1138,8 +1143,9 @@
 			final IType[] parameterTypes = new IType[] {setType(eClassifierType(EcorePackage.eINSTANCE
 					.getEClass())) };
 			final IType[] expectedReturnTypes = new IType[] {sequenceType(nothingType("No IRootEObjectProvider registered")) };
+			final IType[] expectedReturnAllTypes = new IType[] {sequenceType(nothingType("Nothing will be left after calling allInstances:\nNo IRootEObjectProvider registered")) };
 
-			assertValidation(expectedReturnTypes, "allInstances", parameterTypes);
+			assertValidation(expectedReturnTypes, expectedReturnAllTypes, "allInstances", parameterTypes);
 		} finally {
 			getQueryEnvironment().removeEPackage(EcorePackage.eINSTANCE.getName());
 		}
diff --git a/query/tests/org.eclipse.acceleo.query.tests/src/org/eclipse/acceleo/query/services/tests/XPathServicesValidationTest.java b/query/tests/org.eclipse.acceleo.query.tests/src/org/eclipse/acceleo/query/services/tests/XPathServicesValidationTest.java
index fad44e5..75471b9 100644
--- a/query/tests/org.eclipse.acceleo.query.tests/src/org/eclipse/acceleo/query/services/tests/XPathServicesValidationTest.java
+++ b/query/tests/org.eclipse.acceleo.query.tests/src/org/eclipse/acceleo/query/services/tests/XPathServicesValidationTest.java
@@ -60,8 +60,9 @@
 
 			final IType[] parameterTypes = new IType[] {eClassifierType(eCls1) };
 			final IType[] expectedReturnTypes = new IType[] {sequenceType(nothingType("EClassifier=eCls1 can't be contained")) };
+			final IType[] expectedReturnAllTypes = new IType[] {sequenceType(nothingType("Nothing will be left after calling ancestors:\nEClassifier=eCls1 can't be contained")) };
 
-			assertValidation(expectedReturnTypes, "ancestors", parameterTypes);
+			assertValidation(expectedReturnTypes, expectedReturnAllTypes, "ancestors", parameterTypes);
 		} finally {
 			getQueryEnvironment().removeEPackage(ePkg.getName());
 		}
@@ -329,8 +330,9 @@
 
 			final IType[] parameterTypes = new IType[] {eClassifierType(eCls1) };
 			final IType[] expectedReturnTypes = new IType[] {sequenceType(nothingType("EClassifier=eCls1 can't have following siblings")) };
+			final IType[] expectedReturnAllTypes = new IType[] {sequenceType(nothingType("Nothing will be left after calling followingSiblings:\nEClassifier=eCls1 can't have following siblings")) };
 
-			assertValidation(expectedReturnTypes, "followingSiblings", parameterTypes);
+			assertValidation(expectedReturnTypes, expectedReturnAllTypes, "followingSiblings", parameterTypes);
 		} finally {
 			getQueryEnvironment().removeEPackage(ePkg.getName());
 		}
@@ -584,8 +586,9 @@
 
 			final IType[] parameterTypes = new IType[] {eClassifierType(eCls1) };
 			final IType[] expectedReturnTypes = new IType[] {sequenceType(nothingType("EClassifier=eCls1 can't have preceding siblings")) };
+			final IType[] expectedReturnAllTypes = new IType[] {sequenceType(nothingType("Nothing will be left after calling precedingSiblings:\nEClassifier=eCls1 can't have preceding siblings")) };
 
-			assertValidation(expectedReturnTypes, "precedingSiblings", parameterTypes);
+			assertValidation(expectedReturnTypes, expectedReturnAllTypes, "precedingSiblings", parameterTypes);
 		} finally {
 			getQueryEnvironment().removeEPackage(ePkg.getName());
 		}
@@ -847,8 +850,9 @@
 
 			final IType[] parameterTypes = new IType[] {eClassifierType(eCls1) };
 			final IType[] expectedReturnTypes = new IType[] {sequenceType(nothingType("EClassifier=eCls1 can't have siblings")) };
+			final IType[] expectedReturnAllTypes = new IType[] {sequenceType(nothingType("Nothing will be left after calling siblings:\nEClassifier=eCls1 can't have siblings")) };
 
-			assertValidation(expectedReturnTypes, "siblings", parameterTypes);
+			assertValidation(expectedReturnTypes, expectedReturnAllTypes, "siblings", parameterTypes);
 		} finally {
 			getQueryEnvironment().removeEPackage(ePkg.getName());
 		}