blob: d7eda31da9b9699a9a889af808a18fb3fa1ca19f [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:
* E.D.Willink - Initial API and implementation
*******************************************************************************/
package org.eclipse.ocl.examples.pivot.tests;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Date;
import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.List;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.emf.ecore.EReference;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.emf.ecore.EcorePackage;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.jdt.annotation.NonNull;
import org.eclipse.jdt.annotation.Nullable;
import org.eclipse.ocl.examples.xtext.tests.TestUtil;
import org.eclipse.ocl.examples.xtext.tests.company.CompanyPackage;
import org.eclipse.ocl.pivot.ids.IdResolver;
import org.eclipse.ocl.pivot.ids.TypeId;
import org.eclipse.ocl.pivot.internal.messages.PivotMessagesInternal;
import org.eclipse.ocl.pivot.internal.values.BagImpl;
import org.eclipse.ocl.pivot.messages.PivotMessages;
import org.eclipse.ocl.pivot.utilities.ClassUtil;
import org.eclipse.ocl.pivot.utilities.OCL;
import org.eclipse.ocl.pivot.values.OrderedSetValue;
import org.eclipse.ocl.pivot.values.Value;
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 model access operations.
*/
@RunWith(value = Parameterized.class)
public class EvaluateModelOperationsTest4 extends PivotTestSuite
{
@Parameters
public static Collection<Object[]> data() {
Object[][] data = new Object[][]{{false}, {true}};
return Arrays.asList(data);
}
public EvaluateModelOperationsTest4(boolean useCodeGen) {
super(useCodeGen);
}
protected @NonNull TestOCL createOCLWithProjectMap() {
return new TestOCL(getTestFileSystem(), getTestPackageName(), getName(), getProjectMap());
}
@Override
protected @NonNull String getTestPackageName() {
return "EvaluateModelOperations";
}
@BeforeClass public static void resetCounter() throws Exception {
PivotTestSuite.resetCounter();
}
@Override
@Before public void setUp() throws Exception {
TestUtil.doOCLinEcoreSetup();
super.setUp();
}
@Override
@After public void tearDown() throws Exception {
super.tearDown();
}
@SuppressWarnings("unchecked")
public void eAdd(@NonNull EObject eObject, @NonNull String featureName, @Nullable Object value) {
EStructuralFeature eStructuralFeature = eObject.eClass().getEStructuralFeature(featureName);
assert eStructuralFeature.isMany();
if (eStructuralFeature instanceof EReference) {
assert value instanceof EObject;
}
else {
assert !(value instanceof EObject);
}
((List<Object>)eObject.eGet(eStructuralFeature)).add(value);
}
public @NonNull EObject eCreate(EClass cClass) {
return ClassUtil.nonNullEMF(cClass.getEPackage().getEFactoryInstance().create(cClass));
}
public void eSet(@NonNull EObject eObject, @NonNull String featureName, @Nullable Object value) {
EStructuralFeature eStructuralFeature = eObject.eClass().getEStructuralFeature(featureName);
assert !eStructuralFeature.isMany();
if (eStructuralFeature instanceof EReference) {
assert value instanceof EObject;
}
else {
assert !(value instanceof EObject);
}
eObject.eSet(eStructuralFeature, value);
}
/**
* Test that Ecore Data Types can be used. Inspired by Bug 358713.
*/
@Test public void test_ecoreDataTypes() throws Exception {
TestOCL ocl = createOCL();
String metamodelText =
"import ecore : 'http://www.eclipse.org/emf/2002/Ecore#/';\n" +
"package pkg : pkg = 'pkg' {\n" +
" class A {\n" +
" property anEBigDecimal : ecore::EBigDecimal;\n" +
" property anEBigInteger : ecore::EBigInteger;\n" +
" property anEBoolean : ecore::EBoolean;\n" +
" property anEBooleanObject : ecore::EBooleanObject;\n" +
" property anEByte : ecore::EByte;\n" +
" property anEByteObject : ecore::EByteObject;\n" +
" property anEChar : ecore::EChar;\n" +
" property anECharacterObject : ecore::ECharacterObject;\n" +
" property anEDouble : ecore::EDouble;\n" +
" property anEDoubleObject : ecore::EDoubleObject;\n" +
" property anEFloat : ecore::EFloat;\n" +
" property anEFloatObject : ecore::EFloatObject;\n" +
" property anEInt : ecore::EInt;\n" +
" property anEIntegerObject : ecore::EIntegerObject;\n" +
" property anELong : ecore::ELong;\n" +
" property anELongObject : ecore::ELongObject;\n" +
" property anEShort : ecore::EShort;\n" +
" property anEShortObject : ecore::EShortObject;\n" +
" property anEString : ecore::EString;\n" +
" property anEDate : ecore::EDate;\n" +
" }\n" +
"}\n";
Resource metamodel = cs2ecore(ocl, metamodelText, getTestFileURI("test.ecore"));
EPackage ePackage = (EPackage) metamodel.getContents().get(0);
EClass eClass = ClassUtil.nonNullState((EClass) ePackage.getEClassifiers().get(0));
// helper.setContext(metamodelManager.getIdResolver().getType(eClass));
EObject eObject = eCreate(eClass);
//
Date nowDate = new Date();
eSet(eObject, "anEDate", nowDate);
ocl.assertQueryTrue(eObject, "anEDate = anEDate");
ocl.assertQueryFalse(eObject, "anEDate = ecore::EDate{value='2345-12-23'}");
//
eSet(eObject, "anEBigDecimal", BigDecimal.valueOf(0));
ocl.assertQueryEquals(eObject, 0, "anEBigDecimal");
ocl.assertQueryEquals(eObject, 1, "anEBigDecimal + 1");
ocl.assertQueryEquals(eObject, 0, "self.anEBigDecimal");
ocl.assertQueryEquals(eObject, 1, "self.anEBigDecimal + 1");
//
eSet(eObject, "anEBigInteger", BigInteger.valueOf(0));
ocl.assertQueryEquals(eObject, 0, "anEBigInteger");
ocl.assertQueryEquals(eObject, 1, "anEBigInteger + 1");
ocl.assertQueryEquals(eObject, 0, "self.anEBigInteger");
ocl.assertQueryEquals(eObject, 1, "self.anEBigInteger + 1");
//
ocl.assertQueryEquals(eObject, false, "anEBoolean");
ocl.assertQueryEquals(eObject, true, "anEBoolean or true");
ocl.assertQueryEquals(eObject, false, "self.anEBoolean");
ocl.assertQueryEquals(eObject, true, "self.anEBoolean or true");
//
eSet(eObject, "anEBooleanObject", false);
ocl.assertQueryEquals(eObject, false, "anEBooleanObject");
ocl.assertQueryEquals(eObject, true, "anEBooleanObject or true");
ocl.assertQueryEquals(eObject, false, "self.anEBooleanObject");
ocl.assertQueryEquals(eObject, true, "self.anEBooleanObject or true");
//
ocl.assertQueryEquals(eObject, 0, "anEByte");
ocl.assertQueryEquals(eObject, 1, "anEByte + 1");
ocl.assertQueryEquals(eObject, 0, "self.anEByte");
ocl.assertQueryEquals(eObject, 1, "self.anEByte + 1");
//
eSet(eObject, "anEByteObject", (byte)0);
ocl.assertQueryEquals(eObject, 0, "anEByteObject");
ocl.assertQueryEquals(eObject, 1, "anEByteObject + 1");
ocl.assertQueryEquals(eObject, 0, "self.anEByteObject");
ocl.assertQueryEquals(eObject, 1, "self.anEByteObject + 1");
//
ocl.assertQueryEquals(eObject, 0, "anEChar");
ocl.assertQueryEquals(eObject, 1, "anEChar + 1");
ocl.assertQueryEquals(eObject, 0, "self.anEChar");
ocl.assertQueryEquals(eObject, 1, "self.anEChar + 1");
//
eSet(eObject, "anECharacterObject", (char)0);
ocl.assertQueryEquals(eObject, 0, "anECharacterObject");
ocl.assertQueryEquals(eObject, 1, "anECharacterObject + 1");
ocl.assertQueryEquals(eObject, 0, "self.anECharacterObject");
ocl.assertQueryEquals(eObject, 1, "self.anECharacterObject + 1");
//
ocl.assertQueryEquals(eObject, 0, "anEDouble");
ocl.assertQueryEquals(eObject, 1, "anEDouble + 1");
ocl.assertQueryEquals(eObject, 0, "self.anEDouble");
ocl.assertQueryEquals(eObject, 1, "self.anEDouble + 1");
//
eSet(eObject, "anEDoubleObject", (double)0);
ocl.assertQueryEquals(eObject, 0, "anEDoubleObject");
ocl.assertQueryEquals(eObject, 1, "anEDoubleObject + 1");
ocl.assertQueryEquals(eObject, 0, "self.anEDoubleObject");
ocl.assertQueryEquals(eObject, 1, "self.anEDoubleObject + 1");
//
ocl.assertQueryEquals(eObject, 0, "anEFloat");
ocl.assertQueryEquals(eObject, 1, "anEFloat + 1");
ocl.assertQueryEquals(eObject, 0, "self.anEFloat");
ocl.assertQueryEquals(eObject, 1, "self.anEFloat + 1");
//
eSet(eObject, "anEFloatObject", (float)0);
ocl.assertQueryEquals(eObject, 0, "anEFloatObject");
ocl.assertQueryEquals(eObject, 1, "anEFloatObject + 1");
ocl.assertQueryEquals(eObject, 0, "self.anEFloatObject");
ocl.assertQueryEquals(eObject, 1, "self.anEFloatObject + 1");
//
ocl.assertQueryEquals(eObject, 0, "anEInt");
ocl.assertQueryEquals(eObject, 1, "anEInt + 1");
ocl.assertQueryEquals(eObject, 0, "self.anEInt");
ocl.assertQueryEquals(eObject, 1, "self.anEInt + 1");
//
eSet(eObject, "anEIntegerObject", 0);
ocl.assertQueryEquals(eObject, 0, "anEIntegerObject");
ocl.assertQueryEquals(eObject, 1, "anEIntegerObject + 1");
ocl.assertQueryEquals(eObject, 0, "self.anEIntegerObject");
ocl.assertQueryEquals(eObject, 1, "self.anEIntegerObject + 1");
//
ocl.assertQueryEquals(eObject, 0, "anELong");
ocl.assertQueryEquals(eObject, 1, "anELong + 1");
ocl.assertQueryEquals(eObject, 0, "self.anELong");
ocl.assertQueryEquals(eObject, 1, "self.anELong + 1");
//
eSet(eObject, "anELongObject", (long)0);
ocl.assertQueryEquals(eObject, 0, "anELongObject");
ocl.assertQueryEquals(eObject, 1, "anELongObject + 1");
ocl.assertQueryEquals(eObject, 0, "self.anELongObject");
ocl.assertQueryEquals(eObject, 1, "self.anELongObject + 1");
//
ocl.assertQueryEquals(eObject, 0, "anEShort");
ocl.assertQueryEquals(eObject, 1, "anEShort + 1");
ocl.assertQueryEquals(eObject, 0, "self.anEShort");
ocl.assertQueryEquals(eObject, 1, "self.anEShort + 1");
//
eSet(eObject, "anEShortObject", (short)0);
ocl.assertQueryEquals(eObject, 0, "anEShortObject");
ocl.assertQueryEquals(eObject, 1, "anEShortObject + 1");
ocl.assertQueryEquals(eObject, 0, "self.anEShortObject");
ocl.assertQueryEquals(eObject, 1, "self.anEShortObject + 1");
//
eSet(eObject, "anEString", "");
ocl.assertQueryEquals(eObject, "", "anEString");
ocl.assertQueryEquals(eObject, "1", "anEString + '1'");
ocl.assertQueryEquals(eObject, "", "self.anEString");
ocl.assertQueryEquals(eObject, "1", "self.anEString + '1'");
ocl.dispose();
}
/**
* Test implicit collect and oclAsSet() therein. Inspired by Bug 351512.
*/
@Test public void test_oclAsSet_351512() throws Exception {
TestOCL ocl = createOCL();
IdResolver idResolver = ocl.getIdResolver();
String metamodelText =
"import ecore : 'http://www.eclipse.org/emf/2002/Ecore#/';\n" +
"package pkg : pkg = 'pkg' {\n" +
" class A {\n" +
" property bs : B[*] {ordered,unique};\n" +
" attribute name : String;\n" +
" }\n" +
" class B {\n" +
" property c : C;\n" +
" }\n" +
" class C {\n" +
" attribute name : String;\n" +
" }\n" +
"}\n";
Resource metamodel = cs2ecore(ocl, metamodelText, getTestFileURI("test.ecore"));
EPackage ePackage = (EPackage) metamodel.getContents().get(0);
EClass aClass = ClassUtil.nonNullState((EClass) ePackage.getEClassifier("A"));
EClass bClass = (EClass) ePackage.getEClassifier("B");
EClass cClass = (EClass) ePackage.getEClassifier("C");
EObject c1 = eCreate(cClass);
eSet(c1, "name", "c1");
EObject c2 = eCreate(cClass);
eSet(c2, "name", "c2");
EObject b1 = eCreate(bClass);
eSet(b1, "c", c1);
EObject b2 = eCreate(bClass);
eSet(b2, "c", c2);
EObject a = eCreate(aClass);
eAdd(a, "bs", b1);
eAdd(a, "bs", b2);
//
Object b1_value = idResolver.boxedValueOf(b1);
Object b2_value = idResolver.boxedValueOf(b2);
Object c1_value = idResolver.boxedValueOf(c1);
Object c2_value = idResolver.boxedValueOf(c2);
Value orderedSet_b1_b2 = idResolver.createOrderedSetOfEach(TypeId.ORDERED_SET.getSpecializedId(TypeId.OCL_ANY), b1_value, b2_value);
Value sequence_c1_c2 = idResolver.createSequenceOfEach(TypeId.SEQUENCE.getSpecializedId(TypeId.OCL_ANY), c1_value, c2_value);
//
ocl.assertQueryEquals(a, orderedSet_b1_b2, "bs");
ocl.assertQueryEquals(a, sequence_c1_c2, "bs?.c");
ocl.assertQueryEquals(a, sequence_c1_c2, "bs?.c.oclAsSet()");
ocl.assertQueryResults(a, "Sequence{'c1','c2'}", "bs?.c?.name");
ocl.assertQueryResults(a, "Sequence{'c1','c2'}", "self.bs?.c?.name");
ocl.assertQueryResults(a, "Sequence{'c1','c2'}", "bs?.c?.oclAsSet().name");
ocl.assertQueryResults(a, "Sequence{'c1','c2'}", "bs?.c?.oclAsSet()->collect(name)"); // Test for Bug 351512
ocl.assertQueryResults(a, "Sequence{'c1','c2'}", "bs?.c?->collect(oclAsSet()).name");
ocl.assertQueryResults(a, "Sequence{'c1','c2'}", "bs?.c?->collect(j : C | j.oclAsSet()).name");
ocl.assertQueryResults(a, "Sequence{'c1','c2'}", "bs?->collect(i : B | i.c)?->collect(j : C | j.oclAsSet())->collect(k : C | k.name)");
ocl.dispose();
}
/**
* Test container/containment navigation.
*/
@Test public void test_containment_navigation() throws Exception {
TestOCL ocl = createOCL();
IdResolver idResolver = ocl.getIdResolver();
String metamodelText =
"package containment : pfx = 'http://containment'\n" +
"{\n" +
" class Parent\n" +
" {\n" +
" property child1 : Child1[?] { ordered composes };\n" +
" property child2#parent : Child2[?] { ordered composes };\n" +
" property children1 : Children1[*] { ordered composes };\n" +
" property children2#parent : Children2[*] { ordered composes };\n" +
" }\n" +
" class Child1\n" +
" {\n" +
" }\n" +
" class Child2\n" +
" {\n" +
" property parent#child2 : Parent[?] { ordered };\n" +
" }\n" +
" class Children1\n" +
" {\n" +
" }\n" +
" class Children2\n" +
" {\n" +
" property parent#children2 : Parent[?] { ordered };\n" +
" }\n" +
"}\n";
OCL ocl1 = createOCL();
Resource metamodel = cs2ecore(ocl1, metamodelText, getTestFileURI("test.ecore"));
EPackage ePackage = (EPackage) metamodel.getContents().get(0);
EClass parentClass = ClassUtil.nonNullState((EClass) ePackage.getEClassifier("Parent"));
EClass child1Class = ClassUtil.nonNullState((EClass) ePackage.getEClassifier("Child1"));
EClass child2Class = ClassUtil.nonNullState((EClass) ePackage.getEClassifier("Child2"));
EClass children1Class = ClassUtil.nonNullState((EClass) ePackage.getEClassifier("Children1"));
EClass children2Class = ClassUtil.nonNullState((EClass) ePackage.getEClassifier("Children2"));
EObject parent = eCreate(parentClass);
EObject child1 = eCreate(child1Class);
EObject child2 = eCreate(child2Class);
EObject children1 = eCreate(children1Class);
EObject children2 = eCreate(children2Class);
eSet(parent, "child1", child1);
eSet(parent, "child2", child2);
eAdd(parent, "children1", children1);
eAdd(parent, "children2", children2);
org.eclipse.ocl.pivot.Class parentType = idResolver.getType(parentClass);
org.eclipse.ocl.pivot.Class child1Type = idResolver.getType(child1Class);
org.eclipse.ocl.pivot.Class child2Type = idResolver.getType(child2Class);
org.eclipse.ocl.pivot.Class children1Type = idResolver.getType(children1Class);
org.eclipse.ocl.pivot.Class children2Type = idResolver.getType(children2Class);
//
OrderedSetValue kids1 = idResolver.createOrderedSetOfEach(TypeId.ORDERED_SET.getSpecializedId(children1Type.getTypeId()), children1);
OrderedSetValue kids2 = idResolver.createOrderedSetOfEach(TypeId.ORDERED_SET.getSpecializedId(children2Type.getTypeId()), children2);
//
ocl.assertSemanticErrorQuery(parentType, "parent", PivotMessagesInternal.UnresolvedProperty_ERROR_, "", "parent");
ocl.assertSemanticErrorQuery(parentType, "self.parent", PivotMessagesInternal.UnresolvedProperty_ERROR_, parentType, "parent");
ocl.assertQueryEquals(parent, parentType, "Parent");
ocl.assertSemanticErrorQuery(parentType, "self.Parent", PivotMessagesInternal.UnresolvedProperty_ERROR_, parentType, "Parent");
ocl.assertQueryEquals(parent, child1, "child1");
ocl.assertQueryEquals(parent, child1, "self.child1");
ocl.assertQueryEquals(parent, child1Type, "Child1");
ocl.assertSemanticErrorQuery(parentType, "self.Child1", PivotMessagesInternal.UnresolvedProperty_ERROR_, parentType, "Child1");
ocl.assertQueryEquals(parent, child2, "child2");
ocl.assertQueryEquals(parent, child2, "self.child2");
ocl.assertQueryEquals(parent, child2Type, "Child2");
ocl.assertSemanticErrorQuery(parentType, "self.Child2", PivotMessagesInternal.UnresolvedProperty_ERROR_, parentType, "Child2");
ocl.assertQueryEquals(parent, kids1, "children1");
ocl.assertQueryEquals(parent, kids1, "self.children1");
ocl.assertQueryEquals(parent, children1Type, "Children1");
ocl.assertSemanticErrorQuery(parentType, "self.Children1", PivotMessagesInternal.UnresolvedProperty_ERROR_, parentType, "Children1");
ocl.assertQueryEquals(parent, kids2, "children2");
ocl.assertQueryEquals(parent, kids2, "self.children2");
ocl.assertQueryEquals(parent, children2Type, "Children2");
ocl.assertSemanticErrorQuery(parentType, "self.Children2", PivotMessagesInternal.UnresolvedProperty_ERROR_, parentType, "Children2");
//
ocl.assertSemanticErrorQuery(child1Type, "parent", PivotMessagesInternal.UnresolvedProperty_ERROR_, "", "parent");
ocl.assertQueryEquals(child2, parentType, "Parent");
ocl.assertSemanticErrorQuery(child1Type, "self.parent", PivotMessagesInternal.UnresolvedProperty_ERROR_, child1Type, "parent");
ocl.assertQueryEquals(child1, parent, "self.Parent");
//
ocl.assertQueryEquals(child2, parent, "parent");
ocl.assertQueryEquals(child2, parentType, "Parent");
ocl.assertQueryEquals(child2, parent, "self.parent");
ocl.assertSemanticErrorQuery(child2Type, "self.Parent", PivotMessagesInternal.UnresolvedProperty_ERROR_, child2Type, "Parent");
//
ocl.assertSemanticErrorQuery(children1Type, "parent", PivotMessagesInternal.UnresolvedProperty_ERROR_, "", "parent");
ocl.assertQueryEquals(children1, parentType, "Parent");
ocl.assertSemanticErrorQuery(children1Type, "self.parent", PivotMessagesInternal.UnresolvedProperty_ERROR_, children1Type, "parent");
ocl.assertQueryEquals(children1, parent, "self.Parent");
//
ocl.assertQueryEquals(children2, parent, "parent");
ocl.assertQueryEquals(children2, parentType, "Parent");
ocl.assertQueryEquals(children2, parent, "self.parent");
ocl.assertSemanticErrorQuery(children2Type, "self.Parent", PivotMessagesInternal.UnresolvedProperty_ERROR_, children2Type, "Parent");
//
ocl.assertQueryTrue(parent, "child1 = child1");
ocl1.dispose();
ocl.dispose();
}
/**
* Tests that boxed Enumerations are navigable
*/
@Test public void test_enumeration_navigation() throws Exception {
TestOCL ocl = createOCL();
if (!useCodeGen) { // FIXME BUG 458359
ocl.assertQueryResults(CompanyPackage.Literals.COMPANY_SIZE_KIND, "Sequence{'small','medium','large'}", "self.eLiterals.name");
// FIXME the following needs the full UML model to vbe loaded otherwise $uml$ is not a defined root package id.
// UML2AS.initialize(resourceSet);
// ocl.assertQueryResults(UMLPackage.Literals.AGGREGATION_KIND, "Sequence{'none','composite'}", "self.eLiterals.name");
}
ocl.dispose();
}
/**
* Test that Ecore Maps are loaded for MapValue evaluation.
*/
@Test public void test_maps() throws Exception {
TestOCL ocl = createOCLWithProjectMap();
URI uri = URI.createPlatformResourceURI("org.eclipse.emf.ecore/model/Ecore.ecore", true);
EObject ePackage = ocl.getResourceSet().getEObject(uri.appendFragment("/"), true);
//
ocl.assertQueryResults(ePackage, "Set{'baseType','constraints','name'}",
"self.eClassifiers->collect(c | c.eAnnotations)->collect(a | a.details)->collect(m | m->collect(k <- v | k))->asSet()");
// ocl.assertQueryResults(ePackage, "Set{'baseType','constraints','name','suppressedIsSetVisibility','suppressedUnsetVisibility'}",
// "ecore::EAnnotation.allInstances().details->collect(m | m->collect(k <- v | k))->asSet()");
ocl.dispose();
}
/**
* Test multi-container navigation inspired by Bug 394152.
*/
@Test public void test_multi_container_394152() throws Exception {
TestOCL ocl = createOCL();
String metamodelText =
"package bug394152 : pfx = 'http://bug394152'\n" +
"{\n" +
" class Parent\n" +
" {\n" +
" property left#left : Child[+] { ordered composes };\n" +
" property right#right : Child[+] { ordered composes };\n" +
" }\n" +
" class Child\n" +
" {\n" +
" property left#left : Parent[?] { ordered };\n" +
" property right#right : Parent[?] { ordered };\n" +
" }\n" +
"}\n";
Resource metamodel = cs2ecore(ocl, metamodelText, getTestFileURI("test.ecore"));
EPackage ePackage = (EPackage) metamodel.getContents().get(0);
EClass parentClass = (EClass) ePackage.getEClassifier("Parent");
EClass childClass = ClassUtil.nonNullState((EClass) ePackage.getEClassifier("Child"));
EObject parent = eCreate(parentClass);
EObject leftChild = eCreate(childClass);
EObject rightChild = eCreate(childClass);
eAdd(parent, "left", leftChild);
eAdd(parent, "right", rightChild);
//
ocl.assertQueryEquals(leftChild, parent, "left");
ocl.assertQueryEquals(leftChild, null, "right");
ocl.assertQueryEquals(rightChild, null, "left");
ocl.assertQueryEquals(rightChild, parent, "right");
ocl.dispose();
}
@Test public void test_unified_types_411441() throws Exception {
TestOCL ocl = createOCL();
ocl.assertQueryTrue(null, "let x : Collection(Type) = Set{Integer,Real} in x?->forAll(x : Type | x.name.indexOf('e') > 0)");
ocl.assertQueryTrue(null, "let x : Type[*] = Bag{Integer,Real} in x?->forAll(x : Type | x.name.indexOf('e') > 0)");
ocl.assertValidationErrorQuery(null, "let x : Type[*] = Set{Integer,Real} in x?->forAll(x : Type | x.name.indexOf('e') > 0)",
PivotMessages.ValidationConstraintIsNotSatisfied_ERROR_, "LetVariable::CompatibleTypeForInitializer", "x : Bag(Type[*|?]) = Set{Integer, Real}");
ocl.assertQueryTrue(null, "let x : Collection(Collection(Type[*])) = Set{Bag{Integer,Real},Bag{Boolean}} in x?->forAll(x : Collection(Type[*]) | x->size() > 0)");
ocl.assertValidationErrorQuery(null, "let x : Collection(Collection(Type[*])) = Set{Bag{Integer,Real},Bag{Boolean}} in x?->forAll(x : Type | x->size() > 0)",
PivotMessages.ValidationConstraintIsNotSatisfied_ERROR_, "IteratorExp::IteratorTypeIsSourceElementType", "x?->forAll(x : Type[1] | x.oclAsSet()->size().>(0))");
ocl.assertValidationErrorQuery(null, "let x : Collection(Type) = Set{Integer,Real} in x?->forAll(x : Type[*] | x->size() > 0)",
PivotMessages.ValidationConstraintIsNotSatisfied_ERROR_, "IteratorExp::IteratorTypeIsSourceElementType", "x?->forAll(x : Bag(Type[*|?]) | x->size().>(0))");
ocl.dispose();
}
@Test
public void test_ecore_collection_equality() throws Exception {
TestOCL ocl = createOCL();
//
EList<EStructuralFeature> eStructuralFeatures = EcorePackage.Literals.ECLASS.getEStructuralFeatures();
ocl.assertQueryOCLEquals(EcorePackage.Literals.ECLASS, eStructuralFeatures, "self.eStructuralFeatures");
//
ocl.assertQueryOCLNotEquals(EcorePackage.Literals.ECLASS, eStructuralFeatures, "self.eStructuralFeatures->asBag()");
ocl.assertQueryOCLEquals(EcorePackage.Literals.ECLASS, eStructuralFeatures, "self.eStructuralFeatures->asOrderedSet()");
ocl.assertQueryOCLNotEquals(EcorePackage.Literals.ECLASS, eStructuralFeatures, "self.eStructuralFeatures->asSequence()");
ocl.assertQueryOCLNotEquals(EcorePackage.Literals.ECLASS, eStructuralFeatures, "self.eStructuralFeatures->asSet()");
//
ocl.assertQueryOCLNotEquals(EcorePackage.Literals.ECLASS, new HashSet<>(eStructuralFeatures), "self.eStructuralFeatures->asBag()");
ocl.assertQueryOCLNotEquals(EcorePackage.Literals.ECLASS, new HashSet<>(eStructuralFeatures), "self.eStructuralFeatures->asOrderedSet()");
ocl.assertQueryOCLNotEquals(EcorePackage.Literals.ECLASS, new HashSet<>(eStructuralFeatures), "self.eStructuralFeatures->asSequence()");
ocl.assertQueryOCLEquals(EcorePackage.Literals.ECLASS, new HashSet<>(eStructuralFeatures), "self.eStructuralFeatures->asSet()");
//
ocl.assertQueryOCLNotEquals(EcorePackage.Literals.ECLASS, new ArrayList<>(eStructuralFeatures), "self.eStructuralFeatures->asBag()");
ocl.assertQueryOCLNotEquals(EcorePackage.Literals.ECLASS, new ArrayList<>(eStructuralFeatures), "self.eStructuralFeatures->asOrderedSet()");
ocl.assertQueryOCLEquals(EcorePackage.Literals.ECLASS, new ArrayList<>(eStructuralFeatures), "self.eStructuralFeatures->asSequence()");
ocl.assertQueryOCLNotEquals(EcorePackage.Literals.ECLASS, new ArrayList<>(eStructuralFeatures), "self.eStructuralFeatures->asSequence()->reverse()");
ocl.assertQueryOCLNotEquals(EcorePackage.Literals.ECLASS, new ArrayList<>(eStructuralFeatures), "self.eStructuralFeatures->asSet()");
//
ocl.assertQueryOCLNotEquals(EcorePackage.Literals.ECLASS, new LinkedHashSet<>(eStructuralFeatures), "self.eStructuralFeatures->asBag()");
ocl.assertQueryOCLEquals(EcorePackage.Literals.ECLASS, new LinkedHashSet<>(eStructuralFeatures), "self.eStructuralFeatures->asOrderedSet()");
ocl.assertQueryOCLNotEquals(EcorePackage.Literals.ECLASS, new LinkedHashSet<>(eStructuralFeatures), "self.eStructuralFeatures->asOrderedSet()->reverse()");
ocl.assertQueryOCLNotEquals(EcorePackage.Literals.ECLASS, new LinkedHashSet<>(eStructuralFeatures), "self.eStructuralFeatures->asSequence()");
ocl.assertQueryOCLNotEquals(EcorePackage.Literals.ECLASS, new LinkedHashSet<>(eStructuralFeatures), "self.eStructuralFeatures->asSet()");
//
Iterable<@NonNull EStructuralFeature> eStructuralFeatures2 = ClassUtil.nullFree(eStructuralFeatures);
ocl.assertQueryOCLEquals(EcorePackage.Literals.ECLASS, new BagImpl<>(eStructuralFeatures2), "self.eStructuralFeatures->asBag()");
ocl.assertQueryOCLNotEquals(EcorePackage.Literals.ECLASS, new BagImpl<>(eStructuralFeatures2), "self.eStructuralFeatures->asOrderedSet()");
ocl.assertQueryOCLNotEquals(EcorePackage.Literals.ECLASS, new BagImpl<>(eStructuralFeatures2), "self.eStructuralFeatures->asSequence()");
ocl.assertQueryOCLNotEquals(EcorePackage.Literals.ECLASS, new BagImpl<>(eStructuralFeatures2), "self.eStructuralFeatures->asSet()");
//
ocl.assertQueryOCLEquals(EcorePackage.Literals.ECLASS, org.eclipse.ocl.util.CollectionUtil.createNewBag(eStructuralFeatures), "self.eStructuralFeatures->asBag()");
ocl.assertQueryOCLNotEquals(EcorePackage.Literals.ECLASS, org.eclipse.ocl.util.CollectionUtil.createNewBag(eStructuralFeatures), "self.eStructuralFeatures->asOrderedSet()");
ocl.assertQueryOCLNotEquals(EcorePackage.Literals.ECLASS, org.eclipse.ocl.util.CollectionUtil.createNewBag(eStructuralFeatures), "self.eStructuralFeatures->asSequence()");
ocl.assertQueryOCLNotEquals(EcorePackage.Literals.ECLASS, org.eclipse.ocl.util.CollectionUtil.createNewBag(eStructuralFeatures), "self.eStructuralFeatures->asSet()");
//
ocl.dispose();
}
@Test
public void test_ecore_number_equality() throws Exception {
TestOCL ocl = createOCL();
//
ocl.assertQueryOCLEquals(null, Byte.valueOf((byte)255), "-1");
ocl.assertQueryOCLEquals(null, Character.valueOf((char)255), "255");
ocl.assertQueryOCLEquals(null, Short.valueOf((short)255), "255");
ocl.assertQueryOCLEquals(null, Integer.valueOf(255), "255");
ocl.assertQueryOCLEquals(null, Long.valueOf(255), "255");
ocl.assertQueryOCLEquals(null, BigInteger.valueOf(255), "255");
ocl.assertQueryOCLEquals(null, Float.valueOf(255), "255");
ocl.assertQueryOCLEquals(null, Double.valueOf(255), "255");
ocl.assertQueryOCLEquals(null, BigDecimal.valueOf(255), "255");
//
ocl.assertQueryOCLNotEquals(null, Byte.valueOf((byte)255), "254");
ocl.assertQueryOCLNotEquals(null, Character.valueOf((char)255), "254");
ocl.assertQueryOCLNotEquals(null, Short.valueOf((short)255), "254");
ocl.assertQueryOCLNotEquals(null, Integer.valueOf(255), "254");
ocl.assertQueryOCLNotEquals(null, Long.valueOf(255), "254");
ocl.assertQueryOCLNotEquals(null, BigInteger.valueOf(255), "254");
ocl.assertQueryOCLNotEquals(null, Float.valueOf(255), "255.1");
ocl.assertQueryOCLNotEquals(null, Double.valueOf(255), "255.1");
ocl.assertQueryOCLNotEquals(null, BigDecimal.valueOf(255), "255.1");
//
ocl.dispose();
}
}