[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() <= 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() < 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() <= 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() <= 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() < 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() <= 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();