[574324] Add oclinecore/completeocl isPrimeNumber tests
diff --git a/plugins/org.eclipse.ocl.xtext.base/src/org/eclipse/ocl/xtext/base/utilities/ExtendedParserContext.java b/plugins/org.eclipse.ocl.xtext.base/src/org/eclipse/ocl/xtext/base/utilities/ExtendedParserContext.java
index ba1e525..d2feed7 100644
--- a/plugins/org.eclipse.ocl.xtext.base/src/org/eclipse/ocl/xtext/base/utilities/ExtendedParserContext.java
+++ b/plugins/org.eclipse.ocl.xtext.base/src/org/eclipse/ocl/xtext/base/utilities/ExtendedParserContext.java
@@ -26,6 +26,8 @@
  * install the derived context into the ExpressionInOCL.
  *
  * @noimplement This interface is not intended to be implemented by clients.
+ *
+ * FIXME Currently only implemented for UMLXParserContext.
  */
 public interface ExtendedParserContext extends ParserContext
 {
diff --git a/plugins/org.eclipse.ocl.xtext.essentialocl/src/org/eclipse/ocl/xtext/essentialocl/utilities/EssentialOCLCSResource.java b/plugins/org.eclipse.ocl.xtext.essentialocl/src/org/eclipse/ocl/xtext/essentialocl/utilities/EssentialOCLCSResource.java
index 3d0c072..0a42a79 100644
--- a/plugins/org.eclipse.ocl.xtext.essentialocl/src/org/eclipse/ocl/xtext/essentialocl/utilities/EssentialOCLCSResource.java
+++ b/plugins/org.eclipse.ocl.xtext.essentialocl/src/org/eclipse/ocl/xtext/essentialocl/utilities/EssentialOCLCSResource.java
@@ -513,7 +513,7 @@
 		ParserContext parserContext2 = parserContext;
 		if (parserContext2 == null) {
 			EnvironmentFactoryInternal environmentFactory = PivotUtilInternal.getEnvironmentFactory(this);
-			parserContext2 = parserContext = new DefaultParserContext(environmentFactory, getURI());
+			parserContext2 = parserContext = new DefaultParserContext(environmentFactory, getURI());		// FIXME use a derived ExtendedParserContext
 		}
 		return parserContext2;
 	}
diff --git a/tests/org.eclipse.ocl.examples.xtext.tests/models/documentation/OCLinEcoreTutorialForPivot.ecore b/tests/org.eclipse.ocl.examples.xtext.tests/models/documentation/OCLinEcoreTutorialForPivot.ecore
index f3348a2..565e24d 100644
--- a/tests/org.eclipse.ocl.examples.xtext.tests/models/documentation/OCLinEcoreTutorialForPivot.ecore
+++ b/tests/org.eclipse.ocl.examples.xtext.tests/models/documentation/OCLinEcoreTutorialForPivot.ecore
@@ -1,67 +1,82 @@
-<?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="tutorial" nsURI="http://www.eclipse.org/mdt/ocl/oclinecore/tutorial" nsPrefix="tut">
-  <eAnnotations source="http://www.eclipse.org/OCL/Import">
-    <details key="ecore" value="http://www.eclipse.org/emf/2002/Ecore"/>
-  </eAnnotations>
-  <eAnnotations source="http://www.eclipse.org/emf/2002/Ecore">
-    <details key="invocationDelegates" value="http://www.eclipse.org/emf/2002/Ecore/OCL/Pivot"/>
-    <details key="settingDelegates" value="http://www.eclipse.org/emf/2002/Ecore/OCL/Pivot"/>
-    <details key="validationDelegates" value="http://www.eclipse.org/emf/2002/Ecore/OCL/Pivot"/>
-  </eAnnotations>
-  <eClassifiers xsi:type="ecore:EClass" name="Library">
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="name" lowerBound="1" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="books" ordered="false" upperBound="-1" eType="#//Book" containment="true" eOpposite="#//Book/library"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="loans" ordered="false" upperBound="-1" eType="#//Loan" containment="true"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="members" ordered="false" upperBound="-1" eType="#//Member" containment="true"
-        eOpposite="#//Member/library"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Book">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/Ecore">
-      <details key="constraints" value="SufficientCopies"/>
-    </eAnnotations>
-    <eAnnotations source="http://www.eclipse.org/emf/2002/Ecore/OCL/Pivot">
-      <details key="SufficientCopies" value="library?.loans->select((book = self))->size() &lt;= copies"/>
-    </eAnnotations>
-    <eOperations name="isAvailable" lowerBound="1" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/Ecore/OCL/Pivot">
-        <details key="body" value="loans->size() &lt; copies"/>
-      </eAnnotations>
-    </eOperations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="name" lowerBound="1" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="copies" lowerBound="1" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBigInteger"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="library" eType="#//Library" eOpposite="#//Library/books"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="loans" ordered="false" upperBound="-1" eType="#//Loan" volatile="true" derived="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/Ecore/OCL/Pivot">
-        <details key="derivation" value="library?.loans->select(book = self)"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Member">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/Ecore">
-      <details key="constraints" value="AtMostTwoLoans UniqueLoans"/>
-    </eAnnotations>
-    <eAnnotations source="http://www.eclipse.org/emf/2002/Ecore/OCL/Pivot">
-      <details key="AtMostTwoLoans" value="loans->size() &lt;= 2"/>
-      <details key="UniqueLoans" value="loans->isUnique(book)"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="name" lowerBound="1" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="library" eType="#//Library" eOpposite="#//Library/members"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="loans" ordered="false" upperBound="-1" eType="#//Loan" volatile="true" derived="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/Ecore/OCL/Pivot">
-        <details key="derivation" value="library?.loans->select(member = self)"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="books" ordered="false" unique="false" upperBound="-1" eType="#//Book" volatile="true"
-        derived="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/Ecore/OCL/Pivot">
-        <details key="derivation" value="loans->collect(book)"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Loan">
-    <eStructuralFeatures xsi:type="ecore:EReference" name="book" lowerBound="1" eType="#//Book"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="member" lowerBound="1" eType="#//Member"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="date" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDate"/>
-  </eClassifiers>
-</ecore:EPackage>
+<?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="tutorial" nsURI="http://www.eclipse.org/mdt/ocl/oclinecore/tutorial"

+    nsPrefix="tut">

+  <eAnnotations source="http://www.eclipse.org/OCL/Import">

+    <details key="ecore" value="http://www.eclipse.org/emf/2002/Ecore"/>

+  </eAnnotations>

+  <eAnnotations source="http://www.eclipse.org/emf/2002/Ecore">

+    <details key="invocationDelegates" value="http://www.eclipse.org/emf/2002/Ecore/OCL/Pivot"/>

+    <details key="settingDelegates" value="http://www.eclipse.org/emf/2002/Ecore/OCL/Pivot"/>

+    <details key="validationDelegates" value="http://www.eclipse.org/emf/2002/Ecore/OCL/Pivot"/>

+  </eAnnotations>

+  <eClassifiers xsi:type="ecore:EClass" name="Library">

+    <eStructuralFeatures xsi:type="ecore:EAttribute" name="name" lowerBound="1" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>

+    <eStructuralFeatures xsi:type="ecore:EReference" name="books" ordered="false"

+        upperBound="-1" eType="#//Book" containment="true" eOpposite="#//Book/library"/>

+    <eStructuralFeatures xsi:type="ecore:EReference" name="loans" ordered="false"

+        upperBound="-1" eType="#//Loan" containment="true"/>

+    <eStructuralFeatures xsi:type="ecore:EReference" name="members" ordered="false"

+        upperBound="-1" eType="#//Member" containment="true" eOpposite="#//Member/library"/>

+  </eClassifiers>

+  <eClassifiers xsi:type="ecore:EClass" name="Book">

+    <eAnnotations source="http://www.eclipse.org/emf/2002/Ecore">

+      <details key="constraints" value="SufficientCopies"/>

+    </eAnnotations>

+    <eAnnotations source="http://www.eclipse.org/emf/2002/Ecore/OCL/Pivot">

+      <details key="SufficientCopies" value="library?.loans->select((book = self))->size() &lt;= copies"/>

+    </eAnnotations>

+    <eOperations name="isAvailable" lowerBound="1" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">

+      <eAnnotations source="http://www.eclipse.org/emf/2002/Ecore/OCL/Pivot">

+        <details key="body" value="loans->size() &lt; copies"/>

+      </eAnnotations>

+    </eOperations>

+    <eOperations name="hasSpareCopies" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBooleanObject">

+      <eAnnotations source="http://www.eclipse.org/emf/2002/Ecore/OCL/Pivot">

+        <details key="body" value="(copies - loans->size() - wanted) > 0"/>

+      </eAnnotations>

+      <eParameters name="wanted" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBigInteger"/>

+    </eOperations>

+    <eStructuralFeatures xsi:type="ecore:EAttribute" name="name" lowerBound="1" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>

+    <eStructuralFeatures xsi:type="ecore:EAttribute" name="copies" lowerBound="1"

+        eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBigInteger"/>

+    <eStructuralFeatures xsi:type="ecore:EReference" name="library" eType="#//Library"

+        eOpposite="#//Library/books"/>

+    <eStructuralFeatures xsi:type="ecore:EReference" name="loans" ordered="false"

+        upperBound="-1" eType="#//Loan" volatile="true" derived="true">

+      <eAnnotations source="http://www.eclipse.org/emf/2002/Ecore/OCL/Pivot">

+        <details key="derivation" value="library?.loans->select(book = self)"/>

+      </eAnnotations>

+    </eStructuralFeatures>

+  </eClassifiers>

+  <eClassifiers xsi:type="ecore:EClass" name="Member">

+    <eAnnotations source="http://www.eclipse.org/emf/2002/Ecore">

+      <details key="constraints" value="AtMostTwoLoans UniqueLoans"/>

+    </eAnnotations>

+    <eAnnotations source="http://www.eclipse.org/emf/2002/Ecore/OCL/Pivot">

+      <details key="AtMostTwoLoans" value="loans->size() &lt;= 2"/>

+      <details key="UniqueLoans" value="loans->isUnique(book)"/>

+    </eAnnotations>

+    <eStructuralFeatures xsi:type="ecore:EAttribute" name="name" lowerBound="1" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>

+    <eStructuralFeatures xsi:type="ecore:EReference" name="library" eType="#//Library"

+        eOpposite="#//Library/members"/>

+    <eStructuralFeatures xsi:type="ecore:EReference" name="loans" ordered="false"

+        upperBound="-1" eType="#//Loan" volatile="true" derived="true">

+      <eAnnotations source="http://www.eclipse.org/emf/2002/Ecore/OCL/Pivot">

+        <details key="derivation" value="library?.loans->select(member = self)"/>

+      </eAnnotations>

+    </eStructuralFeatures>

+    <eStructuralFeatures xsi:type="ecore:EReference" name="books" ordered="false"

+        unique="false" upperBound="-1" eType="#//Book" volatile="true" derived="true">

+      <eAnnotations source="http://www.eclipse.org/emf/2002/Ecore/OCL/Pivot">

+        <details key="derivation" value="loans->collect(book)"/>

+      </eAnnotations>

+    </eStructuralFeatures>

+  </eClassifiers>

+  <eClassifiers xsi:type="ecore:EClass" name="Loan">

+    <eStructuralFeatures xsi:type="ecore:EReference" name="book" lowerBound="1" eType="#//Book"/>

+    <eStructuralFeatures xsi:type="ecore:EReference" name="member" lowerBound="1"

+        eType="#//Member"/>

+    <eStructuralFeatures xsi:type="ecore:EAttribute" name="date" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDate"/>

+  </eClassifiers>

+</ecore:EPackage>

diff --git a/tests/org.eclipse.ocl.examples.xtext.tests/src/org/eclipse/ocl/examples/pivot/tests/AbstractValidateTests.java b/tests/org.eclipse.ocl.examples.xtext.tests/src/org/eclipse/ocl/examples/pivot/tests/AbstractValidateTests.java
index 72deac9..03fabad 100644
--- a/tests/org.eclipse.ocl.examples.xtext.tests/src/org/eclipse/ocl/examples/pivot/tests/AbstractValidateTests.java
+++ b/tests/org.eclipse.ocl.examples.xtext.tests/src/org/eclipse/ocl/examples/pivot/tests/AbstractValidateTests.java
@@ -130,13 +130,19 @@
 		return assertValidationDiagnostics("Pivot validation errors", asResource, validationDiagnostics);
 	}
 
-	protected @NonNull EObject eCreate(EPackage ePackage, String className) {
+	protected @NonNull EObject eCreate(@NonNull EPackage ePackage, @NonNull String className) {
 		EClass eClass = (EClass) ePackage.getEClassifier(className);
 		EFactory eFactoryInstance = ePackage.getEFactoryInstance();
 		return eFactoryInstance.create(eClass);
 	}
 
-	protected void eSet(EObject eObject, String eFeatureName, Object value) {
+/*
+ * eInvoke would bypass CompleteClasses. Use ocl.assertQuery...
+ *
+  	protected Object eInvoke(@NonNull EObject eObject, @NonNull String eOperationName, Object... values) throws InvocationTargetException {
+ */
+
+	protected void eSet(@NonNull EObject eObject, @NonNull String eFeatureName, Object value) {
 		EClass eClass = eObject.eClass();
 		EStructuralFeature eFeature = eClass.getEStructuralFeature(eFeatureName);
 		assert eFeature != null;
diff --git a/tests/org.eclipse.ocl.examples.xtext.tests/src/org/eclipse/ocl/examples/pivot/tests/PivotTestCaseWithAutoTearDown.java b/tests/org.eclipse.ocl.examples.xtext.tests/src/org/eclipse/ocl/examples/pivot/tests/PivotTestCaseWithAutoTearDown.java
index 6316a0e..317743c 100644
--- a/tests/org.eclipse.ocl.examples.xtext.tests/src/org/eclipse/ocl/examples/pivot/tests/PivotTestCaseWithAutoTearDown.java
+++ b/tests/org.eclipse.ocl.examples.xtext.tests/src/org/eclipse/ocl/examples/pivot/tests/PivotTestCaseWithAutoTearDown.java
@@ -126,7 +126,7 @@
 		return ecoreURI;
 	}
 
-	public @NonNull TestFile createOCLinEcoreFile(@NonNull String filePath, @NonNull String fileContent) throws IOException {
+	public @NonNull TestFile createFile(@NonNull String filePath, @NonNull String fileContent) throws IOException {
 		TestProject testProject = getTestProject();
 		TestFile outFile = testProject.getOutputFile(filePath);
 		File file = outFile.getFile();
@@ -136,6 +136,11 @@
 		return outFile;
 	}
 
+	@Deprecated /* @deprecated use createFile */
+	public @NonNull TestFile createOCLinEcoreFile(@NonNull String filePath, @NonNull String fileContent) throws IOException {
+		return createFile(filePath, fileContent);
+	}
+
 	/**
 	 * Return the name of the test bundle. The default implementation assumes that the package name is
 	 * the same as the bundle name. Override when this assumption is unjustified.
diff --git a/tests/org.eclipse.ocl.examples.xtext.tests/src/org/eclipse/ocl/examples/pivot/tests/ValidateTests.java b/tests/org.eclipse.ocl.examples.xtext.tests/src/org/eclipse/ocl/examples/pivot/tests/ValidateTests.java
index 8ab2350..c42469d 100644
--- a/tests/org.eclipse.ocl.examples.xtext.tests/src/org/eclipse/ocl/examples/pivot/tests/ValidateTests.java
+++ b/tests/org.eclipse.ocl.examples.xtext.tests/src/org/eclipse/ocl/examples/pivot/tests/ValidateTests.java
@@ -11,6 +11,7 @@
 package org.eclipse.ocl.examples.pivot.tests;
 
 import java.io.IOException;
+import java.lang.reflect.InvocationTargetException;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
@@ -50,6 +51,7 @@
 import org.eclipse.ocl.pivot.internal.utilities.PivotConstantsInternal;
 import org.eclipse.ocl.pivot.internal.validation.EcoreOCLEValidator;
 import org.eclipse.ocl.pivot.messages.PivotMessages;
+import org.eclipse.ocl.pivot.resource.CSResource;
 import org.eclipse.ocl.pivot.uml.UMLStandaloneSetup;
 import org.eclipse.ocl.pivot.uml.internal.es2as.UML2AS;
 import org.eclipse.ocl.pivot.utilities.AbstractEnvironmentFactory;
@@ -93,6 +95,11 @@
 		return assertDiagnostics(prefix, resource, diagnostics, messages);
 	}
 
+	//	@Override
+	protected @NonNull TestOCL createTestOCL() {
+		return new TestOCL(getTestFileSystem(), getTestPackageName(), getTestName(), OCL.NO_PROJECTS, null);
+	}
+
 	public Resource doLoadEcore(@NonNull OCL ocl, @NonNull URI ecoreURI) throws IOException {
 		Resource ecoreResource = ocl.getResourceSet().getResource(ecoreURI, true);
 		return ecoreResource;
@@ -189,7 +196,7 @@
 						"		}\n" +
 						"	}\n" +
 						"}\n";
-		createOCLinEcoreFile("Bug418552.oclinecore", testDocument);
+		createFile("Bug418552.oclinecore", testDocument);
 		OCL ocl1 = createOCL();
 		@NonNull List<Diagnostic> diagnostics = doValidateOCLinEcore(ocl1, "Bug418552", getMessages(
 			StringUtil.bind(PivotMessages.ValidationConstraintIsNotSatisfied_ERROR_, "Property::CompatibleDefaultExpression", "temp::Tester::total")));
@@ -253,6 +260,202 @@
 		ocl.dispose();
 	}
 
+	// See Bug 574324
+	public void testValidate_IsPrimeNumber_completeocl() throws IOException, InterruptedException, InvocationTargetException {
+		TestOCL ocl = createTestOCL();
+		String xmiDocument =
+				"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
+				+ "<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\"\n"
+				+ "    name=\"IsPrimeNumber\" nsURI=\"isPrimeNumber\" nsPrefix=\"isp\">\n"
+				+ "</ecore:EPackage>\n"
+				+ "\n";
+		TestFile xmiTestFile = createFile("IsPrimeNumber.xmi", xmiDocument);
+		URI xmiURI = xmiTestFile.getFileURI();
+		Resource ecoreResource = ocl.getResourceSet().getResource(xmiURI, true);
+		EPackage testPackage = ClassUtil.nonNullState((EPackage) ecoreResource.getContents().get(0));
+		String oclTestDocument =
+				"import ecore : 'http://www.eclipse.org/emf/2002/Ecore#/'\n"
+				+ "\n"
+				+ "package ecore\n"
+				+ "\n"
+				+ "context EModelElement\n"
+				+ "def: isPrimeNumber(candidatePrime : Integer) : Boolean =\n"
+				+ "	(0 < candidatePrime)\n"
+				+ "	  and ((candidatePrime < 4)\n"
+				+ "		  or ((candidatePrime.div(2) * 2) <> candidatePrime)\n"
+				+ "			 and isPrimeNumber(candidatePrime, 3))\n"
+				+ "\n"
+				+ "def: isPrimeNumber(candidatePrime : Integer, candidateFactor:Integer) : Boolean =\n"
+				+ "	((candidatePrime.div(candidateFactor) * candidateFactor) <> candidatePrime)\n"
+				+ "	  and ((candidateFactor*candidateFactor > candidatePrime)\n"
+				+ "		  or isPrimeNumber(candidatePrime, candidateFactor+2))\n"
+				+ "endpackage\n";
+		TestFile oclTestFile = createFile("IsPrimeNumber.ocl", oclTestDocument);
+		URI oclURI = oclTestFile.getFileURI();
+		ocl.getResourceSet().getResource(oclURI, true);
+		try {
+			checkValidationDiagnostics(testPackage, Diagnostic.WARNING);
+			ocl.assertQueryFalse(testPackage, "isPrimeNumber(0)");
+			ocl.assertQueryTrue(testPackage, "isPrimeNumber(1)");
+			ocl.assertQueryTrue(testPackage, "isPrimeNumber(2)");
+			ocl.assertQueryTrue(testPackage, "isPrimeNumber(3)");
+			ocl.assertQueryFalse(testPackage, "isPrimeNumber(4)");
+			ocl.assertQueryTrue(testPackage, "isPrimeNumber(5)");
+
+			ocl.assertQueryFalse(testPackage, "isPrimeNumber(15)");
+			ocl.assertQueryFalse(testPackage, "isPrimeNumber(16)");
+			ocl.assertQueryTrue(testPackage, "isPrimeNumber(17)");
+			ocl.assertQueryFalse(testPackage, "isPrimeNumber(18)");
+			ocl.assertQueryTrue(testPackage, "isPrimeNumber(19)");
+			ocl.assertQueryFalse(testPackage, "isPrimeNumber(20)");
+
+			ocl.assertQueryFalse(testPackage, "isPrimeNumber(96)");
+			ocl.assertQueryTrue(testPackage, "isPrimeNumber(97)");
+			ocl.assertQueryFalse(testPackage, "isPrimeNumber(98)");
+
+			ocl.assertQueryFalse(testPackage, "isPrimeNumber(996)");
+			ocl.assertQueryTrue(testPackage, "isPrimeNumber(997)");
+			ocl.assertQueryFalse(testPackage, "isPrimeNumber(998)");
+
+			ocl.assertQueryFalse(testPackage, "isPrimeNumber(10005)");
+			ocl.assertQueryFalse(testPackage, "isPrimeNumber(10006)");
+			ocl.assertQueryTrue(testPackage, "isPrimeNumber(10007)");
+			ocl.assertQueryFalse(testPackage, "isPrimeNumber(10008)");
+			ocl.assertQueryTrue(testPackage, "isPrimeNumber(10009)");
+			ocl.assertQueryFalse(testPackage, "isPrimeNumber(10010)");
+			ocl.assertQueryFalse(testPackage, "isPrimeNumber(10011)");
+		}
+		finally {
+			ocl.dispose();
+		}
+	}
+
+	// See Bug 574324, Bug 574483
+	public void testValidate_IsPrimeNumber_completeocl_Integer() throws IOException, InterruptedException, InvocationTargetException {
+		TestOCL ocl = createTestOCL();
+		String oclTestDocument =
+				"package ocl\n"
+				+ "\n"
+				+ "context _'Integer'\n"
+				+ "def: isPrimeNumber() : Boolean =\n"
+				+ "	(0 < self)\n"
+				+ "	  and ((self < 4)\n"
+				+ "		  or ((self.div(2) * 2) <> self)\n"
+				+ "			 and self.isPrimeNumber(3))\n"
+				+ "\n"
+				+ "def: isPrimeNumber(candidateFactor:Integer) : Boolean =\n"
+				+ "	((self.div(candidateFactor) * candidateFactor) <> self)\n"
+				+ "	  and ((candidateFactor*candidateFactor > self)\n"
+				+ "		  or self.isPrimeNumber(candidateFactor+2))\n"
+				+ "endpackage\n";
+		TestFile oclTestFile = createFile("IsPrimeNumber.ocl", oclTestDocument);
+		URI oclURI = oclTestFile.getFileURI();
+		CSResource csResource = (CSResource) ocl.getResourceSet().getResource(oclURI, true);
+		assert csResource != null;
+		assertNoResourceErrors("Load", csResource);
+		try {
+			ocl.assertQueryFalse(null, "0.isPrimeNumber()");
+			ocl.assertQueryTrue(null, "1.isPrimeNumber()");
+			ocl.assertQueryTrue(null, "2.isPrimeNumber()");
+			ocl.assertQueryTrue(null, "3.isPrimeNumber()");
+			ocl.assertQueryFalse(null, "4.isPrimeNumber()");
+			ocl.assertQueryTrue(null, "5.isPrimeNumber()");
+
+			ocl.assertQueryFalse(null, "15.isPrimeNumber()");
+			ocl.assertQueryFalse(null, "16.isPrimeNumber()");
+			ocl.assertQueryTrue(null, "17.isPrimeNumber()");
+			ocl.assertQueryFalse(null, "18.isPrimeNumber()");
+			ocl.assertQueryTrue(null, "19.isPrimeNumber()");
+			ocl.assertQueryFalse(null, "20.isPrimeNumber()");
+
+			ocl.assertQueryFalse(null, "96.isPrimeNumber()");
+			ocl.assertQueryTrue(null, "97.isPrimeNumber()");
+			ocl.assertQueryFalse(null, "98.isPrimeNumber()");
+
+			ocl.assertQueryFalse(null, "996.isPrimeNumber()");
+			ocl.assertQueryTrue(null, "997.isPrimeNumber()");
+			ocl.assertQueryFalse(null, "998.isPrimeNumber()");
+
+			ocl.assertQueryFalse(null, "10005.isPrimeNumber()");
+			ocl.assertQueryFalse(null, "10006.isPrimeNumber()");
+			ocl.assertQueryTrue(null, "10007.isPrimeNumber()");
+			ocl.assertQueryFalse(null, "10008.isPrimeNumber()");
+			ocl.assertQueryTrue(null, "10009.isPrimeNumber()");
+			ocl.assertQueryFalse(null, "10010.isPrimeNumber()");
+			ocl.assertQueryFalse(null, "10011.isPrimeNumber()");
+		}
+		finally {
+			ocl.dispose();
+		}
+	}
+
+	// See Bug 574324
+	public void testValidate_IsPrimeNumber_oclinecore() throws IOException, InterruptedException, InvocationTargetException {
+		TestOCL ocl = createTestOCL();
+		String testDocument =
+				"package isPrimeNumber : isp = 'isPrimeNumber'\n"
+				+ "{\n"
+				+ "	class MyNumber\n"
+				+ "	{\n"
+				+ "		operation isPrimeNumber(candidatePrime : Integer) : Boolean {\n"
+				+ "			body: (0 < candidatePrime)\n"
+				+ "				  and ((candidatePrime < 4)\n"
+				+ "					  or ((candidatePrime.div(2) * 2) <> candidatePrime)\n"
+				+ "						 and isPrimeNumber(candidatePrime, 3));\n"
+				+ "		}\n"
+				+ "\n"
+				+ "		operation isPrimeNumber(candidatePrime : Integer, candidateFactor:Integer) : Boolean {\n"
+//				+ "			body: false.oclLog('\ncandidatePrime='+candidatePrime.toString() + ', candidateFactor='+candidateFactor.toString() +'\n') or\n"
+				+ "			body: ((candidatePrime.div(candidateFactor) * candidateFactor) <> candidatePrime)\n"
+				+ "				  and ((candidateFactor*candidateFactor > candidatePrime)\n"
+				+ "					  or isPrimeNumber(candidatePrime, candidateFactor+2));\n"
+				+ "		}\n"
+				+ "	}\n"
+				+ "}\n";
+		TestFile testFile = createFile("IsPrimeNumber.oclinecore", testDocument);
+		URI inputURI = testFile.getFileURI();
+		URI ecoreURI = getTestFile("IsPrimeNumber.ecore").getFileURI();
+		Resource ecoreResource = doLoadOCLinEcore(ocl, inputURI, ecoreURI);
+		EPackage validatePackage = ClassUtil.nonNullState((EPackage) ecoreResource.getContents().get(0));
+		try {
+			EObject testInstance = eCreate(validatePackage, "MyNumber");
+			checkValidationDiagnostics(testInstance, Diagnostic.WARNING);
+			ocl.assertQueryFalse(testInstance, "isPrimeNumber(0)");
+			ocl.assertQueryTrue(testInstance, "isPrimeNumber(1)");
+			ocl.assertQueryTrue(testInstance, "isPrimeNumber(2)");
+			ocl.assertQueryTrue(testInstance, "isPrimeNumber(3)");
+			ocl.assertQueryFalse(testInstance, "isPrimeNumber(4)");
+			ocl.assertQueryTrue(testInstance, "isPrimeNumber(5)");
+
+			ocl.assertQueryFalse(testInstance, "isPrimeNumber(15)");
+			ocl.assertQueryFalse(testInstance, "isPrimeNumber(16)");
+			ocl.assertQueryTrue(testInstance, "isPrimeNumber(17)");
+			ocl.assertQueryFalse(testInstance, "isPrimeNumber(18)");
+			ocl.assertQueryTrue(testInstance, "isPrimeNumber(19)");
+			ocl.assertQueryFalse(testInstance, "isPrimeNumber(20)");
+
+			ocl.assertQueryFalse(testInstance, "isPrimeNumber(96)");
+			ocl.assertQueryTrue(testInstance, "isPrimeNumber(97)");
+			ocl.assertQueryFalse(testInstance, "isPrimeNumber(98)");
+
+			ocl.assertQueryFalse(testInstance, "isPrimeNumber(996)");
+			ocl.assertQueryTrue(testInstance, "isPrimeNumber(997)");
+			ocl.assertQueryFalse(testInstance, "isPrimeNumber(998)");
+
+			ocl.assertQueryFalse(testInstance, "isPrimeNumber(10005)");
+			ocl.assertQueryFalse(testInstance, "isPrimeNumber(10006)");
+			ocl.assertQueryTrue(testInstance, "isPrimeNumber(10007)");
+			ocl.assertQueryFalse(testInstance, "isPrimeNumber(10008)");
+			ocl.assertQueryTrue(testInstance, "isPrimeNumber(10009)");
+			ocl.assertQueryFalse(testInstance, "isPrimeNumber(10010)");
+			ocl.assertQueryFalse(testInstance, "isPrimeNumber(10011)");
+		}
+		finally {
+			ocl.dispose();
+			EValidator.Registry.INSTANCE.remove(validatePackage);
+		}
+	}
+
 	public void testValidate_Pivot_ecore() throws IOException, InterruptedException {
 		//
 		//	Create model
@@ -398,7 +601,7 @@
 						"context Book\n" +
 						"inv ExactlyOneCopy: copies=1\n" +
 						"endpackage\n";
-		TestFile testFile = createOCLinEcoreFile("ExtraOCLinEcoreTutorial.ocl", testDocument);
+		TestFile testFile = createFile("ExtraOCLinEcoreTutorial.ocl", testDocument);
 		//
 		Resource resource = ClassUtil.nonNullState(resourceSet.getResource(xmiURI, true));
 		assertValidationDiagnostics("Without Complete OCL", resource, getMessages(
@@ -466,7 +669,7 @@
 				"  inv IsClassWrtRoot: self.rootFalse()\n" +
 				"  inv IsClassWrtLeaf: self.leafFalse()\n" +
 				"endpackage\n";
-		TestFile testFile = createOCLinEcoreFile("Bug422583.ocl", testDocument);
+		TestFile testFile = createFile("Bug422583.ocl", testDocument);
 		//
 		Resource resource = ClassUtil.nonNullState(resourceSet.getResource(umlURI, true));
 		org.eclipse.uml2.uml.Class uNamed = null;
diff --git a/tests/org.eclipse.ocl.examples.xtext.tests/src/org/eclipse/ocl/examples/test/xtext/EcoreConsoleTests.java b/tests/org.eclipse.ocl.examples.xtext.tests/src/org/eclipse/ocl/examples/test/xtext/EcoreConsoleTests.java
index 21d1c0b..15dcfd0 100644
--- a/tests/org.eclipse.ocl.examples.xtext.tests/src/org/eclipse/ocl/examples/test/xtext/EcoreConsoleTests.java
+++ b/tests/org.eclipse.ocl.examples.xtext.tests/src/org/eclipse/ocl/examples/test/xtext/EcoreConsoleTests.java
@@ -73,6 +73,8 @@
 			fail();
 			return;
 		}
+		assertConsoleResult(consolePage, b1Book, "hasSpareCopies(0)", "true\n");
+		assertConsoleResult(consolePage, b1Book, "hasSpareCopies(5)", "false\n");
 		@SuppressWarnings("unchecked")
 		EObject aLoan = ((List<EObject>) xmiLibrary.eGet(ecoreLoans)).get(0);
 		//
@@ -87,6 +89,8 @@
 		assertConsoleResult(consolePage, b2Book, "isAvailable()", "true\n");
 		assertConsoleResult(consolePage, b1Book, "isAvailable()", "false\n");
 		//
+		assertConsoleResult(consolePage, b1Book, "hasSpareCopies(5)", "false\n");
+		//
 		assertConsoleResult(consolePage, ecoreBook, "name", "'Book'\n");
 		assertConsoleResult(consolePage, ecoreBook, "copies", "<b><error>Parsing failure\n</error></b><error>\n1:1: Unresolved Property '::copies'\n</error>");
 		assertConsoleResult(consolePage, ecoreBook, "oclType().ownedProperties->sortedBy(name)",
diff --git a/tests/org.eclipse.ocl.examples.xtext.tests/src/org/eclipse/ocl/examples/test/xtext/PivotDocumentationExamples.java b/tests/org.eclipse.ocl.examples.xtext.tests/src/org/eclipse/ocl/examples/test/xtext/PivotDocumentationExamples.java
index 0d41755..4f96087 100644
--- a/tests/org.eclipse.ocl.examples.xtext.tests/src/org/eclipse/ocl/examples/test/xtext/PivotDocumentationExamples.java
+++ b/tests/org.eclipse.ocl.examples.xtext.tests/src/org/eclipse/ocl/examples/test/xtext/PivotDocumentationExamples.java
@@ -272,8 +272,7 @@
 
 		// Register an additional EValidator for the Complete OCL document constraints
 		ComposedEValidator newEValidator = ComposedEValidator.install(EXTLibraryPackage.eINSTANCE);
-		newEValidator.addChild(new CompleteOCLEObjectValidator(
-			EXTLibraryPackage.eINSTANCE, uri, ocl.getEnvironmentFactory()));
+		newEValidator.addChild(new CompleteOCLEObjectValidator(EXTLibraryPackage.eINSTANCE, uri));
 
 		// Validate the entire Resource containing the library
 		Resource resource = library.eResource();