blob: 380bdee5023881090f8b6164567322c72ed7fb0e [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2011, 2020 Willink Transformations and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v2.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v20.html
*
* Contributors:
* E.D.Willink - Initial API and implementation
*******************************************************************************/
package org.eclipse.ocl.examples.test.xtext;
import java.math.BigInteger;
import java.util.List;
import java.util.Map;
import org.eclipse.emf.common.util.BasicEList;
import org.eclipse.emf.common.util.Diagnostic;
import org.eclipse.emf.common.util.EMap;
import org.eclipse.emf.common.util.TreeIterator;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EAnnotation;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EOperation;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.emf.ecore.EValidator;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.emf.ecore.resource.URIConverter;
import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
import org.eclipse.emf.ecore.util.Diagnostician;
import org.eclipse.emf.ecore.xmi.impl.EcoreResourceFactoryImpl;
import org.eclipse.jdt.annotation.NonNull;
import org.eclipse.ocl.common.OCLCommon;
import org.eclipse.ocl.common.internal.options.CommonOptions;
import org.eclipse.ocl.ecore.EcoreEnvironment;
import org.eclipse.ocl.examples.pivot.tests.PivotTestCaseWithAutoTearDown;
import org.eclipse.ocl.examples.xtext.tests.TestUtil;
import org.eclipse.ocl.pivot.ExpressionInOCL;
import org.eclipse.ocl.pivot.PivotPackage;
import org.eclipse.ocl.pivot.internal.delegate.OCLDelegateDomain;
import org.eclipse.ocl.pivot.internal.ecore.es2as.Ecore2AS;
import org.eclipse.ocl.pivot.internal.utilities.EnvironmentFactoryInternal;
import org.eclipse.ocl.pivot.internal.utilities.GlobalEnvironmentFactory;
import org.eclipse.ocl.pivot.messages.StatusCodes;
import org.eclipse.ocl.pivot.model.OCLstdlib;
import org.eclipse.ocl.pivot.util.PivotValidator;
import org.eclipse.ocl.pivot.utilities.ClassUtil;
import org.eclipse.ocl.pivot.utilities.LabelUtil;
import org.eclipse.ocl.pivot.utilities.NameUtil;
import org.eclipse.ocl.pivot.utilities.OCL;
import org.eclipse.ocl.pivot.utilities.PivotConstants;
import org.eclipse.ocl.pivot.utilities.ValueUtil;
/**
* Tests for the OCLinEcore tutorial using LPG or Pivot delegate URIs on LPG or Pivot evaluator.
*
* WARNING. These tests fail as plugin tests if an OCLinEcore tutorial project is open.
*/
public class OCLinEcoreTutorialExamples extends PivotTestCaseWithAutoTearDown
{
public void testOCLinEcoreTutorialUsingLPGForLPG() throws Exception {
GlobalEnvironmentFactory.disposeInstance();
org.eclipse.ocl.ecore.OCL.initialize(resourceSet);
org.eclipse.ocl.ecore.delegate.OCLDelegateDomain.initialize(resourceSet);
doTestOCLinEcoreTutorialUsingLPG(getTestModelURI("models/documentation/OCLinEcoreTutorialForLPG.xmi"), true);
GlobalEnvironmentFactory.disposeInstance();
}
public void testOCLinEcoreTutorialUsingLPGForPivot() throws Exception {
GlobalEnvironmentFactory.disposeInstance();
GlobalEnvironmentFactory.getInstance().setSafeNavigationValidationSeverity(StatusCodes.Severity.IGNORE);
OCLDelegateDomain.initialize(resourceSet, PivotConstants.OCL_DELEGATE_URI_PIVOT);
doTestOCLinEcoreTutorialUsingLPG(getTestModelURI("models/documentation/OCLinEcoreTutorialForPivot.xmi"), true);
GlobalEnvironmentFactory.disposeInstance();
}
public void testOCLinEcoreTutorialUsingPivotForLPG() throws Exception {
GlobalEnvironmentFactory.disposeInstance();
org.eclipse.ocl.ecore.delegate.OCLDelegateDomain.initialize(resourceSet);
doTestOCLinEcoreTutorialUsingPivot(getTestModelURI("models/documentation/OCLinEcoreTutorialForLPG.xmi"));
GlobalEnvironmentFactory.disposeInstance();
}
public void testOCLinEcoreTutorialUsingPivotForPivot() throws Exception {
GlobalEnvironmentFactory.disposeInstance();
OCLDelegateDomain.initialize(resourceSet, PivotConstants.OCL_DELEGATE_URI_PIVOT);
// getProjectMap().initializeResourceSet(resourceSet);
doTestOCLinEcoreTutorialUsingPivot(getTestModelURI("models/documentation/OCLinEcoreTutorialForPivot.xmi"));
GlobalEnvironmentFactory.disposeInstance();
}
public void testOCLinEcoreTutorialUsingLPGForDefault() throws Exception {
GlobalEnvironmentFactory.disposeInstance();
GlobalEnvironmentFactory.getInstance().setSafeNavigationValidationSeverity(StatusCodes.Severity.IGNORE);
org.eclipse.ocl.ecore.delegate.OCLDelegateDomain.initialize(resourceSet);
doTestOCLinEcoreTutorialUsingLPG(getTestModelURI("models/documentation/OCLinEcoreTutorial.xmi"), true);
GlobalEnvironmentFactory.disposeInstance();
}
public void testOCLinEcoreTutorialUsingPivotForDefault() throws Exception {
GlobalEnvironmentFactory.disposeInstance();
CommonOptions.DEFAULT_DELEGATION_MODE.setDefaultValue(PivotConstants.OCL_DELEGATE_URI_PIVOT);
org.eclipse.ocl.ecore.delegate.OCLDelegateDomain.initialize(resourceSet);
OCLDelegateDomain.initialize(resourceSet, PivotConstants.OCL_DELEGATE_URI_PIVOT);
getProjectMap().initializeResourceSet(resourceSet);
doTestOCLinEcoreTutorialUsingPivot(getTestModelURI("models/documentation/OCLinEcoreTutorial.xmi"));
GlobalEnvironmentFactory.disposeInstance();
}
protected void doTestOCLinEcoreTutorialUsingLPG(@NonNull URI testModelURI, boolean isLPG) throws Exception {
resourceSet.getResourceFactoryRegistry().getExtensionToFactoryMap().put("*", new EcoreResourceFactoryImpl());
// resourceSet.getURIConverter().getURIMap().put(URI.createURI("http://www.eclipse.org/ocl/1.1.0/oclstdlib.ecore"), URI.createPlatformPluginURI("/org.eclipse.ocl.ecore/model/oclstdlib.ecore", true));
URIConverter.URI_MAP.put(URI.createURI(EcoreEnvironment.OCL_STANDARD_LIBRARY_NS_URI), URI.createPlatformPluginURI("/org.eclipse.ocl.ecore/model/oclstdlib.ecore", true));
Resource xmiResource = resourceSet.getResource(testModelURI, true);
EObject xmiLibrary = xmiResource.getContents().get(0);
EClass ecoreLibrary = xmiLibrary.eClass();
if (isLPG) {
Resource ecoreLibraryResource = ecoreLibrary.eResource();
assert ecoreLibraryResource != null;
removeSafeNavigationOperatorsForLPG(ecoreLibraryResource);
}
EStructuralFeature ecoreBooks = ecoreLibrary.getEStructuralFeature("books");
EClass ecoreBook = (EClass) ecoreBooks.getEType();
EStructuralFeature bookName = ecoreBook.getEStructuralFeature("name");
EStructuralFeature bookCopies = ecoreBook.getEStructuralFeature("copies");
EStructuralFeature bookLoans = ecoreBook.getEStructuralFeature("loans");
EOperation bookIsAvailable = NameUtil.getENamedElement(ecoreBook.getEOperations(), "isAvailable");
@SuppressWarnings("unchecked")
List<EObject> xmiBooks = (List<EObject>) xmiLibrary.eGet(ecoreBooks);
EObject b2Book = null;
for (EObject xmiBook : xmiBooks) {
if (xmiBook.eGet(bookName).equals("b2")) {
b2Book = xmiBook;
}
}
if (b2Book == null) {
fail();
return;
}
org.eclipse.ocl.ecore.EcoreEnvironmentFactory environmentFactory = new org.eclipse.ocl.ecore.EcoreEnvironmentFactory(resourceSet.getPackageRegistry());
org.eclipse.ocl.ecore.OCL ocl = org.eclipse.ocl.ecore.OCL.newInstance(environmentFactory);
org.eclipse.ocl.ecore.OCL.Helper helper = ocl.createOCLHelper();
Object b2Copies = b2Book.eGet(bookCopies); // Static eGet
assertEquals(2, ((Number)b2Copies).intValue());
Object b2Loans = b2Book.eGet(bookLoans); // Dynamic eGet
// SettingDelegate settingDelegate = ((EStructuralFeature.Internal) bookLoans).getSettingDelegate();
// assert settingDelegate instanceof org.eclipse.ocl.pivot.delegate.OCLSettingDelegate;
assertEquals(3, ((List<?>)b2Loans).size());
Object b2IsAvailable = b2Book.eInvoke(bookIsAvailable, new BasicEList<EObject>()); // Dynamic eInvoke
// SettingDelegate settingDelegate = ((EStructuralFeature.Internal) bookLoans).getSettingDelegate();
// assert settingDelegate instanceof org.eclipse.ocl.pivot.delegate.OCLSettingDelegate;
assertEquals(false, ((Boolean)b2IsAvailable).booleanValue());
helper.setContext(b2Book.eClass());
org.eclipse.ocl.ecore.OCLExpression query = helper.createQuery("isAvailable()");
org.eclipse.ocl.ecore.OCL.Query queryEval = ocl.createQuery(query);
Object b2Available = queryEval.evaluate(b2Book);
assertFalse((Boolean)b2Available);
Map<Object, Object> validationContext = LabelUtil.createDefaultContext(Diagnostician.INSTANCE);
Diagnostic diagnostics = Diagnostician.INSTANCE.validate(xmiLibrary, validationContext);
assertEquals(3, diagnostics.getChildren().size());
b2Book.eSet(bookCopies, BigInteger.valueOf(4));
b2Available = queryEval.evaluate(b2Book);
assertTrue((Boolean)b2Available);
diagnostics = Diagnostician.INSTANCE.validate(xmiLibrary, validationContext);
assertEquals(2, diagnostics.getChildren().size());
b2Book.eSet(bookCopies, BigInteger.valueOf(3));
b2Available = queryEval.evaluate(b2Book);
assertFalse((Boolean)b2Available);
List<?> b2loans = (List<?>)b2Book.eGet(bookLoans);
assertEquals(3, b2loans.size());
assertTrue(b2loans.get(1) instanceof EObject);
ocl.dispose();
}
protected void doTestOCLinEcoreTutorialUsingPivot(@NonNull URI testModelURI) throws Exception {
resourceSet.getResourceFactoryRegistry().getExtensionToFactoryMap().put("*", new EcoreResourceFactoryImpl());
Resource xmiResource = resourceSet.getResource(testModelURI, true);
EObject xmiLibrary = xmiResource.getContents().get(0);
EClass ecoreLibrary = xmiLibrary.eClass();
EStructuralFeature ecoreBooks = ecoreLibrary.getEStructuralFeature("books");
EClass ecoreBook = (EClass) ecoreBooks.getEType();
EStructuralFeature bookName = ecoreBook.getEStructuralFeature("name");
EStructuralFeature bookCopies = ecoreBook.getEStructuralFeature("copies");
EStructuralFeature bookLoans = ecoreBook.getEStructuralFeature("loans");
EOperation bookIsAvailable = NameUtil.getENamedElement(ecoreBook.getEOperations(), "isAvailable");
@SuppressWarnings("unchecked")
List<EObject> xmiBooks = (List<EObject>) xmiLibrary.eGet(ecoreBooks);
EObject b2Book = null;
for (EObject xmiBook : xmiBooks) {
if (xmiBook.eGet(bookName).equals("b2")) {
b2Book = xmiBook;
}
}
if (b2Book == null) {
fail();
return;
}
OCL ocl = OCL.newInstance(resourceSet.getPackageRegistry());
try {
EClass b2EClass = b2Book.eClass();
assert b2EClass != null;
Resource b2EClassResource = b2EClass.eResource();
assert b2EClassResource != null;
Ecore2AS ecore2as = Ecore2AS.getAdapter(b2EClassResource, (EnvironmentFactoryInternal) ocl.getEnvironmentFactory());
org.eclipse.ocl.pivot.Class bookType = ecore2as.getCreated(org.eclipse.ocl.pivot.Class.class, b2EClass);
Object b2Copies = b2Book.eGet(bookCopies); // Static eGet
assertEquals(2, ((Number)b2Copies).intValue());
Object b2Loans = b2Book.eGet(bookLoans); // Dynamic eGet
// SettingDelegate settingDelegate = ((EStructuralFeature.Internal) bookLoans).getSettingDelegate();
// assert settingDelegate instanceof org.eclipse.ocl.pivot.delegate.OCLSettingDelegate;
assertEquals(3, ((List<?>)b2Loans).size());
Object b2IsAvailable = b2Book.eInvoke(bookIsAvailable, new BasicEList<EObject>()); // Dynamic eInvoke
// SettingDelegate settingDelegate = ((EStructuralFeature.Internal) bookLoans).getSettingDelegate();
// assert settingDelegate instanceof org.eclipse.ocl.pivot.delegate.OCLSettingDelegate;
assertEquals(false, ((Boolean)b2IsAvailable).booleanValue());
ExpressionInOCL query = ocl.createQuery(bookType, "isAvailable()");
org.eclipse.ocl.pivot.utilities.Query queryEval = ocl.createQuery(query);
Object b2Available = queryEval.evaluateEcore(b2Book);
assertFalse(ValueUtil.asBoolean(b2Available));
Map<Object, Object> validationContext = LabelUtil.createDefaultContext(Diagnostician.INSTANCE);
Diagnostic diagnostics = Diagnostician.INSTANCE.validate(xmiLibrary, validationContext);
assertEquals(3, diagnostics.getChildren().size());
// queryEval.invalidateCaches();
b2Book.eSet(bookCopies, BigInteger.valueOf(4));
b2Available = queryEval.evaluateEcore(b2Book);
assertFalse(ValueUtil.asBoolean(b2Available)); // uses previously cached value
queryEval = ocl.createQuery(query); // new query for changed model
b2Available = queryEval.evaluateEcore(b2Book);
assertTrue(ValueUtil.asBoolean(b2Available));
diagnostics = Diagnostician.INSTANCE.validate(xmiLibrary, validationContext);
assertEquals(2, diagnostics.getChildren().size());
b2Book.eSet(bookCopies, BigInteger.valueOf(3));
queryEval = ocl.createQuery(query); // new query for changed model
b2Available = queryEval.evaluateEcore(b2Book);
assertFalse(ValueUtil.asBoolean(b2Available));
List<?> b2loans = (List<?>)b2Book.eGet(bookLoans);
assertEquals(3, b2loans.size());
assertTrue(b2loans.get(1) instanceof EObject);
} finally {
ocl.dispose();
}
}
protected void removeSafeNavigationOperatorsForLPG(@NonNull Resource eResource) {
for (TreeIterator<EObject> tit = eResource.getAllContents(); tit.hasNext(); ) {
EObject eObject = tit.next();
if (eObject instanceof EAnnotation) {
EAnnotation eAnnotation = (EAnnotation)eObject;
if (OCLCommon.isDelegateURI(eAnnotation.getSource())) {
EMap<String, String> details = eAnnotation.getDetails();
for (String key : details.keySet()) {
String value = details.get(key);
String unsafeValue = value.replace("?.", ".").replace("?->", "->");
if (!ClassUtil.safeEquals(unsafeValue, value)) {
details.put(key, unsafeValue);
}
}
}
tit.prune();
}
}
}
private ResourceSet resourceSet;
@Override
protected void setUp() throws Exception {
super.setUp();
resetRegistries();
OCLstdlib.install();
TestUtil.doEssentialOCLSetup();
resourceSet = new ResourceSetImpl();
}
@Override
protected void tearDown() throws Exception {
if (resourceSet != null) {
unloadResourceSet(resourceSet);
}
resourceSet = null;
EValidator.Registry.INSTANCE.put(PivotPackage.eINSTANCE, PivotValidator.INSTANCE);
super.tearDown();
}
}