| 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; |
| } |