blob: 96608b62d19e405a23e4ee23b433bf0f18322633 [file] [log] [blame]
modeltype ECORE uses 'http://www.eclipse.org/emf/2002/Ecore';
transformation test(out output: ECORE);
constructor EClass::EClass()
{
}
property outProp :EClass = new EClass();
property outProp2 :EClass = new EClass();
main() {
// --------- out: null, abstract
var contTest1 = new EClass();
var outTest1 :EClassifier = null;
var resTest1 = contTest1.map m1(outTest1, "1: ");
assert fatal (contTest1.name = "1: self_name");
assert fatal (outTest1.name = "1: out_name");
assert fatal (resTest1.name = "1: result_name");
// --------- out: non-null
var outTest2 :EClass = new EClass();
var resTest2 = contTest1.map m2(outTest2, "2: ");
assert fatal (contTest1.name = "2: self_name / 1: self_name");
assert fatal (outTest2.name = "2: out_name / 1: self_name");
assert fatal (resTest2.name = "2: result_name");
// --------- same context and out object, different prefix (String)
var resTest2a = contTest1.map m2(outTest2, "3: ");
assert fatal (contTest1.name = "3: self_name / 2: self_name / 1: self_name");
assert fatal (outTest2.name = "3: out_name / 2: self_name / 1: self_name");
assert fatal (resTest2a.name = "3: result_name");
// --------- same context and prefix, different out object => getting trace value
var outTest3 :EClass = new EClass();
var resTest3 = contTest1.map m2(outTest3, "3: ");
assert fatal (contTest1.name = "3: self_name / 2: self_name / 1: self_name");
assert fatal (outTest3.name = "3: out_name / 2: self_name / 1: self_name");
assert fatal (resTest3.name = "3: result_name");
// --------- out: List(String)
var outTest4: List(String);
var resTest4 = contTest1.map m3(outTest4, "4: ");
assert fatal (outTest4->includes("4: out_name / 3: self_name / 2: self_name / 1: self_name"));
var outTest4a: List(String);
var resTest4a = contTest1.map m3(outTest4a, "4: ");
assert fatal (outTest4a->includes("4: out_name / 3: self_name / 2: self_name / 1: self_name"));
// --------- out: Bag(String)
var contTest5 = new EClass();
contTest5.name := "";
var outTest5: Bag(String);
var resTest5 = contTest5.map m4(outTest5, "5: ");
assert fatal (outTest5->includes("5: out_name / "));
var outTest5a: Bag(String);
var resTest5a = contTest5.map m4(outTest5a, "5: ");
assert fatal (outTest5a->includes("5: out_name / "));
// ---------- disjuncts
var selfTest6 = new EClass();
var outTest6 : EClass;
selfTest6.name := "name1";
var resTest6 = map md1(selfTest6, outTest6);
assert fatal (outTest6.name = "out2 name1");
selfTest6.name := "name2";
var resTest6a = map md1(selfTest6, outTest6);
assert fatal (outTest6.name = "out2 name1");
// ----------- out : property
var trans = new test(output);
var contTest7 = new EClass();
contTest7.name := "test7";
var resTest7 = contTest7.map m2(trans.outProp, "7: ");
assert fatal (trans.outProp.name = "7: out_name / test7");
assert fatal (resTest7.name = "7: result_name");
// --------- same context and prefix, different out object => getting trace value
var resTest7a = contTest7.map m2(trans.outProp2, "7: ");
assert fatal (trans.outProp2.name = "7: out_name / test7");
assert fatal (resTest7.name = "7: result_name");
// ---------- use of 'inherits'
var contTest8 = new EClass();
contTest8.name := "test8 ";
var outTest8 : EClass = new EClass();
outTest8.name := "can't read this";
var resTest8 = contTest8.map mi2(outTest8, "8: ");
assert fatal (contTest8.name = "8: test8 mi2 self mi1");
assert fatal (outTest8.name = "8: mi2 out mi1");
assert fatal (resTest8.name = "8: result_name");
// --------- same context and prefix, different out object => getting trace value
var outTest8a :EClass = new EClass();
var resTest8a = contTest8.map mi2(outTest8a, "8: ");
assert fatal (contTest8.name = "8: test8 mi2 self mi1");
assert fatal (outTest8a.name = "8: mi2 out mi1");
assert fatal (resTest8a.name = "8: result_name");
var outTest8b :EClassifier;
var resTest8b = contTest8.map mi1(outTest8b, "8: ");
assert fatal (contTest8.name = "8: test8 mi2 self mi1");
assert fatal (outTest8b.name = "8: mi2 out mi1");
assert fatal (resTest8b.name = "8: result_name");
// ---------- use of 'merges'
var contTest9 = new EClass();
contTest9.name := "test9 ";
var outTest9 : EClass = new EClass();
outTest9.name := "can't read this";
var resTest9 = contTest9.map mm2(outTest9, "9: ");
assert fatal (contTest9.name = "9: test9 9: mm2 self mm1");
assert fatal (outTest9.name = "9: mm2 out mm1");
assert fatal (resTest9.name = "result_name");
// --------- same context and prefix, different out object => getting trace value
var outTest9a :EClass = new EClass();
var resTest9a = contTest9.map mm2(outTest9a, "9: ");
assert fatal (contTest9.name = "9: test9 9: mm2 self mm1");
assert fatal (outTest9a.name = "9: mm2 out mm1");
assert fatal (resTest9a.name = "result_name");
var outTest9b :EClassifier;
var resTest9b = contTest9.map mm1(outTest9b, "9: ");
assert fatal (contTest9.name = "9: test9 9: mm2 self mm1");
assert fatal (outTest9b.name = "9: mm2 out mm1");
assert fatal (resTest9b.name = "result_name");
// ---------- use of nested 'merges'
var contTest10 = new EClass();
contTest10.name := "test10 ";
var outTest10 : EClass = new EClass();
outTest10.name := "can't read this";
var resTest10 = contTest10.map mmnested3(outTest10, "10: ");
assert fatal (contTest10.name = "10: 10: test10 10: 10: mm3 self mm1");
assert fatal (outTest10.name = "10: 10: mm3 out mm1");
assert fatal (resTest10.name = "result_name");
// --------- same context and prefix, different out object => getting trace value
var outTest10a :EClass = new EClass();
var resTest10a = contTest10.map mmnested3(outTest10a, "10: ");
assert fatal (contTest10.name = "10: 10: test10 10: 10: mm3 self mm1");
assert fatal (outTest10a.name = "10: 10: mm3 out mm1");
assert fatal (resTest10a.name = "result_name");
var outTest10b :EClass;
var resTest10b = contTest10.map mmnested2(outTest10b, "10: ");
assert fatal (contTest10.name = "10: 10: test10 10: 10: mm3 self mm1");
assert fatal (outTest10b.name = "10: 10: mm3 out mm1");
assert fatal (resTest10b.name = "result_name");
var outTest10c :EClassifier;
var resTest10c = contTest10.map mmnested1(outTest10c, "10: ");
assert fatal (contTest10.name = "10: 10: test10 10: 10: mm3 self mm1");
assert fatal (outTest10c.name = "10: 10: mm3 out mm1");
assert fatal (resTest10c.name = "result_name");
}
helper fooHelper(inout param : Integer) {
param := 1;
return;
}
helper fooHelper2(inout param : Set(String)) {
param := new Set(String) ("1","2");
return;
}
mapping inout EClass :: m1(out outParam : EClassifier, in prefix:String) : EClass {
init {
outParam := new EClass();
}
self.name := prefix + "self_name";
outParam.name := prefix + "out_name";
name := prefix + 'result_name';
}
mapping inout EClass :: m2(out outParam : EClass, in prefix:String) : EClass {
init {
outParam := new EClass();
}
outParam.name := prefix + "out_name / " + self.name;
self.name := prefix + "self_name / " + self.name;
name := prefix + 'result_name';
}
mapping inout EClass :: m3(out outParam : List(String), in prefix:String) : EClass {
init {
outParam := new List(String)();
outParam->add(prefix + "out_name / " + self.name);
}
self.name := prefix + "self_name / " + self.name;
name := prefix + 'result_name';
}
mapping inout EClass :: m4(out outParam : Bag(String), in prefix:String) : EClass {
init {
outParam := new Bag(String)(prefix + "out_name / " + self.name);
}
self.name := prefix + "self_name / " + self.name;
name := prefix + 'result_name';
}
mapping md1(in selfParam:EClass, out outParam1 : EClass) : EClass disjuncts md2, md3
{
}
mapping md2(in selfParam:EClass, out outParam2 : EClass) : EClass
when {selfParam.name = "name1";}
{
outParam2.name := 'out2 ' + selfParam.name;
}
mapping md3(in selfParam:EClass, out outParam3 : EClass) : EClass
when {selfParam.name != "name1";}
{
outParam3.name := 'out3 ' + selfParam.name;
}
mapping inout EClass :: mi1(out outParam : EClassifier, in prefix:String) : EClass {
init{}
self.name := self.name + outParam.name + " self mi1";
outParam.name := outParam.name + " out mi1";
name := 'result_name';
}
mapping inout EClass :: mi2(out outParam : EClass, in prefix:String) : EClass
inherits EClass::mi1
{
init {
outParam := new EClass();
outParam.name := "mi2";
}
outParam.name := prefix + outParam.name;
self.name := prefix + self.name;
name := prefix + name;
}
mapping inout EClass :: mm1(out outParam : EClassifier, in prefix:String) : EClass {
init{
}
self.name := self.name + outParam.name + " self mm1";
outParam.name := outParam.name + " out mm1";
name := 'result_name';
}
mapping inout EClass :: mm2(out outParam : EClass, in prefix:String) : EClass
merges EClass::mm1
{
init {
outParam := new EClass();
outParam.name := "mm2";
}
outParam.name := prefix + outParam.name;
self.name := prefix + self.name;
name := prefix + name;
}
mapping inout EClass :: mmnested1(out outParam : EClassifier, in prefix:String) : EClass {
init{
}
self.name := self.name + outParam.name + " self mm1";
outParam.name := outParam.name + " out mm1";
name := 'result_name';
}
mapping inout EClass :: mmnested2(out outParam : EClass, in prefix:String) : EClass
merges EClass::mmnested1
{
init {
}
outParam.name := prefix + outParam.name;
self.name := prefix + self.name;
name := prefix + name;
}
mapping inout EClass :: mmnested3(out outParam : EClass, in prefix:String) : EClass
merges EClass::mmnested2
{
init {
outParam := new EClass();
outParam.name := "mm3";
}
outParam.name := prefix + outParam.name;
self.name := prefix + self.name;
name := prefix + name;
}