blob: f710d1691550d3543011416ca62cf37dfb2d701b [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2010, 2013 Eclipse Modeling Project and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* L.Goubet, E.D.Willink - Initial API and implementation
*******************************************************************************/
package org.eclipse.ocl.examples.pivot.tests;
import java.util.Arrays;
import java.util.Collection;
import org.eclipse.jdt.annotation.NonNull;
import org.eclipse.ocl.examples.domain.values.impl.InvalidValueException;
import org.eclipse.ocl.examples.pivot.messages.OCLMessages;
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 collection operations.
*/
@SuppressWarnings("nls")
@RunWith(value = Parameterized.class)
public class EvaluateCollectionOperationsTest4 extends PivotTestSuite
{
@Parameters
public static Collection<Object[]> data() {
Object[][] data = new Object[][]{{false}, {true}};
return Arrays.asList(data);
}
public EvaluateCollectionOperationsTest4(boolean useCodeGen) {
super(useCodeGen);
}
@Override
protected @NonNull String getTestPackageName() {
return "EvaluateCollectionOperations";
}
@BeforeClass public static void resetCounter() throws Exception {
PivotTestSuite.resetCounter();
}
@Override
@Before public void setUp() throws Exception {
super.setUp();
}
@Override
@After public void tearDown() throws Exception {
super.tearDown();
}
@Test public void testCollectionAppend() {
assertQueryResults(null, "Sequence{'a', 'b', 'c'}", "Sequence{'a', 'b'}->append('c')");
assertQueryResults(null, "OrderedSet{'a', 'b', 'c'}", "OrderedSet{'a', 'b'}->append('c')");
assertQueryResults(null, "Sequence{1..4,0}", "Sequence{1..4}->append(0)");
assertQueryResults(null, "Sequence{1..4,4}", "Sequence{1..4}->append(4)");
assertQueryResults(null, "Sequence{1..5}", "Sequence{1..4}->append(5)");
assertQueryResults(null, "Sequence{1..4,6}", "Sequence{1..4}->append(6)");
assertQueryResults(null, "OrderedSet{1..4,0}", "OrderedSet{1..4}->append(0)");
assertQueryResults(null, "OrderedSet{1,3,4,2}", "OrderedSet{1..4}->append(2)");
assertQueryResults(null, "OrderedSet{1..5}", "OrderedSet{1..4}->append(5)");
assertQueryResults(null, "OrderedSet{1..4,6}", "OrderedSet{1..4}->append(6)");
// invalid collection
assertQueryInvalid(null, "let s : Sequence(String) = invalid in s->append('a')");
assertQueryInvalid(null, "let o : OrderedSet(String) = invalid in o->append('a')");
// invalid collection element
assertQueryInvalid(null, "Sequence{'a', 'b'}->append(invalid)");
assertQueryInvalid(null, "OrderedSet{'a', 'b'}->append(invalid)");
// null collection
assertQueryInvalid(null, "let o : OrderedSet(String) = null in o->append('a')");
assertQueryInvalid(null, "let s : Sequence(String) = null in s->append('a')");
// null collection element
assertQueryResults(null, "Sequence{'a', 'b', null}", "Sequence{'a', 'b'}->append(null)");
assertQueryResults(null, "OrderedSet{'a', 'b', null}", "OrderedSet{'a', 'b'}->append(null)");
assertQueryResults(null, "Sequence{'a', null, 'b', null}", "Sequence{'a', null, 'b'}->append(null)");
assertQueryResults(null, "OrderedSet{'a', 'b', null}", "OrderedSet{'a', null, 'b'}->append(null)");
assertQueryResults(null, "Sequence{'1..2', null}", "Sequence{'1..2'}->append(null)");
assertQueryResults(null, "OrderedSet{'1..2', null}", "OrderedSet{'1..2'}->append(null)");
}
@Test public void testCollectionAppendAll() {
assertQueryResults(null, "Sequence{'a', 'b', 'c', 'd'}", "Sequence{'a', 'b'}->appendAll(Sequence{'c', 'd'})");
assertQueryResults(null, "Sequence{'a', 'b', 'c', 'd'}", "Sequence{'a', 'b'}->appendAll(OrderedSet{'c', 'd'})");
assertQueryResults(null, "OrderedSet{'a', 'b', 'c', 'd'}", "OrderedSet{'a', 'b'}->appendAll(Sequence{'c', 'd'})");
assertQueryResults(null, "OrderedSet{'a', 'b', 'c', 'd'}", "OrderedSet{'a', 'b'}->appendAll(OrderedSet{'c', 'd'})");
assertQueryResults(null, "Sequence{10..40,0..10}", "Sequence{10..40}->appendAll(Sequence{0..10})");
assertQueryResults(null, "Sequence{10..40,40..50}", "Sequence{10..40}->appendAll(Sequence{40..50})");
assertQueryResults(null, "Sequence{1..9}", "Sequence{1..4}->appendAll(Sequence{5..9})");
assertQueryResults(null, "Sequence{1..4,6..10}", "Sequence{1..4}->appendAll(Sequence{6..10})");
assertQueryResults(null, "OrderedSet{12..40,0..11}", "OrderedSet{10..40}->appendAll(OrderedSet{0..11})");
assertQueryResults(null, "OrderedSet{1,3,2,4}", "OrderedSet{1..4}->appendAll(OrderedSet{2,4})");
assertQueryResults(null, "OrderedSet{1..10}", "OrderedSet{1..4}->appendAll(OrderedSet{5..10})");
assertQueryResults(null, "OrderedSet{1..4,6..10}", "OrderedSet{1..4}->appendAll(OrderedSet{6..10})");
// invalid collection
assertQueryInvalid(null, "let s : Sequence(String) = invalid in s->appendAll(Sequence{'c', 'd'})");
assertQueryInvalid(null, "let o : OrderedSet(String) = invalid in o->appendAll(OrderedSet{'c', 'd'})");
// invalid collection element
assertQueryInvalid(null, "Sequence{'a', 'b'}->appendAll(invalid)");
assertQueryInvalid(null, "OrderedSet{'a', 'b'}->appendAll(invalid)");
// null collection
assertQueryInvalid(null, "let o : OrderedSet(String) = null in o->appendAll(Sequence{'c', 'd'})");
assertQueryInvalid(null, "let s : Sequence(String) = null in s->appendAll(OrderedSet{'c', 'd'})");
assertQueryInvalid(null, "Sequence{'a', 'b'}->appendAll(null)");
assertQueryInvalid(null, "OrderedSet{'a', 'b'}->appendAll(null)");
// null collection element
assertQueryResults(null, "Sequence{'a', 'b', null, null}", "Sequence{'a', 'b'}->appendAll(Sequence{null,null})");
assertQueryResults(null, "OrderedSet{'a', 'b', null}", "OrderedSet{'a', 'b'}->appendAll(Sequence{null,null})");
assertQueryResults(null, "Sequence{'a', null, 'b', null, null}", "Sequence{'a', null, 'b'}->appendAll(Sequence{null,null})");
assertQueryResults(null, "OrderedSet{'a', 'b', null}", "OrderedSet{'a', null, 'b'}->appendAll(Sequence{null,null})");
assertQueryResults(null, "Sequence{'1..2', null, null}", "Sequence{'1..2'}->appendAll(Sequence{null,null})");
assertQueryResults(null, "OrderedSet{'1..2', null}", "OrderedSet{'1..2'}->appendAll(Sequence{null,null})");
}
@Test public void testCollectionAsBag() {
assertQueryEquals(null, getEmptyBagValue(), "Sequence{}->asBag()");
assertQueryEquals(null, getEmptyBagValue(), "Bag{}->asBag()");
assertQueryEquals(null, getEmptyBagValue(), "Set{}->asBag()");
assertQueryEquals(null, getEmptyBagValue(), "OrderedSet{}->asBag()");
assertQueryResults(null, "Bag{1, 2.0, '3'}", "Sequence{1, 2.0, '3'}->asBag()");
assertQueryResults(null, "Bag{1, 2.0, '3'}", "Bag{1, 2.0, '3'}->asBag()");
assertQueryResults(null, "Bag{1, 2.0, '3'}", "Set{1, 2.0, '3'}->asBag()");
assertQueryResults(null, "Bag{1, 2.0, '3'}", "OrderedSet{1, 2.0, '3'}->asBag()");
// invalid collection
assertQueryInvalid(null, "let s : Sequence(Integer) = invalid in s->asBag()");
assertQueryInvalid(null, "let b : Bag(Integer) = invalid in b->asBag()");
assertQueryInvalid(null, "let s : Set(Integer) = invalid in s->asBag()");
assertQueryInvalid(null, "let o : OrderedSet(Integer) = invalid in o->asBag()");
// null collection
assertQueryInvalid(null, "let s : Sequence(Integer) = null in s->asBag()");
assertQueryInvalid(null, "let b : Bag(Integer) = null in b->asBag()");
assertQueryInvalid(null, "let s : Set(Integer) = null in s->asBag()");
assertQueryInvalid(null, "let o : OrderedSet(Integer) = null in o->asBag()");
}
@Test public void testCollectionAsOrderedSet() {
assertQueryEquals(null, getEmptyOrderedSetValue(), "Sequence{}->asOrderedSet()");
assertQueryEquals(null, getEmptyOrderedSetValue(), "Bag{}->asOrderedSet()");
assertQueryEquals(null, getEmptyOrderedSetValue(), "Set{}->asOrderedSet()");
assertQueryEquals(null, getEmptyOrderedSetValue(), "OrderedSet{}->asOrderedSet()");
assertQueryResults(null, "OrderedSet{1, 2.0, '3'}", "Sequence{1, 2.0, '3'}->asOrderedSet()");
assertQueryResults(null, "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(null, "OrderedSet{1, 2.0, '3'}", "Set{1, 2.0, '3'}->asOrderedSet()");
assertResultContainsAll(null, "OrderedSet{1, 2.0, '3'}", "Bag{1, 2.0, '3'}->asOrderedSet()");
assertQueryResults(null, "OrderedSet{'a', 'b', 'c'}", "Sequence{'a', 'b', 'c', 'b'}->asOrderedSet()");
assertResultContainsAll(null, "OrderedSet{'a', 'b', 'c'}", "Bag{'a', 'b', 'c', 'b'}->asOrderedSet()");
assertResultContainsAll(null, "OrderedSet{'a', 'b', 'c'}", "Set{'a', 'b', 'c', 'b'}->asOrderedSet()");
assertQueryResults(null, "OrderedSet{'a', 'b', 'c'}", "OrderedSet{'a', 'b', 'c', 'b'}->asOrderedSet()");
// invalid collection
assertQueryInvalid(null, "let s : Sequence(Integer) = invalid in s->asOrderedSet()");
assertQueryInvalid(null, "let b : Bag(Integer) = invalid in b->asOrderedSet()");
assertQueryInvalid(null, "let s : Set(Integer) = invalid in s->asOrderedSet()");
assertQueryInvalid(null, "let o : OrderedSet(Integer) = invalid in o->asOrderedSet()");
// null collection
assertQueryInvalid(null, "let s : Sequence(Integer) = null in s->asOrderedSet()");
assertQueryInvalid(null, "let b : Bag(Integer) = null in b->asOrderedSet()");
assertQueryInvalid(null, "let s : Set(Integer) = null in s->asOrderedSet()");
assertQueryInvalid(null, "let o : OrderedSet(Integer) = null in o->asOrderedSet()");
}
@Test public void testCollectionAsSequence() {
assertQueryEquals(null, getEmptySequenceValue(), "Sequence{}->asSequence()");
assertQueryEquals(null, getEmptySequenceValue(), "Bag{}->asSequence()");
assertQueryEquals(null, getEmptySequenceValue(), "Set{}->asSequence()");
assertQueryEquals(null, getEmptySequenceValue(), "OrderedSet{}->asSequence()");
assertQueryResults(null, "Sequence{1, 2.0, '3'}", "Sequence{1, 2.0, '3'}->asSequence()");
assertQueryResults(null, "Sequence{1, 2.0, '3'}", "OrderedSet{1, 2.0, '3'}->asSequence()");
// assertQueryResults(null, "OrderedSet{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(null, "Sequence{1, 2.0, '3'}", "Bag{1, 2.0, '3'}->asSequence()");
assertResultContainsAll(null, "Sequence{1, 2.0, '3'}", "Set{1, 2.0, '3'}->asSequence()");
// invalid collection
// assertQueryInvalid(null, "invalid->asSequence()");
assertQueryInvalid(null, "let s : Sequence(Integer) = invalid in s->asSequence()");
assertQueryInvalid(null, "let b : Bag(Integer) = invalid in b->asSequence()");
assertQueryInvalid(null, "let s : Set(Integer) = invalid in s->asSequence()");
assertQueryInvalid(null, "let o : OrderedSet(Integer) = invalid in o->asSequence()");
// null collection
assertQueryInvalid(null, "let s : Sequence(Integer) = null in s->asSequence()");
assertQueryInvalid(null, "let b : Bag(Integer) = null in b->asSequence()");
assertQueryInvalid(null, "let s : Set(Integer) = null in s->asSequence()");
assertQueryInvalid(null, "let o : OrderedSet(Integer) = null in o->asSequence()");
}
@Test public void testCollectionAsSet() {
assertQueryEquals(null, getEmptySetValue(), "Sequence{}->asSet()");
assertQueryEquals(null, getEmptySetValue(), "Bag{}->asSet()");
assertQueryEquals(null, getEmptySetValue(), "Set{}->asSet()");
assertQueryEquals(null, getEmptySetValue(), "OrderedSet{}->asSet()");
assertQueryResults(null, "Set{1, 2.0, '3'}", "Sequence{1, 2.0, '3'}->asSet()");
assertResultContainsAll(null, "Set{1, 2.0, '3'}", "Bag{1, 2.0, '3'}->asSet()");
assertResultContainsAll(null, "Set{1, 2.0, '3'}", "Set{1, 2.0, '3'}->asSet()");
assertQueryResults(null, "Set{1, 2.0, '3'}", "OrderedSet{1, 2.0, '3'}->asSet()");
assertQueryResults(null, "Set{'a', 'b', 'c'}", "Sequence{'a', 'b', 'c', 'b'}->asSet()");
assertQueryResults(null, "Set{'a', 'b', 'c'}", "Bag{'a', 'b', 'c', 'b'}->asSet()");
assertQueryResults(null, "Set{'a', 'b', 'c'}", "Set{'a', 'b', 'c', 'b'}->asSet()");
assertQueryResults(null, "Set{'a', 'b', 'c'}", "OrderedSet{'a', 'b', 'c', 'b'}->asSet()");
// invalid collection
assertQueryInvalid(null, "let s : Sequence(Integer) = invalid in s->asSet()");
assertQueryInvalid(null, "let b : Bag(Integer) = invalid in b->asSet()");
assertQueryInvalid(null, "let s : Set(Integer) = invalid in s->asSet()");
assertQueryInvalid(null, "let o : OrderedSet(Integer) = invalid in o->asSet()");
// null collection
assertQueryInvalid(null, "let s : Sequence(Integer) = null in s->asSet()");
assertQueryInvalid(null, "let b : Bag(Integer) = null in b->asSet()");
assertQueryInvalid(null, "let s : Set(Integer) = null in s->asSet()");
assertQueryInvalid(null, "let o : OrderedSet(Integer) = null in o->asSet()");
}
@Test public void testCollectionAt() {
assertQueryEquals(null, "a", "Sequence{'a', 'b'}->at(1)");
assertQueryEquals(null, "b", "OrderedSet{'a', 'b'}->at(2)");
assertQueryEquals(null, -3, "Sequence{-3..-1}->at(1)");
assertQueryInvalid(null, "Sequence{-1..-3}->at(3)");
// invalid collection
assertQueryInvalid(null, "let s : Sequence(String) = invalid in s->at(1)");
assertQueryInvalid(null, "let o : OrderedSet(String) = invalid in o->at(1)");
// invalid collection element
assertQueryInvalid(null, "Sequence{'a', invalid}->at(1)");
assertQueryInvalid(null, "OrderedSet{'a', invalid}->at(1)");
// null collection
assertQueryInvalid(null, "let s : Sequence(String) = null in s->at(1)");
assertQueryInvalid(null, "let o : OrderedSet(String) = null in o->at(1)");
// null collection element
assertQueryNull(null, "Sequence{null, 'a'}->at(1)");
assertQueryNull(null, "OrderedSet{null, 'a'}->at(1)");
// out of bounds
assertQueryInvalid(null, "Sequence{'a'}->at(0)");
assertQueryInvalid(null, "OrderedSet{'a'}->at(0)");
assertQueryInvalid(null, "Sequence{'a'}->at(2)");
assertQueryInvalid(null, "OrderedSet{'a'}->at(2)");
assertQueryInvalid(null, "Sequence{-1..-3}->at(0)");
assertQueryInvalid(null, "Sequence{-1..-3}->at(4)");
}
@Test public void testCollectionCount() {
assertQueryEquals(null, 1, "Sequence{3, 'test', 4.0, 4, 4.0, 'test'}->count(3)");
assertQueryEquals(null, 3, "Sequence{3, 'test', 4.0, 4, 4.0, 'test'}->count(4)");
assertQueryEquals(null, 3, "Sequence{3, 'test', 4.0, 4, 4.0, 'test'}->count(-(-4))");
assertQueryEquals(null, 3, "Sequence{3, 'test', 4.0, 4, 4.0, 'test'}->count(4.0)");
assertQueryEquals(null, 2, "Sequence{3, 'test', 4.0, 4, 4.0, 'test'}->count('test')");
assertQueryEquals(null, 1, "Bag{3, 'test', 4.0, 4, 4.0, 'test'}->count(3)");
assertQueryEquals(null, 3, "Bag{3, 'test', 4.0, 4, 4.0, 'test'}->count(4)");
assertQueryEquals(null, 3, "Bag{3, 'test', 4.0, 4, 4.0, 'test'}->count(-(-4))");
assertQueryEquals(null, 3, "Bag{3, 'test', 4.0, 4, 4.0, 'test'}->count(4.0)");
assertQueryEquals(null, 2, "Bag{3, 'test', 4.0, 4, 4.0, 'test'}->count('test')");
assertQueryEquals(null, 1, "Set{3, 'test', 4.0, 4, 4.0, 'test'}->count(3)");
assertQueryEquals(null, 1, "Set{3, 'test', 4.0, 4, 4.0, 'test'}->count(4)");
assertQueryEquals(null, 1, "Set{3, 'test', 4.0, 4, 4.0, 'test'}->count(-(-4))");
assertQueryEquals(null, 1, "Set{3, 'test', 4.0, 4, 4.0, 'test'}->count(4.0)");
assertQueryEquals(null, 1, "Set{3, 'test', 4.0, 4, 4.0, 'test'}->count('test')");
assertQueryEquals(null, 1, "OrderedSet{3, 'test', 4.0, 4, 4.0, 'test'}->count(3)");
assertQueryEquals(null, 1, "OrderedSet{3, 'test', 4.0, 4, 4.0, 'test'}->count(4)");
assertQueryEquals(null, 1, "OrderedSet{3, 'test', 4.0, 4, 4.0, 'test'}->count(-(-4))");
assertQueryEquals(null, 1, "OrderedSet{3, 'test', 4.0, 4, 4.0, 'test'}->count(4.0)");
assertQueryEquals(null, 1, "OrderedSet{3, 'test', 4.0, 4, 4.0, 'test'}->count('test')");
assertQueryEquals(null, 1, "Sequence{-4..-4}->count(-4)");
assertQueryEquals(null, 1, "Sequence{-4..-1}->count(-4)");
assertQueryEquals(null, 0, "Sequence{-1..-4}->count(-4)");
assertQueryEquals(null, 1, "Sequence{-4..-1}->count(-1)");
assertQueryEquals(null, 0, "Sequence{-1..-4}->count(-1)");
assertQueryEquals(null, 0, "Sequence{3, 'test', 4.0, 4, 4.0, 'test'}->count(0)");
assertQueryEquals(null, 0, "Bag{3, 'test', 4.0, 4, 4.0, 'test'}->count(0)");
assertQueryEquals(null, 0, "Set{3, 'test', 4.0, 4, 4.0, 'test'}->count(0)");
assertQueryEquals(null, 0, "OrderedSet{3, 'test', 4.0, 4, 4.0, 'test'}->count(0)");
assertQueryEquals(null, 0, "Sequence{-4..-1}->count(-5)");
assertQueryEquals(null, 0, "Sequence{-1..-4}->count(-5)");
assertQueryEquals(null, 0, "Sequence{-4..-1}->count(0)");
assertQueryEquals(null, 0, "Sequence{-1..-4}->count(0)");
assertQueryEquals(null, 0, "Sequence{-1..-4}->count('x')");
// invalid collection
assertQueryInvalid(null, "let s : Sequence(Integer) = invalid in s->count(0)");
assertQueryInvalid(null, "let b : Bag(Integer) = invalid in b->count(0)");
assertQueryInvalid(null, "let s : Set(Integer) = invalid in s->count(0)");
assertQueryInvalid(null, "let os : OrderedSet(Integer) = invalid in os->count(0)");
// invalid collection element
assertQueryInvalid(null, "Sequence{3, 'test', 4.0, 4, 4.0, 'test'}->count(invalid)");
assertQueryInvalid(null, "Bag{3, 'test', 4.0, 4, 4.0, 'test'}->count(invalid)");
assertQueryInvalid(null, "Set{3, 'test', 4.0, 4, 4.0, 'test'}->count(invalid)");
assertQueryInvalid(null, "OrderedSet{3, 'test', 4.0, 4, 4.0, 'test'}->count(invalid)");
assertQueryInvalid(null, "Sequence{3, invalid, 4.0, invalid, 'test'}->count(3)");
assertQueryInvalid(null, "Bag{3, invalid, 4.0, invalid, 'test'}->count(3)");
assertQueryInvalid(null, "Set{3, invalid, 4.0, invalid, 'test'}->count(3)");
assertQueryInvalid(null, "OrderedSet{3, invalid, 4.0, invalid, 'test'}->count(3)");
// null collection
assertQueryInvalid(null, "let s : Sequence(Integer) = null in s->count(0)");
assertQueryInvalid(null, "let b : Bag(Integer) = null in b->count(0)");
assertQueryInvalid(null, "let s : Set(Integer) = null in s->count(0)");
assertQueryInvalid(null, "let os : OrderedSet(Integer) = null in os->count(0)");
// null collection element
assertQueryEquals(null, 0, "Sequence{3, 'test', 4.0, 4, 4.0, 'test'}->count(null)");
assertQueryEquals(null, 0, "Bag{3, 'test', 4.0, 4, 4.0, 'test'}->count(null)");
assertQueryEquals(null, 0, "Set{3, 'test', 4.0, 4, 4.0, 'test'}->count(null)");
assertQueryEquals(null, 0, "OrderedSet{3, 'test', 4.0, 4, 4.0, 'test'}->count(null)");
assertQueryEquals(null, 2, "Sequence{3, null, 4.0, null, 'test'}->count(null)");
assertQueryEquals(null, 2, "Bag{3, null, 4.0, null, 'test'}->count(null)");
assertQueryEquals(null, 1, "Set{3, null, 4.0, null, 'test'}->count(null)");
assertQueryEquals(null, 1, "OrderedSet{3, null, 4.0, null, 'test'}->count(null)");
}
@Test public void testCollectionElementType() {
assertQueryEquals(null, metaModelManager.getStringType(), "Sequence{'1', '2', '3'}->oclType().elementType");
assertQueryEquals(null, metaModelManager.getOclAnyType(), "Sequence{1, 2.0, '3'}->oclType().elementType");
assertQueryEquals(null, metaModelManager.getUnlimitedNaturalType(), "Sequence{1, 2, 3}->oclType().elementType");
assertQueryEquals(null, metaModelManager.getUnlimitedNaturalType(), "Sequence{1, 2, 3}->oclAsType(Collection(Real))->oclType().elementType");
// FIXME fails because common type is Set(T) and then because T is not type-servable and has no OclAny inheritance
// assertQueryEquals(null, metaModelManager.getSetType(), "Sequence{Set{1}, Set{2.0}, Set{'3'}}->elementType");
// FIXME fails because common type is inadequate for implicit collect
// assertQueryEquals(null, metaModelManager.getOclAnyType(), "Sequence{Set{1}, Set{2.0}, Set{'3'}}.elementType");
}
@Test public void testCollectionEqual() {
assertQueryFalse(null, "Bag{1} = 1");
assertQueryFalse(null, "OrderedSet{1} = 1");
assertQueryFalse(null, "Sequence{1} = 1");
assertQueryFalse(null, "Set{1} = 1");
assertQueryFalse(null, "1 = Bag{1}");
assertQueryFalse(null, "1 = OrderedSet{1}");
assertQueryFalse(null, "1 = Sequence{1}");
assertQueryFalse(null, "1 = Set{1}");
assertQueryFalse(null, "Set{1} = Set{Set{1}}");
assertQueryFalse(null, "Bag{1.01} = Bag{1}");
assertQueryFalse(null, "OrderedSet{1.01} = OrderedSet{1}");
assertQueryFalse(null, "Sequence{1.01} = Sequence{1}");
assertQueryFalse(null, "Set{1.01} = Set{1}");
assertQueryFalse(null, "Set{Set{1.01}} = Set{Set{1}}");
assertQueryTrue(null, "Bag{1.0} = Bag{1}");
assertQueryTrue(null, "OrderedSet{1.0} = OrderedSet{1}");
assertQueryTrue(null, "Sequence{1.0} = Sequence{1}");
assertQueryTrue(null, "Set{1.0} = Set{1}");
assertQueryTrue(null, "Set{Set{1.0}} = Set{Set{1}}");
assertQueryTrue(null, "Sequence{1,2} = Sequence{1,2}");
assertQueryTrue(null, "Sequence{1..2} = Sequence{1..2}");
assertQueryTrue(null, "Sequence{1..2} = Sequence{1,2}");
assertQueryTrue(null, "Sequence{1,2} = Sequence{1..2}");
assertQueryFalse(null, "Sequence{1..2} = Sequence{2,1}");
assertQueryFalse(null, "Sequence{1..2} = Sequence{1,2,1}");
assertQueryTrue(null, "OrderedSet{1,2} = OrderedSet{1,2}");
assertQueryTrue(null, "OrderedSet{1..2} = OrderedSet{1..2}");
assertQueryTrue(null, "OrderedSet{1..2} = OrderedSet{1,2}");
assertQueryTrue(null, "OrderedSet{1,2} = OrderedSet{1..2}");
assertQueryFalse(null, "OrderedSet{1..2} = OrderedSet{2,1}");
assertQueryTrue(null, "OrderedSet{1..2} = OrderedSet{1,2,1}");
assertQueryFalse(null, "Sequence{1..2} = OrderedSet{1,2}");
// null collection element
assertQueryTrue(null, "Bag{null} = Bag{null}");
assertQueryTrue(null, "OrderedSet{null} = OrderedSet{null}");
assertQueryTrue(null, "Sequence{null} = Sequence{null}");
assertQueryTrue(null, "Set{null} = Set{null}");
assertQueryTrue(null, "Set{Set{null}} = Set{Set{null}}");
}
@Test public void testCollectionEqualOrderedXOrdered() {
// same order, same quantities
assertQueryTrue(null, "Sequence{4, 5, 'test'} = Sequence{4, 5, 'test'}");
assertQueryTrue(null, "Sequence{4, 5, 'test', 5} = Sequence{4, 5, 'test', 5}");
assertQueryTrue(null, "OrderedSet{4, 5, 'test', 5} = OrderedSet{4, 5, 'test'}");
assertQueryFalse(null, "Sequence{4, 5, 'test'} = OrderedSet{4, 5, 'test', 5}");
assertQueryFalse(null, "OrderedSet{4, 5, 'test', 5} = Sequence{4, 5, 'test'}");
// distinct order, same quantities
assertQueryFalse(null, "Sequence{4, 5, 'test'} = Sequence{4, 'test', 5}");
assertQueryFalse(null, "Sequence{4, 5, 'test', 5} = Sequence{5, 4, 'test', 5}");
assertQueryFalse(null, "OrderedSet{4, 5, 'test', 5} = OrderedSet{4, 'test', 5}");
assertQueryFalse(null, "Sequence{4, 5, 'test'} = OrderedSet{5, 4, 'test', 5}");
assertQueryFalse(null, "OrderedSet{4, 5, 'test', 5} = Sequence{5, 4, 'test'}");
// distinct quantities
assertQueryFalse(null, "Sequence{4, 5, 'test', 5} = Sequence{4, 5, 'test'}");
assertQueryFalse(null, "Sequence{4, 5, 'test', 5} = OrderedSet{4, 5, 'test', 5}");
assertQueryFalse(null, "OrderedSet{4, 5, 'test', 5} = Sequence{4, 5, 'test', 5}");
}
@Test public void testCollectionEqualOrderedXUnordered() {
// same quantities
assertQueryFalse(null, "Sequence{4, 5, 'test'} = Set{4, 'test', 5, 4}");
assertQueryFalse(null, "Sequence{4, 5, 'test', 4} = Bag{4, 'test', 5, 4}");
assertQueryFalse(null, "OrderedSet{4, 5, 'test', 4} = Set{4, 'test', 5, 4}");
assertQueryFalse(null, "OrderedSet{4, 5, 'test', 4} = Bag{4, 'test', 5}");
// distinct quantities
assertQueryFalse(null, "Sequence{4, 5, 'test', 4} = Set{4, 'test', 5, 4}");
assertQueryFalse(null, "Sequence{4, 5, 'test'} = Bag{4, 'test', 5, 4}");
assertQueryFalse(null, "OrderedSet{4, 5, 'test', 4} = Bag{4, 'test', 5, 4}");
}
@Test public void testCollectionEqualUnorderedXUnordered() {
// same quantities
assertQueryFalse(null, "Bag{4, 5, 'test'} = Set{4, 'test', 5, 4}");
assertQueryTrue(null, "Bag{4, 5, 'test', 4} = Bag{4, 'test', 5, 4}");
assertQueryTrue(null, "Set{4, 5, 'test', 4} = Set{4, 'test', 5, 4}");
assertQueryFalse(null, "Set{4, 5, 'test', 4} = Bag{4, 'test', 5}");
// distinct quantities
assertQueryFalse(null, "Bag{4, 5, 'test', 4} = Set{4, 'test', 5, 4}");
assertQueryFalse(null, "Bag{4, 5, 'test'} = Bag{4, 'test', 5, 4}");
assertQueryFalse(null, "Set{4, 5, 'test', 4} = Bag{4, 'test', 5, 4}");
}
@Test public void testCollectionEqualInvalid() {
assertQueryInvalid(null, "let s : Sequence(Integer) = invalid in s = Sequence{5}");
assertQueryInvalid(null, "let b : Bag(Integer) = invalid in Bag{5} = b");
assertQueryInvalid(null, "let s : Set(Integer) = invalid in s = Set{5}");
assertQueryInvalid(null, "let o : OrderedSet(Integer) = invalid in OrderedSet{5} = o");
assertQueryInvalid(null, "let s1 : Sequence(Integer) = invalid, s2 : Sequence(Integer) = invalid in s1 = s2");
assertQueryInvalid(null, "let b1 : Bag(Integer) = invalid, b2 : Bag(Integer) = invalid in b1 = b2");
assertQueryInvalid(null, "let s1 : Set(Integer) = invalid, s2 : Set(Integer) = invalid in s1 = s2");
assertQueryInvalid(null, "let o1 : OrderedSet(Integer) = invalid, o2 : OrderedSet(Integer) = invalid in o1 = o2");
}
@Test public void testCollectionEqualNull() {
assertQueryFalse(null, "Bag{} = null");
assertQueryFalse(null, "OrderedSet{} = null");
assertQueryFalse(null, "Sequence{} = null");
assertQueryFalse(null, "Set{} = null");
assertQueryFalse(null, "null = Bag{}");
assertQueryFalse(null, "null = OrderedSet{}");
assertQueryFalse(null, "null = Sequence{}");
assertQueryFalse(null, "null = Set{}");
assertQueryFalse(null, "let b : Bag(Integer) = null in b = Bag{}");
assertQueryFalse(null, "let b : Bag(Integer) = null, s : Set(Integer) = Set{} in b = s");
assertQueryFalse(null, "let s : Sequence(Integer) = null in s = Sequence{5}");
assertQueryFalse(null, "let b : Bag(Integer) = null in Bag{5} = b");
assertQueryFalse(null, "let s : Set(Integer) = null in s = Set{5}");
assertQueryFalse(null, "let o : OrderedSet(Integer) = null in OrderedSet{5} = o");
assertQueryTrue(null, "let s1 : Sequence(Integer) = null, s2 : Sequence(Integer) = null in s1 = s2");
assertQueryTrue(null, "let b1 : Bag(Integer) = null, b2 : Bag(Integer) = null in b1 = b2");
assertQueryTrue(null, "let s1 : Set(Integer) = null, s2 : Set(Integer) = null in s1 = s2");
assertQueryTrue(null, "let o1 : OrderedSet(Integer) = null, o2 : OrderedSet(Integer) = null in o1 = o2");
}
@Test public void testCollectionExcludes() {
assertQueryFalse(null, "Sequence{3, 4.0, 'test'}->excludes(3)");
assertQueryFalse(null, "Sequence{3, 4.0, 'test'}->excludes(3.0)");
assertQueryFalse(null, "Sequence{3, 4.0, 'test'}->excludes(4)");
assertQueryFalse(null, "Sequence{3, 4.0, 'test'}->excludes('test')");
assertQueryFalse(null, "Bag{3, 4.0, 'test'}->excludes(3)");
assertQueryFalse(null, "Bag{3, 4.0, 'test'}->excludes(3.0)");
assertQueryFalse(null, "Bag{3, 4.0, 'test'}->excludes(4)");
assertQueryFalse(null, "Bag{3, 4.0, 'test'}->excludes('test')");
assertQueryFalse(null, "Set{3, 4.0, 'test'}->excludes(3)");
assertQueryFalse(null, "Set{3, 4.0, 'test'}->excludes(3.0)");
assertQueryFalse(null, "Set{3, 4.0, 'test'}->excludes(4)");
assertQueryFalse(null, "Set{3, 4.0, 'test'}->excludes('test')");
assertQueryFalse(null, "OrderedSet{3, 4.0, 'test'}->excludes(3)");
assertQueryFalse(null, "OrderedSet{3, 4.0, 'test'}->excludes(3.0)");
assertQueryFalse(null, "OrderedSet{3, 4.0, 'test'}->excludes(4)");
assertQueryFalse(null, "OrderedSet{3, 4.0, 'test'}->excludes('test')");
assertQueryTrue(null, "Sequence{3, 4.0, 'test'}->excludes(3.5)");
assertQueryTrue(null, "Bag{3, 4.0, 'test'}->excludes(3.5)");
assertQueryTrue(null, "Set{3, 4.0, 'test'}->excludes(3.5)");
assertQueryTrue(null, "OrderedSet{3, 4.0, 'test'}->excludes(3.5)");
// invalid collection
assertQueryInvalid(null, "let s : Sequence(Integer) = invalid in s->excludes(0)");
assertQueryInvalid(null, "let b : Bag(Integer) = invalid in b->excludes(0)");
assertQueryInvalid(null, "let s : Set(Integer) = invalid in s->excludes(0)");
assertQueryInvalid(null, "let os : OrderedSet(Integer) = invalid in os->excludes(0)");
// invalid collection element
assertQueryInvalid(null, "Sequence{3, 4.0, 'test'}->excludes(invalid)");
assertQueryInvalid(null, "Bag{3, 4.0, 'test'}->excludes(invalid)");
assertQueryInvalid(null, "Set{3, 4.0, 'test'}->excludes(invalid)");
assertQueryInvalid(null, "OrderedSet{3, 4.0, 'test'}->excludes(invalid)");
assertQueryInvalid(null, "Sequence{0, invalid}->excludes(0)");
assertQueryInvalid(null, "Bag{0, invalid}->excludes(0)");
assertQueryInvalid(null, "Set{0, invalid}->excludes(0)");
assertQueryInvalid(null, "OrderedSet{0, invalid}->excludes(0)");
// null collection
assertQueryInvalid(null, "let s : Sequence(Integer) = null in s->excludes(0)");
assertQueryInvalid(null, "let b : Bag(Integer) = null in b->excludes(0)");
assertQueryInvalid(null, "let s : Set(Integer) = null in s->excludes(0)");
assertQueryInvalid(null, "let os : OrderedSet(Integer) = null in os->excludes(0)");
// null collection element
assertQueryFalse(null, "Sequence{3, 4.0, null, 'test'}->excludes(null)");
assertQueryFalse(null, "Sequence{null}->excludes(null)");
assertQueryFalse(null, "Bag{3, 4.0, null, 'test'}->excludes(null)");
assertQueryFalse(null, "Bag{null}->excludes(null)");
assertQueryFalse(null, "Set{3, 4.0, null, 'test'}->excludes(null)");
assertQueryFalse(null, "Set{null}->excludes(null)");
assertQueryFalse(null, "OrderedSet{3, 4.0, null, 'test'}->excludes(null)");
assertQueryFalse(null, "OrderedSet{null}->excludes(null)");
assertQueryTrue(null, "Sequence{3, 4.0, 'test'}->excludes(null)");
assertQueryTrue(null, "Sequence{}->excludes(null)");
assertQueryTrue(null, "Bag{3, 4.0, 'test'}->excludes(null)");
assertQueryTrue(null, "Bag{}->excludes(null)");
assertQueryTrue(null, "Set{3, 4.0, 'test'}->excludes(null)");
assertQueryTrue(null, "Set{}->excludes(null)");
assertQueryTrue(null, "OrderedSet{3, 4.0, 'test'}->excludes(null)");
assertQueryTrue(null, "OrderedSet{}->excludes(null)");
}
@Test public void testCollectionExcludesAll() {
assertQueryFalse(null, "Sequence{3, 4.0, 'test'}->excludesAll(Sequence{3, 'test'})");
assertQueryFalse(null, "Sequence{3, 4.0, 'test'}->excludesAll(Bag{3, 'test'})");
assertQueryFalse(null, "Sequence{3, 4.0, 'test'}->excludesAll(Set{3, 'test'})");
assertQueryFalse(null, "Sequence{3, 4.0, 'test'}->excludesAll(OrderedSet{3, 'test'})");
assertQueryFalse(null, "Bag{3, 4.0, 'test'}->excludesAll(Sequence{3, 'test'})");
assertQueryFalse(null, "Bag{3, 4.0, 'test'}->excludesAll(Bag{3, 'test'})");
assertQueryFalse(null, "Bag{3, 4.0, 'test'}->excludesAll(Set{3, 'test'})");
assertQueryFalse(null, "Bag{3, 4.0, 'test'}->excludesAll(OrderedSet{3, 'test'})");
assertQueryFalse(null, "Set{3, 4.0, 'test'}->excludesAll(Sequence{3, 'test'})");
assertQueryFalse(null, "Set{3, 4.0, 'test'}->excludesAll(Bag{3, 'test'})");
assertQueryFalse(null, "Set{3, 4.0, 'test'}->excludesAll(Set{3, 'test'})");
assertQueryFalse(null, "Set{3, 4.0, 'test'}->excludesAll(OrderedSet{3, 'test'})");
assertQueryFalse(null, "OrderedSet{3, 4.0, 'test'}->excludesAll(Sequence{3, 'test'})");
assertQueryFalse(null, "OrderedSet{3, 4.0, 'test'}->excludesAll(Bag{3, 'test'})");
assertQueryFalse(null, "OrderedSet{3, 4.0, 'test'}->excludesAll(Set{3, 'test'})");
assertQueryFalse(null, "OrderedSet{3, 4.0, 'test'}->excludesAll(OrderedSet{3, 'test'})");
assertQueryTrue(null, "Sequence{3, 4.0, 'test'}->excludesAll(Sequence{3.5, 'TEST'})");
assertQueryTrue(null, "Sequence{3, 4.0, 'test'}->excludesAll(Bag{3.5, 'TEST'})");
assertQueryTrue(null, "Sequence{3, 4.0, 'test'}->excludesAll(Set{3.5, 'TEST'})");
assertQueryTrue(null, "Sequence{3, 4.0, 'test'}->excludesAll(OrderedSet{3.5, 'TEST'})");
assertQueryTrue(null, "Bag{3, 4.0, 'test'}->excludesAll(Sequence{3.5, 'TEST'})");
assertQueryTrue(null, "Bag{3, 4.0, 'test'}->excludesAll(Bag{3.5, 'TEST'})");
assertQueryTrue(null, "Bag{3, 4.0, 'test'}->excludesAll(Set{3.5, 'TEST'})");
assertQueryTrue(null, "Bag{3, 4.0, 'test'}->excludesAll(OrderedSet{3.5, 'TEST'})");
assertQueryTrue(null, "Set{3, 4.0, 'test'}->excludesAll(Sequence{3.5, 'TEST'})");
assertQueryTrue(null, "Set{3, 4.0, 'test'}->excludesAll(Bag{3.5, 'TEST'})");
assertQueryTrue(null, "Set{3, 4.0, 'test'}->excludesAll(Set{3.5, 'TEST'})");
assertQueryTrue(null, "Set{3, 4.0, 'test'}->excludesAll(OrderedSet{3.5, 'TEST'})");
assertQueryTrue(null, "OrderedSet{3, 4.0, 'test'}->excludesAll(Sequence{3.5, 'TEST'})");
assertQueryTrue(null, "OrderedSet{3, 4.0, 'test'}->excludesAll(Bag{3.5, 'TEST'})");
assertQueryTrue(null, "OrderedSet{3, 4.0, 'test'}->excludesAll(Set{3.5, 'TEST'})");
assertQueryTrue(null, "OrderedSet{3, 4.0, 'test'}->excludesAll(OrderedSet{3.5, 'TEST'})");
// invalid collection
assertQueryInvalid(null, "let s : Sequence(Integer) = invalid in s->excludesAll(Sequence{0})");
assertQueryInvalid(null, "let b : Bag(Integer) = invalid in b->excludesAll(Bag{0})");
assertQueryInvalid(null, "let s : Set(Integer) = invalid in s->excludesAll(Set{0})");
assertQueryInvalid(null, "let os : OrderedSet(Integer) = invalid in os->excludesAll(OrderedSet{0})");
assertQueryInvalid(null, "let s : Sequence(Integer) = invalid in Sequence{0}->excludesAll(s)");
assertQueryInvalid(null, "let b : Bag(Integer) = invalid in Bag{0}->excludesAll(b)");
assertQueryInvalid(null, "let s : Set(Integer) = invalid in Set{0}->excludesAll(s)");
assertQueryInvalid(null, "let os : OrderedSet(Integer) = invalid in OrderedSet{0}->excludesAll(os)");
// invalid collection element
// Collections can't contain the invalid value
assertQueryInvalid(null, "let b : Bag(String) = invalid in b->excludesAll(OrderedSet{'test'})");
assertQueryInvalid(null, "Sequence{3, 4, invalid, 'test'}->excludesAll(OrderedSet{'test'})");
assertQueryInvalid(null, "Bag{3, 4, invalid, 'test'}->excludesAll(Set{'test'})");
assertQueryInvalid(null, "Set{3, 4, invalid, 'test'}->excludesAll(Bag{'test'})");
assertQueryInvalid(null, "OrderedSet{3, 4, invalid, 'test'}->excludesAll(Sequence{'test'})");
assertQueryInvalid(null, "Sequence{3, 4, 'test'}->excludesAll(OrderedSet{'test', invalid})");
assertQueryInvalid(null, "Bag{3, 4, 'test'}->excludesAll(Set{'test', invalid})");
assertQueryInvalid(null, "Set{3, 4, 'test'}->excludesAll(Bag{'test', invalid})");
assertQueryInvalid(null, "OrderedSet{3, 4, 'test'}->excludesAll(Sequence{'test', invalid})");
// null collection
assertQueryInvalid(null, "let s : Sequence(Integer) = null in s->excludesAll(Sequence{0})");
assertQueryInvalid(null, "let b : Bag(Integer) = null in b->excludesAll(Bag{0})");
assertQueryInvalid(null, "let s : Set(Integer) = null in s->excludesAll(Set{0})");
assertQueryInvalid(null, "let os : OrderedSet(Integer) = null in os->excludesAll(OrderedSet{0})");
assertQueryInvalid(null, "let s : Sequence(Integer) = null in Sequence{0}->excludesAll(s)");
assertQueryInvalid(null, "let b : Bag(Integer) = null in Bag{0}->excludesAll(b)");
assertQueryInvalid(null, "let s : Set(Integer) = null in Set{0}->excludesAll(s)");
assertQueryInvalid(null, "let os : OrderedSet(Integer) = null in OrderedSet{0}->excludesAll(os)");
// null collection element
assertQueryFalse(null, "Sequence{3, 4, null, 'test'}->excludesAll(OrderedSet{'TEST', null})");
assertQueryFalse(null, "Bag{3, 4, null, 'test'}->excludesAll(Set{'TEST', null})");
assertQueryFalse(null, "Set{3, 4, null, 'test'}->excludesAll(Bag{'TEST', null})");
assertQueryFalse(null, "OrderedSet{3, 4, null, 'test'}->excludesAll(Sequence{'TEST', null})");
assertQueryTrue(null, "Sequence{3, 4, 'test'}->excludesAll(OrderedSet{'TEST', null})");
assertQueryTrue(null, "Bag{3, 4, 'test'}->excludesAll(Set{'TEST', null})");
assertQueryTrue(null, "Set{3, 4, 'test'}->excludesAll(Bag{'TEST', null})");
assertQueryTrue(null, "OrderedSet{3, 4, 'test'}->excludesAll(Sequence{'TEST', null})");
}
@Test public void testCollectionExcluding() {
/*
* FIXME OMG-issue to add OrderedSet::excluding
* since it's defined in oclstdlib.ecore. However the defined
* "OrderedSet::excluding(T) : Set" should be
* "OrderedSet::excluding(T) : OrderedSet"
*/
assertQueryResults(null, "Sequence{'a', 'c'}", "Sequence{'b', 'a', 'b', 'c'}->excluding('b')");
assertQueryResults(null, "Bag{'c', 'a'}", "Bag{'b', 'a', 'b', 'c'}->excluding('b')");
assertQueryResults(null, "Set{'c', 'a'}", "Set{'a', 'b', 'c'}->excluding('b')");
assertQueryResults(null, "OrderedSet{'a', 'c'}", "OrderedSet{'a', 'b', 'c'}->excluding('b')");
assertQueryResults(null, "Sequence{1,3,4}", "Sequence{1..4}->excluding(2)");
assertQueryResults(null, "OrderedSet{1,3,4}", "OrderedSet{1..4}->excluding(2)");
assertQueryResults(null, "Sequence{1..3,6..9}", "Sequence{1..4,6,7..9}->excluding(4)");
assertQueryResults(null, "OrderedSet{1..3,6..9}", "OrderedSet{1..4,6,7..9}->excluding(4)");
// invalid collection
assertQueryInvalid(null, "let s : Sequence(String) = invalid in s->excluding('a')");
assertQueryInvalid(null, "let b : Bag(String) = invalid in b->excluding('a')");
assertQueryInvalid(null, "let s : Set(String) = invalid in s->excluding('a')");
assertQueryInvalid(null, "let o : OrderedSet(String) = invalid in o->excluding('a')");
// invalid collection element
assertQueryInvalid(null, "Sequence{'a', 'b'}->excluding(invalid)");
assertQueryInvalid(null, "Bag{'a', 'b'}->excluding(invalid)");
assertQueryInvalid(null, "Set{'a', 'b'}->excluding(invalid)");
assertQueryInvalid(null, "OrderedSet{'a', 'b'}->excluding(invalid)");
// null collection
assertQueryInvalid(null, "let s : Sequence(String) = null in s->excluding('a')");
assertQueryInvalid(null, "let b : Bag(String) = null in b->excluding('a')");
assertQueryInvalid(null, "let s : Set(String) = null in s->excluding('a')");
assertQueryInvalid(null, "let o : OrderedSet(String) = null in o->excluding('a')");
// invalid collection element
assertQueryResults(null, "Sequence{'a', 'b'}", "Sequence{null, 'a', null, 'b'}->excluding(null)");
assertQueryResults(null, "Bag{'b', 'a'}", "Bag{null, 'a', null, 'b'}->excluding(null)");
assertQueryResults(null, "Set{'b', 'a'}", "Set{'a', null, 'b'}->excluding(null)");
assertQueryResults(null, "OrderedSet{'a', 'b'}", "OrderedSet{'a', null, 'b'}->excluding(null)");
}
@Test public void testCollectionExcludingAll() {
assertQueryResults(null, "Sequence{'a', 'c'}", "Sequence{'b', 'a', 'd', 'd', 'b', 'c', 'd'}->excludingAll(Sequence{'d', 'd', 'b', 'e'})");
assertQueryResults(null, "Bag{'c', 'a'}", "Bag{'b', 'a', 'd', 'd', 'b', 'c', 'd'}->excludingAll(Bag{'b', 'd', 'd', 'e'})");
assertQueryResults(null, "Set{'c', 'a'}", "Set{'a', 'b', 'c', 'd'}->excludingAll(Set{'b', 'd', 'e'})");
assertQueryResults(null, "OrderedSet{'a', 'c'}", "OrderedSet{'a', 'b', 'c', 'd'}->excludingAll(OrderedSet{'b', 'd', 'e'})");
assertQueryResults(null, "Sequence{1,3,7..8,10}", "Sequence{1..10}->excludingAll(Sequence{2,4..6,9})");
assertQueryResults(null, "OrderedSet{1,3,7..8,10}", "OrderedSet{1..10}->excludingAll(OrderedSet{2,4..6,9})");
assertQueryResults(null, "Sequence{1..2,4,8..9}", "Sequence{1..4,6,7..9}->excludingAll(Sequence{3,5..7})");
assertQueryResults(null, "OrderedSet{1..2,4,8..9}", "OrderedSet{1..4,6,7..9}->excludingAll(OrderedSet{3,5..7})");
// invalid collection
assertQueryInvalid(null, "let s : Sequence(String) = invalid in s->excludingAll(Sequence{'a'})");
assertQueryInvalid(null, "let b : Bag(String) = invalid in b->excludingAll(Bag{'a'})");
assertQueryInvalid(null, "let s : Set(String) = invalid in s->excludingAll(Set{'a'})");
assertQueryInvalid(null, "let o : OrderedSet(String) = invalid in o->excludingAll(OrderedSet{'a'})");
// invalid collection element
assertQueryInvalid(null, "Sequence{'a', 'b'}->excludingAll(invalid)");
assertQueryInvalid(null, "Bag{'a', 'b'}->excludingAll(invalid)");
assertQueryInvalid(null, "Set{'a', 'b'}->excludingAll(invalid)");
assertQueryInvalid(null, "OrderedSet{'a', 'b'}->excludingAll(invalid)");
// null collection
assertQueryInvalid(null, "let s : Sequence(String) = null in s->excludingAll(Sequence{'a'})");
assertQueryInvalid(null, "let b : Bag(String) = null in b->excludingAll(Bag{'a'})");
assertQueryInvalid(null, "let s : Set(String) = null in s->excludingAll(Set{'a'})");
assertQueryInvalid(null, "let o : OrderedSet(String) = null in o->excludingAll(OrderedSet{'a'})");
// invalid collection element
assertQueryResults(null, "Sequence{'a', 'b'}", "Sequence{null, 'a', null, 'b', 'c'}->excludingAll(Sequence{null, 'c'})");
assertQueryResults(null, "Bag{'b', 'a'}", "Bag{null, 'a', null, 'b'}->excludingAll(Bag{null})");
assertQueryResults(null, "Set{'b', 'a'}", "Set{'a', null, 'b'}->excludingAll(Set{null})");
assertQueryResults(null, "OrderedSet{'a', 'b'}", "OrderedSet{'a', null, 'b'}->excludingAll(OrderedSet{null})");
}
@Test public void testCollectionFirst() {
assertQueryEquals(null, 1, "Sequence{1, 2.0, '3'}->first()");
assertQueryEquals(null, 1, "OrderedSet{1, 2.0, '3'}->first()");
// empty
assertQueryInvalid(null, "OrderedSet{}->first()");
assertQueryInvalid(null, "Sequence{}->first()");
// invalid collection
assertQueryInvalid(null, "let s : Sequence(Integer) = invalid in s->first()");
assertQueryInvalid(null, "let o : OrderedSet(Integer) = invalid in o->first()");
// invalid collection element
assertQueryInvalid(null, "Sequence{1, invalid}->first()");
assertQueryInvalid(null, "OrderedSet{1, invalid}->first()");
// null collection
assertQueryInvalid(null, "let s : Sequence(Integer) = null in s->first()");
assertQueryInvalid(null, "let o : OrderedSet(Integer) = null in o->first()");
// null collection element
assertQueryNull(null, "Sequence{null}->first()");
assertQueryNull(null, "OrderedSet{null}->first()");
}
@Test public void testCollectionFlatten() {
assertQueryEquals(null, getEmptySequenceValue(), "Sequence{}->flatten()");
assertQueryEquals(null, getEmptyBagValue(), "Bag{}->flatten()");
assertQueryEquals(null, getEmptySetValue(), "Set{}->flatten()");
assertQueryEquals(null, getEmptyOrderedSetValue(), "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 flattening were inserted, simply check that the
* result is a Sequence and contains all elements.
*/
assertResultContainsAll(null, 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'}";
assertQueryResults(null, expectedResultExpression, expression);
expression = "Set{OrderedSet{Set{3.0, 'test'}, Sequence{2.0, 2}, Bag{1, 3}}}->flatten()";
expectedResultExpression = "Set{1, 2.0, 3.0, 'test'}";
assertResultContainsAll(null, expectedResultExpression, expression);
expression = "OrderedSet{Set{Set{3.0, 'test'}, Sequence{2.0, 2}, Bag{1, 3}}}->flatten()";
expectedResultExpression = "OrderedSet{1, 2, 2.0, 3.0, 'test'}";
assertResultContainsAll(null, 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'}";
assertResultContainsAll(null, expectedResultExpression, expression);
// invalid collection
assertQueryInvalid(null, "let s : Sequence(Integer) = invalid in s->flatten()");
assertQueryInvalid(null, "let b : Bag(Integer) = invalid in b->flatten()");
assertQueryInvalid(null, "let s : Set(Integer) = invalid in s->flatten()");
assertQueryInvalid(null, "let o : OrderedSet(Integer) = invalid in o->flatten()");
// non collection
assertQueryInvalid(null, "let s : Sequence(Integer) = null in s->flatten()");
assertQueryInvalid(null, "let b : Bag(Integer) = null in b->flatten()");
assertQueryInvalid(null, "let s : Set(Integer) = null in s->flatten()");
assertQueryInvalid(null, "let o : OrderedSet(Integer) = null in o->flatten()");
// pseudo collection
assertQueryResults(null, "Set{1}", "1->flatten()");
assertQueryResults(null, "Set{1}", "let s : Sequence(Integer) = null in 1->flatten()");
assertQueryResults(null, "Set{1}", "let b : Bag(Integer) = null in 1->flatten()");
assertQueryResults(null, "Set{1}", "let s : Set(Integer) = null in 1->flatten()");
assertQueryResults(null, "Set{1}", "let o : OrderedSet(Integer) = null in 1->flatten()");
}
@Test public void testCollectionIncludes() {
assertQueryTrue(null, "Sequence{3, 4.0, 'test'}->includes(3)");
assertQueryTrue(null, "Sequence{3, 4.0, 'test'}->includes(3.0)");
assertQueryTrue(null, "Sequence{3, 4.0, 'test'}->includes(4)");
assertQueryTrue(null, "Sequence{3, 4.0, 'test'}->includes('test')");
assertQueryTrue(null, "Bag{3, 4.0, 'test'}->includes(3)");
assertQueryTrue(null, "Bag{3, 4.0, 'test'}->includes(3.0)");
assertQueryTrue(null, "Bag{3, 4.0, 'test'}->includes(4)");
assertQueryTrue(null, "Bag{3, 4.0, 'test'}->includes('test')");
assertQueryTrue(null, "Set{3, 4.0, 'test'}->includes(3)");
assertQueryTrue(null, "Set{3, 4.0, 'test'}->includes(3.0)");
assertQueryTrue(null, "Set{3, 4.0, 'test'}->includes(4)");
assertQueryTrue(null, "Set{3, 4.0, 'test'}->includes('test')");
assertQueryTrue(null, "OrderedSet{3, 4.0, 'test'}->includes(3)");
assertQueryTrue(null, "OrderedSet{3, 4.0, 'test'}->includes(3.0)");
assertQueryTrue(null, "OrderedSet{3, 4.0, 'test'}->includes(4)");
assertQueryTrue(null, "OrderedSet{3, 4.0, 'test'}->includes('test')");
assertQueryFalse(null, "Sequence{3, 4.0, 'test'}->includes(3.5)");
assertQueryFalse(null, "Bag{3, 4.0, 'test'}->includes(3.5)");
assertQueryFalse(null, "Set{3, 4.0, 'test'}->includes(3.5)");
assertQueryFalse(null, "OrderedSet{3, 4.0, 'test'}->includes(3.5)");
// invalid collection
assertQueryInvalid(null, "let s : Sequence(Integer) = invalid in s->includes(0)");
assertQueryInvalid(null, "let b : Bag(Integer) = invalid in b->includes(0)");
assertQueryInvalid(null, "let s : Set(Integer) = invalid in s->includes(0)");
assertQueryInvalid(null, "let os : OrderedSet(Integer) = invalid in os->includes(0)");
// invalid collection element
assertQueryInvalid(null, "Sequence{3, 4.0, 'test'}->includes(invalid)");
assertQueryInvalid(null, "Bag{3, 4.0, 'test'}->includes(invalid)");
assertQueryInvalid(null, "Set{3, 4.0, 'test'}->includes(invalid)");
assertQueryInvalid(null, "OrderedSet{3, 4.0, 'test'}->includes(invalid)");
assertQueryInvalid(null, "Sequence{0, invalid}->includes(0)");
assertQueryInvalid(null, "Bag{0, invalid}->includes(0)");
assertQueryInvalid(null, "Set{0, invalid}->includes(0)");
assertQueryInvalid(null, "OrderedSet{0, invalid}->includes(0)");
// invalid null
assertQueryInvalid(null, "let s : Sequence(Integer) = null in s->includes(0)");
assertQueryInvalid(null, "let b : Bag(Integer) = null in b->includes(0)");
assertQueryInvalid(null, "let s : Set(Integer) = null in s->includes(0)");
assertQueryInvalid(null, "let os : OrderedSet(Integer) = null in os->includes(0)");
// invalid null element
assertQueryTrue(null, "Sequence{3, 4.0, null, 'test'}->includes(null)");
assertQueryTrue(null, "Sequence{null}->includes(null)");
assertQueryTrue(null, "Bag{3, 4.0, null, 'test'}->includes(null)");
assertQueryTrue(null, "Bag{null}->includes(null)");
assertQueryTrue(null, "Set{3, 4.0, null, 'test'}->includes(null)");
assertQueryTrue(null, "Set{null}->includes(null)");
assertQueryTrue(null, "OrderedSet{3, 4.0, null, 'test'}->includes(null)");
assertQueryTrue(null, "OrderedSet{null}->includes(null)");
assertQueryFalse(null, "Sequence{3, 4.0, 'test'}->includes(null)");
assertQueryFalse(null, "Sequence{}->includes(null)");
assertQueryFalse(null, "Bag{3, 4.0, 'test'}->includes(null)");
assertQueryFalse(null, "Bag{}->includes(null)");
assertQueryFalse(null, "Set{3, 4.0, 'test'}->includes(null)");
assertQueryFalse(null, "Set{}->includes(null)");
assertQueryFalse(null, "OrderedSet{3, 4.0, 'test'}->includes(null)");
assertQueryFalse(null, "OrderedSet{}->includes(null)");
}
@Test public void testCollectionIncludesAll() {
assertQueryTrue(null, "Sequence{3, 4.0, 'test'}->includesAll(Sequence{3, 'test'})");
assertQueryTrue(null, "Sequence{3, 4.0, 'test'}->includesAll(Bag{3, 'test'})");
assertQueryTrue(null, "Sequence{3, 4.0, 'test'}->includesAll(Set{3, 'test'})");
assertQueryTrue(null, "Sequence{3, 4.0, 'test'}->includesAll(OrderedSet{3, 'test'})");
assertQueryTrue(null, "Bag{3, 4.0, 'test'}->includesAll(Sequence{3, 'test'})");
assertQueryTrue(null, "Bag{3, 4.0, 'test'}->includesAll(Bag{3, 'test'})");
assertQueryTrue(null, "Bag{3, 4.0, 'test'}->includesAll(Set{3, 'test'})");
assertQueryTrue(null, "Bag{3, 4.0, 'test'}->includesAll(OrderedSet{3, 'test'})");
assertQueryTrue(null, "Set{3, 4.0, 'test'}->includesAll(Sequence{3, 'test'})");
assertQueryTrue(null, "Set{3, 4.0, 'test'}->includesAll(Bag{3, 'test'})");
assertQueryTrue(null, "Set{3, 4.0, 'test'}->includesAll(Set{3, 'test'})");
assertQueryTrue(null, "Set{3, 4.0, 'test'}->includesAll(OrderedSet{3, 'test'})");
assertQueryTrue(null, "OrderedSet{3, 4.0, 'test'}->includesAll(Sequence{3, 'test'})");
assertQueryTrue(null, "OrderedSet{3, 4.0, 'test'}->includesAll(Bag{3, 'test'})");
assertQueryTrue(null, "OrderedSet{3, 4.0, 'test'}->includesAll(Set{3, 'test'})");
assertQueryTrue(null, "OrderedSet{3, 4.0, 'test'}->includesAll(OrderedSet{3, 'test'})");
assertQueryFalse(null, "Sequence{3, 4.0, 'test'}->includesAll(Sequence{3.5, 'test'})");
assertQueryFalse(null, "Sequence{3, 4.0, 'test'}->includesAll(Bag{3.5, 'test'})");
assertQueryFalse(null, "Sequence{3, 4.0, 'test'}->includesAll(Set{3.5, 'test'})");
assertQueryFalse(null, "Sequence{3, 4.0, 'test'}->includesAll(OrderedSet{3.5, 'test'})");
assertQueryFalse(null, "Bag{3, 4.0, 'test'}->includesAll(Sequence{3.5, 'test'})");
assertQueryFalse(null, "Bag{3, 4.0, 'test'}->includesAll(Bag{3.5, 'test'})");
assertQueryFalse(null, "Bag{3, 4.0, 'test'}->includesAll(Set{3.5, 'test'})");
assertQueryFalse(null, "Bag{3, 4.0, 'test'}->includesAll(OrderedSet{3.5, 'test'})");
assertQueryFalse(null, "Set{3, 4.0, 'test'}->includesAll(Sequence{3.5, 'test'})");
assertQueryFalse(null, "Set{3, 4.0, 'test'}->includesAll(Bag{3.5, 'test'})");
assertQueryFalse(null, "Set{3, 4.0, 'test'}->includesAll(Set{3.5, 'test'})");
assertQueryFalse(null, "Set{3, 4.0, 'test'}->includesAll(OrderedSet{3.5, 'test'})");
assertQueryFalse(null, "OrderedSet{3, 4.0, 'test'}->includesAll(Sequence{3.5, 'test'})");
assertQueryFalse(null, "OrderedSet{3, 4.0, 'test'}->includesAll(Bag{3.5, 'test'})");
assertQueryFalse(null, "OrderedSet{3, 4.0, 'test'}->includesAll(Set{3.5, 'test'})");
assertQueryFalse(null, "OrderedSet{3, 4.0, 'test'}->includesAll(OrderedSet{3.5, 'test'})");
// invalid collection
assertQueryInvalid(null, "let s : Sequence(Integer) = invalid in s->includesAll(Sequence{0})");
assertQueryInvalid(null, "let b : Bag(Integer) = invalid in b->includesAll(Bag{0})");
assertQueryInvalid(null, "let s : Set(Integer) = invalid in s->includesAll(Set{0})");
assertQueryInvalid(null, "let os : OrderedSet(Integer) = invalid in os->includesAll(OrderedSet{0})");
assertQueryInvalid(null, "let s : Sequence(Integer) = invalid in Sequence{0}->includesAll(s)");
assertQueryInvalid(null, "let b : Bag(Integer) = invalid in Bag{0}->includesAll(b)");
assertQueryInvalid(null, "let s : Set(Integer) = invalid in Set{0}->includesAll(s)");
assertQueryInvalid(null, "let os : OrderedSet(Integer) = invalid in OrderedSet{0}->includesAll(os)");
// invalid collection element
// Collections can't contain the invalid value
assertQueryInvalid(null, "Sequence{3, 4, invalid, 'test'}->includesAll(OrderedSet{'test'})");
assertQueryInvalid(null, "Bag{3, 4, invalid, 'test'}->includesAll(Set{'test'})");
assertQueryInvalid(null, "Set{3, 4, invalid, 'test'}->includesAll(Bag{'test'})");
assertQueryInvalid(null, "OrderedSet{3, 4, invalid, 'test'}->includesAll(Sequence{'test'})");
assertQueryInvalid(null, "Sequence{3, 4, 'test'}->includesAll(OrderedSet{'test', invalid})");
assertQueryInvalid(null, "Bag{3, 4, 'test'}->includesAll(Set{'test', invalid})");
assertQueryInvalid(null, "Set{3, 4, 'test'}->includesAll(Bag{'test', invalid})");
assertQueryInvalid(null, "OrderedSet{3, 4, 'test'}->includesAll(Sequence{'test', invalid})");
// null collection
assertQueryInvalid(null, "let s : Sequence(Integer) = null in s->includesAll(Sequence{0})");
assertQueryInvalid(null, "let b : Bag(Integer) = null in b->includesAll(Bag{0})");
assertQueryInvalid(null, "let s : Set(Integer) = null in s->includesAll(Set{0})");
assertQueryInvalid(null, "let os : OrderedSet(Integer) = null in os->includesAll(OrderedSet{0})");
assertQueryInvalid(null, "let s : Sequence(Integer) = null in Sequence{0}->includesAll(s)");
assertQueryInvalid(null, "let b : Bag(Integer) = null in Bag{0}->includesAll(b)");
assertQueryInvalid(null, "let s : Set(Integer) = null in Set{0}->includesAll(s)");
assertQueryInvalid(null, "let os : OrderedSet(Integer) = null in OrderedSet{0}->includesAll(os)");
// null collection element
assertQueryTrue(null, "Sequence{3, 4, null, 'test'}->includesAll(OrderedSet{'test', null})");
assertQueryTrue(null, "Bag{3, 4, null, 'test'}->includesAll(Set{'test', null})");
assertQueryTrue(null, "Set{3, 4, null, 'test'}->includesAll(Bag{'test', null})");
assertQueryTrue(null, "OrderedSet{3, 4, null, 'test'}->includesAll(Sequence{'test', null})");
assertQueryFalse(null, "Sequence{3, 4, 'test'}->includesAll(OrderedSet{'test', null})");
assertQueryFalse(null, "Bag{3, 4, 'test'}->includesAll(Set{'test', null})");
assertQueryFalse(null, "Set{3, 4, 'test'}->includesAll(Bag{'test', null})");
assertQueryFalse(null, "OrderedSet{3, 4, 'test'}->includesAll(Sequence{'test', null})");
}
@Test public void testCollectionIncluding() {
/*
* FIXME OMG-issue to add OrderedSet::including
* since it's defined in oclstdlib.ecore. However the defined
* "OrderedSet::including(T) : Set" should be
* "OrderedSet::including(T) : OrderedSet"
*/
assertQueryResults(null, "Sequence{'a', 'b', 'c'}", "Sequence{'a', 'b'}->including('c')");
assertQueryResults(null, "Bag{'c', 'b', 'a'}", "Bag{'a', 'b'}->including('c')");
assertQueryResults(null, "Set{'a', 'c', 'b'}", "Set{'a', 'b'}->including('c')");
assertQueryResults(null, "OrderedSet{'a', 'b', 'c'}", "OrderedSet{'a', 'b'}->including('c')");
assertQueryResults(null, "OrderedSet{1..2,3..4}", "OrderedSet{1..4}->including(4)");
assertQueryResults(null, "Sequence{1..2,3..4,4}", "Sequence{1..4}->including(4)");
assertQueryResults(null, "Sequence{1..5}", "Sequence{1..4}->including(5)");
assertQueryResults(null, "Sequence{1..3,4,6}", "Sequence{1..4}->including(6)");
assertQueryResults(null, "Sequence{1..4,0}", "Sequence{1..4}->including(0)");
assertQueryResults(null, "Set{1..9}", "Set{1..4,6,7..9}->including(5)");
// invalid collection
assertQueryInvalid(null, "let s : Sequence(String) = invalid in s->including('a')");
assertQueryInvalid(null, "let b : Bag(String) = invalid in b->including('a')");
assertQueryInvalid(null, "let s : Set(String) = invalid in s->including('a')");
assertQueryInvalid(null, "let o : OrderedSet(String) = invalid in o->including('a')");
// invalid collection element
assertQueryInvalid(null, "Sequence{'a', 'b'}->including(invalid)");
assertQueryInvalid(null, "Bag{'a', 'b'}->including(invalid)");
assertQueryInvalid(null, "Set{'a', 'b'}->including(invalid)");
assertQueryInvalid(null, "OrderedSet{'a', 'b'}->including(invalid)");
// null collection
assertQueryInvalid(null, "let s : Sequence(String) = null in s->including('a')");
assertQueryInvalid(null, "let b : Bag(String) = null in b->including('a')");
assertQueryInvalid(null, "let s : Set(String) = null in s->including('a')");
assertQueryInvalid(null, "let o : OrderedSet(String) = null in o->including('a')");
// null collection element
assertQueryResults(null, "Sequence{'a', 'b', null}", "Sequence{'a', 'b'}->including(null)");
assertQueryResults(null, "Bag{null, 'b', 'a'}", "Bag{'a', 'b'}->including(null)");
assertQueryResults(null, "Set{'a', null, 'b'}", "Set{'a', 'b'}->including(null)");
assertQueryResults(null, "OrderedSet{'a', 'b', null}", "OrderedSet{'a', 'b'}->including(null)");
assertQueryResults(null, "Sequence{'a', null, 'b', null}", "Sequence{'a', null, 'b'}->including(null)");
assertQueryResults(null, "Bag{null, 'b', null, 'a'}", "Bag{'a', null, 'b'}->including(null)");
assertQueryResults(null, "Set{'a', null, 'b'}", "Set{'a', null, 'b'}->including(null)");
assertQueryResults(null, "OrderedSet{'a', null, 'b'}", "OrderedSet{'a', null, 'b'}->including(null)");
assertQueryResults(null, "Sequence{'1..4', null}", "Sequence{'1..4'}->including(null)");
assertQueryResults(null, "OrderedSet{'1..4', null}", "OrderedSet{'1..4'}->including(null)");
}
@Test public void testCollectionIncludingAll() {
assertQueryResults(null, "Sequence{'a', 'b', 'c', 'd'}", "Sequence{'a', 'b'}->includingAll(Sequence{'c', 'd'})");
assertQueryResults(null, "Bag{'c', 'b', 'a', 'd'}", "Bag{'a', 'b'}->includingAll(Bag{'c', 'd'})");
assertQueryResults(null, "Set{'a', 'c', 'b', 'd'}", "Set{'a', 'b'}->includingAll(Set{'c', 'd'})");
assertQueryResults(null, "OrderedSet{'a', 'b', 'c', 'd'}", "OrderedSet{'a', 'b'}->includingAll(OrderedSet{'c', 'd'})");
assertQueryResults(null, "OrderedSet{1..2,3..4}", "OrderedSet{1..4}->includingAll(OrderedSet{2..4})");
assertQueryResults(null, "Sequence{1..2,3..4,4..6}", "Sequence{1..4}->includingAll(Sequence{4..6})");
assertQueryResults(null, "Sequence{1..7}", "Sequence{1..4}->includingAll(Sequence{5..7})");
assertQueryResults(null, "Sequence{1..3,4,6..8}", "Sequence{1..4}->includingAll(Sequence{6..8})");
assertQueryResults(null, "Sequence{2..4,0..1}", "Sequence{2..4}->includingAll(Sequence{0..1})");
assertQueryResults(null, "Set{1..9}", "Set{1..4,7,8..9}->includingAll(Set{5..7})");
// invalid collection
assertQueryInvalid(null, "let s : Sequence(String) = invalid in s->includingAll(Sequence{'a'})");
assertQueryInvalid(null, "let b : Bag(String) = invalid in b->includingAll(Bag{'a'})");
assertQueryInvalid(null, "let s : Set(String) = invalid in s->includingAll(Set{'a'})");
assertQueryInvalid(null, "let o : OrderedSet(String) = invalid in o->includingAll(OrderedSet{'a'})");
// invalid collection element
assertQueryInvalid(null, "Sequence{'a', 'b'}->includingAll(invalid)");
assertQueryInvalid(null, "Bag{'a', 'b'}->includingAll(invalid)");
assertQueryInvalid(null, "Set{'a', 'b'}->includingAll(invalid)");
assertQueryInvalid(null, "OrderedSet{'a', 'b'}->includingAll(invalid)");
// null collection
assertQueryInvalid(null, "let s : Sequence(String) = null in s->includingAll(Sequence{'a'})");
assertQueryInvalid(null, "let b : Bag(String) = null in b->includingAll(Bag{'a'})");
assertQueryInvalid(null, "let s : Set(String) = null in s->includingAll(Set{'a'})");
assertQueryInvalid(null, "let o : OrderedSet(String) = null in o->includingAll(OrderedSet{'a'})");
// null collection element
assertQueryResults(null, "Sequence{'a', 'b', null, null}", "Sequence{'a', 'b'}->includingAll(Sequence{null, null})");
assertQueryResults(null, "Bag{null, null, 'b', 'a'}", "Bag{'a', 'b'}->includingAll(Bag{null, null})");
assertQueryResults(null, "Set{'a', null, 'b'}", "Set{'a', 'b'}->includingAll(Set{null})");
assertQueryResults(null, "OrderedSet{'a', 'b', null}", "OrderedSet{'a', 'b'}->includingAll(OrderedSet{null})");
assertQueryResults(null, "Sequence{'a', null, 'b', null}", "Sequence{'a', null, 'b'}->includingAll(Sequence{null})");
assertQueryResults(null, "Bag{null, 'b', null, 'a'}", "Bag{'a', null, 'b'}->includingAll(Bag{null})");
assertQueryResults(null, "Set{'a', null, 'b'}", "Set{'a', null, 'b'}->includingAll(Set{null})");
assertQueryResults(null, "OrderedSet{'a', null, 'b'}", "OrderedSet{'a', null, 'b'}->includingAll(OrderedSet{null})");
assertQueryResults(null, "Sequence{'1..4', null}", "Sequence{'1..4'}->includingAll(Sequence{null})");
assertQueryResults(null, "OrderedSet{'1..4', null}", "OrderedSet{'1..4'}->includingAll(OrderedSet{null})");
}
@Test public void testCollectionIndexOf() {
assertQueryEquals(null, 1, "Sequence{'a', 'b'}->indexOf('a')");
assertQueryEquals(null, 2, "OrderedSet{'a', 'b'}->indexOf('b')");
// invalid collection
assertQueryInvalid(null, "let s : Sequence(String) = invalid in s->indexOf('a')");
assertQueryInvalid(null, "let o : OrderedSet(String) = invalid in o->indexOf('a')");
// invalid collection element
assertQueryInvalid(null, "Sequence{'a', invalid}->indexOf(invalid)");
assertQueryInvalid(null, "OrderedSet{'a', invalid}->indexOf(invalid)");
// null collection
assertQueryInvalid(null, "let s : Sequence(String) = null in s->indexOf('a')");
assertQueryInvalid(null, "let o : OrderedSet(String) = null in o->indexOf('a')");
// null collection element
assertQueryEquals(null, 1, "Sequence{null, 'a'}->indexOf(null)");
assertQueryEquals(null, 1, "OrderedSet{null, 'a'}->indexOf(null)");
// non-element
assertQueryInvalid(null, "Sequence{'a'}->indexOf('b')");
assertQueryInvalid(null, "OrderedSet{'a'}->indexOf('b')");
}
@Test public void testCollectionInsertAt() {
// For now resolve Issue 14980 semantics by by first removing an existing content
assertQueryResults(null, "Sequence{'c', 'a', 'b'}", "Sequence{'a', 'b'}->insertAt(1, 'c')");
assertQueryResults(null, "OrderedSet{'a', 'c', 'b'}", "OrderedSet{'a', 'b'}->insertAt(2, 'c')");
// We can add _after_ the last element
assertQueryResults(null, "Sequence{'a', 'b', 'c'}", "Sequence{'a', 'b'}->insertAt(3, 'c')");
assertQueryResults(null, "OrderedSet{'a', 'b', 'c'}", "OrderedSet{'a', 'b'}->insertAt(3, 'c')");
// invalid collection
assertQueryInvalid(null, "let s : Sequence(String) = invalid in s->insertAt(1, 'a')");
assertQueryInvalid(null, "let o : OrderedSet(String) = invalid in o->insertAt(1, 'a')");
// invalid collection element
assertQueryInvalid(null, "Sequence{'a'}->insertAt(1, invalid)");
assertQueryInvalid(null, "OrderedSet{'a'}->insertAt(1, invalid)");
// null collection
assertQueryInvalid(null, "let s : Sequence(String) = null in s->insertAt(1, 'a')");
assertQueryInvalid(null, "let o : OrderedSet(String) = null in o->insertAt(1, 'a')");
// null collection element
assertQueryResults(null, "Sequence{null, 'a'}", "Sequence{'a'}->insertAt(1, null)");
assertQueryResults(null, "Sequence{null, null}", "Sequence{null}->insertAt(1, null)");
// assertQueryResults(null, "Sequence{'a', null}", "Sequence{null}->insertAt(1, 'a')");
assertQueryResults(null, "OrderedSet{'a', null}", "OrderedSet{'a'}->insertAt(2, null)");
assertQueryResults(null, "OrderedSet{null}", "OrderedSet{null}->insertAt(1, null)");
// assertQueryResults(null, "OrderedSet{null, 'a'}", "OrderedSet{null}->insertAt(2, 'a')");
// out of bounds
assertQueryInvalid(null, "Sequence{'a'}->insertAt(0, 'b')");
assertQueryInvalid(null, "OrderedSet{'a'}->insertAt(0, 'b')");
assertQueryInvalid(null, "Sequence{'a'}->insertAt(3, 'b')");
assertQueryInvalid(null, "OrderedSet{'a'}->insertAt(3, 'b')");
assertQueryInvalid(null, "OrderedSet{'a'}->insertAt(2, 'a')");
// duplicates
assertQueryResults(null, "Sequence{'b', 'a', 'b', 'c'}", "Sequence{'a', 'b', 'c'}->insertAt(1, 'b')");
assertQueryResults(null, "Sequence{'a', 'b', 'c', 'b'}", "Sequence{'a', 'b', 'c'}->insertAt(4, 'b')");
assertQueryResults(null, "OrderedSet{'b', 'a', 'c'}", "OrderedSet{'a', 'b', 'c'}->insertAt(1, 'b')");
assertQueryResults(null, "OrderedSet{'a', 'b', 'c'}", "OrderedSet{'a', 'b', 'c'}->insertAt(2, 'b')");
assertQueryResults(null, "OrderedSet{'a', 'c', 'b'}", "OrderedSet{'a', 'b', 'c'}->insertAt(3, 'b')");
assertQueryInvalid(null, "OrderedSet{'a', 'b', 'c'}->insertAt(4, 'b')");
}
@Test public void testCollectionIntersection() {
// No duplicates
assertQueryEquals(null, getEmptySetValue(), "Set{'a', 'b'}->intersection(Set{'c', 'd'})");
assertQueryEquals(null, getEmptySetValue(), "Set{'a', 'b'}->intersection(Sequence{'c', 'd'})");
assertQueryEquals(null, getEmptySetValue(), "Set{'a', 'b'}->intersection(OrderedSet{'c', 'd'})");
assertQueryEquals(null, getEmptySetValue(), "Set{'a', 'b'}->intersection(Bag{'c', 'd'})");
assertQueryEquals(null, getEmptySetValue(), "Sequence{'a', 'b'}->intersection(Set{'c', 'd'})");
assertQueryEquals(null, getEmptyBagValue(), "Sequence{'a', 'b'}->intersection(Sequence{'c', 'd'})");
assertQueryEquals(null, getEmptySetValue(), "Sequence{'a', 'b'}->intersection(OrderedSet{'c', 'd'})");
assertQueryEquals(null, getEmptyBagValue(), "Sequence{'a', 'b'}->intersection(Bag{'c', 'd'})");
assertQueryEquals(null, getEmptySetValue(), "OrderedSet{'a', 'b'}->intersection(Set{'c', 'd'})");
assertQueryEquals(null, getEmptySetValue(), "OrderedSet{'a', 'b'}->intersection(Sequence{'c', 'd'})");
assertQueryEquals(null, getEmptySetValue(), "OrderedSet{'a', 'b'}->intersection(OrderedSet{'c', 'd'})");
assertQueryEquals(null, getEmptySetValue(), "OrderedSet{'a', 'b'}->intersection(Bag{'c', 'd'})");
assertQueryEquals(null, getEmptySetValue(), "Bag{'a', 'b'}->intersection(Set{'c', 'd'})");
assertQueryEquals(null, getEmptyBagValue(), "Bag{'a', 'b'}->intersection(Sequence{'c', 'd'})");
assertQueryEquals(null, getEmptySetValue(), "Bag{'a', 'b'}->intersection(OrderedSet{'c', 'd'})");
assertQueryEquals(null, getEmptyBagValue(), "Bag{'a', 'b'}->intersection(Bag{'c', 'd'})");
// Duplicates
assertQueryResults(null, "Set{'a', 'b'}", "Set{'a', 'b', 'a'}->intersection(Set{'a', 'b', 'c'})");
assertQueryResults(null, "Set{'a', 'b'}", "Set{'a', 'b', 'a'}->intersection(Bag{'a', 'b', 'c'})");
assertQueryResults(null, "Set{'a', 'b'}", "Bag{'a', 'b', 'a'}->intersection(Set{'a', 'b', 'c'})");
assertQueryResults(null, "Bag{'a', 'b'}", "Bag{'a', 'b', 'a'}->intersection(Bag{'a', 'b'})");
assertQueryResults(null, "Bag{'a', 'b'}", "Bag{'a', 'b'}->intersection(Bag{'a', 'b', 'a'})");
assertQueryResults(null, "Bag{'a', 'b', 'b'}", "Bag{'a', 'b', 'a', 'b'}->intersection(Bag{'a', 'b', 'b'})");
assertQueryResults(null, "Bag{'a', 'b'}", "Bag{'a', 'b', 'a'}->intersection(Bag{'a', 'b', 'c'})");
assertQueryResults(null, "Bag{'a'}", "Bag{'a', 'a', 'a', 'a'}->intersection(Bag{'a', 'b', 'b'})");
// empty collection
assertQueryEquals(null, getEmptySetValue(), "Set{3, 4}->intersection(Set{})");
assertQueryEquals(null, getEmptySetValue(), "Set{3, 4}->intersection(Bag{})");
assertQueryEquals(null, getEmptyBagValue(), "Bag{3, 4}->intersection(Bag{})");
assertQueryEquals(null, getEmptySetValue(), "Bag{3, 4}->intersection(Set{})");
// implicit collection
assertQueryEquals(null, getEmptySetValue(), "1->intersection(Set{})");
assertQueryEquals(null, getEmptySetValue(), "2->intersection(Bag{})");
// assertBadQuery(SemanticException.class, Diagnostic.ERROR,
// "Set{}->intersection(Set{3, 4})",
// OCLMessages.OperationNotFound_ERROR_, "intersection(Set(Integer))", "Set(OclVoid)");
assertQueryEquals(null, getEmptySetValue(), "Set{}->intersection(Set{3, 4})");
assertQueryEquals(null, getEmptySetValue(), "Set{}->intersection(Bag{3, 4})");
assertQueryEquals(null, getEmptyBagValue(), "Bag{}->intersection(Bag{3, 4})");
assertQueryEquals(null, getEmptySetValue(), "Bag{}->intersection(Set{3, 4})");
// invalid collection
assertQueryInvalid(null, "let s : Set(Integer) = invalid in s->intersection(Set{4})");
assertQueryInvalid(null, "let s : Set(Integer) = invalid in s->intersection(Bag{4})");
assertQueryInvalid(null, "let b : Bag(Integer) = invalid in b->intersection(Set{4})");
assertQueryInvalid(null, "let b : Bag(Integer) = invalid in b->intersection(Bag{4})");
assertSemanticErrorQuery("let s : Set(Integer) = invalid in Set{4}->intersection(s)",
OCLMessages.UnresolvedOperationCall_ERROR_, "intersection", "Set(UnlimitedNatural)", "Set(Integer)");
assertQueryInvalid(null, "let s : Set(UnlimitedNatural) = invalid in Set{4}->intersection(s)");
assertQueryInvalid(null, "let s : Set(UnlimitedNatural) = invalid in Bag{4}->intersection(s)");
assertQueryInvalid(null, "let b : Bag(UnlimitedNatural) = invalid in Set{4}->intersection(b)");
assertQueryInvalid(null, "let b : Bag(UnlimitedNatural) = invalid in Bag{4}->intersection(b)");
// invalid collection element
assertQueryInvalid(null, "Set{3, 4}->intersection(Set{invalid})");
assertQueryInvalid(null, "Set{3, invalid}->intersection(Bag{4})");
assertQueryInvalid(null, "Bag{3, invalid}->intersection(Set{4})");
assertQueryInvalid(null, "Bag{3, 4}->intersection(Bag{invalid})");
// null collection
assertQueryInvalid(null, "let s : Set(Integer) = null in s->intersection(Set{4})");
assertQueryInvalid(null, "let s : Set(Integer) = null in s->intersection(Bag{4})");
assertQueryInvalid(null, "let b : Bag(Integer) = null in b->intersection(Set{4})");
assertQueryInvalid(null, "let b : Bag(Integer) = null in b->intersection(Bag{4})");
assertQueryInvalid(null, "let s : Set(UnlimitedNatural) = null in Set{4}->intersection(s)");
assertQueryInvalid(null, "let s : Set(UnlimitedNatural) = null in Bag{4}->intersection(s)");
assertQueryInvalid(null, "let b : Bag(UnlimitedNatural) = null in Set{4}->intersection(b)");
assertQueryInvalid(null, "let b : Bag(UnlimitedNatural) = null in Bag{4}->intersection(b)");
// null collection element
assertQueryResults(null, "Set{2, null}", "Set{2, 3, null}->intersection(Set{2, 4, null})");
assertQueryResults(null, "Set{2, null}", "Set{2, 3, null}->intersection(Bag{2, 4, null})");
assertQueryResults(null, "Set{2, null}", "Bag{2, 3, null}->intersection(Set{2, 4, null})");
assertQueryResults(null, "Bag{null, null}", "Bag{3, 4, null, null}->intersection(Bag{null, 2, null})");
}
@Test public void testCollectionIntersectionReturnType() {
assertQueryResults(null, "Set{'c'}", "Set{'a'}->intersection(Set{'b'})->including('c')");
assertQueryResults(null, "Set{'c'}", "let domainVars: Set(String) = Set{'a'}, whenVars: Set(String) = Set{'b'}, tev: String = 'c' in domainVars->intersection(whenVars)->including(tev)");
assertQueryTrue(null, "let domainTopVars: Set(String) = Set{'c'}, domainVars: Set(String) = Set{'a'}, whenVars: Set(String) = Set{'b'}, tev: String = 'c' in domainTopVars = domainVars->intersection(whenVars)->including(tev)");
}
@Test public void testCollectionIsEmpty() {
assertQueryTrue(null, "Sequence{}->isEmpty()");
assertQueryTrue(null, "Bag{}->isEmpty()");
assertQueryTrue(null, "Set{}->isEmpty()");
assertQueryTrue(null, "OrderedSet{}->isEmpty()");
assertQueryFalse(null, "Sequence{4, 4, 'test'}->isEmpty()");
assertQueryFalse(null, "Bag{4, 4, 'test'}->isEmpty()");
assertQueryFalse(null, "Set{4, 4, 'test'}->isEmpty()");
assertQueryFalse(null, "OrderedSet{4, 4, 'test'}->isEmpty()");
assertQueryResults(null, "Set{'test'}", "'test'.oclAsSet()");
assertQueryFalse(null, "'test'.oclAsSet()->isEmpty()");
assertQueryFalse(null, "'test'->isEmpty()");
assertQueryFalse(null, "''->isEmpty()");
// invalid collection
assertQueryInvalid(null, "let s : Sequence(Integer) = invalid in s->isEmpty()");
assertQueryInvalid(null, "let b : Bag(Integer) = invalid in b->isEmpty()");
assertQueryInvalid(null, "let s : Set(Integer) = invalid in s->isEmpty()");
assertQueryInvalid(null, "let o : OrderedSet(Integer) = invalid in o->isEmpty()");
// invalid collection element
assertQueryInvalid(null, "invalid->isEmpty()");
assertQueryInvalid(null, "Sequence{invalid}->isEmpty()");
assertQueryInvalid(null, "Bag{invalid}->isEmpty()");
assertQueryInvalid(null, "Set{invalid}->isEmpty()");
assertQueryInvalid(null, "OrderedSet{invalid}->isEmpty()");
// null collection
// assertQueryInvalid(null, "null->isEmpty()");
assertQueryTrue(null, "null->isEmpty()");
assertQueryInvalid(null, "let s : Sequence(Integer) = null in s->isEmpty()");
assertQueryInvalid(null, "let b : Bag(Integer) = null in b->isEmpty()");
assertQueryInvalid(null, "let s : Set(Integer) = null in s->isEmpty()");
assertQueryInvalid(null, "let o : OrderedSet(Integer) = null in o->isEmpty()");
// null collection element
// assertQueryInvalid(null, "let s : String = null in s->isEmpty()");
assertQueryTrue(null, "let s : String = null in s->isEmpty()");
assertQueryFalse(null, "Sequence{null}->isEmpty()");
assertQueryFalse(null, "Bag{null}->isEmpty()");
assertQueryFalse(null, "Set{null}->isEmpty()");
assertQueryFalse(null, "OrderedSet{null}->isEmpty()");
}
@Test public void testCollectionLast() {
assertQueryEquals(null, "3", "Sequence{1, 2.0, '3'}->last()"); //$NON-NLS-2$
assertQueryEquals(null, "3", "OrderedSet{1, 2.0, '3'}->last()"); //$NON-NLS-2$
// empty
assertQueryInvalid(null, "Sequence{}->last()");
assertQueryInvalid(null, "OrderedSet{}->last()");
// invalid collection
assertQueryInvalid(null, "let s : Sequence(Integer) = invalid in s->last()");
assertQueryInvalid(null, "let o : OrderedSet(Integer) = invalid in o->last()");
// invalid collection element
assertQueryInvalid(null, "Sequence{invalid, 1}->last()");
assertQueryInvalid(null, "OrderedSet{invalid, 1}->last()");
// null collection
assertQueryInvalid(null, "let s : Sequence(Integer) = null in s->last()");
assertQueryInvalid(null, "let o : OrderedSet(Integer) = null in o->last()");
// null collection element
assertQueryNull(null, "Sequence{null}->last()");
assertQueryNull(null, "OrderedSet{null}->last()");
}
@Test public void testCollectionLower() {
assertQueryEquals(null, 3, "Sequence{1, 2.0, '3'}->oclType().lower");
assertQueryEquals(null, 3, "Sequence{1, 2.0, 3}->oclAsType(Collection(Real))->oclType().lower");
assertQueryEquals(null, 3, "Set{1, 2.0, 3}->oclAsType(Collection(Real)[2..4])->oclType().lower"); // no change to dynamic bound
}
@Test public void testCollectionMax() {
assertQueryEquals(null, 2, "Sequence{1, 2}->max()");
assertQueryEquals(null, 5.0, "Set{5, 4.0, 3.0, 2, 1}->max()");
assertQueryEquals(null, 1, "Bag{1}->max()");
assertQueryEquals(null, 1, "Bag{1}->max()");
assertQueryInvalid(null, "OrderedSet{'hi', 'lo'}->max()");
assertQueryInvalid(null, "Set{}->max()");
assertQueryInvalid(null, "OrderedSet{true, 1, 'bad'}->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
}
@Test public void testCollectionMin() {
assertQueryEquals(null, 1, "Sequence{1, 2}->min()");
assertQueryEquals(null, 1.0, "Set{5, 4.0, 3.0, 2, 1}->min()");
assertQueryEquals(null, 1, "Bag{1}->min()");
assertQueryInvalid(null, "OrderedSet{'hi', 'lo'}->min()");
assertQueryInvalid(null, "Set{}->min()");
assertQueryInvalid(null, "OrderedSet{true, 1, 'bad'}->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
}
@Test public void testCollectionMinus() {
assertQueryResults(null, "Set{'b'}", "Set{'a', 'b', 'c'} - Set{'c', 'a'}");
/*
* FIXME OMG-issue generalise to UniqueCollection::-
* "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
*/
assertQueryResults(null, "OrderedSet{'b'}", "OrderedSet{'a', 'b', 'c'} - Set{'c', 'a'}");
// invalid collection
assertQueryInvalid(null, "let s : Set(String) = invalid in s - Set{'c'}");
assertQueryInvalid(null, "let s : Set(String) = invalid in Set{'a'} - s");
// invalid collection element
assertQueryInvalid(null, "Set{'a', invalid} - Set{'c', invalid}");
assertQueryInvalid(null, "Set{'a', invalid} - Set{'c', 'a'}");
// null collection
assertQueryInvalid(null, "let s : Set(String) = null in s - Set{'c', null}");
assertQueryInvalid(null, "let s : Set(String) = null in Set{'a', null} - s");
// null collection element
assertQueryResults(null, "Set{'a'}", "Set{'a', null} - Set{'c', null}");
assertQueryResults(null, "Set{null}", "Set{'a', null} - Set{'c', 'a'}");
}
@Test public void testCollectionNotEmpty() {
assertQueryFalse(null, "Sequence{}->notEmpty()");
assertQueryFalse(null, "Bag{}->notEmpty()");
assertQueryFalse(null, "Set{}->notEmpty()");
assertQueryFalse(null, "OrderedSet{}->notEmpty()");
assertQueryTrue(null, "Sequence{4, 4, 'test'}->notEmpty()");
assertQueryTrue(null, "Bag{4, 4, 'test'}->notEmpty()");
assertQueryTrue(null, "Set{4, 4, 'test'}->notEmpty()");
assertQueryTrue(null, "OrderedSet{4, 4, 'test'}->notEmpty()");
assertQueryTrue(null, "'test'->notEmpty()");
assertQueryTrue(null, "''->notEmpty()");
// invalid collection
assertQueryInvalid(null, "invalid->notEmpty()", "invalid", InvalidValueException.class);
assertQueryInvalid(null, "let s : Sequence(Integer) = invalid in s->notEmpty()", "invalid", InvalidValueException.class);
assertQueryInvalid(null, "let b : Bag(Integer) = invalid in b->notEmpty()", "invalid", InvalidValueException.class);
assertQueryInvalid(null, "let s : Set(Integer) = invalid in s->notEmpty()", "invalid", InvalidValueException.class);
assertQueryInvalid(null, "let o : OrderedSet(Integer) = invalid in o->notEmpty()", "invalid", InvalidValueException.class);
// invalid collection element
assertQueryInvalid(null, "Sequence{invalid}->notEmpty()", "invalid", InvalidValueException.class);
assertQueryInvalid(null, "Bag{invalid}->notEmpty()", "invalid", InvalidValueException.class);
assertQueryInvalid(null, "Set{invalid}->notEmpty()", "invalid", InvalidValueException.class);
assertQueryInvalid(null, "OrderedSet{invalid}->notEmpty()", "invalid", InvalidValueException.class);
// null collection
// assertQueryInvalid(null, "null->notEmpty()");
assertQueryFalse(null, "null->notEmpty()");
assertQueryInvalid(null, "let s : Sequence(Integer) = null in s->notEmpty()", "'Collection' rather than 'OclVoid' value required", InvalidValueException.class);
assertQueryInvalid(null, "let b : Bag(Integer) = null in b->notEmpty()", "'Collection' rather than 'OclVoid' value required", InvalidValueException.class);
assertQueryInvalid(null, "let s : Set(Integer) = null in s->notEmpty()", "'Collection' rather than 'OclVoid' value required", InvalidValueException.class);
assertQueryInvalid(null, "let o : OrderedSet(Integer) = null in o->notEmpty()", "'Collection' rather than 'OclVoid' value required", InvalidValueException.class);
// null collection element
assertQueryTrue(null, "Sequence{null}->notEmpty()");
assertQueryTrue(null, "Bag{null}->notEmpty()");
assertQueryTrue(null, "Set{null}->notEmpty()");
assertQueryTrue(null, "OrderedSet{null}->notEmpty()");
}
@Test public void testCollectionNotEqual() {
assertQueryTrue(null, "Bag{1} <> 1");
assertQueryTrue(null, "OrderedSet{1} <> 1");
assertQueryTrue(null, "Sequence{1} <> 1");
assertQueryTrue(null, "Set{1} <> 1");
assertQueryTrue(null, "1 <> Bag{1}");
assertQueryTrue(null, "1 <> OrderedSet{1}");
assertQueryTrue(null, "1 <> Sequence{1}");
assertQueryTrue(null, "1 <> Set{1}");
assertQueryTrue(null, "Set{1} <> Set{Set{1}}");
assertQueryTrue(null, "Bag{1.01} <> Bag{1}");
assertQueryTrue(null, "OrderedSet{1.01} <> OrderedSet{1}");
assertQueryTrue(null, "Sequence{1.01} <> Sequence{1}");
assertQueryTrue(null, "Set{1.01} <> Set{1}");
assertQueryTrue(null, "Set{Set{1.01}} <> Set{Set{1}}");
assertQueryFalse(null, "Bag{1.0} <> Bag{1}");
assertQueryFalse(null, "OrderedSet{1.0} <> OrderedSet{1}");
assertQueryFalse(null, "Sequence{1.0} <> Sequence{1}");
assertQueryFalse(null, "Set{1.0} <> Set{1}");
assertQueryFalse(null, "Set{Set{1.0}} <> Set{Set{1}}");
assertQueryFalse(null, "Sequence{1..2} <> Sequence{1,2}");
assertQueryFalse(null, "OrderedSet{1..2} <> OrderedSet{1,2}");
assertQueryTrue(null, "Sequence{1..2} <> Sequence{2,1}");
assertQueryTrue(null, "OrderedSet{1..2} <> OrderedSet{2,1}");
assertQueryTrue(null, "Sequence{1..2} <> OrderedSet{1,2}");
}
@Test public void testCollectionNotEqualInvalid() {
assertQueryInvalid(null, "let s : Sequence(Integer) = invalid in s <> Sequence{5}");
assertQueryInvalid(null, "let b : Bag(Integer) = invalid in Bag{5} <> b");
assertQueryInvalid(null, "let s : Set(Integer) = invalid in s <> Set{5}");
assertQueryInvalid(null, "let o : OrderedSet(Integer) = invalid in OrderedSet{5} <> o");
assertQueryInvalid(null, "let s1 : Sequence(Integer) = invalid, s2 : Sequence(Integer) = invalid in s1 <> s2");
assertQueryInvalid(null, "let b1 : Bag(Integer) = invalid, b2 : Bag(Integer) = invalid in b1 <> b2");
assertQueryInvalid(null, "let s1 : Set(Integer) = invalid, s2 : Set(Integer) = invalid in s1 <> s2");
assertQueryInvalid(null, "let o1 : OrderedSet(Integer) = invalid, o2 : OrderedSet(Integer) = invalid in o1 <> o2");
}
@Test public void testCollectionNotEqualNull() {
assertQueryTrue(null, "let s : Sequence(Integer) = null in s <> Sequence{5}");
assertQueryTrue(null, "let b : Bag(Integer) = null in Bag{5} <> b");
assertQueryTrue(null, "let s : Set(Integer) = null in s <> Set{5}");
assertQueryTrue(null, "let o : OrderedSet(Integer) = null in OrderedSet{5} <> o");
assertQueryFalse(null, "let s1 : Sequence(Integer) = null, s2 : Sequence(Integer) = null in s1 <> s2");
assertQueryFalse(null, "let b1 : Bag(Integer) = null, b2 : Bag(Integer) = null in b1 <> b2");
assertQueryFalse(null, "let s1 : Set(Integer) = null, s2 : Set(Integer) = null in s1 <> s2");
assertQueryFalse(null, "let o1 : OrderedSet(Integer) = null, o2 : OrderedSet(Integer) = null in o1 <> o2");
}
@Test public void testCollectionNotEqualOrderedXOrdered() {
// same order, same quantities
/* assertQueryFalse(null, "Sequence{4, 5, 'test'} <> Sequence{4, 5, 'test'}");
assertQueryFalse(null, "Sequence{4, 5, 'test', 5} <> Sequence{4, 5, 'test', 5}");
assertQueryFalse(null, "OrderedSet{4, 5, 'test', 5} <> OrderedSet{4, 5, 'test'}");
assertQueryTrue(null, "Sequence{4, 5, 'test'} <> OrderedSet{4, 5, 'test', 5}");
assertQueryTrue(null, "OrderedSet{4, 5, 'test', 5} <> Sequence{4, 5, 'test'}");
// distinct order, same quantities
assertQueryTrue(null, "Sequence{4, 5, 'test'} <> Sequence{4, 'test', 5}");
assertQueryTrue(null, "Sequence{4, 5, 'test', 5} <> Sequence{5, 4, 'test', 5}");
*/ assertQueryTrue(null, "OrderedSet{4, 5, 'test', 5} <> OrderedSet{4, 'test', 5}");
assertQueryTrue(null, "Sequence{4, 5, 'test'} <> OrderedSet{5, 4, 'test', 5}");
assertQueryTrue(null, "OrderedSet{4, 5, 'test', 5} <> Sequence{5, 4, 'test'}");
// distinct quantities
assertQueryTrue(null, "Sequence{4, 5, 'test', 5} <> Sequence{4, 5, 'test'}");
assertQueryTrue(null, "Sequence{4, 5, 'test', 5} <> OrderedSet{4, 5, 'test', 5}");
assertQueryTrue(null, "OrderedSet{4, 5, 'test', 5} <> Sequence{4, 5, 'test', 5}");
}
@Test public void testCollectionNotEqualOrderedXUnordered() {
// same quantities
assertQueryTrue(null, "Sequence{4, 5, 'test'} <> Set{4, 'test', 5, 4}");
assertQueryTrue(null, "Sequence{4, 5, 'test', 4} <> Bag{4, 'test', 5, 4}");
assertQueryTrue(null, "OrderedSet{4, 5, 'test', 4} <> Set{4, 'test', 5, 4}");
assertQueryTrue(null, "OrderedSet{4, 5, 'test', 4} <> Bag{4, 'test', 5}");
// distinct quantities
assertQueryTrue(null, "Sequence{4, 5, 'test', 4} <> Set{4, 'test', 5, 4}");
assertQueryTrue(null, "Sequence{4, 5, 'test'} <> Bag{4, 'test', 5, 4}");
assertQueryTrue(null, "OrderedSet{4, 5, 'test', 4} <> Bag{4, 'test', 5, 4}");
}
@Test public void testCollectionNotEqualUnorderedXUnordered() {
// same quantities
assertQueryTrue(null, "Bag{4, 5, 'test'} <> Set{4, 'test', 5, 4}");
assertQueryFalse(null, "Bag{4, 5, 'test', 4} <> Bag{4, 'test', 5, 4}");
assertQueryFalse(null, "Set{4, 5, 'test', 4} <> Set{4, 'test', 5, 4}");
assertQueryTrue(null, "Set{4, 5, 'test', 4} <> Bag{4, 'test', 5}");
// distinct quantities
assertQueryTrue(null, "Bag{4, 5, 'test', 4} <> Set{4, 'test', 5, 4}");
assertQueryTrue(null, "Bag{4, 5, 'test'} <> Bag{4, 'test', 5, 4}");
assertQueryTrue(null, "Set{4, 5, 'test', 4} <> Bag{4, 'test', 5, 4}");
}
@Test public void testCollectionPrepend() {
assertQueryResults(null, "Sequence{'c', 'a', 'b'}", "Sequence{'a', 'b'}->prepend('c')");
assertQueryResults(null, "OrderedSet{'c', 'a', 'b'}", "OrderedSet{'a', 'b'}->prepend('c')");
// invalid collection
assertQueryInvalid(null, "let s : Sequence(String) = invalid in s->prepend('a')");
assertQueryInvalid(null, "let o : OrderedSet(String) = invalid in o->prepend('a')");
// invalid collection element
assertQueryInvalid(null, "Sequence{'a', 'b'}->prepend(invalid)");
assertQueryInvalid(null, "OrderedSet{'a', 'b'}->prepend(invalid)");
// null collection
assertQueryInvalid(null, "let s : Sequence(String) = null in s->prepend('a')");
assertQueryInvalid(null, "let o : OrderedSet(String) = null in o->prepend('a')");
// null collection element
assertQueryResults(null, "Sequence{null, 'a', null, 'b'}", "Sequence{'a', null, 'b'}->prepend(null)");
assertQueryResults(null, "OrderedSet{null, 'a', 'b'}", "OrderedSet{'a', null, 'b'}->prepend(null)");
}
@Test public void testCollectionPrependAll() {
assertQueryResults(null, "Sequence{'c', 'd', 'a', 'b'}", "Sequence{'a', 'b'}->prependAll(Sequence{'c', 'd'})");
assertQueryResults(null, "Sequence{'c', 'd', 'a', 'b'}", "Sequence{'a', 'b'}->prependAll(OrderedSet{'c', 'd'})");
assertQueryResults(null, "OrderedSet{'c', 'd', 'a', 'b'}", "OrderedSet{'a', 'b'}->prependAll(Sequence{'c', 'd'})");
assertQueryResults(null, "OrderedSet{'c', 'd', 'a', 'b'}", "OrderedSet{'a', 'b'}->prependAll(OrderedSet{'c', 'd'})");
// invalid collection
assertQueryInvalid(null, "let s : Sequence(String) = invalid in s->prependAll(Sequence{'a', 'b'})");
assertQueryInvalid(null, "let o : OrderedSet(String) = invalid in o->prependAll(OrderedSet{'a', 'b'})");
// invalid collection element
assertQueryInvalid(null, "Sequence{'a', 'b'}->prependAll(invalid)");
assertQueryInvalid(null, "OrderedSet{'a', 'b'}->prependAll(invalid)");
// null collection
assertQueryInvalid(null, "let s : Sequence(String) = null in s->prependAll(Sequence{'a', 'b'})");
assertQueryInvalid(null, "let o : OrderedSet(String) = null in o->prependAll(OrderedSet{'a', 'b'})");
// null collection element
assertQueryResults(null, "Sequence{null, null, 'a', null, 'b'}", "Sequence{'a', null, 'b'}->prependAll(Sequence{null,null})");
assertQueryResults(null, "OrderedSet{null, 'a', 'b'}", "OrderedSet{'a', null, 'b'}->prependAll(Sequence{null,null})");
}
@Test public void testCollectionProduct() {
// Abstract2Moniker.TRACE_MONIKERS.setState(true);
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)
assertQueryResults(null, expectedResultExpression, "Sequence{3, 4}->product(Sequence{3.0, 4.0})");
assertQueryResults(null, expectedResultExpression, "Sequence{3, 4}->product(Bag{3.0, 4.0})");
assertQueryResults(null, expectedResultExpression, "Sequence{3, 4}->product(Set{3.0, 4.0})");
assertQueryResults(null, expectedResultExpression, "Sequence{3, 4}->product(OrderedSet{3.0, 4.0})");
// Bag::product(Collection)
assertQueryResults(null, expectedResultExpression, "Bag{3, 4}->product(Sequence{3.0, 4.0})");
assertQueryResults(null, expectedResultExpression, "Bag{3, 4}->product(Bag{3.0, 4.0})");
assertQueryResults(null, expectedResultExpression, "Bag{3, 4}->product(Set{3.0, 4.0})");
assertQueryResults(null, expectedResultExpression, "Bag{3, 4}->product(OrderedSet{3.0, 4.0})");
// Set::product(Collection)
assertQueryResults(null, expectedResultExpression, "Set{3, 4}->product(Sequence{3.0, 4.0})");
assertQueryResults(null, expectedResultExpression, "Set{3, 4}->product(Bag{3.0, 4.0})");
assertQueryResults(null, expectedResultExpression, "Set{3, 4}->product(Set{3.0, 4.0})");
assertQueryResults(null, expectedResultExpression, "Set{3, 4}->product(OrderedSet{3.0, 4.0})");
// OrderedSet::product(Collection)
assertQueryResults(null, expectedResultExpression, "OrderedSet{3, 4}->product(Sequence{3.0, 4.0})");
assertQueryResults(null, expectedResultExpression, "OrderedSet{3, 4}->product(Bag{3.0, 4.0})");
assertQueryResults(null, expectedResultExpression, "OrderedSet{3, 4}->product(Set{3.0, 4.0})");
assertQueryResults(null, expectedResultExpression, "OrderedSet{3, 4}->product(OrderedSet{3.0, 4.0})");
// bug284129
// assertQueryResults(null, "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})");
assertQueryResults(null, "Set{Tuple{first = 3.0, 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})");
// empty
assertQueryEquals(null, getEmptySetValue(), "Sequence{3, 4}->product(OrderedSet{})");
assertQueryEquals(null, getEmptySetValue(), "Bag{3, 4}->product(Set{})");
assertQueryEquals(null, getEmptySetValue(), "Set{3, 4}->product(Bag{})");
assertQueryEquals(null, getEmptySetValue(), "OrderedSet{3, 4}->product(Sequence{})");
assertQueryEquals(null, getEmptySetValue(), "Sequence{}->product(OrderedSet{3, 4})");
assertQueryEquals(null, getEmptySetValue(), "Bag{}->product(Set{3, 4})");
assertQueryEquals(null, getEmptySetValue(), "Set{}->product(Bag{3, 4})");
assertQueryEquals(null, getEmptySetValue(), "OrderedSet{}->product(Sequence{3, 4})");
// invalid collection
assertQueryInvalid(null, "let s : Sequence(Integer) = invalid in OrderedSet{3, 4}->product(s)");
assertQueryInvalid(null, "let b : Bag(Integer) = invalid in Set{3, 4}->product(b)");
assertQueryInvalid(null, "let s : Set(Integer) = invalid in Bag{3, 4}->product(s)");
assertQueryInvalid(null, "let o : OrderedSet(Integer) = invalid in Sequence{3, 4}->product(o)");
assertQueryInvalid(null, "let s : Sequence(Integer) = invalid in s->product(OrderedSet{3, 4})");
assertQueryInvalid(null, "let b : Bag(Integer) = invalid in b->product(Set{3, 4})");
assertQueryInvalid(null, "let s : Set(Integer) = invalid in s->product(Bag{3, 4})");
assertQueryInvalid(null, "let o : OrderedSet(Integer) = invalid in o->product(Sequence{3, 4})");
// invalid collection element
assertQueryInvalid(null, "Sequence{3, 4}->product(OrderedSet{invalid})");
assertQueryInvalid(null, "Bag{3, 4}->product(Set{invalid})");
assertQueryInvalid(null, "Set{3, 4}->product(Bag{invalid})");
assertQueryInvalid(null, "OrderedSet{3, 4}->product(Sequence{invalid})");
assertQueryInvalid(null, "Sequence{invalid, 4}->product(Sequence{3})");
assertQueryInvalid(null, "Bag{invalid, 4}->product(Set{3})");
assertQueryInvalid(null, "Set{invalid, 4}->product(Bag{3})");
assertQueryInvalid(null, "OrderedSet{invalid, 4}->product(Sequence{3})");
}
@Test public void testCollectionProductNull() {
assertQueryInvalid(null, "let s : Sequence(Integer) = null in OrderedSet{3, 4}->product(s)");
assertQueryInvalid(null, "let b : Bag(Integer) = null in Set{3, 4}->product(b)");
assertQueryInvalid(null, "let s : Set(Integer) = null in Bag{3, 4}->product(s)");
assertQueryInvalid(null, "let o : OrderedSet(Integer) = null in Sequence{3, 4}->product(o)");
assertQueryInvalid(null, "let s : Sequence(Integer) = null in s->product(OrderedSet{3, 4})");
assertQueryInvalid(null, "let b : Bag(Integer) = null in b->product(Set{3, 4})");
assertQueryInvalid(null, "let s : Set(Integer) = null in s->product(Bag{3, 4})");
assertQueryInvalid(null, "let o : OrderedSet(Integer) = null in o->product(Sequence{3, 4})");
}
@Test public void testCollectionProductNullValue() {
assertQueryResults(null, "Set{Tuple{first = 3, second = null}, Tuple{first = 4, second = null}}", "Sequence{3, 4}->product(OrderedSet{null})");
assertQueryResults(null, "Set{Tuple{first = 3, second = null}, Tuple{first = 4, second = null}}", "Bag{3, 4}->product(Set{null})");
assertQueryResults(null, "Set{Tuple{first = 3, second = null}, Tuple{first = 4, second = null}}", "Set{3, 4}->product(Bag{null})");
assertQueryResults(null, "Set{Tuple{first = 3, second = null}, Tuple{first = 4, second = null}}", "OrderedSet{3, 4}->product(Sequence{null})");
assertQueryResults(null, "Set{Tuple{first = null, second = 3}, Tuple{first = null, second = 4}}", "Sequence{null}->product(OrderedSet{3, 4})");
assertQueryResults(null, "Set{Tuple{first = null, second = 3}, Tuple{first = null, second = 4}}", "Bag{null}->product(Set{3, 4})");
assertQueryResults(null, "Set{Tuple{first = null, second = 3}, Tuple{first = null, second = 4}}", "Set{null}->product(Bag{3, 4})");
assertQueryResults(null, "Set{Tuple{first = null, second = 3}, Tuple{first = null, second = 4}}", "OrderedSet{null}->product(Sequence{3, 4})");
assertQueryResults(null, "let nu : UnlimitedNatural = null in Set{Tuple{first = nu, second = 3}, Tuple{first = 4, second = 3}}", "Sequence{null, 4}->product(Sequence{3})");
assertQueryResults(null, "let nu : UnlimitedNatural = null in Set{Tuple{first = nu, second = 3}, Tuple{first = 4, second = 3}}", "Bag{null, 4}->product(Set{3})");
assertQueryResults(null, "let nu : UnlimitedNatural = null in Set{Tuple{first = nu, second = 3}, Tuple{first = 4, second = 3}}", "Set{null, 4}->product(Bag{3})");
assertQueryResults(null, "let nu : UnlimitedNatural = null in Set{Tuple{first = nu, second = 3}, Tuple{first = 4, second = 3}}", "OrderedSet{null, 4}->product(Sequence{3})");
assertQueryResults(null, "let n : UnlimitedNatural = null in Set{Tuple{first = n, second = 3}, Tuple{first = 4, second = 3}}", "Sequence{null, 4}->product(Sequence{3})");
assertQueryResults(null, "let n : UnlimitedNatural = null in Set{Tuple{first = n, second = 3}, Tuple{first = 4, second = 3}}", "Bag{null, 4}->product(Sequence{3})");
assertQueryResults(null, "let n : UnlimitedNatural = null in Set{Tuple{first = n, second = 3}, Tuple{first = 4, second = 3}}", "Set{null, 4}->product(Sequence{3})");
assertQueryResults(null, "let n : UnlimitedNatural = null in Set{Tuple{first = n, second = 3}, Tuple{first = 4, second = 3}}", "OrderedSet{null, 4}->product(Sequence{3})");
}
@Test public void testCollectionReverse() {
assertSemanticErrorQuery("Bag{1,3,null,2}->reverse()", OCLMessages.UnresolvedOperation_ERROR_, "reverse", "Bag(UnlimitedNatural)");
assertQueryResults(null, "OrderedSet{}", "OrderedSet{}->reverse()");
assertQueryResults(null, "OrderedSet{null}", "OrderedSet{null}->reverse()");
assertQueryResults(null, "OrderedSet{2,1}", "OrderedSet{1,2}->reverse()");
assertQueryResults(null, "OrderedSet{'a','b'}", "OrderedSet{'b','a'}->reverse()");
assertQueryResults(null, "OrderedSet{}", "OrderedSet{}->reverse()");
assertQueryResults(null, "OrderedSet{21,20,19,18,17,16,13,24,23,22,15,14,12,11,10,9,null,8,7,6,5,4,3,2,1}", "OrderedSet{1..4,3..8,null,9..12,14..15,4,22..24,13..21}->reverse()");
assertQueryResults(null, "Sequence{2,null,3,1}", "Sequence{1,3,null,2}->reverse()");
assertQueryResults(null, "Sequence{21,20,19,18,17,16,15,14,13,24,23,22,4,15,14,12,11,10,9,null,8,7,6,5,4,3,4,3,2,1}", "Sequence{1..4,3..8,null,9..12,14..15,4,22..24,13..21}->reverse()");
assertQueryResults(null, "Sequence{Set{1..3},Sequence{1..3},OrderedSet{1,3},Bag{1,1,1}}", "Sequence{Bag{1,1,1},OrderedSet{1,3},Sequence{1..3},Set{1..3}}->reverse()");
assertSemanticErrorQuery("Set{}->reverse()", OCLMessages.UnresolvedOperation_ERROR_, "reverse", "Set(<unspecified:4>)");
}
@Test public void testCollectionSelectByKind() {
assertQueryResults(null, "Sequence{'TEST'}", "Sequence{4, 4, 5.0, 'test'}->selectByKind(String).toUpper()");
//
assertQueryResults(null, "Bag{4,4}", "Bag{4, 4, 5.0, 'test', null}->selectByKind(Integer)");
assertQueryResults(null, "OrderedSet{4}", "OrderedSet{4, 4, 5.0, 'test', null}->selectByKind(Integer)");
assertQueryResults(null, "Sequence{4,4}", "Sequence{4, 4, 5.0, 'test', null}->selectByKind(Integer)");
assertQueryResults(null, "Set{4}", "Set{4, 4, 5.0, 'test', null}->selectByKind(Integer)");
//
assertQueryResults(null, "Bag{}", "Bag{}->selectByKind(Integer)");
assertQueryResults(null, "OrderedSet{}", "OrderedSet{}->selectByKind(Integer)");
assertQueryResults(null, "Sequence{}", "Sequence{}->selectByKind(Integer)");
assertQueryResults(null, "Set{}", "Set{}->selectByKind(Integer)");
//
assertQueryResults(null, "Bag{}", "Bag{null}->selectByKind(Integer)");
assertQueryResults(null, "OrderedSet{}", "OrderedSet{null}->selectByKind(Integer)");
assertQueryResults(null, "Sequence{}", "Sequence{null}->selectByKind(Integer)");
assertQueryResults(null, "Set{}", "Set{null}->selectByKind(Integer)");
//
assertQueryResults(null, "Bag{}", "Bag{null}->selectByKind(OclVoid)");
assertQueryResults(null, "OrderedSet{}", "OrderedSet{null}->selectByKind(OclVoid)");
assertQueryResults(null, "Sequence{}", "Sequence{null}->selectByKind(OclVoid)");
assertQueryResults(null, "Set{}", "Set{null}->selectByKind(OclVoid)");
//
assertQueryResults(null, "Bag{}", "Bag{null}->selectByKind(OclInvalid)");
assertQueryResults(null, "OrderedSet{}", "OrderedSet{null}->selectByKind(OclInvalid)");
assertQueryResults(null, "Sequence{}", "Sequence{null}->selectByKind(OclInvalid)");
assertQueryResults(null, "Set{}", "Set{null}->selectByKind(OclInvalid)");
//
assertQueryResults(null, "Bag{4, 4}", "Bag{4, 4, 5.0, 'test'}->selectByKind(UnlimitedNatural)");
assertQueryResults(null, "OrderedSet{4}", "OrderedSet{4, 4, 5.0, 'test'}->selectByKind(UnlimitedNatural)");
assertQueryResults(null, "Sequence{4, 4}", "Sequence{4, 4, 5.0, 'test'}->selectByKind(UnlimitedNatural)");
assertQueryResults(null, "Set{4}", "Set{4, 4, 5.0, 'test'}->selectByKind(UnlimitedNatural)");
//
assertQueryResults(null, "Sequence{'TEST'}", "Sequence{4, 4, 5.0, 'test'}->selectByKind(String).toUpper()");
assertQueryEquals(null, 9.0, "Set{4, 4, 5.0, 'test'}->selectByKind(Real)->sum()");
assertQueryEquals(null, 4, "Set{4, 4, 5.0, 'test'}->selectByKind(UnlimitedNatural)->sum()");
}
@Test public void testCollectionSelectByType() {
assertQueryResults(null, "Bag{}", "Bag{4, 4, 5.0, 'test', null}->selectByType(Integer)");
assertQueryResults(null, "OrderedSet{}", "OrderedSet{4, 4, 5.0, 'test', null}->selectByType(Integer)");
assertQueryResults(null, "Sequence{}", "Sequence{4, 4, 5.0, 'test', null}->selectByType(Integer)");
assertQueryResults(null, "Set{}", "Set{4, 4, 5.0, 'test', null}->selectByType(Integer)");
//
assertQueryResults(null, "Bag{}", "Bag{}->selectByType(Integer)");
assertQueryResults(null, "OrderedSet{}", "OrderedSet{}->selectByType(Integer)");
assertQueryResults(null, "Sequence{}", "Sequence{}->selectByType(Integer)");
assertQueryResults(null, "Set{}", "Set{}->selectByType(Integer)");
//
assertQueryResults(null, "Bag{}", "Bag{null}->selectByType(Integer)");
assertQueryResults(null, "OrderedSet{}", "OrderedSet{null}->selectByType(Integer)");
assertQueryResults(null, "Sequence{}", "Sequence{null}->selectByType(Integer)");
assertQueryResults(null, "Set{}", "Set{null}->selectByType(Integer)");
//
assertQueryResults(null, "Bag{null}", "Bag{null}->selectByType(OclVoid)");
assertQueryResults(null, "OrderedSet{null}", "OrderedSet{null}->selectByType(OclVoid)");
assertQueryResults(null, "Sequence{null}", "Sequence{null}->selectByType(OclVoid)");
assertQueryResults(null, "Set{null}", "Set{null}->selectByType(OclVoid)");
//
assertQueryResults(null, "Bag{}", "Bag{null}->selectByType(OclInvalid)");
assertQueryResults(null, "OrderedSet{}", "OrderedSet{null}->selectByType(OclInvalid)");
assertQueryResults(null, "Sequence{}", "Sequence{null}->selectByType(OclInvalid)");
assertQueryResults(null, "Set{}", "Set{null}->selectByType(OclInvalid)");
//
assertQueryResults(null, "Bag{4, 4}", "Bag{4, 4, 5.0, 'test'}->selectByType(UnlimitedNatural)");
assertQueryResults(null, "OrderedSet{4}", "OrderedSet{4, 4, 5.0, 'test'}->selectByType(UnlimitedNatural)");
assertQueryResults(null, "Sequence{4, 4}", "Sequence{4, 4, 5.0, 'test'}->selectByType(UnlimitedNatural)");
assertQueryResults(null, "Set{4}", "Set{4, 4, 5.0, 'test'}->selectByType(UnlimitedNatural)");
//
assertQueryResults(null, "Sequence{'TEST'}", "Sequence{4, 4, 5.0, 'test'}->selectByType(String).toUpper()");
assertQueryEquals(null, 5.0, "Set{4, 4, 5.0, 'test'}->selectByType(Real)->sum()");
assertQueryEquals(null, 4, "Set{4, 4, 5.0, 'test'}->selectByType(UnlimitedNatural)->sum()");
}
@Test public void testCollectionSize() {
assertQueryEquals(null, 4, "Sequence{4, 4, 5, 'test'}->size()");
assertQueryEquals(null, 4, "Bag{4, 4, 5, 'test'}->size()");
assertQueryEquals(null, 3, "Set{4, 4, 5, 'test'}->size()");
assertQueryEquals(null, 3, "OrderedSet{4, 4, 5, 'test'}->size()");
assertQueryEquals(null, 0, "Sequence{}->size()");
assertQueryEquals(null, 0, "Bag{}->size()");
assertQueryEquals(null, 0, "Set{}->size()");
assertQueryEquals(null, 0, "OrderedSet{}->size()");
// invalid collection
assertQueryInvalid(null, "let s : String = invalid in s->size()");
assertQueryInvalid(null, "let s : Sequence(Integer) = invalid in s->size()");
// invalid collection element
assertQueryInvalid(null, "OrderedSet{'a', 'b', invalid}->size()");
assertQueryInvalid(null, "Set{'a', 'b', invalid}->size()");
assertQueryInvalid(null, "Bag{'a', 'b', invalid}->size()");
assertQueryInvalid(null, "Sequence{'a', 'b', invalid}->size()");
// null collection
// assertQueryInvalid(null, "let s : String = null in s->size()");
assertQueryEquals(null, 0, "let s : String = null in s->size()");
assertQueryInvalid(null, "let s : Sequence(Integer) = null in s->size()");
// null collection element
assertQueryEquals(null, 4, "Sequence{'a', 'b', null, null}->size()");
assertQueryEquals(null, 4, "Bag{'a', 'b', null, null}->size()");
assertQueryEquals(null, 3, "Set{'a', 'b', null, null}->size()");
assertQueryEquals(null, 3, "OrderedSet{'a', 'b', null, null}->size()");
}
@Test public void testCollectionSubOrderedSet() {
assertQueryResults(null, "OrderedSet{'a'}", "OrderedSet{'a', 'b', 'c', 'd'}->subOrderedSet(1, 1)");
assertQueryResults(null, "OrderedSet{'b', 'c'}", "OrderedSet{'a', 'b', 'c', 'd'}->subOrderedSet(2, 3)");
assertQueryResults(null, "OrderedSet{'d'}", "OrderedSet{'a', 'b', 'c', 'd'}->subOrderedSet(4, 4)");
// invalid collection
assertQueryInvalid(null, "let o : OrderedSet(String) = invalid in o->subOrderedSet(1, 1)");
// null collection
assertQueryInvalid(null, "let o : OrderedSet(String) = null in o->subOrderedSet(1, 1)");
// out of bounds
assertQueryInvalid(null, "OrderedSet{'a', 'b', 'c', 'd'}->subOrderedSet(0, 1)");
assertQueryInvalid(null, "OrderedSet{'a', 'b', 'c', 'd'}->subOrderedSet(4, 5)");
// illegal arguments
assertQueryInvalid(null, "OrderedSet{'a', 'b', 'c', 'd'}->subOrderedSet(2, 1)");
}
@Test public void testCollectionSubSequence() {
assertQueryResults(null, "Sequence{'a'}", "Sequence{'a', 'b', 'c', 'd'}->subSequence(1, 1)");
assertQueryResults(null, "Sequence{'b', 'c'}", "Sequence{'a', 'b', 'c', 'd'}->subSequence(2, 3)");
assertQueryResults(null, "Sequence{'d'}", "Sequence{'a', 'b', 'c', 'd'}->subSequence(4, 4)");
// invalid collection
assertQueryInvalid(null, "let o : Sequence(String) = invalid in o->subSequence(1, 1)");
// null collection
assertQueryInvalid(null, "let o : Sequence(String) = null in o->subSequence(1, 1)");
// out of bounds
assertQueryInvalid(null, "Sequence{'a', 'b', 'c', 'd'}->subSequence(0, 1)");
assertQueryInvalid(null, "Sequence{'a', 'b', 'c', 'd'}->subSequence(4, 5)");
// illegal arguments
assertQueryInvalid(null, "Sequence{'a', 'b', 'c', 'd'}->subSequence(2, 1)");
}
@Test public void testCollectionSum() {
assertQueryEquals(null, 0, "let s : Sequence(Integer) = Sequence{} in s->sum()");
assertQueryEquals(null, 0.0, "let b : Bag(Real) = Bag{} in b->sum()");
assertQueryEquals(null, 0.0, "let s : Set(Real) = Set{} in s->sum()");
assertQueryEquals(null, 0, "let o : OrderedSet(Integer) = OrderedSet{} in o->sum()");
assertQueryEquals(null, 13.0, "Sequence{4.0, 4.0, 5.0}->sum()");
assertQueryEquals(null, 13, "Bag{4, 4, 5}->sum()");
assertQueryEquals(null, 9.0, "Set{4, 4.0, 5.0}->sum()");
assertQueryEquals(null, 9.0, "OrderedSet{4.0, 4.0, 5.0}->sum()");
assertQueryEquals(null, metaModelManager.getRealType(), "Bag{4.0, 4, 5}->sum().oclType()");
assertQueryEquals(null, metaModelManager.getIntegerType(), "Bag{4, -4, -5}->sum().oclType()");
assertQueryEquals(null, metaModelManager.getUnlimitedNaturalType(), "Bag{4, 4, 5}->sum().oclType()");
assertQueryEquals(null, 4, "4->sum()");
// invalid collection
assertQueryInvalid(null, "let s : Sequence(Integer) = invalid in s->sum()");
assertQueryInvalid(null, "let b : Bag(Integer) = invalid in b->sum()");
assertQueryInvalid(null, "let s : Set(Integer) = invalid in s->sum()");
assertQueryInvalid(null, "let o : OrderedSet(Integer) = invalid in o->sum()");
// invalid collection element
assertQueryInvalid(null, "Sequence{4.0, invalid, 5.0}->sum()");
assertQueryInvalid(null, "Bag{4, invalid, 5}->sum()");
assertQueryInvalid(null, "Set{4, invalid, 5}->sum()");
assertQueryInvalid(null, "OrderedSet{4.0, invalid, 5.0}->sum()");
// null collection
assertQueryInvalid(null, "let s : Sequence(Integer) = null in s->sum()");
assertQueryInvalid(null, "let b : Bag(Integer) = null in b->sum()");
assertQueryInvalid(null, "let s : Set(Integer) = null in s->sum()");
assertQueryInvalid(null, "let o : OrderedSet(Integer) = null in o->sum()");
// null collection element
assertQueryInvalid(null, "Sequence{4.0, null, 5.0}->sum()");
assertQueryInvalid(null, "Bag{4, null, 5}->sum()");
assertQueryInvalid(null, "Set{4, null, 5}->sum()");
assertQueryInvalid(null, "OrderedSet{4.0, null, 5.0}->sum()");
// FIXME Bug 301351 Subtest-not-implemented user-defined +
}
@Test public void testCollectionSymmetricDifference() {
assertQueryResults(null, "Set{'a', 'c'}", "Set{'a', 'b'}->symmetricDifference(Set{'b', 'c'})");
// invalid collection
assertQueryInvalid(null, "let s : Set(String) = invalid in s->symmetricDifference(Set{'a'})");
// invalid collection element
assertQueryInvalid(null, "Set{'a', invalid, 'b'}->symmetricDifference(Set{'b', 'c'})");
// null collection
assertQueryInvalid(null, "let s : Set(String) = null in s->symmetricDifference(Set{'a'})");
// null collection element
assertQueryResults(null, "Set{'a', null, 'c'}", "Set{'a', null, 'b'}->symmetricDifference(Set{'b', 'c'})");
}
@Test public void testCollectionUnionDuplicates() {
assertQueryResults(null, "Set{'a', 'b', 'c'}", "Set{'a', 'b', 'a'}->union(Set{'b', 'c'})");
assertQueryResults(null, "Bag{'a', 'b', 'b', 'c'}", "Set{'a', 'b', 'a'}->union(Bag{'b', 'c'})");
assertQueryResults(null, "Bag{'a', 'b', 'a', 'b', 'c'}", "Bag{'a', 'b', 'a'}->union(Bag{'b', 'c'})");
assertQueryResults(null, "Bag{'a', 'b', 'a', 'b', 'c'}", "Bag{'a', 'b', 'a'}->union(Set{'b', 'c'})");
// assertQueryResults(null, "Sequence{'a', 'b', 'a', 'b', 'c'}", "Sequence{'a', 'b', 'a'}->union(Sequence{'b', 'c'})");
assertQueryResults(null, "Bag{'a', 'b', 'a', 'b', 'c'}", "Sequence{'a', 'b', 'a'}->union(Sequence{'b', 'c'})");
}
@Test public void testCollectionUnionEmptyCollection() {
assertQueryResults(null, "Set{3, 4}", "Set{3, 4}->union(Set{})");
assertQueryResults(null, "Bag{3, 4}", "Set{3, 4}->union(Bag{})");
assertQueryResults(null, "Bag{3, 4}", "Bag{3, 4}->union(Bag{})");
assertQueryResults(null, "Bag{3, 4}", "Bag{3, 4}->union(Set{})");
assertQueryResults(null, "Bag{3, 4}", "Sequence{3, 4}->union(Sequence{})");
assertQueryResults(null, "Set{3, 4}", "Set{}->union(Set{3, 4})");
assertQueryResults(null, "Bag{3, 4}", "Set{}->union(Bag{3, 4})");
assertQueryResults(null, "Bag{3, 4}", "Bag{}->union(Bag{3, 4})");
assertQueryResults(null, "Bag{3, 4}", "Bag{}->union(Set{3, 4})");
assertQueryResults(null, "Bag{3, 4}", "Sequence{}->union(Sequence{3, 4})");
}
@Test public void testCollectionUnionInvalid() {
assertQueryInvalid(null, "let s : Set(String) = invalid in s->union(Set{'a'})");
assertQueryInvalid(null, "let s : Set(String) = invalid in s->union(Bag{'a'})");
assertQueryInvalid(null, "let b : Bag(String) = invalid in b->union(Bag{'a'})");
assertQueryInvalid(null, "let b : Bag(String) = invalid in b->union(Set{'a'})");
assertQueryInvalid(null, "let s : Sequence(String) = invalid in s->union(Sequence{'a'})");
assertQueryInvalid(null, "let s : Set(String) = invalid in Set{'a'}->union(s)");
assertQueryInvalid(null, "let s : Set(String) = invalid in Bag{'a'}->union(s)");
assertQueryInvalid(null, "let b : Bag(String) = invalid in Bag{'a'}->union(b)");
assertQueryInvalid(null, "let b : Bag(String) = invalid in Set{'a'}->union(b)");
assertQueryInvalid(null, "let s : Sequence(String) = invalid in Sequence{'a'}->union(s)");
}
@Test public void testCollectionUnionInvalidValue() {
assertQueryInvalid(null, "Set{'a', invalid}->union(Set{'b', invalid})");
assertQueryInvalid(null, "Set{'a', invalid}->union(Bag{'b', invalid})");
assertQueryInvalid(null, "Bag{'a', invalid}->union(Bag{'b', invalid})");
assertQueryInvalid(null, "Bag{'a', invalid}->union(Set{'b', invalid})");
assertQueryInvalid(null, "Sequence{'a', invalid}->union(Sequence{'b', invalid})");
}
@Test public void testCollectionUnionNoDuplicates() {
/*
* FIXME OMG-issue generalise to Collection::union
* 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.
*/
assertQueryResults(null, "Set{'a', 'b', 'c', 'd'}", "Set{'a', 'b'}->union(Set{'c', 'd'})");
assertQueryResults(null, "Bag{'a', 'b', 'c', 'd'}", "Set{'a', 'b'}->union(Bag{'c', 'd'})");
assertQueryResults(null, "Bag{'a', 'b', 'c', 'd'}", "Bag{'a', 'b'}->union(Bag{'c', 'd'})");
assertQueryResults(null, "Bag{'a', 'b', 'c', 'd'}", "Bag{'a', 'b'}->union(Set{'c', 'd'})");
// assertQueryResults(null, "Sequence{'a', 'b', 'c', 'd'}", "Sequence{'a', 'b'}->union(Sequence{'c', 'd'})");
assertQueryResults(null, "Bag{'a', 'b', 'c', 'd'}", "Sequence{'a', 'b'}->union(Sequence{'c', 'd'})");
}
@Test public void testCollectionUnionNull() {
assertQueryInvalid(null, "let s : Set(String) = null in s->union(Set{'a'})");
assertQueryInvalid(null, "let s : Set(String) = null in s->union(Bag{'a'})");
assertQueryInvalid(null, "let b : Bag(String) = null in b->union(Bag{'a'})");
assertQueryInvalid(null, "let b : Bag(String) = null in b->union(Set{'a'})");
assertQueryInvalid(null, "let s : Sequence(String) = null in s->union(Sequence{'a'})");
assertQueryInvalid(null, "let s : Set(String) = null in Set{'a'}->union(s)");
assertQueryInvalid(null, "let s : Set(String) = null in Bag{'a'}->union(s)");
assertQueryInvalid(null, "let b : Bag(String) = null in Bag{'a'}->union(b)");
assertQueryInvalid(null, "let b : Bag(String) = null in Set{'a'}->union(b)");
assertQueryInvalid(null, "let s : Sequence(String) = null in Sequence{'a'}->union(s)");
}
@Test public void testCollectionUnionNullValue() {
assertQueryResults(null, "Set{'a', null, 'b'}", "Set{'a', null}->union(Set{'b', null})");
assertQueryResults(null, "Bag{'a', null, 'b', null}", "Set{'a', null}->union(Bag{'b', null})");
assertQueryResults(null, "Bag{'a', null, 'b', null}", "Bag{'a', null}->union(Bag{'b', null})");
assertQueryResults(null, "Bag{'a', null, 'b', null}", "Bag{'a', null}->union(Set{'b', null})");
// assertQueryResults(null, "Sequence{'a', null, 'b', null}", "Sequence{'a', null}->union(Sequence{'b', null})");
assertQueryResults(null, "Bag{'a', null, 'b', null}", "Sequence{'a', null}->union(Sequence{'b', null})");
}
@Test public void testCollectionUpper() {
assertQueryEquals(null, 3, "Sequence{1, 2.0, '3'}->oclType().upper");
assertQueryEquals(null, 3, "Sequence{1, 2.0, 3}->oclAsType(Collection(Real))->oclType().upper");
assertQueryEquals(null, 3, "Set{1, 2.0, 3}->oclAsType(Collection(Real)[2..4])->oclType().upper"); // no change to dynamic bound
}
}