blob: 3a65e68d8c00e99ab33cb330ea50c7520dae12d1 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2011, 2019 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:
* L.Goubet, E.D.Willink - Initial API and implementation
*******************************************************************************/
package org.eclipse.ocl.examples.pivot.tests;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EFactory;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.jdt.annotation.NonNull;
import org.eclipse.jdt.annotation.Nullable;
import org.eclipse.ocl.examples.xtext.tests.TestFileSystem;
import org.eclipse.ocl.pivot.ExpressionInOCL;
import org.eclipse.ocl.pivot.Model;
import org.eclipse.ocl.pivot.Package;
import org.eclipse.ocl.pivot.ids.CollectionTypeId;
import org.eclipse.ocl.pivot.ids.IdResolver;
import org.eclipse.ocl.pivot.ids.TypeId;
import org.eclipse.ocl.pivot.internal.manager.MetamodelManagerInternal;
import org.eclipse.ocl.pivot.internal.messages.PivotMessagesInternal;
import org.eclipse.ocl.pivot.uml.UMLStandaloneSetup;
import org.eclipse.ocl.pivot.uml.internal.es2as.UML2AS;
import org.eclipse.ocl.pivot.utilities.ClassUtil;
import org.eclipse.ocl.pivot.utilities.MetamodelManager;
import org.eclipse.ocl.pivot.utilities.OCL;
import org.eclipse.ocl.pivot.utilities.ParserException;
import org.eclipse.ocl.pivot.utilities.PivotConstants;
import org.eclipse.ocl.pivot.utilities.StringUtil;
import org.eclipse.ocl.pivot.utilities.ValueUtil;
import org.eclipse.uml2.uml.util.UMLUtil;
import org.eclipse.uml2.uml.util.UMLUtil.UML2EcoreConverter;
import org.junit.After;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;
/**
* Tests for Name access.
*/
@RunWith(value = Parameterized.class)
public class EvaluateUMLTest4 extends PivotTestSuite
{
public static class MyOCL extends TestOCL
{
EPackage statefulEPackage;
EFactory statefulEFactory;
EClass c1Class;
public MyOCL(@NonNull TestFileSystem testFileSystem, @NonNull String testPackageName, @NonNull String name) {
super(testFileSystem, testPackageName, name, useCodeGen ? getProjectMap() : OCL.NO_PROJECTS);
MetamodelManagerInternal metamodelManager = getMetamodelManager();
Package asMetamodel = metamodelManager.getASmetamodel();
if (asMetamodel != null) {
metamodelManager.addGlobalNamespace(PivotConstants.OCL_NAME, asMetamodel);
}
}
@SuppressWarnings("null")
protected Resource getPivotFromUML(@NonNull MetamodelManagerInternal metamodelManager, Resource umlResource, @NonNull String @Nullable [] asValidationMessages) throws ParserException {
// String problem = UML2AS.initialize(metamodelManager.getExternalResourceSet());
// assertNull(problem);
UML2AS uml2as = UML2AS.getAdapter(umlResource, metamodelManager.getEnvironmentFactory());
Model pivotModel = uml2as.getASModel();
Resource asResource = pivotModel.eResource();
assertNoResourceErrors("Normalisation failed", asResource);
assertValidationDiagnostics("Normalisation invalid", asResource, asValidationMessages);
return asResource;
}
protected Resource initStateMachinePackage(URI uri, @NonNull String @Nullable [] asValidationMessages) throws ParserException {
UMLStandaloneSetup.init();
MetamodelManagerInternal metamodelManager = getMetamodelManager();
ResourceSet resourceSet2 = getResourceSet();
assert resourceSet2 != null;
UML2AS.initialize(resourceSet2);
Resource umlResource = resourceSet2.getResource(uri, true);
List<EObject> contents = umlResource.getContents();
Map<String, String> options = new HashMap<String, String>();
options.put(UML2EcoreConverter.OPTION__ECORE_TAGGED_VALUES, UMLUtil.OPTION__PROCESS);
options.put(UML2EcoreConverter.OPTION__REDEFINING_OPERATIONS, UMLUtil.OPTION__PROCESS);
options.put(UML2EcoreConverter.OPTION__REDEFINING_PROPERTIES, UMLUtil.OPTION__PROCESS);
options.put(UML2EcoreConverter.OPTION__SUBSETTING_PROPERTIES, UMLUtil.OPTION__PROCESS);
options.put(UML2EcoreConverter.OPTION__UNION_PROPERTIES, UMLUtil.OPTION__PROCESS);
options.put(UML2EcoreConverter.OPTION__DERIVED_FEATURES, UMLUtil.OPTION__PROCESS);
options.put(UML2EcoreConverter.OPTION__DUPLICATE_OPERATIONS, UMLUtil.OPTION__PROCESS);
options.put(UML2EcoreConverter.OPTION__DUPLICATE_OPERATION_INHERITANCE, UMLUtil.OPTION__PROCESS);
options.put(UML2EcoreConverter.OPTION__DUPLICATE_FEATURES, UMLUtil.OPTION__PROCESS);
options.put(UML2EcoreConverter.OPTION__DUPLICATE_FEATURE_INHERITANCE, UMLUtil.OPTION__PROCESS);
options.put(UML2EcoreConverter.OPTION__SUPER_CLASS_ORDER, UMLUtil.OPTION__PROCESS);
options.put(UML2EcoreConverter.OPTION__ANNOTATION_DETAILS, UMLUtil.OPTION__PROCESS);
options.put(UML2EcoreConverter.OPTION__INVARIANT_CONSTRAINTS, UMLUtil.OPTION__PROCESS);
options.put(UML2EcoreConverter.OPTION__OPERATION_BODIES, UMLUtil.OPTION__PROCESS);
options.put(UML2EcoreConverter.OPTION__COMMENTS, UMLUtil.OPTION__PROCESS);
UML2EcoreConverter uml2EcoreConverter = new UML2EcoreConverter();
Collection<? extends EObject> ecoreContents = uml2EcoreConverter.convert(contents, options, null, null);
Resource ecoreResource = resourceSet2.createResource(URI.createURI("StateMachines.ecore"));
for (EObject eObject : ecoreContents) {
assert eObject != null;
ecoreResource.getContents().add(eObject);
}
statefulEPackage = (EPackage) ecoreResource.getContents().get(0);
statefulEFactory = statefulEPackage.getEFactoryInstance();
c1Class = (EClass) statefulEPackage.getEClassifier("C1");
Resource asResource = getPivotFromUML(metamodelManager, umlResource, asValidationMessages);
return asResource;
}
}
@Parameters
public static Collection<Object[]> data() {
Object[][] data = new Object[][]{{false} /*, {true}*/};
return Arrays.asList(data);
}
public EvaluateUMLTest4(boolean useCodeGen) {
super(useCodeGen);
}
@Override
protected @NonNull MyOCL createOCL() {
return new MyOCL(getTestFileSystem(), getTestPackageName(), getName());
}
@Override
protected @NonNull String getTestPackageName() {
return "EvaluateUML";
}
@BeforeClass public static void resetCounter() throws Exception {
PivotTestSuite.resetCounter();
}
@Override
@Before public void setUp() throws Exception {
super.setUp();
}
@Override
@After public void tearDown() throws Exception {
super.tearDown();
}
/**
* Tests construction of a type instance with property values
* @throws ParserException
*/
@Test public void test_oclIsInState() throws InvocationTargetException, ParserException {
UMLStandaloneSetup.init();
MyOCL ocl = createOCL();
ocl.initStateMachinePackage(getTestModelURI("models/uml/StateMachines.uml"),
new @NonNull String[] {
"The 'Feature::TypeIsNotNull' constraint is violated for 'Model::C1::o1() : «null»[1]'",
"The 'Feature::TypeIsNotNull' constraint is violated for 'Model::C2::o2() : «null»[1]'"
});
MetamodelManager metamodelManager = ocl.getMetamodelManager();
EObject context = ocl.statefulEFactory.create(ocl.c1Class);
org.eclipse.ocl.pivot.Class contextType = metamodelManager.getASOfEcore(org.eclipse.ocl.pivot.Class.class, ocl.c1Class);
assert contextType != null;
ocl.assertSemanticErrorQuery(contextType, "self.oclIsInState(S2b)", PivotMessagesInternal.UnresolvedProperty_ERROR_, "Model::C1", "S2b");
ocl.assertQueryInvalid(context, "self.oclIsInState(S1a)", StringUtil.bind(PivotMessagesInternal.FailedToEvaluate_ERROR_, "OclAny::oclIsInState(OclState[?]) : Boolean[1]", "C1", "self.oclIsInState(S1a)"), UnsupportedOperationException.class);
ocl.dispose();
}
public EObject doLoadUML(@NonNull OCL ocl, @NonNull URI uri, String fragment) throws IOException {
URI umlURI = uri.appendFragment(fragment);
return ocl.getResourceSet().getEObject(umlURI, true);
}
/**
* Tests construction of a type instance with property values
* @throws ParserException
*/
@Test public void test_stereotypes_Bug431638() throws Exception {
MyOCL ocl = createOCL();
// UML2AS.ADD_ELEMENT_EXTENSION.setState(true);
// UML2AS.ADD_IMPORTED_RESOURCE.setState(true);
// UML2AS.ADD_PROFILE_APPLICATION.setState(true);
// UML2AS.CONVERT_RESOURCE.setState(true);
// AbstractTypeServer.ADD_BASE_PROPERTY.setState(true);
// AbstractTypeServer.ADD_EXTENSION_PROPERTY.setState(true);
IdResolver idResolver = ocl.getIdResolver();
EObject context = doLoadUML(ocl, getTestModelURI("models/uml/Bug431638.uml"), "Bug431638Model.Class1.Attribute1");
assertNotNull(context);
org.eclipse.ocl.pivot.Class contextType = idResolver.getStaticTypeOfValue(null, context);
org.eclipse.ocl.pivot.Package contextPackage = contextType.getOwningPackage();
// assertEquals(XMI2UMLResource.UML_METAMODEL_NS_URI, contextPackage.getNsURI());
// assertEquals(IdManager.METAMODEL, contextPackage.getPackageId());
assertEquals(PivotConstants.UML_METAMODEL_NAME, contextPackage.getPackageId().getDisplayName());
ocl.assertValidQuery(contextType, "self.extension_vStereotype1");
ocl.assertSemanticErrorQuery(contextType, "self.extension_Stereotype1", PivotMessagesInternal.UnresolvedProperty_ERROR_, "UML::Property", "extension_Stereotype1");
ocl.assertValidQuery(contextType, "self.extension_vStereotype1.base_NamedElement");
ocl.assertSemanticErrorQuery(contextType, "self.extension_vStereotype1.base_Class", PivotMessagesInternal.UnresolvedProperty_ERROR_, "Bug431638Profile::vStereotype1", "base_Class");
ocl.assertSemanticErrorQuery(contextType, "self.extension_vStereotype1.string", PivotMessagesInternal.UnresolvedProperty_ERROR_, "Bug431638Profile::vStereotype1", "string");
ocl.assertValidQuery(contextType, "self.extension_vStereotype1.oclAsType(Bug431638Profile::Stereotype1).string");
//OK ocl.assertQueryEquals(context, contextType, "self.oclType()");
//OK ocl.assertQueryEquals(context, "Property", "self.oclType().name");
ocl.assertQueryEquals(context, "overrideValue", "self.extension_vStereotype1.oclAsType(Bug431638Profile::Stereotype1).string");
// ocl.assertValidQuery((Type)contextType, "self.extension_vStereotype1.base_Class.oclIsKindOf(Property)");
// ocl.assertQueryFalse(context, "self.extension_vStereotype1.base_Class.oclIsKindOf(Property)");
// ocl.assertQueryTrue(context, "self.oclType().oclIsKindOf(self.extension_vStereotype1.base_NamedElement)");
ocl.assertSemanticErrorQuery(contextType, "self.extension_vStereotype1.base_Class = self.oclType()", PivotMessagesInternal.UnresolvedProperty_ERROR_, "Bug431638Profile::vStereotype1", "base_Class");
// ocl.assertQueryTrue(context, "self.extension_vStereotype1.base_Class.oclIsKindOf(UML::Property)");
// ocl.assertSemanticErrorQuery2((Type)contextType, "self.extension_vStereotype1", OCLMessages.UnresolvedProperty_ERROR_, "Model::C1", "S2b");
ocl.dispose();
}
/**
* Tests construction of a type instance with property values
*/
@Test public void test_enumerations_Bug455394() throws Exception {
UMLStandaloneSetup.init();
MyOCL ocl = createOCL();
IdResolver idResolver = ocl.getIdResolver();
EObject context = doLoadUML(ocl, getTestModelURI("models/uml/Bug455394.uml"), "Model.Class1.class2");
assertNotNull(context);
assert context != null;
org.eclipse.ocl.pivot.Class contextType = idResolver.getStaticTypeOfValue(null, context);
ocl.assertQueryTrue(context, "self.aggregation=UML::AggregationKind::composite");
ocl.assertQueryResults(context, "UML::AggregationKind::composite", "self.aggregation");
EObject associationContext = doLoadUML(ocl, getTestModelURI("models/uml/Bug455394.uml"), "Model.A_class2_class1");
CollectionTypeId collectionTypeId = TypeId.ORDERED_SET.getSpecializedId(contextType.getTypeId());
ocl.assertQueryEquals(associationContext, idResolver.createOrderedSetOfEach(collectionTypeId, context), "self.memberEnd?->select(e|e.aggregation=AggregationKind::composite)");
ocl.dispose();
}
/**
* Tests uses of allInstances on a stereotype
*/
@Test public void test_stereotype_allinstances_Bug485225() throws Exception {
UMLStandaloneSetup.init();
MyOCL ocl = createOCL();
IdResolver idResolver = ocl.getIdResolver();
EObject train1 = doLoadUML(ocl, getTestModelURI("models/uml/Bug485225.uml"), "_zKtRgLUyEeWSV7DXeOPrdA"); //RootElement.Train1");
org.eclipse.ocl.pivot.Class contextType = idResolver.getStaticTypeOfValue(null, train1);
EObject application1 = doLoadUML(ocl, getTestModelURI("models/uml/Bug485225.uml"), "_zLFE8LUyEeWSV7DXeOPrdA");
EObject application2 = doLoadUML(ocl, getTestModelURI("models/uml/Bug485225.uml"), "_8MmIwLUyEeWSV7DXeOPrdA");
assert train1 != null;
assert application1 != null;
assert application2 != null;
CollectionTypeId setTypeId = TypeId.SET.getSpecializedId(contextType.getTypeId());
ocl.assertQueryEquals(train1, ValueUtil.createSetOfEach(setTypeId, application1, application2), "TestProfile::Train.allInstances()");
ocl.assertQueryEquals(train1, ValueUtil.createSetOfEach(setTypeId, application1, application2), "self.extension_Train.oclType().allInstances()");
ocl.assertQueryResults(train1, "Bag{'Train1','Train2'}", "TestProfile::Train.allInstances().base_Class.name");
ocl.dispose();
}
/**
* Tests uses of allInstances on a signal
*/
@Test public void test_signal_allinstances_Bug496210() throws Exception {
UMLStandaloneSetup.init();
MyOCL ocl = createOCL();
URI umlURI = getTestModelURI("models/uml/Bug496210.uml");
Resource umlResource = ocl.getResourceSet().getResource(umlURI, true);
EObject umlClass1 = ClassUtil.nonNullState(umlResource.getEObject("Class1"));
ExpressionInOCL expr1 = ocl.createInvariant(umlClass1, "Class1.allInstances()->size()");
assertEquals("test::Class1.allInstances()->size()", expr1.toString());
EObject umlSignal2 = ClassUtil.nonNullState(umlResource.getEObject("Signal2"));
ExpressionInOCL expr2 = ocl.createInvariant(umlSignal2, "Signal2.allInstances()->size()");
assertEquals("test::Signal2.allInstances()->size()", expr2.toString());
ocl.dispose();
}
}