/*******************************************************************************
 * 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();
	}
}
