modeltype ecore uses "http://www.eclipse.org/emf/2002/Ecore";

transformation virtualPredefinedTypeOpers(inout model : ecore); 

main() {
	var seq : Sequence(String) := Sequence { '' };
	
	assert fatal (seq->addOnCollectionString(Set{}) = 'Collection(String)::addOnCollectionString');  
	assert fatal (seq->addOnSequenceAny() = 'Sequence(OclAny)::addOnSequenceAny()');
	assert fatal (Sequence { 1 }->addOnSequenceAny() = 'Sequence(OclAny)::addOnSequenceAny()');	
	
	var x:Collection(String) := seq;
	assert fatal (x->addOnCollectionAny() = 'Collection(OclAny)::addOnCollectionAny');		
	assert fatal (Bag{ 'aString' }->addOnCollectionAny() = 'Collection(OclAny)::addOnCollectionAny');	
	
	var s : Set(Set(String)) := Set { Set {'element'} };
	assert fatal (s->addOnCollectionSetAny(Set {}) = 'Collection(Set(OclAny))::addOnCollectionSetAny');
	var oAny : Collection(OclAny) := s.addOnCollectionAny(); -- collect operation calls on elements	
	assert fatal (oAny->includes('Collection(OclAny)::addOnCollectionAny'));

	assert fatal (false.echoMe() = false);
 	
 	var i : Integer := 1;
	var r : Real := 1.5;
 	
 	assert fatal ( i.addOnInteger(10) = i + 10);
	assert fatal ( i.addOnReal(100) = i + 100);

	assert fatal ( r.addOnReal(1000) = r + 1000 );
	assert fatal ( r.echoMe() = r );
	
	var a : OclAny := 'aString';
	assert fatal (a.virtOper() = 'String::virtOper');
	assert fatal (true.virtOper() = 'OclAny::virtOper');
	
	
	assert fatal (Set { 1.2 }->addOnCollectionReal() = 'Collection(Real)::addOnCollectionReal');
	-- check conformant integer	
	assert fatal (Set { 1 }->addOnCollectionReal() = 'Collection(Real)::addOnCollectionReal');
	var source : Collection(Real) := Set { 1 };	
	assert fatal (source->addOnCollectionReal() = 'Collection(Real)::addOnCollectionReal');	
}

helper OclAny::echoMe() : OclAny { 
	return self;    
}

helper Integer::addOnInteger(i : Integer) : Integer {
	return self + i;  
}

helper Real::addOnReal(r : Real) : Real {
  return self + r;
}

helper String::virtOper() : String {
	return 'String::virtOper';	
}

helper OclAny::virtOper() : String {
	return 'OclAny::virtOper';
}

helper Collection(OclAny)::addOnCollectionAny() : String {
	return 'Collection(OclAny)::addOnCollectionAny';
}

helper Collection(String)::addOnCollectionString(arg : Set(String)) : String {
	return 'Collection(String)::addOnCollectionString';
}

helper Collection(Set(OclAny))::addOnCollectionSetAny(arg : Set(OclAny)) : String {		
	return 'Collection(Set(OclAny))::addOnCollectionSetAny';
}


helper Sequence(OclAny)::addOnSequenceAny() : String {
  return 'Sequence(OclAny)::addOnSequenceAny()';
}

query Collection(Real)::addOnCollectionReal() : String {
	return 'Collection(Real)::addOnCollectionReal';
}


-- https://bugs.eclipse.org/bugs/show_bug.cgi?id=244730
query Integer::xone() : Integer {
        return self.xtwo();
}

query Real::xtwo() : Integer {
        return 5;
}
