/**
 * Copyright (c) 2009, 2018 Obeo 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:
 *     Obeo - initial API and implementation
 *     Axel Uhl (SAP AG) - Bug 342644
 */
package org.eclipse.ocl.tests;

import org.eclipse.emf.common.util.Diagnostic;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.ocl.SemanticException;
import org.eclipse.ocl.internal.l10n.OCLMessages;
import org.eclipse.ocl.util.CollectionUtil;

// FIXME we're missing oclIsNew and oclIsInState
/**
 * This unit test focuses on the Standard library's Collection operations.
 * 
 * @author Laurent Goubet (lgoubet)
 */
@SuppressWarnings("nls")
public abstract class GenericEvaluationCollectionOperationTest<E extends EObject, PK extends E, T extends E, C extends T, CLS extends C, DT extends C, PT extends C, ET extends DT, O extends E, PM extends E, P extends E, PA extends P, PR extends P, EL, S, COA, SSA, CT>
extends GenericEvaluationTestSuite<E, PK, T, C, CLS, DT, PT, ET, O, PM, P, PA, PR, EL, S, COA, SSA, CT> {

	public void testCollectionAppend() {
		assertExpressionResults("Sequence{'a', 'b', 'c'}", "Sequence{'a', 'b'}->append('c')");
		assertExpressionResults("OrderedSet{'a', 'b', 'c'}", "OrderedSet{'a', 'b'}->append('c')");
	}

	public void testCollectionAppendInvalid() {
		assertResultInvalid("let s : Sequence(String) = invalid in s->append('a')");
		assertResultInvalid("let o : OrderedSet(String) = invalid in o->append('a')");
	}

	public void testCollectionAppendInvalidValue() {
		assertResultInvalid("Sequence{'a', 'b'}->append(invalid)");
		assertResultInvalid("OrderedSet{'a', 'b'}->append(invalid)");
	}

	public void testCollectionAppendNull() {
		assertResultInvalid("let s : Sequence(String) = null in s->append('a')");
		assertResultInvalid("let o : OrderedSet(String) = null in o->append('a')");
	}

	public void testCollectionAppendNullValue() {
		assertExpressionResults("Sequence{'a', 'b', null}", "Sequence{'a', 'b'}->append(null)");
		assertExpressionResults("OrderedSet{'a', 'b', null}", "OrderedSet{'a', 'b'}->append(null)");
	}

	public void testCollectionAsBag() {
		assertResult(CollectionUtil.createNewBag(), "Sequence{}->asBag()");
		assertResult(CollectionUtil.createNewBag(), "Bag{}->asBag()");
		assertResult(CollectionUtil.createNewBag(), "Set{}->asBag()");
		assertResult(CollectionUtil.createNewBag(), "OrderedSet{}->asBag()");

		assertExpressionResults("Bag{1, 2.0, '3'}", "Sequence{1, 2.0, '3'}->asBag()");
		assertExpressionResults("Bag{1, 2.0, '3'}", "Bag{1, 2.0, '3'}->asBag()");
		assertExpressionResults("Bag{1, 2.0, '3'}", "Set{1, 2.0, '3'}->asBag()");
		assertExpressionResults("Bag{1, 2.0, '3'}", "OrderedSet{1, 2.0, '3'}->asBag()");
	}

	public void testCollectionAsBagInvalid() {
		assertResultInvalid("let s : Sequence(Integer) = invalid in s->asBag()");
		assertResultInvalid("let b : Bag(Integer) = invalid in b->asBag()");
		assertResultInvalid("let s : Set(Integer) = invalid in s->asBag()");
		assertResultInvalid("let o : OrderedSet(Integer) = invalid in o->asBag()");
	}

	public void testCollectionAsBagNull() {
		assertResultInvalid("let s : Sequence(Integer) = null in s->asBag()");
		assertResultInvalid("let b : Bag(Integer) = null in b->asBag()");
		assertResultInvalid("let s : Set(Integer) = null in s->asBag()");
		assertResultInvalid("let o : OrderedSet(Integer) = null in o->asBag()");
	}

	public void testCollectionAsOrderedSet() {
		assertResult(CollectionUtil.createNewOrderedSet(),
			"Sequence{}->asOrderedSet()");
		assertResult(CollectionUtil.createNewOrderedSet(),
			"Bag{}->asOrderedSet()");
		assertResult(CollectionUtil.createNewOrderedSet(),
			"Set{}->asOrderedSet()");
		assertResult(CollectionUtil.createNewOrderedSet(),
			"OrderedSet{}->asOrderedSet()");

		assertExpressionResults("OrderedSet{1, 2.0, '3'}", "Sequence{1, 2.0, '3'}->asOrderedSet()");
		assertExpressionResults("OrderedSet{1, 2.0, '3'}", "OrderedSet{1, 2.0, '3'}->asOrderedSet()");

		/*
		 * Bag and Set are not ordered, simply check that the result is an
		 * OrderedSet and it contains all needed values.
		 */
		assertResultContainsAll("OrderedSet{1, 2.0, '3'}", "Set{1, 2.0, '3'}->asOrderedSet()");
		assertResultContainsAll("OrderedSet{1, 2.0, '3'}", "Bag{1, 2.0, '3'}->asOrderedSet()");
	}

	public void testCollectionAsOrderedSetInvalid() {
		assertResultInvalid("let s : Sequence(Integer) = invalid in s->asOrderedSet()");
		assertResultInvalid("let b : Bag(Integer) = invalid in b->asOrderedSet()");
		assertResultInvalid("let s : Set(Integer) = invalid in s->asOrderedSet()");
		assertResultInvalid("let o : OrderedSet(Integer) = invalid in o->asOrderedSet()");
	}

	public void testCollectionAsOrderedSetNull() {
		assertResultInvalid("let s : Sequence(Integer) = null in s->asOrderedSet()");
		assertResultInvalid("let b : Bag(Integer) = null in b->asOrderedSet()");
		assertResultInvalid("let s : Set(Integer) = null in s->asOrderedSet()");
		assertResultInvalid("let o : OrderedSet(Integer) = null in o->asOrderedSet()");
	}

	public void testCollectionAsSequence() {
		assertResult(CollectionUtil.createNewSequence(),
			"Sequence{}->asSequence()");
		assertResult(CollectionUtil.createNewSequence(), "Bag{}->asSequence()");
		assertResult(CollectionUtil.createNewSequence(), "Set{}->asSequence()");
		assertResult(CollectionUtil.createNewSequence(),
			"OrderedSet{}->asSequence()");

		assertExpressionResults("Sequence{1, 2.0, '3'}", "Sequence{1, 2.0, '3'}->asSequence()");
		assertExpressionResults("Sequence{1, 2.0, '3'}", "OrderedSet{1, 2.0, '3'}->asSequence()");

		/*
		 * Bag and Set are not ordered, simply check that the result is a
		 * Sequence and it contains all needed values.
		 */
		assertResultContainsAll("Sequence{1, 2.0, '3'}", "Bag{1, 2.0, '3'}->asSequence()");
		assertResultContainsAll("Sequence{1, 2.0, '3'}", "Set{1, 2.0, '3'}->asSequence()");
	}

	public void testCollectionAsSequenceInvalid() {
		assertResultInvalid("let s : Sequence(Integer) = invalid in s->asSequence()");
		assertResultInvalid("let b : Bag(Integer) = invalid in b->asSequence()");
		assertResultInvalid("let s : Set(Integer) = invalid in s->asSequence()");
		assertResultInvalid("let o : OrderedSet(Integer) = invalid in o->asSequence()");
	}

	public void testCollectionAsSequenceNull() {
		assertResultInvalid("let s : Sequence(Integer) = null in s->asSequence()");
		assertResultInvalid("let b : Bag(Integer) = null in b->asSequence()");
		assertResultInvalid("let s : Set(Integer) = null in s->asSequence()");
		assertResultInvalid("let o : OrderedSet(Integer) = null in o->asSequence()");
	}

	public void testCollectionAsSet() {
		assertResult(CollectionUtil.createNewSet(), "Sequence{}->asSet()");
		assertResult(CollectionUtil.createNewSet(), "Bag{}->asSet()");
		assertResult(CollectionUtil.createNewSet(), "Set{}->asSet()");
		assertResult(CollectionUtil.createNewSet(), "OrderedSet{}->asSet()");

		assertExpressionResults("Set{1, 2.0, '3'}", "Sequence{1, 2.0, '3'}->asSet()");
		assertResultContainsAll("Set{1, 2.0, '3'}", "Bag{1, 2.0, '3'}->asSet()");
		assertResultContainsAll("Set{1, 2.0, '3'}", "Set{1, 2.0, '3'}->asSet()");
		assertExpressionResults("Set{1, 2.0, '3'}", "OrderedSet{1, 2.0, '3'}->asSet()");
	}

	public void testCollectionAsSetInvalid() {
		assertResultInvalid("let s : Sequence(Integer) = invalid in s->asSet()");
		assertResultInvalid("let b : Bag(Integer) = invalid in b->asSet()");
		assertResultInvalid("let s : Set(Integer) = invalid in s->asSet()");
		assertResultInvalid("let o : OrderedSet(Integer) = invalid in o->asSet()");
	}

	public void testCollectionAsSetNull() {
		assertResultInvalid("let s : Sequence(Integer) = null in s->asSet()");
		assertResultInvalid("let b : Bag(Integer) = null in b->asSet()");
		assertResultInvalid("let s : Set(Integer) = null in s->asSet()");
		assertResultInvalid("let o : OrderedSet(Integer) = null in o->asSet()");
	}

	public void testCollectionAt() {
		assertResult("a", "Sequence{'a', 'b'}->at(1)");
		assertResult("b", "OrderedSet{'a', 'b'}->at(2)");
	}

	public void testCollectionAtInvalid() {
		assertResultInvalid("let s : Sequence(String) = invalid in s->at(1)");
		assertResultInvalid("let o : OrderedSet(String) = invalid in o->at(1)");
	}

	public void testCollectionAtInvalidValue() {
		assertResultInvalid("Sequence{'a', invalid}->at(1)");
		assertResultInvalid("OrderedSet{'a', invalid}->at(1)");
	}

	public void testCollectionAtNull() {
		assertResultInvalid("let s : Sequence(String) = null in s->at(1)");
		assertResultInvalid("let o : OrderedSet(String) = null in o->at(1)");
	}

	public void testCollectionAtNullValue() {
		assertResult(null, "Sequence{null, 'a'}->at(1)");
		assertResult(null, "OrderedSet{null, 'a'}->at(1)");
	}

	public void testCollectionAtOutOfBounds() {
		assertResultInvalid("Sequence{'a'}->at(0)");
		assertResultInvalid("OrderedSet{'a'}->at(0)");

		assertResultInvalid("Sequence{'a'}->at(2)");
		assertResultInvalid("OrderedSet{'a'}->at(2)");
	}

	public void testCollectionCount() {
		assertResult(Integer.valueOf(1),
			"Sequence{3, 'test', 4.0, 4, 4.0, 'test'}->count(3)");
		assertResult(Integer.valueOf(3),
			"Sequence{3, 'test', 4.0, 4, 4.0, 'test'}->count(4.0)");
		assertResult(Integer.valueOf(2),
			"Sequence{3, 'test', 4.0, 4, 4.0, 'test'}->count('test')");
		assertResult(Integer.valueOf(1),
			"Bag{3, 'test', 4.0, 4, 4.0, 'test'}->count(3)");
		assertResult(Integer.valueOf(3),
			"Bag{3, 'test', 4.0, 4, 4.0, 'test'}->count(4.0)");
		assertResult(Integer.valueOf(2),
			"Bag{3, 'test', 4.0, 4, 4.0, 'test'}->count('test')");
		assertResult(Integer.valueOf(1),
			"Set{3, 'test', 4.0, 4, 4.0, 'test'}->count(3)");
		// FIXME number values currently have different Java equality from OCL equality
		//assertResult(Integer.valueOf(1),
		//	"Set{3, 'test', 4.0, 4, 4.0, 'test'}->count(4.0)");
		assertResult(Integer.valueOf(1),
			"Set{3, 'test', 4.0, 4, 4.0, 'test'}->count('test')");
		assertResult(Integer.valueOf(1),
			"OrderedSet{3, 'test', 4.0, 4, 4.0, 'test'}->count(3)");
		// FIXME number values currently have different Java equality from OCL equality
		//assertResult(Integer.valueOf(1),
		//	"OrderedSet{3, 'test', 4.0, 4, 4.0, 'test'}->count(4.0)");
		assertResult(Integer.valueOf(1),
			"OrderedSet{3, 'test', 4.0, 4, 4.0, 'test'}->count('test')");

		assertResult(Integer.valueOf(0),
			"Sequence{3, 'test', 4.0, 4, 4.0, 'test'}->count(0)");
		assertResult(Integer.valueOf(0),
			"Bag{3, 'test', 4.0, 4, 4.0, 'test'}->count(0)");
		assertResult(Integer.valueOf(0),
			"Set{3, 'test', 4.0, 4, 4.0, 'test'}->count(0)");
		assertResult(Integer.valueOf(0),
			"OrderedSet{3, 'test', 4.0, 4, 4.0, 'test'}->count(0)");
	}

	public void testCollectionCountInvalid() {
		assertResultInvalid("let s : Sequence(Integer) = invalid in s->count(0)");
		assertResultInvalid("let b : Bag(Integer) = invalid in b->count(0)");
		assertResultInvalid("let s : Set(Integer) = invalid in s->count(0)");
		assertResultInvalid("let os : OrderedSet(Integer) = invalid in os->count(0)");
	}

	public void testCollectionCountInvalidValue() {
		assertResultInvalid("Sequence{3, 'test', 4.0, 4, 4.0, 'test'}->count(invalid)");
		assertResultInvalid("Bag{3, 'test', 4.0, 4, 4.0, 'test'}->count(invalid)");
		assertResultInvalid("Set{3, 'test', 4.0, 4, 4.0, 'test'}->count(invalid)");
		assertResultInvalid("OrderedSet{3, 'test', 4.0, 4, 4.0, 'test'}->count(invalid)");

		assertResultInvalid("Sequence{3, invalid, 4.0, invalid, 'test'}->count(3)");
		assertResultInvalid("Bag{3, invalid, 4.0, invalid, 'test'}->count(3)");
		assertResultInvalid("Set{3, invalid, 4.0, invalid, 'test'}->count(3)");
		assertResultInvalid("OrderedSet{3, invalid, 4.0, invalid, 'test'}->count(3)");
	}

	public void testCollectionCountNull() {
		assertResultInvalid("let s : Sequence(Integer) = null in s->count(0)");
		assertResultInvalid("let b : Bag(Integer) = null in b->count(0)");
		assertResultInvalid("let s : Set(Integer) = null in s->count(0)");
		assertResultInvalid("let os : OrderedSet(Integer) = null in os->count(0)");
	}

	public void testCollectionCountNullValue() {
		assertResult(Integer.valueOf(0),
			"Sequence{3, 'test', 4.0, 4, 4.0, 'test'}->count(null)");
		assertResult(Integer.valueOf(0),
			"Bag{3, 'test', 4.0, 4, 4.0, 'test'}->count(null)");
		assertResult(Integer.valueOf(0),
			"Set{3, 'test', 4.0, 4, 4.0, 'test'}->count(null)");
		assertResult(Integer.valueOf(0),
			"OrderedSet{3, 'test', 4.0, 4, 4.0, 'test'}->count(null)");

		assertResult(Integer.valueOf(2),
			"Sequence{3, null, 4.0, null, 'test'}->count(null)");
		assertResult(Integer.valueOf(2),
			"Bag{3, null, 4.0, null, 'test'}->count(null)");
		assertResult(Integer.valueOf(1),
			"Set{3, null, 4.0, null, 'test'}->count(null)");
		assertResult(Integer.valueOf(1),
			"OrderedSet{3, null, 4.0, null, 'test'}->count(null)");
	}

	public void testCollectionEqualInvalid() {
		// operation invocations on invalid except for oclIsInvalid and oclIsUndefined yield invalid
		assertResultInvalid("let s : Sequence(Integer) = invalid in s = Sequence{5}");
		assertResultInvalid("let b : Bag(Integer) = invalid in Bag{5} = b");
		assertResultInvalid("let s : Set(Integer) = invalid in s = Set{5}");
		assertResultInvalid("let o : OrderedSet(Integer) = invalid in OrderedSet{5} = o");

		assertResultInvalid("let s1 : Sequence(Integer) = invalid, s2 : Sequence(Integer) = invalid in s1 = s2");
		assertResultInvalid("let b1 : Bag(Integer) = invalid, b2 : Bag(Integer) = invalid in b1 = b2");
		assertResultInvalid("let s1 : Set(Integer) = invalid, s2 : Set(Integer) = invalid in s1 = s2");
		assertResultInvalid("let o1 : OrderedSet(Integer) = invalid, o2 : OrderedSet(Integer) = invalid in o1 = o2");
	}

	public void testCollectionEqualNull() {
		assertResultFalse("let s : Sequence(Integer) = null in s = Sequence{5}");
		assertResultFalse("let b : Bag(Integer) = null in Bag{5} = b");
		assertResultFalse("let s : Set(Integer) = null in s = Set{5}");
		assertResultFalse("let o : OrderedSet(Integer) = null in OrderedSet{5} = o");

		assertResultTrue("let s1 : Sequence(Integer) = null, s2 : Sequence(Integer) = null in s1 = s2");
		assertResultTrue("let b1 : Bag(Integer) = null, b2 : Bag(Integer) = null in b1 = b2");
		assertResultTrue("let s1 : Set(Integer) = null, s2 : Set(Integer) = null in s1 = s2");
		assertResultTrue("let o1 : OrderedSet(Integer) = null, o2 : OrderedSet(Integer) = null in o1 = o2");
	}

	public void testCollectionEqualOrderedXOrdered() {
		// same order, same quantities
		assertResultTrue("Sequence{4, 5, 'test'} = Sequence{4, 5, 'test'}");
		assertResultTrue("Sequence{4, 5, 'test', 5} = Sequence{4, 5, 'test', 5}");
		assertResultTrue("OrderedSet{4, 5, 'test', 5} = OrderedSet{4, 5, 'test'}");
		// OrderedSet comparison shall respect ordering
		assertResultFalse("OrderedSet{4, 5, 6} = OrderedSet{6, 4, 5}");
		// according to 11.7.1 two collections not of the same kind are not equal
		// The following don't parse because:
		// "Cannot find operation (=(OrderedSet(OclAny))) for the type (Sequence(OclAny))"
		//		assertResultFalse("Sequence{4, 5, 'test'} = OrderedSet{4, 5, 'test', 5}");
		//		assertResultFalse("OrderedSet{4, 5, 'test', 5} = Sequence{4, 5, 'test'}");

		// distinct order, same quantities
		assertResultFalse("Sequence{4, 5, 'test'} = Sequence{4, 'test', 5}");
		assertResultFalse("Sequence{4, 5, 'test', 5} = Sequence{5, 4, 'test', 5}");
		// The following seems not clearly specified:
		// assertResultFalse("OrderedSet{4, 5, 'test', 5} = OrderedSet{4, 'test', 5}");
		// The following don't parse because:
		// "Cannot find operation (=(OrderedSet(OclAny))) for the type (Sequence(OclAny))"
		//		assertResultFalse("Sequence{4, 5, 'test'} = OrderedSet{5, 4, 'test', 5}");
		//		assertResultFalse("OrderedSet{4, 5, 'test', 5} = Sequence{5, 4, 'test'}");

		// distinct quantities
		assertResultFalse("Sequence{4, 5, 'test', 5} = Sequence{4, 5, 'test'}");
		// The following don't parse because:
		// "Cannot find operation (=(OrderedSet(OclAny))) for the type (Sequence(OclAny))"
		//		assertResultFalse("Sequence{4, 5, 'test', 5} = OrderedSet{4, 5, 'test', 5}");
		//		assertResultFalse("OrderedSet{4, 5, 'test', 5} = Sequence{4, 5, 'test', 5}");
	}

	public void testCollectionEqualUnorderedXUnordered() {
		// same quantities
		// doesn't parse because = for different collection types is currently not supported
		// assertResultTrue("Bag{4, 5, 'test'} = Set{4, 'test', 5, 4}");
		assertResultTrue("Bag{4, 5, 'test', 4} = Bag{4, 'test', 5, 4}");
		assertResultTrue("Set{4, 5, 'test', 4} = Set{4, 'test', 5, 4}");
		// assertResultTrue("Set{4, 5, 'test', 4} = Bag{4, 'test', 5}");

		// distinct quantities
		// assertResultFalse("Bag{4, 5, 'test', 4} = Set{4, 'test', 5, 4}");
		assertResultFalse("Bag{4, 5, 'test'} = Bag{4, 'test', 5, 4}");
		// assertResultFalse("Set{4, 5, 'test', 4} = Bag{4, 'test', 5, 4}");
	}

	public void testCollectionExcludes() {
		assertResultFalse("Sequence{3, 4.0, 'test'}->excludes(3)");
		assertResultFalse("Sequence{3, 4.0, 'test'}->excludes('test')");
		assertResultFalse("Bag{3, 4.0, 'test'}->excludes(3)");
		assertResultFalse("Bag{3, 4.0, 'test'}->excludes('test')");
		assertResultFalse("Set{3, 4.0, 'test'}->excludes(3)");
		assertResultFalse("Set{3, 4.0, 'test'}->excludes('test')");
		assertResultFalse("OrderedSet{3, 4.0, 'test'}->excludes(3)");
		assertResultFalse("OrderedSet{3, 4.0, 'test'}->excludes('test')");

		assertResultTrue("Sequence{3, 4.0, 'test'}->excludes(3.0)");
		assertResultTrue("Sequence{3, 4.0, 'test'}->excludes(4)");
		assertResultTrue("Bag{3, 4.0, 'test'}->excludes(3.0)");
		assertResultTrue("Bag{3, 4.0, 'test'}->excludes(4)");
		assertResultTrue("Set{3, 4.0, 'test'}->excludes(3.0)");
		assertResultTrue("Set{3, 4.0, 'test'}->excludes(4)");
		assertResultTrue("OrderedSet{3, 4.0, 'test'}->excludes(3.0)");
		assertResultTrue("OrderedSet{3, 4.0, 'test'}->excludes(4)");
	}

	public void testCollectionExcludesAll() {
		assertResultFalse("Sequence{3, 4.0, 'test'}->excludesAll(Sequence{3, 'test'})");
		assertResultFalse("Sequence{3, 4.0, 'test'}->excludesAll(Bag{3, 'test'})");
		assertResultFalse("Sequence{3, 4.0, 'test'}->excludesAll(Set{3, 'test'})");
		assertResultFalse("Sequence{3, 4.0, 'test'}->excludesAll(OrderedSet{3, 'test'})");
		assertResultFalse("Bag{3, 4.0, 'test'}->excludesAll(Sequence{3, 'test'})");
		assertResultFalse("Bag{3, 4.0, 'test'}->excludesAll(Bag{3, 'test'})");
		assertResultFalse("Bag{3, 4.0, 'test'}->excludesAll(Set{3, 'test'})");
		assertResultFalse("Bag{3, 4.0, 'test'}->excludesAll(OrderedSet{3, 'test'})");
		assertResultFalse("Set{3, 4.0, 'test'}->excludesAll(Sequence{3, 'test'})");
		assertResultFalse("Set{3, 4.0, 'test'}->excludesAll(Bag{3, 'test'})");
		assertResultFalse("Set{3, 4.0, 'test'}->excludesAll(Set{3, 'test'})");
		assertResultFalse("Set{3, 4.0, 'test'}->excludesAll(OrderedSet{3, 'test'})");
		assertResultFalse("OrderedSet{3, 4.0, 'test'}->excludesAll(Sequence{3, 'test'})");
		assertResultFalse("OrderedSet{3, 4.0, 'test'}->excludesAll(Bag{3, 'test'})");
		assertResultFalse("OrderedSet{3, 4.0, 'test'}->excludesAll(Set{3, 'test'})");
		assertResultFalse("OrderedSet{3, 4.0, 'test'}->excludesAll(OrderedSet{3, 'test'})");

		assertResultTrue("Sequence{3, 4.0, 'test'}->excludesAll(Sequence{3.0, 4, 'TEST'})");
		assertResultTrue("Sequence{3, 4.0, 'test'}->excludesAll(Bag{3.0, 4, 'TEST'})");
		assertResultTrue("Sequence{3, 4.0, 'test'}->excludesAll(Set{3.0, 4, 'TEST'})");
		assertResultTrue("Sequence{3, 4.0, 'test'}->excludesAll(OrderedSet{3.0, 4, 'TEST'})");
		assertResultTrue("Bag{3, 4.0, 'test'}->excludesAll(Sequence{3.0, 4, 'TEST'})");
		assertResultTrue("Bag{3, 4.0, 'test'}->excludesAll(Bag{3.0, 4, 'TEST'})");
		assertResultTrue("Bag{3, 4.0, 'test'}->excludesAll(Set{3.0, 4, 'TEST'})");
		assertResultTrue("Bag{3, 4.0, 'test'}->excludesAll(OrderedSet{3.0, 4, 'TEST'})");
		assertResultTrue("Set{3, 4.0, 'test'}->excludesAll(Sequence{3.0, 4, 'TEST'})");
		assertResultTrue("Set{3, 4.0, 'test'}->excludesAll(Bag{3.0, 4, 'TEST'})");
		assertResultTrue("Set{3, 4.0, 'test'}->excludesAll(Set{3.0, 4, 'TEST'})");
		assertResultTrue("Set{3, 4.0, 'test'}->excludesAll(OrderedSet{3.0, 4, 'TEST'})");
		assertResultTrue("OrderedSet{3, 4.0, 'test'}->excludesAll(Sequence{3.0, 4, 'TEST'})");
		assertResultTrue("OrderedSet{3, 4.0, 'test'}->excludesAll(Bag{3.0, 4, 'TEST'})");
		assertResultTrue("OrderedSet{3, 4.0, 'test'}->excludesAll(Set{3.0, 4, 'TEST'})");
		assertResultTrue("OrderedSet{3, 4.0, 'test'}->excludesAll(OrderedSet{3.0, 4, 'TEST'})");
	}

	public void testCollectionExcludesAllInvalid() {
		assertResultInvalid("let s : Sequence(Integer) = invalid in s->excludesAll(Sequence{0})");
		assertResultInvalid("let b : Bag(Integer) = invalid in b->excludesAll(Bag{0})");
		assertResultInvalid("let s : Set(Integer) = invalid in s->excludesAll(Set{0})");
		assertResultInvalid("let os : OrderedSet(Integer) = invalid in os->excludesAll(OrderedSet{0})");

		assertResultInvalid("let s : Sequence(Integer) = invalid in Sequence{0}->excludesAll(s)");
		assertResultInvalid("let b : Bag(Integer) = invalid in Bag{0}->excludesAll(b)");
		assertResultInvalid("let s : Set(Integer) = invalid in Set{0}->excludesAll(s)");
		assertResultInvalid("let os : OrderedSet(Integer) = invalid in OrderedSet{0}->excludesAll(os)");
	}

	public void testCollectionExcludesAllInvalidValue() {
		// Collections can't contain the invalid value
		assertResultInvalid("Sequence{3, 4, invalid, 'test'}->excludesAll(OrderedSet{'test'})");
		assertResultInvalid("Bag{3, 4, invalid, 'test'}->excludesAll(Set{'test'})");
		assertResultInvalid("Set{3, 4, invalid, 'test'}->excludesAll(Bag{'test'})");
		assertResultInvalid("OrderedSet{3, 4, invalid, 'test'}->excludesAll(Sequence{'test'})");

		assertResultInvalid("Sequence{3, 4, 'test'}->excludesAll(OrderedSet{'test', invalid})");
		assertResultInvalid("Bag{3, 4, 'test'}->excludesAll(Set{'test', invalid})");
		assertResultInvalid("Set{3, 4, 'test'}->excludesAll(Bag{'test', invalid})");
		assertResultInvalid("OrderedSet{3, 4, 'test'}->excludesAll(Sequence{'test', invalid})");
	}

	public void testCollectionExcludesAllNull() {
		assertResultInvalid("let s : Sequence(Integer) = null in s->excludesAll(Sequence{0})");
		assertResultInvalid("let b : Bag(Integer) = null in b->excludesAll(Bag{0})");
		assertResultInvalid("let s : Set(Integer) = null in s->excludesAll(Set{0})");
		assertResultInvalid("let os : OrderedSet(Integer) = null in os->excludesAll(OrderedSet{0})");

		assertResultInvalid("let s : Sequence(Integer) = null in Sequence{0}->excludesAll(s)");
		assertResultInvalid("let b : Bag(Integer) = null in Bag{0}->excludesAll(b)");
		assertResultInvalid("let s : Set(Integer) = null in Set{0}->excludesAll(s)");
		assertResultInvalid("let os : OrderedSet(Integer) = null in OrderedSet{0}->excludesAll(os)");
	}

	public void testCollectionExcludesAllNullValue() {
		assertResultFalse("Sequence{3, 4, null, 'test'}->excludesAll(OrderedSet{'TEST', null})");
		assertResultFalse("Bag{3, 4, null, 'test'}->excludesAll(Set{'TEST', null})");
		assertResultFalse("Set{3, 4, null, 'test'}->excludesAll(Bag{'TEST', null})");
		assertResultFalse("OrderedSet{3, 4, null, 'test'}->excludesAll(Sequence{'TEST', null})");

		assertResultTrue("Sequence{3, 4, 'test'}->excludesAll(OrderedSet{'TEST', null})");
		assertResultTrue("Bag{3, 4, 'test'}->excludesAll(Set{'TEST', null})");
		assertResultTrue("Set{3, 4, 'test'}->excludesAll(Bag{'TEST', null})");
		assertResultTrue("OrderedSet{3, 4, 'test'}->excludesAll(Sequence{'TEST', null})");
	}

	public void testCollectionExcludesInvalid() {
		assertResultInvalid("let s : Sequence(Integer) = invalid in s->excludes(0)");
		assertResultInvalid("let b : Bag(Integer) = invalid in b->excludes(0)");
		assertResultInvalid("let s : Set(Integer) = invalid in s->excludes(0)");
		assertResultInvalid("let os : OrderedSet(Integer) = invalid in os->excludes(0)");
	}

	public void testCollectionExcludesInvalidValue() {
		assertResultInvalid("Sequence{3, 4.0, 'test'}->excludes(invalid)");
		assertResultInvalid("Bag{3, 4.0, 'test'}->excludes(invalid)");
		assertResultInvalid("Set{3, 4.0, 'test'}->excludes(invalid)");
		assertResultInvalid("OrderedSet{3, 4.0, 'test'}->excludes(invalid)");

		assertResultInvalid("Sequence{0, invalid}->excludes(0)");
		assertResultInvalid("Bag{0, invalid}->excludes(0)");
		assertResultInvalid("Set{0, invalid}->excludes(0)");
		assertResultInvalid("OrderedSet{0, invalid}->excludes(0)");
	}

	public void testCollectionExcludesNull() {
		assertResultInvalid("let s : Sequence(Integer) = null in s->excludes(0)");
		assertResultInvalid("let b : Bag(Integer) = null in b->excludes(0)");
		assertResultInvalid("let s : Set(Integer) = null in s->excludes(0)");
		assertResultInvalid("let os : OrderedSet(Integer) = null in os->excludes(0)");
	}

	public void testCollectionExcludesNullValue() {
		assertResultFalse("Sequence{3, 4.0, null, 'test'}->excludes(null)");
		assertResultFalse("Sequence{null}->excludes(null)");
		assertResultFalse("Bag{3, 4.0, null, 'test'}->excludes(null)");
		assertResultFalse("Bag{null}->excludes(null)");
		assertResultFalse("Set{3, 4.0, null, 'test'}->excludes(null)");
		assertResultFalse("Set{null}->excludes(null)");
		assertResultFalse("OrderedSet{3, 4.0, null, 'test'}->excludes(null)");
		assertResultFalse("OrderedSet{null}->excludes(null)");

		assertResultTrue("Sequence{3, 4.0, 'test'}->excludes(null)");
		assertResultTrue("Sequence{}->excludes(null)");
		assertResultTrue("Bag{3, 4.0, 'test'}->excludes(null)");
		assertResultTrue("Bag{}->excludes(null)");
		assertResultTrue("Set{3, 4.0, 'test'}->excludes(null)");
		assertResultTrue("Set{}->excludes(null)");
		assertResultTrue("OrderedSet{3, 4.0, 'test'}->excludes(null)");
		assertResultTrue("OrderedSet{}->excludes(null)");
	}

	public void testCollectionExcluding() {
		/*
		 * FIXME raise issue for adding OrderedSet::excluding ... especially
		 * since it's defined in oclstdlib.ecore. However the defined
		 * "OrderedSet::excluding(T) : Set" should be
		 * "OrderedSet::excluding(T) : OrderedSet"
		 */
		assertExpressionResults("Sequence{'a', 'c'}", "Sequence{'b', 'a', 'b', 'c'}->excluding('b')");
		assertExpressionResults("Bag{'c', 'a'}", "Bag{'b', 'a', 'b', 'c'}->excluding('b')");
		assertExpressionResults("Set{'c', 'a'}", "Set{'a', 'b', 'c'}->excluding('b')");
		assertExpressionResults("OrderedSet{'a', 'c'}", "OrderedSet{'a', 'b', 'c'}->excluding('b')");
	}

	public void testCollectionExcludingInvalid() {
		assertResultInvalid("let s : Sequence(String) = invalid in s->excluding('a')");
		assertResultInvalid("let b : Bag(String) = invalid in b->excluding('a')");
		assertResultInvalid("let s : Set(String) = invalid in s->excluding('a')");
		assertResultInvalid("let o : OrderedSet(String) = invalid in o->excluding('a')");
	}

	public void testCollectionExcludingInvalidValue() {
		assertResultInvalid("Sequence{'a', 'b'}->excluding(invalid)");
		assertResultInvalid("Bag{'a', 'b'}->excluding(invalid)");
		assertResultInvalid("Set{'a', 'b'}->excluding(invalid)");
		assertResultInvalid("OrderedSet{'a', 'b'}->excluding(invalid)");
	}

	public void testCollectionExcludingNull() {
		assertResultInvalid("let s : Sequence(String) = null in s->excluding('a')");
		assertResultInvalid("let b : Bag(String) = null in b->excluding('a')");
		assertResultInvalid("let s : Set(String) = null in s->excluding('a')");
		assertResultInvalid("let o : OrderedSet(String) = null in o->excluding('a')");
	}

	public void testCollectionExcludingNullValue() {
		// FIXME passes as a side effect of bug 283518
		assertExpressionResults("Sequence{'a', 'b'}", "Sequence{null, 'a', null, 'b'}->excluding(null)");
		assertExpressionResults("Bag{'b', 'a'}", "Bag{null, 'a', null, 'b'}->excluding(null)");
		assertExpressionResults("Set{'b', 'a'}", "Set{'a', null, 'b'}->excluding(null)");
		assertExpressionResults("OrderedSet{'a', 'b'}", "OrderedSet{'a', null, 'b'}->excluding(null)");
	}

	public void testCollectionFirst() {
		assertResultInvalid("Sequence{}->first()");
		assertResultInvalid("OrderedSet{}->first()");

		assertResult(Integer.valueOf(1), "Sequence{1, 2.0, '3'}->first()");
		assertResult(Integer.valueOf(1), "OrderedSet{1, 2.0, '3'}->first()");
	}

	public void testCollectionFirstInvalid() {
		assertResultInvalid("let s : Sequence(Integer) = invalid in s->first()");
		assertResultInvalid("let o : OrderedSet(Integer) = invalid in o->first()");
	}

	public void testCollectionFirstInvalidValue() {
		assertResultInvalid("Sequence{1, invalid}->first()");
		assertResultInvalid("OrderedSet{1, invalid}->first()");
	}

	public void testCollectionFirstNull() {
		assertResultInvalid("let s : Sequence(Integer) = null in s->first()");
		assertResultInvalid("let o : OrderedSet(Integer) = null in o->first()");
	}

	public void testCollectionFirstNullValue() {
		assertResult(null, "Sequence{null}->first()");
		assertResult(null, "OrderedSet{null}->first()");
	}

	public void testCollectionFlatten() {
		assertResult(CollectionUtil.createNewSequence(),
			"Sequence{}->flatten()");
		assertResult(CollectionUtil.createNewBag(), "Bag{}->flatten()");
		assertResult(CollectionUtil.createNewSet(), "Set{}->flatten()");
		// Our implementation chooses to flatten an OrderedSet into an OrderedSet because
		// Section A.2.5.8 of OCL 2.3 (OMG 10-11-42) leaves it unspecified
		assertResult(CollectionUtil.createNewOrderedSet(),
			"OrderedSet{}->flatten()");

		String expression = "Sequence{Set{1,2,3}, Sequence{2.0, 3.0}, Bag{'test'}}->flatten()";
		String expectedResultExpression = "Sequence{1, 2, 3, 2.0, 3.0, 'test'}";
		/*
		 * as the Sequence is ordered and we cannot know in which order the
		 * result of the Set flatenning were inserted, simply check that the
		 * result is a Sequence and contains all elements.
		 */
		assertResultContainsAll(expectedResultExpression, expression);

		expression = "Bag{Set{Bag{'test', 2, 3.0}}, Sequence{OrderedSet{2.0, 3, 1}}}->flatten()";
		expectedResultExpression = "Bag{1, 2, 3, 2.0, 3.0, 'test'}";
		assertExpressionResults(expectedResultExpression, expression);

		expression = "Set{OrderedSet{Set{3.0, 'test'}, Sequence{2.0, 2}, Bag{1, 3}}}->flatten()";
		expectedResultExpression = "Set{1, 2, 3, 2.0, 3.0, 'test'}";
		assertExpressionResults(expectedResultExpression, expression);

		// FIXME The following doesn't currently work because equal numeric values of different
		// types are inserted as distinct elements into Set/OrderedSet based on Java
		// object semantics.
		// expression = "OrderedSet{Set{Set{3.0, 'test'}, Sequence{2.0, 2}, Bag{1, 3}}}->flatten()";
		// expectedResultExpression = "OrderedSet{1, 2, 3, 2.0, 3.0, 'test'}";
		/*
		 * as the OrderedSet is ordered and we cannot know in which order the
		 * result of the Set flatenning were inserted, simply check that the
		 * result is an OrderedSet and contains all elements.
		 */
		// FIXME OrderedSet::flatten() : Set should be OrderedSet::flatten() :
		// OrderedSet
		// assertResultContainsAll(expectedResultExpression, expression);

		// expression = "Set{Sequence{Sequence{3.0, 'test'}}, Sequence{Sequence{2.0, 2}, Sequence{1, 3}}}->flatten()";
		// expectedResultExpression = "Set{1, 2, 3, 2.0, 3.0, 'test'}";
		// assertExpressionResults(expectedResultExpression, expression);
	}

	public void testCollectionFlattenInvalid() {
		assertResultInvalid("let s : Sequence(Integer) = invalid in s->flatten()");
		assertResultInvalid("let b : Bag(Integer) = invalid in b->flatten()");
		assertResultInvalid("let s : Set(Integer) = invalid in s->flatten()");
		assertResultInvalid("let o : OrderedSet(Integer) = invalid in o->flatten()");
	}

	public void testCollectionFlattenNull() {
		assertResultInvalid("let s : Sequence(Integer) = null in s->flatten()");
		assertResultInvalid("let b : Bag(Integer) = null in b->flatten()");
		assertResultInvalid("let s : Set(Integer) = null in s->flatten()");
		assertResultInvalid("let o : OrderedSet(Integer) = null in o->flatten()");
	}

	public void testCollectionIncludes() {
		assertResultTrue("Sequence{3, 4.0, 'test'}->includes(3)");
		assertResultTrue("Sequence{3, 4.0, 'test'}->includes('test')");
		assertResultTrue("Bag{3, 4.0, 'test'}->includes(3)");
		assertResultTrue("Bag{3, 4.0, 'test'}->includes('test')");
		assertResultTrue("Set{3, 4.0, 'test'}->includes(3)");
		assertResultTrue("Set{3, 4.0, 'test'}->includes('test')");
		assertResultTrue("OrderedSet{3, 4.0, 'test'}->includes(3)");
		assertResultTrue("OrderedSet{3, 4.0, 'test'}->includes('test')");

		assertResultFalse("Sequence{3, 4.0, 'test'}->includes(3.0)");
		assertResultFalse("Sequence{3, 4.0, 'test'}->includes(4)");
		assertResultFalse("Bag{3, 4.0, 'test'}->includes(3.0)");
		assertResultFalse("Bag{3, 4.0, 'test'}->includes(4)");
		assertResultFalse("Set{3, 4.0, 'test'}->includes(3.0)");
		assertResultFalse("Set{3, 4.0, 'test'}->includes(4)");
		assertResultFalse("OrderedSet{3, 4.0, 'test'}->includes(3.0)");
		assertResultFalse("OrderedSet{3, 4.0, 'test'}->includes(4)");
	}

	public void testCollectionIncludesAll() {
		assertResultTrue("Sequence{3, 4.0, 'test'}->includesAll(Sequence{3, 'test'})");
		assertResultTrue("Sequence{3, 4.0, 'test'}->includesAll(Bag{3, 'test'})");
		assertResultTrue("Sequence{3, 4.0, 'test'}->includesAll(Set{3, 'test'})");
		assertResultTrue("Sequence{3, 4.0, 'test'}->includesAll(OrderedSet{3, 'test'})");
		assertResultTrue("Bag{3, 4.0, 'test'}->includesAll(Sequence{3, 'test'})");
		assertResultTrue("Bag{3, 4.0, 'test'}->includesAll(Bag{3, 'test'})");
		assertResultTrue("Bag{3, 4.0, 'test'}->includesAll(Set{3, 'test'})");
		assertResultTrue("Bag{3, 4.0, 'test'}->includesAll(OrderedSet{3, 'test'})");
		assertResultTrue("Set{3, 4.0, 'test'}->includesAll(Sequence{3, 'test'})");
		assertResultTrue("Set{3, 4.0, 'test'}->includesAll(Bag{3, 'test'})");
		assertResultTrue("Set{3, 4.0, 'test'}->includesAll(Set{3, 'test'})");
		assertResultTrue("Set{3, 4.0, 'test'}->includesAll(OrderedSet{3, 'test'})");
		assertResultTrue("OrderedSet{3, 4.0, 'test'}->includesAll(Sequence{3, 'test'})");
		assertResultTrue("OrderedSet{3, 4.0, 'test'}->includesAll(Bag{3, 'test'})");
		assertResultTrue("OrderedSet{3, 4.0, 'test'}->includesAll(Set{3, 'test'})");
		assertResultTrue("OrderedSet{3, 4.0, 'test'}->includesAll(OrderedSet{3, 'test'})");

		assertResultFalse("Sequence{3, 4.0, 'test'}->includesAll(Sequence{3, 4, 'test'})");
		assertResultFalse("Sequence{3, 4.0, 'test'}->includesAll(Bag{3, 4, 'test'})");
		assertResultFalse("Sequence{3, 4.0, 'test'}->includesAll(Set{3, 4, 'test'})");
		assertResultFalse("Sequence{3, 4.0, 'test'}->includesAll(OrderedSet{3, 4, 'test'})");
		assertResultFalse("Bag{3, 4.0, 'test'}->includesAll(Sequence{3, 4, 'test'})");
		assertResultFalse("Bag{3, 4.0, 'test'}->includesAll(Bag{3, 4, 'test'})");
		assertResultFalse("Bag{3, 4.0, 'test'}->includesAll(Set{3, 4, 'test'})");
		assertResultFalse("Bag{3, 4.0, 'test'}->includesAll(OrderedSet{3, 4, 'test'})");
		assertResultFalse("Set{3, 4.0, 'test'}->includesAll(Sequence{3, 4, 'test'})");
		assertResultFalse("Set{3, 4.0, 'test'}->includesAll(Bag{3, 4, 'test'})");
		assertResultFalse("Set{3, 4.0, 'test'}->includesAll(Set{3, 4, 'test'})");
		assertResultFalse("Set{3, 4.0, 'test'}->includesAll(OrderedSet{3, 4, 'test'})");
		assertResultFalse("OrderedSet{3, 4.0, 'test'}->includesAll(Sequence{3, 4, 'test'})");
		assertResultFalse("OrderedSet{3, 4.0, 'test'}->includesAll(Bag{3, 4, 'test'})");
		assertResultFalse("OrderedSet{3, 4.0, 'test'}->includesAll(Set{3, 4, 'test'})");
		assertResultFalse("OrderedSet{3, 4.0, 'test'}->includesAll(OrderedSet{3, 4, 'test'})");
	}

	public void testCollectionIncludesAllInvalid() {
		assertResultInvalid("let s : Sequence(Integer) = invalid in s->includesAll(Sequence{0})");
		assertResultInvalid("let b : Bag(Integer) = invalid in b->includesAll(Bag{0})");
		assertResultInvalid("let s : Set(Integer) = invalid in s->includesAll(Set{0})");
		assertResultInvalid("let os : OrderedSet(Integer) = invalid in os->includesAll(OrderedSet{0})");

		assertResultInvalid("let s : Sequence(Integer) = invalid in Sequence{0}->includesAll(s)");
		assertResultInvalid("let b : Bag(Integer) = invalid in Bag{0}->includesAll(b)");
		assertResultInvalid("let s : Set(Integer) = invalid in Set{0}->includesAll(s)");
		assertResultInvalid("let os : OrderedSet(Integer) = invalid in OrderedSet{0}->includesAll(os)");
	}

	public void testCollectionIncludesAllInvalidValue() {
		// Collections can't contain the invalid value
		assertResultInvalid("Sequence{3, 4, invalid, 'test'}->includesAll(OrderedSet{'test'})");
		assertResultInvalid("Bag{3, 4, invalid, 'test'}->includesAll(Set{'test'})");
		assertResultInvalid("Set{3, 4, invalid, 'test'}->includesAll(Bag{'test'})");
		assertResultInvalid("OrderedSet{3, 4, invalid, 'test'}->includesAll(Sequence{'test'})");

		assertResultInvalid("Sequence{3, 4, 'test'}->includesAll(OrderedSet{'test', invalid})");
		assertResultInvalid("Bag{3, 4, 'test'}->includesAll(Set{'test', invalid})");
		assertResultInvalid("Set{3, 4, 'test'}->includesAll(Bag{'test', invalid})");
		assertResultInvalid("OrderedSet{3, 4, 'test'}->includesAll(Sequence{'test', invalid})");
	}

	public void testCollectionIncludesAllNull() {
		assertResultInvalid("let s : Sequence(Integer) = null in s->includesAll(Sequence{0})");
		assertResultInvalid("let b : Bag(Integer) = null in b->includesAll(Bag{0})");
		assertResultInvalid("let s : Set(Integer) = null in s->includesAll(Set{0})");
		assertResultInvalid("let os : OrderedSet(Integer) = null in os->includesAll(OrderedSet{0})");

		assertResultInvalid("let s : Sequence(Integer) = null in Sequence{0}->includesAll(s)");
		assertResultInvalid("let b : Bag(Integer) = null in Bag{0}->includesAll(b)");
		assertResultInvalid("let s : Set(Integer) = null in Set{0}->includesAll(s)");
		assertResultInvalid("let os : OrderedSet(Integer) = null in OrderedSet{0}->includesAll(os)");
	}

	public void testCollectionIncludesAllNullValue() {
		assertResultTrue("Sequence{3, 4, null, 'test'}->includesAll(OrderedSet{'test', null})");
		assertResultTrue("Bag{3, 4, null, 'test'}->includesAll(Set{'test', null})");
		assertResultTrue("Set{3, 4, null, 'test'}->includesAll(Bag{'test', null})");
		assertResultTrue("OrderedSet{3, 4, null, 'test'}->includesAll(Sequence{'test', null})");

		assertResultFalse("Sequence{3, 4, 'test'}->includesAll(OrderedSet{'test', null})");
		assertResultFalse("Bag{3, 4, 'test'}->includesAll(Set{'test', null})");
		assertResultFalse("Set{3, 4, 'test'}->includesAll(Bag{'test', null})");
		assertResultFalse("OrderedSet{3, 4, 'test'}->includesAll(Sequence{'test', null})");
	}

	public void testCollectionIncludesInvalid() {
		assertResultInvalid("let s : Sequence(Integer) = invalid in s->includes(0)");
		assertResultInvalid("let b : Bag(Integer) = invalid in b->includes(0)");
		assertResultInvalid("let s : Set(Integer) = invalid in s->includes(0)");
		assertResultInvalid("let os : OrderedSet(Integer) = invalid in os->includes(0)");
	}

	public void testCollectionIncludesInvalidValue() {
		assertResultInvalid("Sequence{3, 4.0, 'test'}->includes(invalid)");
		assertResultInvalid("Bag{3, 4.0, 'test'}->includes(invalid)");
		assertResultInvalid("Set{3, 4.0, 'test'}->includes(invalid)");
		assertResultInvalid("OrderedSet{3, 4.0, 'test'}->includes(invalid)");

		assertResultInvalid("Sequence{0, invalid}->includes(0)");
		assertResultInvalid("Bag{0, invalid}->includes(0)");
		assertResultInvalid("Set{0, invalid}->includes(0)");
		assertResultInvalid("OrderedSet{0, invalid}->includes(0)");
	}

	public void testCollectionIncludesNull() {
		assertResultInvalid("let s : Sequence(Integer) = null in s->includes(0)");
		assertResultInvalid("let b : Bag(Integer) = null in b->includes(0)");
		assertResultInvalid("let s : Set(Integer) = null in s->includes(0)");
		assertResultInvalid("let os : OrderedSet(Integer) = null in os->includes(0)");
	}

	public void testCollectionIncludesNullValue() {
		assertResultTrue("Sequence{3, 4.0, null, 'test'}->includes(null)");
		assertResultTrue("Sequence{null}->includes(null)");
		assertResultTrue("Bag{3, 4.0, null, 'test'}->includes(null)");
		assertResultTrue("Bag{null}->includes(null)");
		assertResultTrue("Set{3, 4.0, null, 'test'}->includes(null)");
		assertResultTrue("Set{null}->includes(null)");
		assertResultTrue("OrderedSet{3, 4.0, null, 'test'}->includes(null)");
		assertResultTrue("OrderedSet{null}->includes(null)");

		assertResultFalse("Sequence{3, 4.0, 'test'}->includes(null)");
		assertResultFalse("Sequence{}->includes(null)");
		assertResultFalse("Bag{3, 4.0, 'test'}->includes(null)");
		assertResultFalse("Bag{}->includes(null)");
		assertResultFalse("Set{3, 4.0, 'test'}->includes(null)");
		assertResultFalse("Set{}->includes(null)");
		assertResultFalse("OrderedSet{3, 4.0, 'test'}->includes(null)");
		assertResultFalse("OrderedSet{}->includes(null)");
	}

	public void testCollectionIncluding() {
		/*
		 * FIXME raise issue for adding OrderedSet::including ... especially
		 * since it's defined in oclstdlib.ecore. However the defined
		 * "OrderedSet::including(T) : Set" should be
		 * "OrderedSet::including(T) : OrderedSet"
		 */
		assertExpressionResults("Sequence{'a', 'b', 'c'}", "Sequence{'a', 'b'}->including('c')");
		assertExpressionResults("Bag{'c', 'b', 'a'}", "Bag{'a', 'b'}->including('c')");
		assertExpressionResults("Set{'a', 'c', 'b'}", "Set{'a', 'b'}->including('c')");
		assertExpressionResults("OrderedSet{'a', 'b', 'c'}", "OrderedSet{'a', 'b'}->including('c')");
	}

	public void testCollectionIncludingInvalid() {
		assertResultInvalid("let s : Sequence(String) = invalid in s->including('a')");
		assertResultInvalid("let b : Bag(String) = invalid in b->including('a')");
		assertResultInvalid("let s : Set(String) = invalid in s->including('a')");
		assertResultInvalid("let o : OrderedSet(String) = invalid in o->including('a')");
	}

	public void testCollectionIncludingInvalidValue() {
		assertResultInvalid("Sequence{'a', 'b'}->including(invalid)");
		assertResultInvalid("Bag{'a', 'b'}->including(invalid)");
		assertResultInvalid("Set{'a', 'b'}->including(invalid)");
		assertResultInvalid("OrderedSet{'a', 'b'}->including(invalid)");
	}

	public void testCollectionIncludingNull() {
		assertResultInvalid("let s : Sequence(String) = null in s->including('a')");
		assertResultInvalid("let b : Bag(String) = null in b->including('a')");
		assertResultInvalid("let s : Set(String) = null in s->including('a')");
		assertResultInvalid("let o : OrderedSet(String) = null in o->including('a')");
	}

	public void testCollectionIncludingNullValue() {
		assertExpressionResults("Sequence{'a', 'b', null}", "Sequence{'a', 'b'}->including(null)");
		assertExpressionResults("Bag{null, 'b', 'a'}", "Bag{'a', 'b'}->including(null)");
		assertExpressionResults("Set{'a', null, 'b'}", "Set{'a', 'b'}->including(null)");
		assertExpressionResults("OrderedSet{'a', 'b', null}", "OrderedSet{'a', 'b'}->including(null)");
	}

	public void testCollectionIndexOf() {
		assertResult(Integer.valueOf(1), "Sequence{'a', 'b'}->indexOf('a')");
		assertResult(Integer.valueOf(2), "OrderedSet{'a', 'b'}->indexOf('b')");
	}

	public void testCollectionIndexOfInvalid() {
		assertResultInvalid("let s : Sequence(String) = invalid in s->indexOf('a')");
		assertResultInvalid("let o : OrderedSet(String) = invalid in o->indexOf('a')");
	}

	public void testCollectionIndexOfInvalidValue() {
		assertResultInvalid("Sequence{'a', invalid}->indexOf(invalid)");
		assertResultInvalid("OrderedSet{'a', invalid}->indexOf(invalid)");
	}

	public void testCollectionIndexOfNotContained() {
		/*
		 * FIXME raise issue for the result of this to be "0" or "-1" instead of
		 * the invalid value
		 */
		assertResultInvalid("Sequence{'a'}->indexOf('b')");
		assertResultInvalid("OrderedSet{'a'}->indexOf('b')");
	}

	public void testCollectionIndexOfNull() {
		assertResultInvalid("let s : Sequence(String) = null in s->indexOf('a')");
		assertResultInvalid("let o : OrderedSet(String) = null in o->indexOf('a')");
	}

	public void testCollectionIndexOfNullValue() {
		assertResult(Integer.valueOf(1), "Sequence{null, 'a'}->indexOf(null)");
		assertResult(Integer.valueOf(1), "OrderedSet{null, 'a'}->indexOf(null)");
	}

	public void testCollectionInsertAt() {
		assertExpressionResults("Sequence{'c', 'a', 'b'}", "Sequence{'a', 'b'}->insertAt(1, 'c')");
		assertExpressionResults("OrderedSet{'a', 'c', 'b'}", "OrderedSet{'a', 'b'}->insertAt(2, 'c')");

		// We can add _after_ the last element
		assertExpressionResults("Sequence{'a', 'b', 'c'}", "Sequence{'a', 'b'}->insertAt(3, 'c')");
		assertExpressionResults("OrderedSet{'a', 'b', 'c'}", "OrderedSet{'a', 'b'}->insertAt(3, 'c')");
	}

	public void testCollectionInsertAtInvalid() {
		assertResultInvalid("let s : Sequence(String) = invalid in s->insertAt(1, 'a')");
		assertResultInvalid("let o : OrderedSet(String) = invalid in o->insertAt(1, 'a')");
	}

	public void testCollectionInsertAtInvalidValue() {
		assertResultInvalid("Sequence{'a'}->insertAt(1, invalid)");
		assertResultInvalid("OrderedSet{'a'}->insertAt(1, invalid)");
	}

	public void testCollectionInsertAtNull() {
		assertResultInvalid("let s : Sequence(String) = null in s->insertAt(1, 'a')");
		assertResultInvalid("let o : OrderedSet(String) = null in o->insertAt(1, 'a')");
	}

	public void testCollectionInsertAtNullValue() {
		/*
		 * FIXME cannot "insertAt" a null value with the current implementation.
		 * lines 1161 to 1166 of the EvaluationVisitorImpl :
		 */
		// Object arg2 = args.get(1).accept(getVisitor());
		//
		// // check if undefined
		// if (isUndefined(arg2)) {
		// return getinvalid();
		// }
		assertExpressionResults("Sequence{'a', null}", "Sequence{'a'}->insertAt(2, null)");
		assertExpressionResults("OrderedSet{'a', null}", "OrderedSet{'a'}->insertAt(2, null)");
	}

	public void testCollectionInsertAtOutOfBounds() {
		assertResultInvalid("Sequence{'a'}->insertAt(0, 'b')");
		assertResultInvalid("OrderedSet{'a'}->insertAt(0, 'b')");

		assertResultInvalid("Sequence{'a'}->insertAt(3, 'b')");
		assertResultInvalid("OrderedSet{'a'}->insertAt(3, 'b')");
	}

	public void testCollectionIntersectionDuplicates() {
		assertExpressionResults("Set{'a', 'b'}", "Set{'a', 'b', 'a'}->intersection(Set{'a', 'b', 'c'})");
		assertExpressionResults("Set{'a', 'b'}", "Set{'a', 'b', 'a'}->intersection(Bag{'a', 'b', 'c'})");
		assertExpressionResults("Set{'a', 'b'}", "Bag{'a', 'b', 'a'}->intersection(Set{'a', 'b', 'c'})");
		// FIXME : The specification tells us we should be expecting the least
		// amount of occurences as the result of the
		// intersection of two bags. The expected results should then be :
		// "Bag{'a', 'b', 'a'}->intersection(Bag{'a', 'b'})" == "Bag{'a', 'b'}"
		// and
		// "Bag{'a', 'b', 'a', 'b'}->intersection(Bag{'a', 'b', 'b'})" ==
		// "Bag{'a', 'b', 'b'}"

		// Note that the current implementation sports a bug : we take into
		// account the "smaller" bag and copy its elements if they're contained
		// by the "greater" so that
		// "Bag{'a', 'b', 'a'}->intersection(Bag{'a', 'b'})" == "Bag{'a', 'b'}"
		// and
		// "Bag{'a', 'b', 'a'}->intersection(Bag{'a', 'b', 'c'})" ==
		// "Bag{'a', 'a', 'b'}"
		assertExpressionResults("Bag{'a', 'b'}", "Bag{'a', 'b', 'a'}->intersection(Bag{'a', 'b'})");
		assertExpressionResults("Bag{'a', 'b', 'b'}", "Bag{'a', 'b', 'a', 'b'}->intersection(Bag{'a', 'b', 'b'})");
	}

	public void testCollectionIntersectionEmptyCollection() {
		assertResult(CollectionUtil.createNewSet(),
			"Set{3, 4}->intersection(Set{})");
		assertResult(CollectionUtil.createNewSet(),
			"Set{3, 4}->intersection(Bag{})");
		assertResult(CollectionUtil.createNewBag(),
			"Bag{3, 4}->intersection(Bag{})");
		assertResult(CollectionUtil.createNewSet(),
			"Bag{3, 4}->intersection(Set{})");

		assertResult(CollectionUtil.createNewSet(),
			"let s:Set(Integer)=Set{} in s->intersection(Set{3, 4})");
		assertResult(CollectionUtil.createNewSet(),
			"let s:Set(Integer)=Set{} in s->intersection(Bag{3, 4})");
		assertResult(CollectionUtil.createNewBag(),
			"let b:Bag(Integer)=Bag{} in b->intersection(Bag{3, 4})");
		assertResult(CollectionUtil.createNewSet(),
			"let b:Bag(Integer)=Bag{} in b->intersection(Set{3, 4})");
	}

	public void testCollectionIntersectionInvalid() {
		assertResultInvalid("let s : Set(Integer) = invalid in s->intersection(Set{4})");
		assertResultInvalid("let s : Set(Integer) = invalid in s->intersection(Bag{4})");
		assertResultInvalid("let b : Bag(Integer) = invalid in b->intersection(Set{4})");
		assertResultInvalid("let b : Bag(Integer) = invalid in b->intersection(Bag{4})");

		assertResultInvalid("let s : Set(Integer) = invalid in Set{4}->intersection(s)");
		assertResultInvalid("let s : Set(Integer) = invalid in Bag{4}->intersection(s)");
		assertResultInvalid("let b : Bag(Integer) = invalid in Set{4}->intersection(b)");
		assertResultInvalid("let b : Bag(Integer) = invalid in Bag{4}->intersection(b)");
	}

	public void testCollectionIntersectionInvalidValue() {
		assertResultInvalid("Set{3, 4}->intersection(Set{invalid})");
		assertResultInvalid("Set{3, invalid}->intersection(Bag{4})");
		assertResultInvalid("Bag{3, invalid}->intersection(Set{4})");
		assertResultInvalid("Bag{3, 4}->intersection(Bag{invalid})");
	}

	public void testCollectionIntersectionNoDuplicates() {
		assertResult(CollectionUtil.createNewSet(),
			"Set{'a', 'b'}->intersection(Set{'c', 'd'})");
		assertResult(CollectionUtil.createNewSet(),
			"Set{'a', 'b'}->intersection(Bag{'c', 'd'})");
		assertResult(CollectionUtil.createNewSet(),
			"Bag{'a', 'b'}->intersection(Set{'c', 'd'})");

		assertResult(CollectionUtil.createNewBag(),
			"Bag{'a', 'b'}->intersection(Bag{'c', 'd'})");
	}

	public void testCollectionIntersectionNull() {
		assertResultInvalid("let s : Set(Integer) = null in s->intersection(Set{4})");
		assertResultInvalid("let s : Set(Integer) = null in s->intersection(Bag{4})");
		assertResultInvalid("let b : Bag(Integer) = null in b->intersection(Set{4})");
		assertResultInvalid("let b : Bag(Integer) = null in b->intersection(Bag{4})");

		assertResultInvalid("let s : Set(Integer) = null in Set{4}->intersection(s)");
		assertResultInvalid("let s : Set(Integer) = null in Bag{4}->intersection(s)");
		assertResultInvalid("let b : Bag(Integer) = null in Set{4}->intersection(b)");
		assertResultInvalid("let b : Bag(Integer) = null in Bag{4}->intersection(b)");
	}

	public void testCollectionIntersectionNullValue() {
		assertExpressionResults("Set{2, null}", "Set{2, 3, null}->intersection(Set{2, 4, null})");
		assertExpressionResults("Set{2, null}", "Set{2, 3, null}->intersection(Bag{2, 4, null})");
		assertExpressionResults("Set{2, null}", "Bag{2, 3, null}->intersection(Set{2, 4, null})");
		assertExpressionResults("Bag{null, null}", "Bag{3, 4, null, null}->intersection(Bag{null, 2, null})");
	}

	public void testCollectionIsEmpty() {
		assertResultTrue("Sequence{}->isEmpty()");
		assertResultTrue("Bag{}->isEmpty()");
		assertResultTrue("Set{}->isEmpty()");
		assertResultTrue("OrderedSet{}->isEmpty()");

		assertResultFalse("Sequence{4, 4, 'test'}->isEmpty()");
		assertResultFalse("Bag{4, 4, 'test'}->isEmpty()");
		assertResultFalse("Set{4, 4, 'test'}->isEmpty()");
		assertResultFalse("OrderedSet{4, 4, 'test'}->isEmpty()");

		assertResultFalse("'test'->isEmpty()");
	}

	public void testCollectionIsEmptyInvalid() {
		assertResultInvalid("let s : Sequence(Integer) = invalid in s->isEmpty()");
		assertResultInvalid("let b : Bag(Integer) = invalid in b->isEmpty()");
		assertResultInvalid("let s : Set(Integer) = invalid in s->isEmpty()");
		assertResultInvalid("let o : OrderedSet(Integer) = invalid in o->isEmpty()");
	}

	public void testCollectionIsEmptyInvalidValue() {
		assertResultInvalid("Sequence{invalid}->isEmpty()");
		assertResultInvalid("Bag{invalid}->isEmpty()");
		assertResultInvalid("Set{invalid}->isEmpty()");
		assertResultInvalid("OrderedSet{invalid}->isEmpty()");

		assertResultInvalid("invalid->isEmpty()");
	}

	public void testCollectionIsEmptyNull() {
		assertResultInvalid("let s : Sequence(Integer) = null in s->isEmpty()");
		assertResultInvalid("let b : Bag(Integer) = null in b->isEmpty()");
		assertResultInvalid("let s : Set(Integer) = null in s->isEmpty()");
		assertResultInvalid("let o : OrderedSet(Integer) = null in o->isEmpty()");
	}

	public void testCollectionIsEmptyNullValue() {
		assertResultFalse("Sequence{null}->isEmpty()");
		assertResultFalse("Bag{null}->isEmpty()");
		assertResultFalse("Set{null}->isEmpty()");
		assertResultFalse("OrderedSet{null}->isEmpty()");

		// 11.7.1 : clarification was added for this :
		assertResultTrue("null->isEmpty()");
	}

	public void testCollectionLast() {
		assertResultInvalid("Sequence{}->last()");
		assertResultInvalid("OrderedSet{}->last()");

		assertResult("3", "Sequence{1, 2.0, '3'}->last()"); //$NON-NLS-2$
		assertResult("3", "OrderedSet{1, 2.0, '3'}->last()"); //$NON-NLS-2$
	}

	public void testCollectionLastInvalid() {
		assertResultInvalid("let s : Sequence(Integer) = invalid in s->last()");
		assertResultInvalid("let o : OrderedSet(Integer) = invalid in o->last()");
	}

	public void testCollectionLastInvalidValue() {
		assertResultInvalid("Sequence{invalid, 1}->last()");
		assertResultInvalid("OrderedSet{invalid, 1}->last()");
	}

	public void testCollectionLastNull() {
		assertResultInvalid("let s : Sequence(Integer) = null in s->last()");
		assertResultInvalid("let o : OrderedSet(Integer) = null in o->last()");
	}

	public void testCollectionLastNullValue() {
		assertResult(null, "Sequence{null}->last()");
		assertResult(null, "OrderedSet{null}->last()");
	}

	public void testCollectionMax() {
		assertResult(2, "Sequence{1, 2}->max()");
		assertResult(5.0, "Set{5, 4.0, 3.0, 2, 1}->max()");
		assertResult(1, "Bag{1}->max()");
		assertResult(1, "Bag{1}->max()");
        assertBadQuery(SemanticException.class, Diagnostic.ERROR,
        	"OrderedSet{'hi', 'lo'}->max()",
        	OCLMessages.MaxOperator_ERROR_);
        assertBadQuery(SemanticException.class, Diagnostic.ERROR,
        	"Set{}->max()",
        	OCLMessages.MaxOperator_ERROR_);
        assertBadQuery(SemanticException.class, Diagnostic.ERROR,
        	"OrderedSet{true, 1, 'bad'}->max()",
        	OCLMessages.MaxOperator_ERROR_);		
		// FIXME Bug 301351 Subtest-not-implemented user-defined max
	}

	public void testCollectionMin() {
		assertResult(1, "Sequence{1, 2}->min()");
		assertResult(1.0, "Set{5, 4.0, 3.0, 2, 1}->min()");
		assertResult(1, "Bag{1}->min()");
        assertBadQuery(SemanticException.class, Diagnostic.ERROR,
        	"OrderedSet{'hi', 'lo'}->min()",
        	OCLMessages.MinOperator_ERROR_);
        assertBadQuery(SemanticException.class, Diagnostic.ERROR,
        	"Set{}->min()",
        	OCLMessages.MinOperator_ERROR_);
        assertBadQuery(SemanticException.class, Diagnostic.ERROR,
        	"OrderedSet{true, 1, 'bad'}->min()",
        	OCLMessages.MinOperator_ERROR_);		
		// FIXME Bug 301351 Subtest-not-implemented user-defined min
	}

	public void testCollectionMinus() {
		assertExpressionResults("Set{'b'}", "Set{'a', 'b', 'c'} - Set{'c', 'a'}");
		/*
		 * FIXME this is no specified operation. If we define
		 * "OrderedSet::-(Set) : Set", we also need "Set::-(OrderedSet) : Set"
		 * and "OrderedSet::-(OrderedSet) : OrderedSet". That being said,
		 * "OrderedSet::-(Set) : Set" should be
		 * "OrderedSet::-(Set) : OrderedSet". revisit all "testCollectionMinus*"
		 * to add the new
		 */
		assertExpressionResults("Set{'b'}", "OrderedSet{'a', 'b', 'c'} - Set{'c', 'a'}");
	}

	public void testCollectionMinusInvalid() {
		assertResultInvalid("let s : Set(String) = invalid in s - Set{'c'}");
		assertResultInvalid("let s : Set(String) = invalid in Set{'a'} - s");
	}

	public void testCollectionMinusInvalidValue() {
		assertResultInvalid("Set{'a', invalid} - Set{'c', invalid}");
		assertResultInvalid("Set{'a', invalid} - Set{'c', 'a'}");
	}

	public void testCollectionMinusNull() {
		assertResultInvalid("let s : Set(String) = null in s - Set{'c', null}");
		assertResultInvalid("let s : Set(String) = null in Set{'a', null} - s");
	}

	public void testCollectionMinusNullValue() {
		assertExpressionResults("Set{'a'}", "Set{'a', null} - Set{'c', null}");
		assertExpressionResults("let s:Set(String)=Set{} in s->including(null)", "Set{'a', null} - Set{'c', 'a'}");
	}

	public void testCollectionNotEmpty() {
		assertResultFalse("Sequence{}->notEmpty()");
		assertResultFalse("Bag{}->notEmpty()");
		assertResultFalse("Set{}->notEmpty()");
		assertResultFalse("OrderedSet{}->notEmpty()");

		assertResultTrue("Sequence{4, 4, 'test'}->notEmpty()");
		assertResultTrue("Bag{4, 4, 'test'}->notEmpty()");
		assertResultTrue("Set{4, 4, 'test'}->notEmpty()");
		assertResultTrue("OrderedSet{4, 4, 'test'}->notEmpty()");

		assertResultTrue("'test'->notEmpty()");
	}

	public void testCollectionNotEmptyInvalid() {
		assertResultInvalid("let s : Sequence(Integer) = invalid in s->notEmpty()");
		assertResultInvalid("let b : Bag(Integer) = invalid in b->notEmpty()");
		assertResultInvalid("let s : Set(Integer) = invalid in s->notEmpty()");
		assertResultInvalid("let o : OrderedSet(Integer) = invalid in o->notEmpty()");
	}

	public void testCollectionNotEmptyInvalidValue() {
		assertResultInvalid("Sequence{invalid}->notEmpty()");
		assertResultInvalid("Bag{invalid}->notEmpty()");
		assertResultInvalid("Set{invalid}->notEmpty()");
		assertResultInvalid("OrderedSet{invalid}->notEmpty()");

		assertResultInvalid("invalid->notEmpty()");
	}

	public void testCollectionNotEmptyNull() {
		assertResultInvalid("let s : Sequence(Integer) = null in s->notEmpty()");
		assertResultInvalid("let b : Bag(Integer) = null in b->notEmpty()");
		assertResultInvalid("let s : Set(Integer) = null in s->notEmpty()");
		assertResultInvalid("let o : OrderedSet(Integer) = null in o->notEmpty()");
	}

	public void testCollectionNotEmptyNullValue() {
		assertResultTrue("Sequence{null}->notEmpty()");
		assertResultTrue("Bag{null}->notEmpty()");
		assertResultTrue("Set{null}->notEmpty()");
		assertResultTrue("OrderedSet{null}->notEmpty()");

		assertResultFalse("null->notEmpty()");
	}

	public void testCollectionNotEqualInvalid() {
		// operation invocations on invalid except for oclIsInvalid and oclIsUndefined yield invalid
		assertResultInvalid("let s : Sequence(Integer) = invalid in s <> Sequence{5}");
		assertResultInvalid("let b : Bag(Integer) = invalid in Bag{5} <> b");
		assertResultInvalid("let s : Set(Integer) = invalid in s <> Set{5}");
		assertResultInvalid("let o : OrderedSet(Integer) = invalid in OrderedSet{5} <> o");

		assertResultInvalid("let s1 : Sequence(Integer) = invalid, s2 : Sequence(Integer) = invalid in s1 <> s2");
		assertResultInvalid("let b1 : Bag(Integer) = invalid, b2 : Bag(Integer) = invalid in b1 <> b2");
		assertResultInvalid("let s1 : Set(Integer) = invalid, s2 : Set(Integer) = invalid in s1 <> s2");
		assertResultInvalid("let o1 : OrderedSet(Integer) = invalid, o2 : OrderedSet(Integer) = invalid in o1 <> o2");
	}

	public void testCollectionNotEqualNull() {
		assertResultTrue("let s : Sequence(Integer) = null in s <> Sequence{5}");
		assertResultTrue("let b : Bag(Integer) = null in Bag{5} <> b");
		assertResultTrue("let s : Set(Integer) = null in s <> Set{5}");
		assertResultTrue("let o : OrderedSet(Integer) = null in OrderedSet{5} <> o");

		assertResultFalse("let s1 : Sequence(Integer) = null, s2 : Sequence(Integer) = null in s1 <> s2");
		assertResultFalse("let b1 : Bag(Integer) = null, b2 : Bag(Integer) = null in b1 <> b2");
		assertResultFalse("let s1 : Set(Integer) = null, s2 : Set(Integer) = null in s1 <> s2");
		assertResultFalse("let o1 : OrderedSet(Integer) = null, o2 : OrderedSet(Integer) = null in o1 <> o2");
	}

	public void testCollectionNotEqualOrderedXOrdered() {
		// same order, same quantities
		assertResultFalse("Sequence{4, 5, 'test'} <> Sequence{4, 5, 'test'}");
		assertResultFalse("Sequence{4, 5, 'test', 5} <> Sequence{4, 5, 'test', 5}");
		assertResultFalse("OrderedSet{4, 5, 'test', 5} <> OrderedSet{4, 5, 'test'}");
		// Collections are equal only if they are of the same kind
		assertResultTrue("Sequence{4, 5, 'test'} <> OrderedSet{4, 5, 'test', 5}");
		assertResultTrue("OrderedSet{4, 5, 'test', 5} <> Sequence{4, 5, 'test'}");

		// distinct order, same quantities
		assertResultTrue("Sequence{4, 5, 'test'} <> Sequence{4, 'test', 5}");
		assertResultTrue("Sequence{4, 5, 'test', 5} <> Sequence{5, 4, 'test', 5}");
		// FIXME unclear semantics of ordering in OrderedSet collection literal with multiple occurrences of equal values
		// assertResultTrue("OrderedSet{4, 5, 'test', 5} <> OrderedSet{4, 'test', 5}");
		assertResultTrue("Sequence{4, 5, 'test'} <> OrderedSet{5, 4, 'test', 5}");
		assertResultTrue("OrderedSet{4, 5, 'test', 5} <> Sequence{5, 4, 'test'}");

		// distinct quantities
		assertResultTrue("Sequence{4, 5, 'test', 5} <> Sequence{4, 5, 'test'}");
		assertResultTrue("Sequence{4, 5, 'test', 5} <> OrderedSet{4, 5, 'test', 5}");
		assertResultTrue("OrderedSet{4, 5, 'test', 5} <> Sequence{4, 5, 'test', 5}");
	}

	public void testCollectionNotEqualOrderedXUnordered() {
		/*
		 * FIXME <ordered collection> x <non ordered collection> Should return
		 * true or false when containing the elements in the same quantities?
		 */
		// same quantities
		assertResultTrue("Sequence{4, 5, 'test'} <> Set{4, 'test', 5, 4}");
		assertResultTrue("Sequence{4, 5, 'test', 4} <> Bag{4, 'test', 5, 4}");
		assertResultTrue("OrderedSet{4, 5, 'test', 4} <> Set{4, 'test', 5, 4}");
		assertResultTrue("OrderedSet{4, 5, 'test', 4} <> Bag{4, 'test', 5}");

		// distinct quantities
		assertResultTrue("Sequence{4, 5, 'test', 4} <> Set{4, 'test', 5, 4}");
		assertResultTrue("Sequence{4, 5, 'test'} <> Bag{4, 'test', 5, 4}");
		assertResultTrue("OrderedSet{4, 5, 'test', 4} <> Bag{4, 'test', 5, 4}");
	}

	public void testCollectionNotEqualUnorderedXUnordered() {
		// same quantities
		// collections are only equal if they are of the same kind
		assertResultTrue("Bag{4, 5, 'test'} <> Set{4, 'test', 5, 4}");
		assertResultFalse("Bag{4, 5, 'test', 4} <> Bag{4, 'test', 5, 4}");
		assertResultFalse("Set{4, 5, 'test', 4} <> Set{4, 'test', 5, 4}");
		// collections are only equal if they are of the same kind
		assertResultTrue("Set{4, 5, 'test', 4} <> Bag{4, 'test', 5}");

		// distinct quantities
		assertResultTrue("Bag{4, 5, 'test', 4} <> Set{4, 'test', 5, 4}");
		assertResultTrue("Bag{4, 5, 'test'} <> Bag{4, 'test', 5, 4}");
		assertResultTrue("Set{4, 5, 'test', 4} <> Bag{4, 'test', 5, 4}");
	}

	public void testCollectionPrepend() {
		assertExpressionResults("Sequence{'c', 'a', 'b'}", "Sequence{'a', 'b'}->prepend('c')");
		assertExpressionResults("OrderedSet{'c', 'a', 'b'}", "OrderedSet{'a', 'b'}->prepend('c')");
	}

	public void testCollectionPrependInvalid() {
		assertResultInvalid("let s : Sequence(String) = invalid in s->prepend('a')");
		assertResultInvalid("let o : OrderedSet(String) = invalid in o->prepend('a')");
	}

	public void testCollectionPrependInvalidValue() {
		assertResultInvalid("Sequence{'a', 'b'}->prepend(invalid)");
		assertResultInvalid("OrderedSet{'a', 'b'}->prepend(invalid)");
	}

	public void testCollectionPrependNull() {
		assertResultInvalid("let s : Sequence(String) = null in s->prepend('a')");
		assertResultInvalid("let o : OrderedSet(String) = null in o->prepend('a')");
	}

	public void testCollectionPrependNullValue() {
		assertExpressionResults("Sequence{null, 'a', 'b'}", "Sequence{'a', 'b'}->prepend(null)");
		assertExpressionResults("OrderedSet{null, 'a', 'b'}", "OrderedSet{'a', 'b'}->prepend(null)");
	}

	public void testCollectionProduct() {
		String expectedResultExpression = "Set{Tuple{first = 3, second = 3.0}, Tuple{first = 3, second = 4.0}, Tuple{first = 4, second = 3.0}, Tuple{first = 4, second = 4.0}}";

		// Sequence::product(Collection)
		assertExpressionResults(expectedResultExpression, "Sequence{3, 4}->product(Sequence{3.0, 4.0})");
		assertExpressionResults(expectedResultExpression, "Sequence{3, 4}->product(Bag{3.0, 4.0})");
		assertExpressionResults(expectedResultExpression, "Sequence{3, 4}->product(Set{3.0, 4.0})");
		assertExpressionResults(expectedResultExpression, "Sequence{3, 4}->product(OrderedSet{3.0, 4.0})");

		// Bag::product(Collection)
		assertExpressionResults(expectedResultExpression, "Bag{3, 4}->product(Sequence{3.0, 4.0})");
		assertExpressionResults(expectedResultExpression, "Bag{3, 4}->product(Bag{3.0, 4.0})");
		assertExpressionResults(expectedResultExpression, "Bag{3, 4}->product(Set{3.0, 4.0})");
		assertExpressionResults(expectedResultExpression, "Bag{3, 4}->product(OrderedSet{3.0, 4.0})");

		// Set::product(Collection)
		assertExpressionResults(expectedResultExpression, "Set{3, 4}->product(Sequence{3.0, 4.0})");
		assertExpressionResults(expectedResultExpression, "Set{3, 4}->product(Bag{3.0, 4.0})");
		assertExpressionResults(expectedResultExpression, "Set{3, 4}->product(Set{3.0, 4.0})");
		assertExpressionResults(expectedResultExpression, "Set{3, 4}->product(OrderedSet{3.0, 4.0})");

		// OrderedSet::product(Collection)
		assertExpressionResults(expectedResultExpression, "OrderedSet{3, 4}->product(Sequence{3.0, 4.0})");
		assertExpressionResults(expectedResultExpression, "OrderedSet{3, 4}->product(Bag{3.0, 4.0})");
		assertExpressionResults(expectedResultExpression, "OrderedSet{3, 4}->product(Set{3.0, 4.0})");
		assertExpressionResults(expectedResultExpression, "OrderedSet{3, 4}->product(OrderedSet{3.0, 4.0})");
	}

	public void testCollectionProductEmptyCollection() {
		assertResult(CollectionUtil.createNewSet(),
			"Sequence{3, 4}->product(OrderedSet{})");
		assertResult(CollectionUtil.createNewSet(), "Bag{3, 4}->product(Set{})");
		assertResult(CollectionUtil.createNewSet(), "Set{3, 4}->product(Bag{})");
		assertResult(CollectionUtil.createNewSet(),
			"OrderedSet{3, 4}->product(Sequence{})");

		assertResult(CollectionUtil.createNewSet(),
			"Sequence{}->product(OrderedSet{3, 4})");
		assertResult(CollectionUtil.createNewSet(), "Bag{}->product(Set{3, 4})");
		assertResult(CollectionUtil.createNewSet(), "Set{}->product(Bag{3, 4})");
		assertResult(CollectionUtil.createNewSet(),
			"OrderedSet{}->product(Sequence{3, 4})");
	}

	public void testCollectionProductInvalid() {
		assertResultInvalid("let s : Sequence(Integer) = invalid in OrderedSet{3, 4}->product(s)");
		assertResultInvalid("let b : Bag(Integer) = invalid in Set{3, 4}->product(b)");
		assertResultInvalid("let s : Set(Integer) = invalid in Bag{3, 4}->product(s)");
		assertResultInvalid("let o : OrderedSet(Integer) = invalid in Sequence{3, 4}->product(o)");

		assertResultInvalid("let s : Sequence(Integer) = invalid in s->product(OrderedSet{3, 4})");
		assertResultInvalid("let b : Bag(Integer) = invalid in b->product(Set{3, 4})");
		assertResultInvalid("let s : Set(Integer) = invalid in s->product(Bag{3, 4})");
		assertResultInvalid("let o : OrderedSet(Integer) = invalid in o->product(Sequence{3, 4})");
	}

	public void testCollectionProductInvalidValue() {
		assertResultInvalid("Sequence{3, 4}->product(OrderedSet{invalid})");
		assertResultInvalid("Bag{3, 4}->product(Set{invalid})");
		assertResultInvalid("Set{3, 4}->product(Bag{invalid})");
		assertResultInvalid("OrderedSet{3, 4}->product(Sequence{invalid})");

		assertResultInvalid("Sequence{invalid, 4}->product(Sequence{3})");
		assertResultInvalid("Bag{invalid, 4}->product(Set{3})");
		assertResultInvalid("Set{invalid, 4}->product(Bag{3})");
		assertResultInvalid("OrderedSet{invalid, 4}->product(Sequence{3})");
	}

	public void testCollectionProductNull() {
		assertResultInvalid("let s : Sequence(Integer) = null in OrderedSet{3, 4}->product(s)");
		assertResultInvalid("let b : Bag(Integer) = null in Set{3, 4}->product(b)");
		assertResultInvalid("let s : Set(Integer) = null in Bag{3, 4}->product(s)");
		assertResultInvalid("let o : OrderedSet(Integer) = null in Sequence{3, 4}->product(o)");

		assertResultInvalid("let s : Sequence(Integer) = null in s->product(OrderedSet{3, 4})");
		assertResultInvalid("let b : Bag(Integer) = null in b->product(Set{3, 4})");
		assertResultInvalid("let s : Set(Integer) = null in s->product(Bag{3, 4})");
		assertResultInvalid("let o : OrderedSet(Integer) = null in o->product(Sequence{3, 4})");
	}

	public void testCollectionProduct_bug284129() {
		// FIXME Due to number equality inconsistency between Java and OCL, the following doesn't work:
		// assertExpressionResults("Set{Tuple{first = 3, second = 3.0}, Tuple{first = 3, second = 4}, Tuple{first = 4.0, second = 3.0}, Tuple{first = 4.0, second = 4}}", "Sequence{3, 4.0}->product(Sequence{3.0, 4})");
		// But if we relax a little and compare the result to all Double/Real values, it works:
		// assertExpressionResults("Set{Tuple{first = 3.1, second = 3.0}, Tuple{first = 3.0, second = 4.0}, Tuple{first = 4.0, second = 3.0}, Tuple{first = 4.0, second = 4.0}}", "Sequence{3, 4.0}->product(Sequence{3.0, 4})");
		// FIXME A common output type is not enforced
		assertExpressionResults("let r3 : Real = 3, r4 : Real = 4 in Set{Tuple{first = r3, second = 3.0}, Tuple{first = r3, second = r4}, Tuple{first = 4.0, second = 3.0}, Tuple{first = 4.0, second = r4}}", "Sequence{3, 4.0}->product(Sequence{3.0, 4})");
	}

	public void testCollectionProductNullValue() {
//
		assertExpressionResults("Set{Tuple{first = 3, second = null}, Tuple{first = 4, second = null}}", "Sequence{3, 4}->product(OrderedSet{null})");
		assertExpressionResults("Set{Tuple{first = 3, second = null}, Tuple{first = 4, second = null}}", "Bag{3, 4}->product(let s:Set(OclVoid)=Set{} in s->including(null))");
		assertExpressionResults("Set{Tuple{first = 3, second = null}, Tuple{first = 4, second = null}}", "Set{3, 4}->product(Bag{null})");
		assertExpressionResults("Set{Tuple{first = 3, second = null}, Tuple{first = 4, second = null}}", "OrderedSet{3, 4}->product(Sequence{null})");

		assertExpressionResults("let iNull : Integer = null in Set{Tuple{first = iNull, second = 3}, Tuple{first = 4, second = 3}}", "Sequence{null, 4}->product(Sequence{3})");
		assertExpressionResults("let iNull : Integer = null in Set{Tuple{first = iNull, second = 3}, Tuple{first = 4, second = 3}}", "Bag{null, 4}->product(Set{3})");
		assertExpressionResults("let iNull : Integer = null in Set{Tuple{first = iNull, second = 3}, Tuple{first = 4, second = 3}}", "Set{null, 4}->product(Bag{3})");
		assertExpressionResults("let iNull : Integer = null in Set{Tuple{first = iNull, second = 3}, Tuple{first = 4, second = 3}}", "OrderedSet{null, 4}->product(Sequence{3})");
	}

	public void testCollectionSize() {
		assertResult(Integer.valueOf(4), "Sequence{4, 4, 5, 'test'}->size()");
		assertResult(Integer.valueOf(4), "Bag{4, 4, 5, 'test'}->size()");
		assertResult(Integer.valueOf(3), "Set{4, 4, 5, 'test'}->size()");
		assertResult(Integer.valueOf(3), "OrderedSet{4, 4, 5, 'test'}->size()");

		assertResult(Integer.valueOf(0), "Sequence{}->size()");
		assertResult(Integer.valueOf(0), "Bag{}->size()");
		assertResult(Integer.valueOf(0), "Set{}->size()");
		assertResult(Integer.valueOf(0), "OrderedSet{}->size()");
	}

	public void testCollectionSizeInvalid() {
		assertResultInvalid("let s : String = invalid in s->size()");
		assertResultInvalid("let s : Sequence(Integer) = invalid in s->size()");
	}

	public void testCollectionSizeInvalidValue() {
		assertResultInvalid("OrderedSet{'a', 'b', invalid}->size()");
		assertResultInvalid("Set{'a', 'b', invalid}->size()");
		assertResultInvalid("Bag{'a', 'b', invalid}->size()");
		assertResultInvalid("Sequence{'a', 'b', invalid}->size()");
	}

	public void testCollectionSizeNull() {
		// converting a null value to a set has to result in an empty set;
		// see OCL spec 11.2.3
		assertResult(Integer.valueOf(0), "let s : String = null in s->size()");
		// In the following case there is no implicit conversion to Set.
		// Therefore, size() will be attempted on a null Sequence, required
		// to evaluate to invalid.
		assertResultInvalid("let s : Sequence(Integer) = null in s->size()");
	}

	public void testCollectionSizeNullValue() {
		assertResult(Integer.valueOf(4),
			"Sequence{'a', 'b', null, null}->size()");
		assertResult(Integer.valueOf(4), "Bag{'a', 'b', null, null}->size()");
		assertResult(Integer.valueOf(3), "Set{'a', 'b', null, null}->size()");
		assertResult(Integer.valueOf(3),
			"OrderedSet{'a', 'b', null, null}->size()");
	}

	public void testCollectionSubOrderedSet() {
		assertExpressionResults("OrderedSet{'a'}", "OrderedSet{'a', 'b', 'c', 'd'}->subOrderedSet(1, 1)");
		assertExpressionResults("OrderedSet{'b', 'c'}", "OrderedSet{'a', 'b', 'c', 'd'}->subOrderedSet(2, 3)");
		assertExpressionResults("OrderedSet{'d'}", "OrderedSet{'a', 'b', 'c', 'd'}->subOrderedSet(4, 4)");
	}

	public void testCollectionSubOrderedSetIllegalArguments() {
		assertResultInvalid("OrderedSet{'a', 'b', 'c', 'd'}->subOrderedSet(2, 1)");
	}

	public void testCollectionSubOrderedSetInvalid() {
		assertResultInvalid("let o : OrderedSet(String) = invalid in o->subOrderedSet(1, 1)");
	}

	public void testCollectionSubOrderedSetNull() {
		assertResultInvalid("let o : OrderedSet(String) = null in o->subOrderedSet(1, 1)");
	}

	public void testCollectionSubOrderedSetOutOfBounds() {
		assertResultInvalid("OrderedSet{'a', 'b', 'c', 'd'}->subOrderedSet(0, 1)");
		assertResultInvalid("OrderedSet{'a', 'b', 'c', 'd'}->subOrderedSet(4, 5)");
	}

	public void testCollectionSubSequence() {
		assertExpressionResults("Sequence{'a'}", "Sequence{'a', 'b', 'c', 'd'}->subSequence(1, 1)");
		assertExpressionResults("Sequence{'b', 'c'}", "Sequence{'a', 'b', 'c', 'd'}->subSequence(2, 3)");
		assertExpressionResults("Sequence{'d'}", "Sequence{'a', 'b', 'c', 'd'}->subSequence(4, 4)");
	}

	public void testCollectionSubSequenceIllegalArguments() {
		assertResultInvalid("Sequence{'a', 'b', 'c', 'd'}->subSequence(2, 1)");
	}

	public void testCollectionSubSequenceInvalid() {
		assertResultInvalid("let o : Sequence(String) = invalid in o->subSequence(1, 1)");
	}

	public void testCollectionSubSequenceNull() {
		assertResultInvalid("let o : Sequence(String) = null in o->subSequence(1, 1)");
	}

	public void testCollectionSubSequenceOutOfBounds() {
		assertResultInvalid("Sequence{'a', 'b', 'c', 'd'}->subSequence(0, 1)");
		assertResultInvalid("Sequence{'a', 'b', 'c', 'd'}->subSequence(4, 5)");
	}

	public void testCollectionSum() {
		assertResult(Integer.valueOf(0),
			"let s : Sequence(Integer) = Sequence{} in s->sum()");
		assertResult(Double.valueOf(0d),
			"let b : Bag(Real) = Bag{} in b->sum()");
		assertResult(Double.valueOf(0d),
			"let s : Set(Real) = Set{} in s->sum()");
		assertResult(Integer.valueOf(0),
			"let o : OrderedSet(Integer) = OrderedSet{} in o->sum()");

		assertResult(Double.valueOf(13d), "Sequence{4.0, 4.0, 5.0}->sum()");
		assertResult(Integer.valueOf(13), "Bag{4, 4, 5}->sum()");
		assertResult(Double.valueOf(9), "Set{4, 4, 5.0}->sum()");
		assertResult(Double.valueOf(9d), "OrderedSet{4.0, 4.0, 5.0}->sum()");

		assertResult(Integer.valueOf(4), "4->sum()");
	}

	public void testCollectionSumInvalid() {
		assertResultInvalid("let s : Sequence(Integer) = invalid in s->sum()");
		assertResultInvalid("let b : Bag(Integer) = invalid in b->sum()");
		assertResultInvalid("let s : Set(Integer) = invalid in s->sum()");
		assertResultInvalid("let o : OrderedSet(Integer) = invalid in o->sum()");
	}

	public void testCollectionSumInvalidValue() {
		assertResultInvalid("Sequence{4.0, invalid, 5.0}->sum()");
		assertResultInvalid("Bag{4, invalid, 5}->sum()");
		assertResultInvalid("Set{4, invalid, 5}->sum()");
		assertResultInvalid("OrderedSet{4.0, invalid, 5.0}->sum()");
	}

	public void testCollectionSumNull() {
		assertResultInvalid("let s : Sequence(Integer) = null in s->sum()");
		assertResultInvalid("let b : Bag(Integer) = null in b->sum()");
		assertResultInvalid("let s : Set(Integer) = null in s->sum()");
		assertResultInvalid("let o : OrderedSet(Integer) = null in o->sum()");
	}

	public void testCollectionSumNullValue() {
		assertResultInvalid("Sequence{4.0, null, 5.0}->sum()");
		assertResultInvalid("Bag{4, null, 5}->sum()");
		assertResultInvalid("Set{4, null, 5}->sum()");
		assertResultInvalid("OrderedSet{4.0, null, 5.0}->sum()");
	}

	public void testCollectionSymmetricDifference() {
		assertExpressionResults("Set{'a', 'c'}", "Set{'a', 'b'}->symmetricDifference(Set{'b', 'c'})");
	}

	public void testCollectionSymmetricDifferenceInvalid() {
		assertResultInvalid("let s : Set(String) = invalid in s->symmetricDifference(Set{'a'})");
	}

	public void testCollectionSymmetricDifferenceInvalidValue() {
		assertResultInvalid("Set{'a', invalid, 'b'}->symmetricDifference(Set{'b', 'c'})");
	}

	public void testCollectionSymmetricDifferenceNull() {
		assertResultInvalid("let s : Set(String) = null in s->symmetricDifference(Set{'a'})");
	}

	public void testCollectionSymmetricDifferenceNullValue() {
		// FIXME passes as a side effect of bug 283518
		assertExpressionResults("Set{'a', null, 'c'}", "Set{'a', null, 'b'}->symmetricDifference(Set{'b', 'c'})");
	}

	public void testCollectionUnionDuplicates() {
		assertExpressionResults("Set{'a', 'b', 'c'}", "Set{'a', 'b', 'a'}->union(Set{'b', 'c'})");
		assertExpressionResults("Bag{'a', 'b', 'b', 'c'}", "Set{'a', 'b', 'a'}->union(Bag{'b', 'c'})");
		assertExpressionResults("Bag{'a', 'b', 'a', 'b', 'c'}", "Bag{'a', 'b', 'a'}->union(Bag{'b', 'c'})");
		assertExpressionResults("Bag{'a', 'b', 'a', 'b', 'c'}", "Bag{'a', 'b', 'a'}->union(Set{'b', 'c'})");

		assertExpressionResults("Sequence{'a', 'b', 'a', 'b', 'c'}", "Sequence{'a', 'b', 'a'}->union(Sequence{'b', 'c'})");
	}

	public void testCollectionUnionEmptyCollection() {
		assertExpressionResults("Set{3, 4}", "Set{3, 4}->union(Set{})");
		assertExpressionResults("Bag{3, 4}", "Set{3, 4}->union(Bag{})");
		assertExpressionResults("Bag{3, 4}", "Bag{3, 4}->union(Bag{})");
		assertExpressionResults("Bag{3, 4}", "Bag{3, 4}->union(Set{})");
		assertExpressionResults("Sequence{3, 4}", "Sequence{3, 4}->union(Sequence{})");

		assertExpressionResults("Set{3, 4}", "let s:Set(Integer)=Set{} in s->union(Set{3, 4})");
		assertExpressionResults("Bag{3, 4}", "let s:Set(Integer)=Set{} in s->union(Bag{3, 4})");
		assertExpressionResults("Bag{3, 4}", "let b:Bag(Integer)=Bag{} in b->union(Bag{3, 4})");
		assertExpressionResults("Bag{3, 4}", "let b:Bag(Integer)=Bag{} in b->union(Set{3, 4})");
		assertExpressionResults("Sequence{3, 4}", "let s:Sequence(Integer)=Sequence{} in s->union(Sequence{3, 4})");
	}

	public void testCollectionUnionInvalid() {
		assertResultInvalid("let s : Set(String) = invalid in s->union(Set{'a'})");
		assertResultInvalid("let s : Set(String) = invalid in s->union(Bag{'a'})");
		assertResultInvalid("let b : Bag(String) = invalid in b->union(Bag{'a'})");
		assertResultInvalid("let b : Bag(String) = invalid in b->union(Set{'a'})");
		assertResultInvalid("let s : Sequence(String) = invalid in s->union(Sequence{'a'})");

		assertResultInvalid("let s : Set(String) = invalid in Set{'a'}->union(s)");
		assertResultInvalid("let s : Set(String) = invalid in Bag{'a'}->union(s)");
		assertResultInvalid("let b : Bag(String) = invalid in Bag{'a'}->union(b)");
		assertResultInvalid("let b : Bag(String) = invalid in Set{'a'}->union(b)");
		assertResultInvalid("let s : Sequence(String) = invalid in Sequence{'a'}->union(s)");
	}

	public void testCollectionUnionInvalidValue() {
		assertResultInvalid("Set{'a', invalid}->union(Set{'b', invalid})");
		assertResultInvalid("Set{'a', invalid}->union(Bag{'b', invalid})");
		assertResultInvalid("Bag{'a', invalid}->union(Bag{'b', invalid})");
		assertResultInvalid("Bag{'a', invalid}->union(Set{'b', invalid})");
		assertResultInvalid("Sequence{'a', invalid}->union(Sequence{'b', invalid})");
	}

	public void testCollectionUnionNoDuplicates() {
		/*
		 * FIXME the specification defines operations Set::union(Set),
		 * Set::union(Bag), Bag::union(Set) and Bag::union(Bag) with the same
		 * semantics "the union of self and bag" and operation
		 * Sequence::union(Sequence) with the description
		 * "The sequence consisting of all elements in self, followed by all elements in s"
		 * . Why aren't there Sequence::union(OrderedSet),
		 * OrderedSet::union(Sequence) and OrderedSet::union(OrderedSet) with
		 * the same semantics as Sequence::union(Sequence) ? That is most likely
		 * an overlook.
		 */
		assertExpressionResults("Set{'a', 'b', 'c', 'd'}", "Set{'a', 'b'}->union(Set{'c', 'd'})");
		assertExpressionResults("Bag{'a', 'b', 'c', 'd'}", "Set{'a', 'b'}->union(Bag{'c', 'd'})");
		assertExpressionResults("Bag{'a', 'b', 'c', 'd'}", "Bag{'a', 'b'}->union(Bag{'c', 'd'})");
		assertExpressionResults("Bag{'a', 'b', 'c', 'd'}", "Bag{'a', 'b'}->union(Set{'c', 'd'})");

		assertExpressionResults("Sequence{'a', 'b', 'c', 'd'}", "Sequence{'a', 'b'}->union(Sequence{'c', 'd'})");
	}

	public void testCollectionUnionNull() {
		assertResultInvalid("let s : Set(String) = null in s->union(Set{'a'})");
		assertResultInvalid("let s : Set(String) = null in s->union(Bag{'a'})");
		assertResultInvalid("let b : Bag(String) = null in b->union(Bag{'a'})");
		assertResultInvalid("let b : Bag(String) = null in b->union(Set{'a'})");
		assertResultInvalid("let s : Sequence(String) = null in s->union(Sequence{'a'})");

		assertResultInvalid("let s : Set(String) = null in Set{'a'}->union(s)");
		assertResultInvalid("let s : Set(String) = null in Bag{'a'}->union(s)");
		assertResultInvalid("let b : Bag(String) = null in Bag{'a'}->union(b)");
		assertResultInvalid("let b : Bag(String) = null in Set{'a'}->union(b)");
		assertResultInvalid("let s : Sequence(String) = null in Sequence{'a'}->union(s)");
	}

	public void testCollectionUnionNullValue() {
		assertExpressionResults("Set{'a', null, 'b'}", "Set{'a', null}->union(Set{'b', null})");
		assertExpressionResults("Bag{'a', null, 'b', null}", "Set{'a', null}->union(Bag{'b', null})");
		assertExpressionResults("Bag{'a', null, 'b', null}", "Bag{'a', null}->union(Bag{'b', null})");
		assertExpressionResults("Bag{'a', null, 'b', null}", "Bag{'a', null}->union(Set{'b', null})");
		assertExpressionResults("Sequence{'a', null, 'b', null}", "Sequence{'a', null}->union(Sequence{'b', null})");
	}
}
