blob: 96fa628ee8f6679ba60bac25011af5350c6c0adb [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2006, 2011, 2011 IBM Corporation, Zeligsoft Inc., Open Canarias S.L. 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:
* IBM - Initial API and implementation
* Zeligsoft - Bug 244946
* Adolfo Sanchez-Barbudo Herrera - Bug 260403
* Axel Uhl (SAP AG) - Bug 342644
*******************************************************************************/
package org.eclipse.ocl.ecore.tests;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
import java.util.Set;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EClassifier;
import org.eclipse.emf.ecore.EOperation;
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.emf.ecore.EParameter;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.emf.ecore.ETypedElement;
import org.eclipse.emf.ecore.EcoreFactory;
import org.eclipse.emf.ecore.EcorePackage;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.ocl.TypeResolver;
import org.eclipse.ocl.ecore.TupleType;
import org.eclipse.ocl.expressions.CollectionKind;
import org.eclipse.ocl.expressions.ExpressionsFactory;
import org.eclipse.ocl.expressions.ExpressionsPackage;
import org.eclipse.ocl.expressions.OCLExpression;
import org.eclipse.ocl.expressions.Variable;
import org.eclipse.ocl.options.ParsingOptions;
import org.eclipse.ocl.types.CollectionType;
import org.eclipse.ocl.types.OCLStandardLibrary;
import org.eclipse.ocl.util.Tuple;
import org.eclipse.ocl.util.TypeUtil;
/**
* Tests for collection types.
*
* @author Christian W. Damus (cdamus)
*/
@SuppressWarnings("nls")
public class CollectionsTest
extends AbstractTestSuite {
/**
* Tests the insertAt() operation for sequences.
*/
public void test_insertAt_sequence_126722() {
helper.setContext(EcorePackage.Literals.ESTRING);
try {
OCLExpression<EClassifier> expr = helper
.createQuery("Sequence{'a', 'b', 'd', 'e'}->insertAt(3, 'c')");
List<?> result = (List<?>) ocl.evaluate("", expr);
List<?> expected = Arrays.asList(new Object[]{
"a", "b", "c", "d", "e"});
assertEquals(expected, result);
} catch (Exception e) {
fail("Failed to parse or evaluate: " + e.getLocalizedMessage());
}
}
/**
* Tests the insertAt() operation for ordered sets.
*/
public void test_insertAt_orderedSet_126722() {
helper.setContext(EcorePackage.Literals.ESTRING);
try {
OCLExpression<EClassifier> expr = helper
.createQuery("OrderedSet{'a', 'b', 'd', 'e'}->insertAt(3, 'c')");
Set<?> result = (Set<?>) ocl.evaluate("", expr);
List<?> expected = Arrays.asList(new Object[]{
"a", "b", "c", "d", "e"});
assertEquals(expected, new java.util.ArrayList<Object>(result));
// no duplicates; result is exactly equivalent (order preserved)
expr = helper
.createQuery("OrderedSet{'a', 'b', 'c', 'd', 'e'}->insertAt(5, 'c')");
result = (Set<?>) ocl.evaluate("", expr);
expected = Arrays.asList(new Object[]{"a", "b", "c", "d", "e"});
assertEquals(expected, new java.util.ArrayList<Object>(result));
} catch (Exception e) {
fail("Failed to parse or evaluate: " + e.getLocalizedMessage());
}
}
/**
* Tests the prepend() operation for sequences.
*/
public void test_prepend_sequence_126722() {
helper.setContext(EcorePackage.Literals.ESTRING);
try {
OCLExpression<EClassifier> expr = helper
.createQuery("Sequence{'a', 'b', 'd', 'e'}->prepend('c')");
List<?> result = (List<?>) ocl.evaluate("", expr);
List<?> expected = Arrays.asList(new Object[]{
"c", "a", "b", "d", "e"});
assertEquals(expected, result);
} catch (Exception e) {
fail("Failed to parse or evaluate: " + e.getLocalizedMessage());
}
}
/**
* Tests the prepend() operation for ordered sets.
*/
public void test_prepend_orderedSet_126722() {
helper.setContext(EcorePackage.Literals.ESTRING);
try {
OCLExpression<EClassifier> expr = helper
.createQuery("OrderedSet{'a', 'b', 'd', 'e'}->prepend('c')");
Set<?> result = (Set<?>) ocl.evaluate("", expr);
List<?> expected = Arrays.asList(new Object[]{
"c", "a", "b", "d", "e"});
assertEquals(expected, new java.util.ArrayList<Object>(result));
// no duplicates; result has prepended element first
expr = helper
.createQuery("OrderedSet{'a', 'b', 'c', 'd', 'e'}->prepend('c')");
result = (Set<?>) ocl.evaluate("", expr);
expected = Arrays.asList(new Object[]{"c", "a", "b", "d", "e"});
assertEquals(expected, new java.util.ArrayList<Object>(result));
} catch (Exception e) {
fail("Failed to parse or evaluate: " + e.getLocalizedMessage());
}
}
/**
* Tests the append() operation for sequences.
*/
public void test_append_sequence_126722() {
helper.setContext(EcorePackage.Literals.ESTRING);
try {
OCLExpression<EClassifier> expr = helper
.createQuery("Sequence{'a', 'b', 'd', 'e'}->append('c')");
List<?> result = (List<?>) ocl.evaluate("", expr);
List<?> expected = Arrays.asList(new Object[]{
"a", "b", "d", "e", "c"});
assertEquals(expected, result);
} catch (Exception e) {
fail("Failed to parse or evaluate: " + e.getLocalizedMessage());
}
}
/**
* Tests the append() operation for ordered sets.
*/
public void test_append_orderedSet_126722() {
helper.setContext(EcorePackage.Literals.ESTRING);
try {
OCLExpression<EClassifier> expr = helper
.createQuery("OrderedSet{'a', 'b', 'd', 'e'}->append('c')");
Set<?> result = (Set<?>) ocl.evaluate("", expr);
List<?> expected = Arrays.asList(new Object[]{
"a", "b", "d", "e", "c"});
assertEquals(expected, new java.util.ArrayList<Object>(result));
// no duplicates; appended element is at end
expr = helper
.createQuery("OrderedSet{'a', 'b', 'c', 'd', 'e'}->append('c')");
result = (Set<?>) ocl.evaluate("", expr);
expected = Arrays.asList(new Object[]{"a", "b", "d", "e", "c"});
assertEquals(expected, new java.util.ArrayList<Object>(result));
} catch (Exception e) {
fail("Failed to parse or evaluate: " + e.getLocalizedMessage());
}
}
/**
* Tests the including() operation for sequences.
*/
public void test_including_sequence_126722() {
helper.setContext(EcorePackage.Literals.ESTRING);
try {
OCLExpression<EClassifier> expr = helper
.createQuery("Sequence{'a', 'b', 'd', 'e'}->including('c')");
List<?> result = (List<?>) ocl.evaluate("", expr);
List<?> expected = Arrays.asList(new Object[]{
"a", "b", "d", "e", "c"});
assertEquals(expected, result);
} catch (Exception e) {
fail("Failed to parse or evaluate: " + e.getLocalizedMessage());
}
}
/**
* Tests the including() operation for ordered sets.
*/
public void test_including_orderedSet_126722() {
helper.setContext(EcorePackage.Literals.ESTRING);
try {
OCLExpression<EClassifier> expr = helper
.createQuery("OrderedSet{'a', 'b', 'd', 'e'}->including('c')");
Set<?> result = (Set<?>) ocl.evaluate("", expr);
Set<?> expected = new java.util.HashSet<Object>(Arrays
.asList(new Object[]{"a", "b", "d", "e", "c"}));
assertEquals(expected, result);
// no duplicates
expr = helper
.createQuery("OrderedSet{'a', 'b', 'c', 'd', 'e'}->including('c')");
result = (Set<?>) ocl.evaluate("", expr);
expected = new java.util.HashSet<Object>(Arrays
.asList(new Object[]{"a", "b", "c", "d", "e"}));
assertEquals(expected, result);
} catch (Exception e) {
fail("Failed to parse or evaluate: " + e.getLocalizedMessage());
}
}
/**
* Tests the excluding() operation for sequences.
*/
public void test_excluding_sequence_126722() {
helper.setContext(EcorePackage.Literals.ESTRING);
try {
OCLExpression<EClassifier> expr = helper
.createQuery("Sequence{'a', 'b', 'c', 'd', 'e'}->excluding('c')");
List<?> result = (List<?>) ocl.evaluate("", expr);
List<?> expected = Arrays.asList(new Object[]{"a", "b", "d", "e"});
assertEquals(expected, result);
} catch (Exception e) {
fail("Failed to parse or evaluate: " + e.getLocalizedMessage());
}
}
/**
* Tests the excluding() operation for ordered sets.
*/
public void test_excluding_orderedSet_126722() {
helper.setContext(EcorePackage.Literals.ESTRING);
try {
OCLExpression<EClassifier> expr = helper
.createQuery("OrderedSet{'a', 'b', 'c', 'd', 'e'}->excluding('c')");
Set<?> result = (Set<?>) ocl.evaluate("", expr);
Set<?> expected = new java.util.HashSet<Object>(Arrays
.asList(new Object[]{"a", "b", "d", "e"}));
assertEquals(expected, result);
// just for fun, try excluding an already excluded element
expr = helper
.createQuery("OrderedSet{'a', 'b', 'd', 'e'}->excluding('c')");
result = (Set<?>) ocl.evaluate("", expr);
expected = new java.util.HashSet<Object>(Arrays
.asList(new Object[]{"a", "b", "d", "e"}));
assertEquals(expected, result);
} catch (Exception e) {
fail("Failed to parse or evaluate: " + e.getLocalizedMessage());
}
}
public void test_first() {
helper.setContext(EcorePackage.Literals.ESTRING);
try {
assertTrue(check(helper, "",
"Sequence{'a', 'b', 'c', 'd', 'e'}->first() = 'a'"));
assertTrue(check(helper, "",
"OrderedSet{'a', 'b', 'c', 'd', 'e'}->first() = 'a'"));
} catch (Exception e) {
fail("Failed to parse or evaluate: " + e.getLocalizedMessage());
}
}
public void test_last() {
helper.setContext(EcorePackage.Literals.ESTRING);
try {
assertTrue(check(helper, "",
"Sequence{'a', 'b', 'c', 'd', 'e'}->last() = 'e'"));
assertTrue(check(helper, "",
"OrderedSet{'a', 'b', 'c', 'd', 'e'}->last() = 'e'"));
} catch (Exception e) {
fail("Failed to parse or evaluate: " + e.getLocalizedMessage());
}
}
public void test_at() {
helper.setContext(EcorePackage.Literals.ESTRING);
try {
assertTrue(check(helper, "",
"Sequence{'a', 'b', 'c', 'd', 'e'}->at(3) = 'c'"));
assertTrue(check(helper, "",
"OrderedSet{'a', 'b', 'c', 'd', 'e'}->at(3)= 'c'"));
} catch (Exception e) {
fail("Failed to parse or evaluate: " + e.getLocalizedMessage());
}
}
public void test_indexOf() {
helper.setContext(EcorePackage.Literals.ESTRING);
try {
assertTrue(check(helper, "",
"Sequence{'a', 'b', 'c', 'd', 'e'}->indexOf('c') = 3"));
assertTrue(check(helper, "",
"OrderedSet{'a', 'b', 'c', 'd', 'e'}->indexOf('c')= 3"));
} catch (Exception e) {
fail("Failed to parse or evaluate: " + e.getLocalizedMessage());
}
}
public void test_subsequence_suborderedset() {
helper.setContext(EcorePackage.Literals.ESTRING);
try {
assertTrue(check(helper, "",
"Sequence{'a', 'b', 'c', 'd', 'e'}->subSequence(2, 4)" +
" = Sequence{'b', 'c', 'd'}"));
assertTrue(check(helper, "",
"OrderedSet{'a', 'b', 'c', 'd', 'e'}->subOrderedSet(2, 4)" +
" = OrderedSet{'b', 'c', 'd'}"));
} catch (Exception e) {
fail("Failed to parse or evaluate: " + e.getLocalizedMessage());
}
}
/**
* Test the flatten() operation on a single level of collection nesting.
*/
public void test_flatten() {
helper.setContext(EcorePackage.Literals.ESTRING);
try {
assertTrue(check(helper, "",
"Set{Sequence{'a', 'b'}, Sequence{'b', 'c', 'd'}}->flatten()" +
" = Set{'b', 'c', 'a', 'd'}"));
assertTrue(check(helper,
"",
"OrderedSet{Sequence{'a', 'b'}, Sequence{'b', 'c', 'd'}}->flatten()" +
" = OrderedSet{'a', 'b', 'c', 'd'}"));
assertTrue(check(helper,
"",
"Sequence{OrderedSet{'a', 'b', 'd'}, OrderedSet{'b', 'c', 'd'}}->flatten()" +
" = Sequence{'a', 'b', 'd', 'b', 'c', 'd'}"));
assertTrue(check(helper, "",
"Bag{Bag{'b', 'a', 'b'}, Bag{'b', 'a', 'c', 'd'}}->flatten()" +
" = Bag{'a', 'a', 'b', 'b', 'b', 'c', 'd'}"));
} catch (Exception e) {
fail("Failed to parse or evaluate: " + e.getLocalizedMessage());
}
}
/**
* Test the flatten() operation on collections not containing collections.
*/
public void test_flatten_notNested() {
helper.setContext(EcorePackage.Literals.ESTRING);
try {
assertTrue(check(helper, "",
"Set{'a', 'b', 'c', 'd'}->flatten()" +
" = Set{'b', 'c', 'a', 'd'}"));
// Collections of different kind are not equal. Our
// implementation chooses to flatten an OrderedSet into an OrderedSet
// as Section A.2.5.8 of OCL 2.3 (OMG 10-11-42) leaves it
// unclear.
assertFalse(check(helper, "",
"OrderedSet{'a', 'b', 'b', 'c', 'd'}->flatten()" +
" = Set{'b', 'c', 'a', 'd'}"));
assertTrue(check(helper, "",
"OrderedSet{'a', 'b', 'b', 'c', 'd'}->flatten()" +
" = OrderedSet{'a', 'b', 'c', 'd'}"));
assertTrue(check(helper, "",
"Sequence{'a', 'b', 'd', 'b', 'c', 'd'}->flatten()" +
" = Sequence{'a', 'b', 'd', 'b', 'c', 'd'}"));
assertTrue(check(helper, "",
"Bag{'b', 'a', 'b', 'b', 'a', 'c', 'd'}->flatten()" +
" = Bag{'a', 'a', 'b', 'b', 'b', 'c', 'd'}"));
} catch (Exception e) {
fail("Failed to parse or evaluate: " + e.getLocalizedMessage());
}
}
/**
* Tests the flatten() operation on an empty source collection.
*/
public void test_flatten_emptySource_195252() {
helper.setContext(EcorePackage.Literals.ESTRING);
try {
assertTrue(check(helper, "",
"Set{}->flatten()" +
" = Set{}"));
// Collections of different kind are not equal. The behavior
// of the flatten() operation on OrderedSet is unspecified
// in OCL 2.3 (OMG 10-11-42) section A.2.5.8, and we choose
// to flatten an OrderedSet into an OrderedSet.
assertFalse(check(helper, "",
"OrderedSet{}->flatten()" +
" = Set{}"));
assertTrue(check(helper, "",
"OrderedSet{}->flatten()" +
" = OrderedSet{}"));
assertTrue(check(helper, "",
"Sequence{}->flatten()" +
" = Sequence{}"));
assertTrue(check(helper, "",
"Bag{}->flatten()" +
" = Bag{}"));
} catch (Exception e) {
fail("Failed to parse or evaluate: " + e.getLocalizedMessage());
}
}
/**
* Tests the flatten() operation on a source collection that contains empty
* collections.
*/
public void test_flatten_emptyChildren() {
helper.setContext(EcorePackage.Literals.ESTRING);
try {
assertTrue(check(helper, "",
"Set{Set{}, Set{}}->flatten()" +
" = Set{}"));
assertTrue(check(helper, "",
"OrderedSet{OrderedSet{}, OrderedSet{}}->flatten()" +
" = OrderedSet{}"));
assertTrue(check(helper, "",
"Sequence{Sequence{}, Sequence{}}->flatten()" +
" = Sequence{}"));
assertTrue(check(helper, "",
"Bag{Bag{}, Bag{}}->flatten()" +
" = Bag{}"));
} catch (Exception e) {
fail("Failed to parse or evaluate: " + e.getLocalizedMessage());
}
}
/**
* Test that the flatten() operation is recursive.
*/
public void test_flatten_recursive_217461() {
helper.setContext(EcorePackage.Literals.ESTRING);
try {
assertTrue(check(helper,
"",
"Set{Sequence{Set{'a'}, Set{'b'}}, Sequence{Set{'b', 'c'}, Set{'d'}}}->flatten()" +
" = Set{'b', 'c', 'a', 'd'}"));
assertTrue(check(helper,
"",
"OrderedSet{Sequence{Set{'a'}, Set{'b'}}, Sequence{Set{'b', 'c'}, Set{'d'}}}->flatten()" +
" = OrderedSet{'a', 'b', 'c', 'd'}"));
assertTrue(check(helper,
"",
"Sequence{OrderedSet{Sequence{'a', 'b'}, Sequence{'d'}}, OrderedSet{Sequence{'b', 'c'}, Sequence{'d'}}}->flatten()" +
" = Sequence{'a', 'b', 'd', 'b', 'c', 'd'}"));
assertTrue(check(helper,
"",
"Bag{Bag{Set{'b', 'a'}, Set{'b'}}, Bag{Set{'b', 'a'}, Set{'c', 'd'}}}->flatten()" +
" = Bag{'a', 'a', 'b', 'b', 'b', 'c', 'd'}"));
} catch (Exception e) {
fail("Failed to parse or evaluate: " + e.getLocalizedMessage());
}
}
/**
* Tests the flatten() operation on a source collection that contains empty
* collections at a greater level of nesting than the first.
*/
public void test_flatten_emptyChildrenRecursive_217461() {
helper.setContext(EcorePackage.Literals.ESTRING);
try {
assertTrue(check(helper, "",
"Set{Set{Sequence{}}, Set{Sequence{}, Sequence{}}}->flatten()" +
" = Set{}"));
assertTrue(check(helper,
"",
"OrderedSet{OrderedSet{Sequence{}, Sequence{}}, OrderedSet{Sequence{}, Sequence{}}}->flatten()" +
" = OrderedSet{}"));
assertTrue(check(helper,
"",
"Sequence{Sequence{Sequence{}, Sequence{}}, Sequence{Sequence{}, Sequence{}}}->flatten()" +
" = Sequence{}"));
assertTrue(check(helper,
"",
"Bag{Bag{Sequence{}, Sequence{}}, Bag{Sequence{}, Sequence{}}}->flatten()" +
" = Bag{}"));
} catch (Exception e) {
fail("Failed to parse or evaluate: " + e.getLocalizedMessage());
}
}
public void test_count() {
helper.setContext(EcorePackage.Literals.EINT);
try {
assertTrue(check(helper, "",
"Sequence{1, 2, 3, 3, 4, 5}->count(3) = 2"));
assertTrue(check(helper, "",
"Sequence{1, 2, 3, 3, 4, 5}->count(6) = 0"));
assertTrue(check(helper, "",
"OrderedSet{1, 2, 3, 3, 4, 5}->count(3) = 1"));
assertTrue(check(helper, "",
"OrderedSet{1, 2, 3, 3, 4, 5}->count(6) = 0"));
assertTrue(check(helper, "",
"Set{1, 2, 3, 3, 4, 5}->count(3) = 1"));
assertTrue(check(helper, "",
"Set{1, 2, 3, 3, 4, 5}->count(6) = 0"));
assertTrue(check(helper, "",
"Bag{1, 2, 3, 3, 4, 5}->count(3) = 2"));
assertTrue(check(helper, "",
"Bag{1, 2, 3, 3, 4, 5}->count(6) = 0"));
} catch (Exception e) {
fail("Failed to parse or evaluate: " + e.getLocalizedMessage());
}
}
public void test_sum() {
helper.setContext(EcorePackage.Literals.EINT);
try {
assertTrue(check(helper, "",
"Sequence{1, 2, 3, 3, 4, 5}->sum() = 18"));
assertTrue(check(helper, "",
"OrderedSet{1, 2, 3, 3, 4, 5}->sum() = 15"));
assertTrue(check(helper, "",
"Set{1, 2, 3, 3, 4, 5}->sum() = 15"));
assertTrue(check(helper, "",
"Bag{1, 2, 3, 3, 4, 5}->sum() = 18"));
} catch (Exception e) {
fail("Failed to parse or evaluate: " + e.getLocalizedMessage());
}
}
/**
* Tests that the sum() iterator returns integer zero for an empty
* collection of integers.
*/
public void test_sum_emptyIntegerCollection_204753() {
helper.setContext(EcorePackage.Literals.EINT);
Integer zero = new Integer(0);
try {
assertEquals(zero, evaluate(helper, "",
"let s : Sequence(Integer) = Sequence{} in s->sum()"));
assertEquals(zero, evaluate(helper, "",
"let s : OrderedSet(Integer) = OrderedSet{} in s->sum()"));
assertEquals(zero, evaluate(helper, "",
"let s : Set(Integer) = Set{} in s->sum()"));
assertEquals(zero, evaluate(helper, "",
"let s : Bag(Integer) = Bag{} in s->sum()"));
} catch (Exception e) {
fail("Failed to parse or evaluate: " + e.getLocalizedMessage());
}
}
/**
* Tests that the sum() iterator returns integer zero for an empty
* collection of reals.
*/
public void test_sum_emptyRealCollection_204753() {
helper.setContext(EcorePackage.Literals.EINT);
Double zero = new Double(0.0);
try {
assertEquals(zero, evaluate(helper, "",
"let s : Sequence(Real) = Sequence{} in s->sum()"));
assertEquals(zero, evaluate(helper, "",
"let s : OrderedSet(Real) = OrderedSet{} in s->sum()"));
assertEquals(zero, evaluate(helper, "",
"let s : Set(Real) = Set{} in s->sum()"));
assertEquals(zero, evaluate(helper, "",
"let s : Bag(Real) = Bag{} in s->sum()"));
} catch (Exception e) {
fail("Failed to parse or evaluate: " + e.getLocalizedMessage());
}
}
public void test_includes() {
helper.setContext(EcorePackage.Literals.EINT);
try {
assertTrue(check(helper, "",
"Sequence{1, 2, 3, 3, 4, 5}->includes(3)"));
assertFalse(check(helper, "",
"Sequence{1, 2, 3, 3, 4, 5}->includes(6)"));
assertTrue(check(helper, "",
"Set{1, 2, 3, 3, 4, 5}->includes(3)"));
assertFalse(check(helper, "",
"Set{1, 2, 3, 3, 4, 5}->includes(6)"));
assertTrue(check(helper, "",
"OrderedSet{1, 2, 3, 3, 4, 5}->includes(3)"));
assertFalse(check(helper, "",
"OrderedSet{1, 2, 3, 3, 4, 5}->includes(6)"));
assertTrue(check(helper, "",
"Bag{1, 2, 3, 3, 4, 5}->includes(3)"));
assertFalse(check(helper, "",
"Bag{1, 2, 3, 3, 4, 5}->includes(6)"));
} catch (Exception e) {
fail("Failed to parse or evaluate: " + e.getLocalizedMessage());
}
}
public void test_includesAll() {
helper.setContext(EcorePackage.Literals.EINT);
try {
assertTrue(check(helper, "",
"Sequence{1, 2, 3, 3, 4, 5}->includesAll(Sequence{1, 3})"));
assertFalse(check(helper, "",
"Sequence{1, 2, 3, 3, 4, 5}->includesAll(Sequence{1, 6})"));
assertTrue(check(helper, "",
"Set{1, 2, 3, 3, 4, 5}->includesAll(Set{1, 3})"));
assertFalse(check(helper, "",
"Set{1, 2, 3, 3, 4, 5}->includesAll(Set{1, 6})"));
assertTrue(check(helper, "",
"OrderedSet{1, 2, 3, 3, 4, 5}->includesAll(OrderedSet{1, 3})"));
assertFalse(check(helper, "",
"OrderedSet{1, 2, 3, 3, 4, 5}->includesAll(OrderedSet{1, 6})"));
assertTrue(check(helper, "",
"Bag{1, 2, 3, 3, 4, 5}->includesAll(Bag{1, 3})"));
assertFalse(check(helper, "",
"Bag{1, 2, 3, 3, 4, 5}->includesAll(Bag{1, 6})"));
} catch (Exception e) {
fail("Failed to parse or evaluate: " + e.getLocalizedMessage());
}
}
public void test_union() {
helper.setContext(EcorePackage.Literals.EINT);
try {
assertTrue(check(helper, "",
"Set{1, 2, 3}->union(Set{3, 4, 5})" +
" = Set{1, 2, 3, 4, 5}"));
assertTrue(check(helper, "",
"OrderedSet{1, 2, 3}->union(Set{3, 4, 5})" +
" = Set{1, 2, 3, 4, 5}"));
assertTrue(check(helper, "",
"Bag{1, 2, 2, 3}->union(Set{3, 4, 5})" +
" = Bag{1, 2, 2, 3, 3, 4, 5}"));
assertTrue(check(helper, "",
"Bag{1, 2, 3}->union(Bag{3, 3, 4, 5})" +
" = Bag{1, 2, 3, 3, 3, 4, 5}"));
} catch (Exception e) {
fail("Failed to parse or evaluate: " + e.getLocalizedMessage());
}
}
public void test_intersection() {
helper.setContext(EcorePackage.Literals.EINT);
try {
assertTrue(check(helper, "",
"Set{1, 2, 3}->intersection(Set{3, 4, 5})" +
" = Set{3}"));
assertTrue(check(helper, "",
"OrderedSet{1, 2, 3}->intersection(Set{3, 4, 5})" +
" = Set{3}"));
assertTrue(check(helper, "",
"Bag{1, 2, 2, 3, 3, 3}->intersection(Bag{3, 3, 4, 5})" +
" = Bag{3, 3}"));
assertTrue(check(helper, "",
"Bag{1, 2, 2, 3, 3, 3}->intersection(Set{3, 4, 5})" +
" = Set{3}"));
} catch (Exception e) {
fail("Failed to parse or evaluate: " + e.getLocalizedMessage());
}
}
public void test_difference() {
helper.setContext(EcorePackage.Literals.EINT);
try {
assertTrue(check(helper, "",
"Set{1, 2, 3} - Set{3, 4, 5}" +
" = Set{1, 2}"));
assertTrue(check(helper, "",
"OrderedSet{1, 2, 3} - Set{3, 4, 5}" +
" = Set{1, 2}"));
} catch (Exception e) {
fail("Failed to parse or evaluate: " + e.getLocalizedMessage());
}
}
public void test_symmetricDifference() {
helper.setContext(EcorePackage.Literals.EINT);
try {
assertTrue(check(helper, "",
"Set{1, 2, 3}->symmetricDifference(Set{3, 4, 5})" +
" = Set{1, 2, 4, 5}"));
assertTrue(check(helper, "",
"OrderedSet{1, 2, 3}->symmetricDifference(Set{3, 4, 5})" +
" = Set{1, 2, 4, 5}"));
} catch (Exception e) {
fail("Failed to parse or evaluate: " + e.getLocalizedMessage());
}
}
/**
* Tests that dot notation can be used successively to navigate multiple
* collection-type references.
*/
public void test_dotNavigationOfReferenceCollections_130239() {
helper.setContext(EcorePackage.Literals.EPACKAGE);
try {
OCLExpression<EClassifier> expr = helper
.createQuery("self.eClassifiers->union(self.eSubpackages.eClassifiers->asSet())->asSet()");
assertEquals(new java.util.HashSet<EClassifier>(
ExpressionsPackage.eINSTANCE.getEClassifiers()), ocl.evaluate(
ExpressionsPackage.eINSTANCE, expr));
} catch (Exception exc) {
fail("Failed to parse or evaluate: " + exc.getLocalizedMessage());
}
}
/**
* Tests that dot notation can be used successively to navigate multiple
* collection-type operations.
*/
public void test_dotNavigationOfOperationCollections_130239() {
EPackage fakePkg = EcoreFactory.eINSTANCE.createEPackage();
fakePkg.setName("fake");
EClass fake = EcoreFactory.eINSTANCE.createEClass();
fake.setName("Fake");
fakePkg.getEClassifiers().add(fake);
EOperation getFakes = EcoreFactory.eINSTANCE.createEOperation();
getFakes.setName("getFakes");
getFakes.setEType(fake);
getFakes.setUpperBound(ETypedElement.UNBOUNDED_MULTIPLICITY);
fake.getEOperations().add(getFakes);
helper.setContext(fake);
try {
helper
.createQuery("self.getFakes()->union(self.getFakes().getFakes()->asSet())");
} catch (Exception exc) {
fail("Failed to parse or evaluate: " + exc.getLocalizedMessage());
}
}
/**
* Tests that the syntax for collection ranges is supported.
*/
public void test_collectionRange_152208() {
helper.setContext(EcorePackage.Literals.EINT);
try {
Collection<?> result = (Collection<?>) evaluate(helper,
new Integer(1), "Sequence{1 .. 10}");
for (int i = 1; i <= 10; i++) {
assertTrue(result.contains(new Integer(i)));
}
result = (Collection<?>) evaluate(helper, new Integer(1),
"Sequence{1, (2+1)..(3+4), 10}");
assertTrue(result.contains(new Integer(1)));
for (int i = 3; i <= 7; i++) {
assertTrue(result.contains(new Integer(i)));
}
assertTrue(result.contains(new Integer(10)));
// try the first expression without spaces (needed a grammar change)
result = (Collection<?>) evaluate(helper, new Integer(1),
"Sequence{1..10}");
for (int i = 1; i <= 10; i++) {
assertTrue(result.contains(new Integer(i)));
}
// and a negation, too (the same grammar change)
result = (Collection<?>) evaluate(helper, new Integer(1),
"Sequence{-20, -10..-1, 1}");
assertTrue(result.contains(new Integer(-20)));
for (int i = -10; i <= -1; i++) {
assertTrue(result.contains(new Integer(i)));
}
assertTrue(result.contains(new Integer(1)));
} catch (Exception e) {
fail("Failed to parse or evaluate: " + e.getLocalizedMessage());
}
}
/**
* Tests that the a singleton collection range is iterable.
*/
public void test_collectionRange_330489() {
helper.setContext(EcorePackage.Literals.EINT);
try {
Collection<?> result = (Collection<?>) evaluate(helper,
new Integer(1), "Sequence{1 .. 1}");
assertEquals(1, result.size());
assertTrue(result.contains(new Integer(1)));
} catch (Exception e) {
fail("Failed to parse or evaluate: " + e.getLocalizedMessage());
}
}
/**
* Tests the support for tuples whose parts are collections that are not
* collection literals.
*/
public void test_tupleWithCollectionPart_175490() {
helper.setContext(EcorePackage.Literals.EPACKAGE);
try {
OCLExpression<EClassifier> expr = helper
.createQuery("Tuple{a = self.eClassifiers}");
assertTrue(expr.getType() instanceof TupleType);
TupleType tt = (TupleType) expr.getType();
assertEquals(1, tt.getEStructuralFeatures().size());
EStructuralFeature part = tt.getEStructuralFeature("a");
assertNotNull(part);
assertTrue(part.getEType() instanceof CollectionType<?, ?>);
@SuppressWarnings("unchecked")
CollectionType<EClassifier, EOperation> collType = (CollectionType<EClassifier, EOperation>) part
.getEType();
assertSame(EcorePackage.Literals.ECLASSIFIER, collType
.getElementType());
Object result = ocl.evaluate(EcorePackage.eINSTANCE, expr);
assertTrue(result instanceof Tuple<?, ?>);
@SuppressWarnings("unchecked")
Tuple<EOperation, EStructuralFeature> tuple = (Tuple<EOperation, EStructuralFeature>) result;
assertTrue(tuple.getValue("a") instanceof Collection<?>);
assertTrue(((Collection<?>) tuple.getValue("a")).contains(EcorePackage.Literals.ECLASSIFIER));
} catch (Exception exc) {
fail("Failed to parse or evaluate: " + exc.getLocalizedMessage());
}
}
/**
* Tests the support for tuples whose parts are collections that are
* collection literals.
*/
public void test_tupleWithCollectionLiteralPart_175490() {
helper.setContext(EcorePackage.Literals.EPACKAGE);
try {
OCLExpression<EClassifier> expr = helper
.createQuery("Tuple{a = Sequence{'a', 'b', 'c'}}");
assertTrue(expr.getType() instanceof TupleType);
TupleType tt = (TupleType) expr.getType();
assertEquals(1, tt.getEStructuralFeatures().size());
EStructuralFeature part = tt.getEStructuralFeature("a");
assertNotNull(part);
assertTrue(part.getEType() instanceof CollectionType<?, ?>);
@SuppressWarnings("unchecked")
CollectionType<EClassifier, EOperation> collType = (CollectionType<EClassifier, EOperation>) part
.getEType();
assertSame(getOCLStandardLibrary().getString(), collType
.getElementType());
Object result = ocl.evaluate(EcorePackage.eINSTANCE, expr);
assertTrue(result instanceof Tuple<?, ?>);
@SuppressWarnings("unchecked")
Tuple<EOperation, EStructuralFeature> tuple = (Tuple<EOperation, EStructuralFeature>) result;
assertTrue(tuple.getValue("a") instanceof Collection<?>);
assertTrue(((Collection<?>) tuple.getValue("a")).contains("b"));
} catch (Exception exc) {
fail("Failed to parse or evaluate: " + exc.getLocalizedMessage());
}
}
/**
* Tests that passing OclInvalid to a collection operation results in
* OclInvalid, not a ClassCastException.
*/
public void test_passOclInvalidToCollectionOperation_183144() {
helper.setContext(EcorePackage.Literals.EPACKAGE);
Variable<EClassifier, EParameter> var = ExpressionsFactory.eINSTANCE
.createVariable();
var.setName("var");
var.setType(TypeUtil.resolveSetType(ocl.getEnvironment(),
getOCLStandardLibrary().getString()));
ocl.getEnvironment().addElement(var.getName(), var, true);
try {
OCLExpression<EClassifier> expr = helper
.createQuery("Set{'a', 'b', 'c'}->union(var)");
ocl.getEvaluationEnvironment().add("var", getInvalid());
Object result = ocl.evaluate(EcorePackage.eINSTANCE, expr);
assertInvalid(result);
} catch (Exception exc) {
fail("Failed to parse or evaluate: " + exc.getLocalizedMessage());
}
}
/**
* Tests that passing null to a collection operation (for which null is not
* appropriate) results in OclInvalid, not a NullPointerException. For
* example, <code>includes(null)</code> is OK but <code>union(null)</code>
* is not.
*/
public void test_passNullToCollectionOperation_183144() {
helper.setContext(EcorePackage.Literals.EPACKAGE);
Variable<EClassifier, EParameter> var = ExpressionsFactory.eINSTANCE
.createVariable();
var.setName("var");
var.setType(TypeUtil.resolveSetType(ocl.getEnvironment(),
getOCLStandardLibrary().getString()));
ocl.getEnvironment().addElement(var.getName(), var, true);
try {
OCLExpression<EClassifier> expr = helper
.createQuery("Set{'a', 'b', 'c'}->union(var)");
ocl.getEvaluationEnvironment().add("var", null);
Object result = ocl.evaluate(EcorePackage.eINSTANCE, expr);
assertInvalid(result);
expr = helper.createQuery("Set{'a', 'b', 'c'}->includes(null)");
result = ocl.evaluate(EcorePackage.eINSTANCE, expr);
assertEquals(Boolean.FALSE, result);
} catch (Exception exc) {
fail("Failed to parse or evaluate: " + exc.getLocalizedMessage());
}
}
/**
* Tests that the OCL Standard Library defines the correct signature for the
* <code>Sequence::&lt;&gt;(Sequence(T))</code> operation.
*/
public void test_sequenceNotEqualSignature_184327() {
helper.setContext(EcorePackage.Literals.ESTRING);
try {
assertTrue(check(helper, "",
"Sequence{1, 2, 3} <> Sequence{3, 2, 1}"));
assertFalse(check(helper, "",
"Sequence{1, 2, 3} <> Sequence{1, 2, 3}"));
} catch (Exception e) {
fail("Failed to parse or evaluate: " + e.getLocalizedMessage());
}
}
/**
* Tests that in ordering of UnlimitedNatural::UNLIMITED is consider greatest element
*/
public void test_sortedByOverUnlimitedNatural() {
helper.setContext(EcorePackage.Literals.ECLASS);
try {
assertTrue(check(helper, EcorePackage.Literals.ECLASS,
"self.eAllStructuralFeatures->sortedBy(upperBound)->first().upperBound = 1"+
" and self.eAllStructuralFeatures->sortedBy(upperBound)->last().upperBound = *"));
} catch (Exception e) {
fail("Failed to parse or evaluate: " + e.getLocalizedMessage());
}
}
/**
* Tests that evaluating an EEList-typed operation call does not result in a
* scalar value.
*/
public void test_valueOfOperationTypedByEEList_202611() {
ParsingOptions.setOption(ocl.getEnvironment(), ParsingOptions
.implicitRootClass(ocl.getEnvironment()),
EcorePackage.Literals.EOBJECT);
helper.setContext(EcorePackage.Literals.EPACKAGE);
try {
OCLExpression<EClassifier> expr = helper
.createQuery("self.eContents()");
assertTrue(expr.getType() instanceof CollectionType<?, ?>);
CollectionType<?, ?> actualType = (CollectionType<?, ?>) expr
.getType();
// should be a Sequence(OclAny)
assertSame(CollectionKind.SEQUENCE_LITERAL, actualType.getKind());
// assertSame(getOCLStandardLibrary().getOclAny(),
// actualType.getElementType());
// should be the right value
Object value = ocl.evaluate(EcorePackage.eINSTANCE, expr);
assertEquals(EcorePackage.eINSTANCE.eContents(), value);
} catch (Exception e) {
fail("Failed to parse or evaluate: " + e.getLocalizedMessage());
}
}
/**
* Tests that generic collection types (those whose element type is
* <tt>T</tt>) resolve correctly to the OCL Standard Library types.
*/
public void test_resolutionOfGenericCollectionTypes_222581() {
TypeResolver<EClassifier, EOperation, EStructuralFeature> resolver = ocl
.getEnvironment().getTypeResolver();
Resource resource = resolver.getResource();
OCLStandardLibrary<EClassifier> stdlib = ocl.getEnvironment()
.getOCLStandardLibrary();
EClassifier t = stdlib.getT();
CollectionType<EClassifier, EOperation> collectionType;
collectionType = resolver.resolveCollectionType(
CollectionKind.SET_LITERAL, t);
assertNotSame(resource, collectionType.eResource());
assertSame(stdlib.getSet(), collectionType);
collectionType = resolver.resolveCollectionType(
CollectionKind.ORDERED_SET_LITERAL, t);
assertNotSame(resource, collectionType.eResource());
assertSame(stdlib.getOrderedSet(), collectionType);
collectionType = resolver.resolveCollectionType(
CollectionKind.SEQUENCE_LITERAL, t);
assertNotSame(resource, collectionType.eResource());
assertSame(stdlib.getSequence(), collectionType);
collectionType = resolver.resolveCollectionType(
CollectionKind.BAG_LITERAL, t);
assertNotSame(resource, collectionType.eResource());
assertSame(stdlib.getBag(), collectionType);
collectionType = resolver.resolveCollectionType(
CollectionKind.COLLECTION_LITERAL, t);
assertNotSame(resource, collectionType.eResource());
assertSame(stdlib.getCollection(), collectionType);
}
/**
* Tests that an invalid "at" index results in OclInvalid, not null.
*/
public void test_invalidAtIndex_orderedSet_244946() {
helper.setContext(EcorePackage.Literals.ESTRING);
try {
assertInvalid(evaluate(helper, "",
"OrderedSet{1, 2, 3}->at(0)"));
assertInvalid(evaluate(helper, "",
"OrderedSet{1, 2, 3}->at(4)"));
} catch (Exception e) {
fail("Failed to parse or evaluate: " + e.getLocalizedMessage());
}
}
/**
* Tests that an invalid "at" index results in OclInvalid, not null.
*/
public void test_invalidAtIndex_sequence_244946() {
helper.setContext(EcorePackage.Literals.ESTRING);
try {
assertInvalid(evaluate(helper, "",
"Sequence{1, 2, 3}->at(0)"));
assertInvalid(evaluate(helper, "",
"Sequence{1, 2, 3}->at(4)"));
} catch (Exception e) {
fail("Failed to parse or evaluate: " + e.getLocalizedMessage());
}
}
/**
* Tests that an invalid "insertAt" index results in OclInvalid, not null.
*/
public void test_invalidInsertAtIndex_orderedSet_244946() {
helper.setContext(EcorePackage.Literals.ESTRING);
try {
// this is OK, as it effectively appends
assertTrue(check(helper, "",
"OrderedSet{1, 2, 3}->insertAt(4, 4) = OrderedSet{1, 2, 3, 4}"));
// and this prepends
assertTrue(check(helper, "",
"OrderedSet{1, 2, 3}->insertAt(1, 0) = OrderedSet{0, 1, 2, 3}"));
// this is not
assertInvalid(evaluate(helper, "",
"OrderedSet{1, 2, 3}->insertAt(5, 5)"));
assertInvalid(evaluate(helper, "",
"OrderedSet{1, 2, 3}->insertAt(0, 0)"));
} catch (Exception e) {
fail("Failed to parse or evaluate: " + e.getLocalizedMessage());
}
}
/**
* Tests that an invalid "insertAt" index results in OclInvalid, not null.
*/
public void test_invalidInsertAtIndex_sequence_244946() {
helper.setContext(EcorePackage.Literals.ESTRING);
try {
// this is OK, as it effectively appends
assertTrue(check(helper, "",
"Sequence{1, 2, 3}->insertAt(4, 4) = Sequence{1, 2, 3, 4}"));
// and this prepends
assertTrue(check(helper, "",
"Sequence{1, 2, 3}->insertAt(1, 0) = Sequence{0, 1, 2, 3}"));
// this is not
assertInvalid(evaluate(helper, "",
"Sequence{1, 2, 3}->insertAt(5, 5)"));
assertInvalid(evaluate(helper, "",
"Sequence{1, 2, 3}->insertAt(0, 0)"));
} catch (Exception e) {
fail("Failed to parse or evaluate: " + e.getLocalizedMessage());
}
}
/**
* Tests that an invalid "subOrderedSet" range results in OclInvalid, not
* null.
*/
public void test_invalidSubOrderedSetRange_244946() {
helper.setContext(EcorePackage.Literals.ESTRING);
try {
assertInvalid(evaluate(helper, "",
"OrderedSet{1, 2, 3}->subOrderedSet(0, 2)"));
assertInvalid(evaluate(helper, "",
"OrderedSet{1, 2, 3}->subOrderedSet(2, 4)"));
assertInvalid(evaluate(helper, "",
"OrderedSet{1, 2, 3}->subOrderedSet(2, 1)"));
} catch (Exception e) {
fail("Failed to parse or evaluate: " + e.getLocalizedMessage());
}
}
/**
* Tests that an invalid "subSequence" range results in OclInvalid, not
* null.
*/
public void test_invalidSubSequenceRange_244946() {
helper.setContext(EcorePackage.Literals.ESTRING);
try {
assertInvalid(evaluate(helper, "",
"Sequence{1, 2, 3}->subSequence(0, 2)"));
assertInvalid(evaluate(helper, "",
"Sequence{1, 2, 3}->subSequence(2, 4)"));
assertInvalid(evaluate(helper, "",
"Sequence{1, 2, 3}->subSequence(2, 1)"));
} catch (Exception e) {
fail("Failed to parse or evaluate: " + e.getLocalizedMessage());
}
}
/**
* Test to check the collections which are declared as OclAny type.
*/
public void test_oclAnyCollections_260403() {
try {
assertTrue(check("let aSeq : Sequence(OclAny) = Sequence {'aString'} in" +
" aSeq->including(10) = Sequence {'aString',10}"));
} catch (Exception e) {
fail("Failed to parse or evaluate: " + e.getLocalizedMessage());
}
}
}