modeltype Ecore uses ecore('http://www.eclipse.org/emf/2002/Ecore');

transformation bug415209;

main() {
	var list : List(EClass) := List {
		object EClass{name := "class0"},
		object EClass{name := "class1"},
		object EClass{name := "class2"}
		};
		
	var c1 : Sequence(EClass) := list->select(true);
	assert fatal (c1->size() = 3);
	var c2 : Sequence(EClass) := list->reject(true);
	assert fatal (c2->size() = 0); 
	var c3 : Sequence(OclAny) := list->collect(clone());
	assert fatal (c3->size() = 3);
	var c4 : Sequence(EClass) := list->collect(clone().oclAsType(EClass));
	assert fatal (c4->size() = 3);
	var c5 : Sequence(OclAny) := list->collectNested(clone());
	assert fatal (c5->size() = 3);
	var c6 : Boolean := list->forAll(true);
	assert fatal (c6); 
	var c7 : Boolean := list->exists(true);
	assert fatal (c7); 
	var c8 : OrderedSet(EClass) := list->closure(oclAsType(EClass));
	assert fatal (c8->size() = 3); 
	var c9 : OrderedSet(OclAny) := list->closure(oclAsType(EClass));
	assert fatal (c9->size() = 3); 
	var c10 : EClass := list->any(true);
	assert fatal (not c10.oclIsUndefined()); 
	var c11 : Boolean := list->isUnique(name); 
	assert fatal (c11); 
	var c12 : Boolean := list->one(name = "class0");
	assert fatal (c12); 
	var c13 : Sequence(EClass) := list->sortedBy(name);
	assert fatal (c13->size() = 3);
	var c14 : Integer := list->iterate(i : EClass; sum: Integer = 0 | sum + 1);
	assert fatal (c14 = 3);
	 
	var c20 : Boolean := (list = list);
	assert fatal (c20);  	
	var c21 : Boolean := (list <> list);
	assert fatal (not c21);
	var c22 : Integer := list->size();
	assert fatal (c22 = 3); 	
	var c23 : Boolean := list->includes(list->any(true));
	assert fatal (c23); 	
	var c24 : Boolean := list->excludes(list->any(true));
	assert fatal (not c24); 	
	var c25 : Integer := list->count(list->any(true));
	assert fatal (c25 = 1); 	
	var c26 : Boolean := list->includesAll(Sequence{list->any(true)});
	assert fatal (c26);
	var c27 : Boolean := list->excludesAll(Sequence{list->any(true)});
	assert fatal (not c27);
	var c28 : Boolean := list->isEmpty();
	assert fatal (not c28);
	var c29 : Boolean := list->notEmpty();
	assert fatal (c29);
	var c30 : Real := list->max();
	assert fatal (c30.oclIsInvalid());
	var c31 : Real := list->min();
	assert fatal (c31.oclIsInvalid());
	var c32 : Real := list->sum();
	assert fatal (c32.oclIsInvalid());
	var c33 : Set(Tuple(first: EClass, second: EClass)) := list->product(Sequence{list->any(true)});
	assert fatal (c33->size() = 3);
	var c34 : Set(EClass) := list->asSet();
	assert fatal (c34->size() = 3);
	var c35 : OrderedSet(EClass) := list->asOrderedSet();
	assert fatal (c35->size() = 3);
	var c36 : Sequence(EClass) := list->asSequence();
	assert fatal (c36->size() = 3);
	var c37 : Bag(EClass) := list->asBag();
	assert fatal (c37->size() = 3);
	var c38 : Sequence(EClass) := list->flatten();
	assert fatal (c38->size() = 3);
	
	list->add(object EClass{});
	list := list->prepend(object EClass{});
	list->insertAt( object EClass{}, 1);
	var c50 : String := list->joinfields("",",","");

	var c60 : Sequence(OclAny) := list.clone(); -- shorthand for collect
	assert fatal (c60->size() = 6); 
	var c61 : Sequence(OclAny) := list->xcollect(clone());
	assert fatal (c61->size() = 6); 
	var c62 : Sequence(OclAny) := list->clone(); -- shorhand for xcollect
	assert fatal (c62->size() = 6); 
	var c63 : Sequence(EClass) := list->xselect(true);
	assert fatal (c63->size() = 6); 
	var c64 : Sequence(EClass) := list[true]; -- shorthand for xselect
	assert fatal (c64->size() = 6);
	var c65 : EClass := list->selectOne(true);
	assert fatal (not c65.oclIsUndefined());
	var c66 : EClass := list![true]; -- shorthand for selectOne
	assert fatal (not c66.oclIsUndefined());
	var c67 : Sequence(OclAny) := list->collectselect(i;res=i.clone()|res.oclIsKindOf(EClass));
	assert fatal (c67->size() = 6); 
	var c68 : Sequence(EClass) := list->clone()[EClass]; -- shorhand for collectselect
	assert fatal (c68->size() = 6);
	var c69 : OclAny := list->collectselectOne(i;res=i.clone()|res.oclIsKindOf(EClass));
	assert fatal (c69 <> null);
	var c70 : EClass := list->clone()![EClass]; -- shorhand for collectselectOne
	assert fatal (c70 <> null);

	list->forEach(i) {};
	list->forOne(i) {};
	
	var c90 : List(EClass) := list->asSequence()->asList();
	var c91 : List(EClass) := list->asBag()->asList();
	var c92 : List(EClass) := list->asSet()->asList();
	var c93 : List(EClass) := list->asOrderedSet()->asList();
	
	var c100 : Sequence(EClass) := List{List{object EClass{}}}->flatten();
	var c101 : Sequence(EClass) := List{object EClass{}}->flatten();
	var c102 : Collection(Collection(EClass));
	var c103 : Collection(EClass) := c102->flatten();
	var c104 : Collection(EClass);
	var c105 : Collection(EClass) := c104->flatten();
}
