From ef96645336703c771b104a8b9d7676d5280b4b37 Mon Sep 17 00:00:00 2001 From: Philip Makedonski Date: Fri, 3 Jul 2020 17:42:41 +0200 Subject: [PATCH] + some refactoring and restructuring --- .../epsilon/execution.eol | 621 +++++++++ .../epsilon/reusable.eol | 565 ++++++++ .../epsilon/ttcn3mapping.etl | 1222 +---------------- 3 files changed, 1200 insertions(+), 1208 deletions(-) create mode 100644 plugins/org.etsi.mts.tdl.ttcn3/epsilon/execution.eol create mode 100644 plugins/org.etsi.mts.tdl.ttcn3/epsilon/reusable.eol diff --git a/plugins/org.etsi.mts.tdl.ttcn3/epsilon/execution.eol b/plugins/org.etsi.mts.tdl.ttcn3/epsilon/execution.eol new file mode 100644 index 00000000..41de529f --- /dev/null +++ b/plugins/org.etsi.mts.tdl.ttcn3/epsilon/execution.eol @@ -0,0 +1,621 @@ +import "logging.eol"; +import "common.eol"; +import "helper.eol"; +import "debug.eol"; +import "reusable.eol"; + +operation TDL!Interaction executeSource() : TTCN!FunctionStatementList { + var ssl = new TTCN!FunctionStatementList(); + + var sfs = new TTCN!FunctionStatement(); + sfs.communication = new TTCN!CommunicationStatements(); + sfs.communication.send = new TTCN!SendStatement(); + //sfs.communication.send.port = self.sourceGate.gate.equivalent(); + sfs.communication.send.port = self.sourceGate.equivalent().port; + sfs.communication.send.send = new TTCN!PortSendOp(); + sfs.communication.send.send.template = new TTCN!InLineTemplate(); + sfs.communication.send.send.template.template = self.argument.getTemplateBody(); + + ssl.statements.add(sfs); + ssl.sc.add(";"); + return ssl; +} + +operation TDL!Interaction executeTarget(t : TDL!Target) : TTCN!FunctionStatementList { + var tsl = new TTCN!FunctionStatementList(); + + var tfs = new TTCN!FunctionStatement(); + tfs.communication = new TTCN!CommunicationStatements(); + tfs.communication.receive = new TTCN!ReceiveStatement(); + tfs.communication.receive.any = new TTCN!PortOrAny(); + //tfs.communication.receive.any.ref = t.targetGate.gate.equivalent(); + tfs.communication.receive.any.ref = t.targetGate.equivalent().port; + tfs.communication.receive.receive = new TTCN!PortReceiveOp(); + tfs.communication.receive.receive.template = new TTCN!InLineTemplate(); + tfs.communication.receive.receive.template.template = self.argument.getTemplateBody(); + + if (not t.valueAssignment.isEmpty()) { + var pr = new TTCN!PortRedirect(); + tfs.communication.receive.receive.redirect = pr; + pr.value = new TTCN!ValueSpec(); + pr.value.variable = new TTCN!VariableRef(); + pr.value.variable.ref = new TTCN!ReferencedValue(); + pr.value.variable.ref.head = new TTCN!Head(); + pr.value.variable.ref.head.target = t.valueAssignment.get(0).variable.equivalent(); + } + + tsl.statements.add(tfs); + tsl.sc.add(";"); + return tsl; +} + +operation TDL!Interaction execute() { + //TODO: needs adapting to context + // add a statement block stack for each component during transformation? + + //TODO: simplify + + //source behaviour + if ((simulateSUT or self.sourceGate.component.role = TDL!ComponentInstanceRole#Tester) + and (currentScope.isUndefined() or currentScope = self.sourceGate.component) + ) { + var sc = self.getMainContext(self.sourceGate.component); + var sb = stack.get(sc).last(); + var ssl = self.executeSource(); + sb.stat.add(ssl); + } + + //TODO: handle multicast? + //target behaviour + if ((simulateSUT or self.target.first().targetGate.component.role = TDL!ComponentInstanceRole#Tester) + and (currentScope.isUndefined() or currentScope = self.target.first().targetGate.component) + ) { + var tc = self.getMainContext(self.target.first().targetGate.component); + var tb = stack.get(tc).last(); + var t = self.target.first(); + var tsl = self.executeTarget(t); + tb.stat.add(tsl); + } + //inlined above + //self.execute(sb, tb); +} + +//TODO: remove? (inlined above) +operation TDL!Interaction execute(sourceContext : TTCN!StatementBlock, targetContext : TTCN!StatementBlock) { + //source behaviour + var ssl = self.executeSource(); + sourceContext.stat.add(ssl); + //TODO: handle multicast? + //target behaviour + var t = self.target.first(); + var tsl = self.executeTarget(t); + targetContext.stat.add(tsl); +} + +operation TDL!AlternativeBehaviour execute() { + if (not transformAlt) return; + var td = self.getTestDescription(); + //TODO: naive simplified assumption + var fb = self.block.first().behaviour.first(); + if (fb.isKindOf(TDL!Interaction)) { + if (simulateSUT or fb.sourceGate.component.role = TDL!ComponentInstanceRole#Tester) { + var sc = self.getMainContext(fb.sourceGate.component); + var sb = stack.get(sc).last(); + self.executeSource(sb); + } + + if (simulateSUT or fb.target.first().targetGate.component.role = TDL!ComponentInstanceRole#Tester) { + var tc = self.getMainContext(fb.target.first().targetGate.component); + var tb = stack.get(tc).last(); + self.executeTarget(tb); + } + } + +} + +operation TDL!AlternativeBehaviour executeTarget(targetContext : TTCN!StatementBlock) { + var tsl = self.executeTarget(); + targetContext.stat.add(tsl); +} + +operation TDL!AlternativeBehaviour executeSource(sourceContext : TTCN!StatementBlock) { + //TODO: simple assumption - trigger first + //TODO: needs to follow path, right now triggers first interactions in other branches as well + var fb = self.block.first().behaviour.first(); + if (fb.isKindOf(TDL!Interaction)) { + var ssl = fb.executeSource(); + sourceContext.stat.add(ssl); + } +} + +operation TDL!AlternativeBehaviour checkPath() : Boolean { + var first = true; + if (self.eContainer.isDefined()) { + if (self.eContainer.isKindOf(TDL!Block)) { + if (self.eContainer.eContainer.isKindOf(TDL!AlternativeBehaviour)) { + if (self.eContainer.eContainer.block.indexOf(self.eContainer) <> 0) { + first = false; + } else { + first = self.eContainer.eContainer.checkPath(); + } + } + } + } + + return first; +} + + +operation TDL!AlternativeBehaviour executeTarget() : TTCN!FunctionStatementList { + if (not transformAlt) return; + //TODO + + //target only so far.. + //where should this be placed? in the receiving side? + //how about source + //TODO: add explicit scoping + + var tsl = new TTCN!FunctionStatementList(); + + var fs = new TTCN!FunctionStatement(); + fs.behavior = new TTCN!BehaviourStatements(); + fs.behavior.alt = new TTCN!AltConstruct(); + fs.behavior.alt.agList = new TTCN!AltGuardList(); + + for (block in self.block) { + var gs = block.executeAltBlock(); + fs.behavior.alt.agList.guardList.add(gs); + } + + tsl.statements.add(fs); + //tsl.sc.add(";"); + return tsl; +} + + +operation TDL!Block executeAltBlock() : TTCN!GuardStatement { + var gs = new TTCN!GuardStatement(); + gs.`guard` = new TTCN!AltGuardChar(); + //TODO: expression + + gs.block = new TTCN!StatementBlock(); + + //naive assumption + if (self.behaviour.first().isKindOf(TDL!Interaction)) { + var cf = self.behaviour.first().getMainContext(self.behaviour.first().target.first().targetGate.component); + stack.get(cf).add(gs.block); + + var i = 0; + for (b in self.behaviour) { + if (i==0) { + //this should be redundant now + if (b.isKindOf(TDL!Interaction)) { + gs.op = b.getGuardOp(); + } else { + //TODO: handle other behaviours? + } + } else { + b.execute(); + } + i = i+1; + } + + stack.get(cf).remove(gs.block); + } else if (self.behaviour.first().isKindOf(TDL!TimeOut)) { + var cf = self.behaviour.first().getMainContext(self.behaviour.first().componentInstance); + stack.get(cf).add(gs.block); + + var i = 0; + for (b in self.behaviour) { + if (i==0) { + //this should be redundant now + if (b.isKindOf(TDL!TimeOut)) { + gs.op = b.getGuardOp(); + } else { + //TODO: handle other behaviours? + } + } else { + b.execute(); + } + i = i+1; + } + + stack.get(cf).remove(gs.block); + + } else { + //TODO + } + + //TODO: statement block + return gs; +} + + +operation TDL!BoundedLoopBehaviour execute() { + //TODO: no component? + for (le in self.numIteration) { + currentScope = le.scope; + var sc = self.getMainContext(le.scope); + var sb = stack.get(sc).last(); + + var tsl = new TTCN!FunctionStatementList(); + sb.stat.add(tsl); + + var fs = new TTCN!FunctionStatement(); + fs.basic = new TTCN!BasicStatements(); + fs.basic.loop = new TTCN!LoopConstruct(); + fs.basic.loop.forStm = new TTCN!ForStatement(); + + tsl.statements.add(fs); + + var init = new TTCN!Initial(); + fs.basic.loop.forStm.init = init; + + var cv = new TTCN!SingleVarInstance(); + + var exp = new TTCN!RelExpression(); + fs.basic.loop.forStm.expression = exp; + + //init + if (le.expression.isKindOf(TDL!DataInstanceUse)) { + + cv.name = "cv"; + cv.ac = ":="; + cv.expr = new TTCN!Value(); + cv.expr.predef = new TTCN!PredefinedValue(); + cv.expr.predef.integer = "0"; + + init.variable = new TTCN!VarInstance(); + //TODO: add more comprehensive resolution + init.variable.listType = le.expression.dataInstance.dataType.getTTCNType(); + init.variable.list = new TTCN!VarList(); + init.variable.list.variables.add(cv); + + //TODO: the TTCN3 grammar needs to save the operators + + //control + exp.left = new TTCN!Value(); + exp.left.ref = new TTCN!ReferencedValue(); + exp.left.ref.head = new TTCN!Head(); + exp.left.ref.head.target = cv; + + exp.right = new TTCN!Value(); + exp.right.ref = new TTCN!ReferencedValue(); + exp.right.ref.head = new TTCN!Head(); + if (le.expression.dataInstance.isValue()) { + exp.right.ref.head.target = le.expression.dataInstance.equivalent().defs.list.first(); + } else { + //can it even be template? + exp.right.ref.head.target = le.expression.dataInstance.equivalent().base; + } + + } else { + //TODO: + } + + //increment + var assign = new TTCN!Assignment(); + assign.ref = new TTCN!VariableRef(); + assign.ref.ref = new TTCN!ReferencedValue(); + assign.ref.ref.head = new TTCN!Head(); + assign.ref.ref.head.target = cv; + + assign.expression = new TTCN!AddExpression(); + assign.expression.left = new TTCN!Value(); + assign.expression.left.ref = new TTCN!ReferencedValue(); + assign.expression.left.ref.head = new TTCN!Head(); + assign.expression.left.ref.head.target = cv; + + assign.expression.right = new TTCN!Value(); + assign.expression.right.predef = new TTCN!PredefinedValue(); + assign.expression.right.predef.integer = "1"; + + fs.basic.loop.forStm.assign = assign; + + var block = new TTCN!StatementBlock(); + + fs.basic.loop.forStm.statement = block; + + var cf = self.getMainContext(le.scope); + stack.get(cf).add(block); + + for (b in self.block.behaviour) { + b.execute(); + } + + stack.get(cf).remove(block); + currentScope = null; + } + +} + +operation TDL!UnboundedLoopBehaviour execute() { + //TODO + for (b in self.block.behaviour) { + b.execute(); + } +} + + +operation TDL!ConditionalBehaviour execute() { + var guards = self.block.get(0).`guard`; + + for (le in guards) { + currentScope = le.scope; + var sc = self.getMainContext(le.scope); + var sb = stack.get(sc).last(); + + var tsl = new TTCN!FunctionStatementList(); + sb.stat.add(tsl); + + var sfs = new TTCN!FunctionStatement(); + sfs.basic = new TTCN!BasicStatements(); + sfs.basic.conditional = new TTCN!ConditionalConstruct(); + + //condition + sfs.basic.conditional.expression = le.expression.getDataUseValue(); + + tsl.statements.add(sfs); + + //main block + var block = new TTCN!StatementBlock(); + sfs.basic.conditional.statement = block; + + var cf = self.getMainContext(le.scope); + stack.get(cf).add(block); + + for (b in self.block.get(0).behaviour) { + b.execute(); + } + + stack.get(cf).remove(block); + + //TODO: else ifs + //else block + if (self.block.size() > 1) { + sfs.basic.conditional.`else` = new TTCN!ElseClause(); + + var eBlock = new TTCN!StatementBlock(); + sfs.basic.conditional.`else`.statement = eBlock; + + stack.get(cf).add(eBlock); + for (b in self.block.last().behaviour) { + b.execute(); + } + stack.get(cf).remove(eBlock); + } + + currentScope = null; + } +} + + +operation TDL!tdl::Assignment execute() { + var ci = self.variable.componentInstance; + if (simulateSUT or ci.role = TDL!ComponentInstanceRole#Tester) { + var sc = self.getMainContext(ci); + var sb = stack.get(sc).last(); + + var ssl = new TTCN!FunctionStatementList(); + + var sfs = new TTCN!FunctionStatement(); + + sfs.basic = new TTCN!BasicStatements(); + sfs.basic.assign = new TTCN!Assignment(); + sfs.basic.assign.ref = new TTCN!VariableRef(); + sfs.basic.assign.ref.ref = new TTCN!ReferencedValue(); + sfs.basic.assign.ref.ref.head = new TTCN!Head(); + sfs.basic.assign.ref.ref.head.target = self.variable.variable.equivalent(); + + sfs.basic.assign.expression = self.expression.getDataUseValue(); + + ssl.statements.add(sfs); + ssl.sc.add(";"); + + sb.stat.add(ssl); + } +} + +operation TDL!Assertion execute() { + var ci = self.componentInstance; + if (simulateSUT or ci.role = TDL!ComponentInstanceRole#Tester) { + var sc = self.getMainContext(ci); + var sb = stack.get(sc).last(); + var ssl = new TTCN!FunctionStatementList(); + + var sfs = new TTCN!FunctionStatement(); + sfs.basic = new TTCN!BasicStatements(); + sfs.basic.conditional = new TTCN!ConditionalConstruct(); + + //condition + sfs.basic.conditional.expression = self.condition.getDataUseValue(); + + //statements - pass + sfs.basic.conditional.statement = new TTCN!StatementBlock(); + var psl = new TTCN!FunctionStatementList(); + psl.statements.add("pass".getVerdictStatement()); + sfs.basic.conditional.statement.stat.add(psl); + + //else - otherwise verdict + sfs.basic.conditional.`else` = new TTCN!ElseClause(); + sfs.basic.conditional.`else`.statement = new TTCN!StatementBlock(); + var osl = new TTCN!FunctionStatementList(); + if (self.otherwise.isDefined()) { + osl.statements.add(self.otherwise.getVerdictStatement()); + } else { + osl.statements.add("fail".getVerdictStatement()); + } + sfs.basic.conditional.`else`.statement.stat.add(osl); + + ssl.statements.add(sfs); + ssl.sc.add(";"); + + sb.stat.add(ssl); + } +} + +operation TDL!ActionReference execute() { + var ci = self.componentInstance; + if (simulateSUT or ci.role = TDL!ComponentInstanceRole#Tester) { + var sc = self.getMainContext(ci); + var sb = stack.get(sc).last(); + var ssl = new TTCN!FunctionStatementList(); + + var sfs = new TTCN!FunctionStatement(); + + sfs.behavior = new TTCN!BehaviourStatements(); + sfs.behavior.`function` = new TTCN!FunctionInstance(); + sfs.behavior.`function`.ref = self.action.equivalent(); + + if (not self.actualParameter.isEmpty()) { + var pl = new TTCN!FunctionActualParList(); + sfs.behavior.`function`.params = pl; + + for (ap in self.actualParameter) { + var p = new TTCN!FunctionActualPar(); + p.template = new TTCN!InLineTemplate(); + p.template.template = new TTCN!TemplateBody(); + p.template.template.simple = new TTCN!SimpleSpec(); + p.template.template.simple.expr = ap.dataUse.getDataUseValue(); + pl.params.add(p); + } + } + + ssl.statements.add(sfs); + ssl.sc.add(";"); + + sb.stat.add(ssl); + } +} + +operation TDL!TestDescriptionReference execute() { + //TODO: support parameters (also in initialisation in TD2FD) + //TODO: support bindings + for (ci in self.getTestDescription().testConfiguration.componentInstance.select(c|simulateSUT or c.role = TDL!ComponentInstanceRole#Tester)) { + var sc = self.getMainContext(ci); + var sb = stack.get(sc).last(); + + var tc = self.testDescription.getMainContext(ci); + var cf = TTCN!FunctionDef.all().select(f|f.name = tc).first(); + if (cf.isDefined()) { + var ssl = new TTCN!FunctionStatementList(); + var s = new TTCN!FunctionStatement(); + s.behavior = new TTCN!BehaviourStatements(); + s.behavior.`function` = new TTCN!FunctionInstance(); + s.behavior.`function`.ref = cf; + ssl.statements.add(s); + ssl.sc.add(";"); + sb.stat.add(ssl); + } else { + (" Could not resolve "+tc).log(1); + //TODO + } + } +} + + +operation TDL!VerdictAssignment execute() { + for (ci in self.getTestDescription().testConfiguration.componentInstance.select(c|simulateSUT or c.role = TDL!ComponentInstanceRole#Tester)) { + var sc = self.getMainContext(ci); + var sb = stack.get(sc).last(); + + var ssl = new TTCN!FunctionStatementList(); + + var sfs = self.verdict.getVerdictStatement(); + + ssl.statements.add(sfs); + ssl.sc.add(";"); + + sb.stat.add(ssl); + } +} + +operation TDL!CompoundBehaviour execute() { + //TODO + for (b in self.block.behaviour) { + b.execute(); + } +} + + +operation TDL!TimerStart execute() { + var ci = self.componentInstance; + if (simulateSUT or ci.role = TDL!ComponentInstanceRole#Tester) { + var sc = self.getMainContext(ci); + var sb = stack.get(sc).last(); + var ssl = new TTCN!FunctionStatementList(); + + var sfs = new TTCN!FunctionStatement(); + + sfs.timer = new TTCN!TimerStatements(); + sfs.timer.start = new TTCN!StartTimerStatement(); + sfs.timer.start.ref = self.timer.equivalent(); + sfs.timer.start.expr = self.period.getDataUseValue(); + + ssl.statements.add(sfs); + ssl.sc.add(";"); + + sb.stat.add(ssl); + } +} + +operation TDL!TimerStop execute() { + var ci = self.componentInstance; + if (simulateSUT or ci.role = TDL!ComponentInstanceRole#Tester) { + var sc = self.getMainContext(ci); + var sb = stack.get(sc).last(); + var ssl = new TTCN!FunctionStatementList(); + + var sfs = new TTCN!FunctionStatement(); + + sfs.timer = new TTCN!TimerStatements(); + sfs.timer.stop = new TTCN!StopTimerStatement(); + sfs.timer.stop.ref = new TTCN!TimerRefOrAll(); + sfs.timer.stop.ref.ref = self.timer.equivalent(); + + ssl.statements.add(sfs); + ssl.sc.add(";"); + + sb.stat.add(ssl); + } +} + +operation TDL!TimeOut execute() { + //TODO: handle in an alt statement? + var ci = self.componentInstance; + if (simulateSUT or ci.role = TDL!ComponentInstanceRole#Tester) { + var sc = self.getMainContext(ci); + var sb = stack.get(sc).last(); + var ssl = new TTCN!FunctionStatementList(); + + var sfs = new TTCN!FunctionStatement(); + + sfs.timer = new TTCN!TimerStatements(); + sfs.timer.timeout = new TTCN!TimeoutStatement(); + sfs.timer.timeout.ref = new TTCN!TimerRefOrAny(); + sfs.timer.timeout.ref.ref = self.timer.equivalent(); + + ssl.statements.add(sfs); + ssl.sc.add(";"); + + sb.stat.add(ssl); + } +} + +operation TDL!Behaviour execute() { + (" Skipping " +self.type.name+" (not yet supported)").println(); + if (self.type.name = "ParallelBehaviour" and false) { + (indent+"group Parallel").printlno(); + var i = 0; + for (block in self.block) { + for (b in block.behaviour) { + b.execute(indent+" "); + } + if (i <= block.size()) { + (indent+"else").printlno(); + } + i = i+1; + } + (indent+"end").printlno(); + } +} diff --git a/plugins/org.etsi.mts.tdl.ttcn3/epsilon/reusable.eol b/plugins/org.etsi.mts.tdl.ttcn3/epsilon/reusable.eol new file mode 100644 index 00000000..946ce6e0 --- /dev/null +++ b/plugins/org.etsi.mts.tdl.ttcn3/epsilon/reusable.eol @@ -0,0 +1,565 @@ +import "logging.eol"; +import "common.eol"; +import "helper.eol"; +import "debug.eol"; + +operation TDL!Action transformTo(fd : TTCN!FunctionDef) { + fd.name = self.TTCNname(); + + var md = new TTCN!ModuleDefinition(); + md.def = fd; + var m = self.eContainer.equivalent(); + m.defs.definitions.add(md); + + fd.statement = new TTCN!StatementBlock(); + + //TODO: fix formatting + if (self.formalParameter.notEmpty()) { + fd.parameterList = new TTCN!FunctionFormalParList(); + for (p in self.formalParameter) { + var fp = new TTCN!FunctionFormalPar(); + //TODO: support for value parameters? + // -> process annotation + // -> extract into a rule to make use of equivalent? + fp.template = new TTCN!FormalTemplatePar(); + fp.~kind = fp.template; + + fp.~kind.name = p.TTCNname(); + + //TODO: direction support? + + fp.~kind.type = p.dataType.getTTCNType(); + + fd.parameterList.params.add(fp); + } + } + //TODO: add support for body? +} + +operation Any getModule() : TTCN!TTCN3Module { + if (self.eContainer.isDefined()) { + if (not self.eContainer.isKindOf(TTCN!TTCN3Module)) { + return self.eContainer.getModule(); + } else { + return self.eContainer; + } + } +} + + +operation Any getElapsedTime() : Any { + var mpElapsedTime = self.getModule().getElapsedTime(); + return mpElapsedTime; +} + +operation TTCN!TTCN3Module getElapsedTime() : Any { + var mpElapsedTime = self.~mpElapsedTime; + return mpElapsedTime; +} + +operation TTCN!TTCN3Module createTypeDefBody() : TTCN!TypeDefBody{ + var md = new TTCN!ModuleDefinition(); + md.def = new TTCN!TypeDef(); + md.def.body = new TTCN!TypeDefBody(); + self.defs.definitions.add(md); + return md.def.body; +} + +operation Any transformSingleMemberAssignment(m : TDL!Member, mad : TDL!DataUse) : TTCN!TemplateBody { + var body = new TTCN!TemplateBody(); + if (mad.isDefined() and mad.isKindOf(TDL!DataInstanceUse)) { + if (mad.dataInstance.isDefined() and mad.argument.isEmpty()) { + body.simple = new TTCN!SimpleSpec(); + body.simple.expr = new TTCN!Value(); + body.simple.expr.ref = new TTCN!ReferencedValue(); + body.simple.expr.ref.head = new TTCN!Head(); + + //Template ->target = BaseTemplate reference + //Constant ->target = SingleConstDef reference + var e = mad.dataInstance.equivalent(); + if (e.isKindOf(TTCN!TemplateDef)) { + body.simple.expr.ref.head.target = e.base; + } else if (e.isKindOf(TTCN!ConstDef)) { + body.simple.expr.ref.head.target = e.defs.list.get(0); + } else { + //what else can it be? + } + + //reduction + //use extended field references + var useEFR = mad.reduction.exists(mr|mr.collectionIndex.isDefined()); + + if (useEFR) { + for (mr in mad.reduction) { + if (mr.member.isDefined()) { + var efr = new TTCN!ExtendedFieldReference(); + efr.field = mr.member.equivalent(); + + body.simple.expr.ref.fields.add(efr); + } + if (mr.collectionIndex.isDefined() + and mr.collectionIndex.dataInstance.isDefined()) { + var efr = new TTCN!ExtendedFieldReference(); + efr.array = new TTCN!Value(); + efr.array.ref = new TTCN!ReferencedValue(); + efr.array.ref.head = new TTCN!Head(); + + var ci = mr.collectionIndex.dataInstance.equivalent(); + if (ci.isKindOf(TTCN!TemplateDef)) { + efr.array.ref.head.target = ci.base; + } else if (ci.isKindOf(TTCN!ConstDef)) { + efr.array.ref.head.target = ci.defs.list.get(0); + } else { + //what else can it be? + } + + body.simple.expr.ref.fields.add(efr); + } + } + } else { + var t = body.simple.expr.ref.head; + for (mr in mad.reduction) { + if (mr.member.isDefined()) { + t.tail = new TTCN!RefValueTail(); + t.tail.value = mr.member.equivalent(); + + } + t = t.tail; + } + } + + } else { + //nested anonymous definitions + //or overriding + (" : "+mad.item).log(1); + if (mad.item.isDefined()) { + body = self.transformDefaultMatchingSymbol(m, mad); + } else { + body.field = mad.transformWildcardMemberAssignment(); + } + } + } else { + body = self.transformDefaultMatchingSymbol(m, mad); + } + return body; +} + +operation Any transformDefaultMatchingSymbol(m : TDL!Member, mad : TDL!DataUse) : TTCN!TemplateBody { + var body = new TTCN!TemplateBody(); + body.simple = new TTCN!SimpleSpec(); + if (mad.isUndefined() + or not mad.isKindOf(TDL!LiteralValueUse)) { + body.simple.spec = new TTCN!SimpleTemplateSpec(); + body.simple.spec.expr = new TTCN!SingleTemplateExpression(); + body.simple.spec.expr.symbol = new TTCN!MatchingSymbol(); + } + if (mad.isUndefined() + and self.unassignedMember.isDefined() + and self.unassignedMember.name = "AnyValueOrOmit") { + if (m.isOptional) { + body.simple.spec.expr.symbol.anyornone = "*"; + } else { + body.simple.spec.expr.symbol.any = "?"; + } + } else if (mad.isUndefined() + and self.unassignedMember.isDefined() + and self.unassignedMember.name = "AnyValue") { + body.simple.spec.expr.symbol.any = "?"; + } else if (mad.isDefined() + and mad.isKindOf(TDL!AnyValue)) { + body.simple.spec.expr.symbol.any = "?"; + } else if (mad.isDefined() + and mad.isKindOf(TDL!AnyValueOrOmit)) { + body.simple.spec.expr.symbol.anyornone = "*"; + } else if (mad.isDefined() + and mad.isKindOf(TDL!LiteralValueUse)) { + //("TODO: Implement full support for literal values : "+mad).log(1); + body.simple.spec = null; + body.simple.expr = new TTCN!Value(); + body.simple.expr.predef = new TTCN!PredefinedValue(); + body.simple.expr.predef.charString = mad.value; + } else if (mad.isDefined()) { + (" TODO: "+self.~rule+" : Not Implemented Yet : "+mad).log(1); + body.simple.spec = null; + body.simple.expr = new TTCN!Value(); + body.simple.expr.predef = new TTCN!PredefinedValue(); + body.simple.expr.predef.charString = "\"TODO_NOT_SUPPORTED_YET\""; + } + return body; +} + +//TODO: deprecated? +operation TDL!StructuredDataInstance transformMemberAssignment() : TTCN!CompoundExpression { + var expr; + if (not self.memberAssignment.isEmpty()) { + expr = new TTCN!FieldExpressionList(); + for (ma in self.memberAssignment) { + var fes = new TTCN!FieldExpressionSpec(); + fes.fieldRef = ma.member.equivalent(); + + //ma.memberSpec + fes.expr = new TTCN!Value(); + if (ma.memberSpec.isKindOf(TDL!DataInstanceUse) + and ma.memberSpec.dataInstance.isDefined()) { + fes.expr.ref = new TTCN!ReferencedValue(); + fes.expr.ref.head = new TTCN!Head(); + + //Template ->target = BaseTemplate reference + //Constant ->target = SingleConstDef reference + var e = ma.memberSpec.dataInstance.equivalent(); + if (e.isKindOf(TTCN!TemplateDef)) { + fes.expr.ref.head.target = e.base; + } else if (e.isKindOf(TTCN!ConstDef)) { + fes.expr.ref.head.target = e.defs.list.get(0); + } else { + //what else can it be? + } + //TODO: handle overriding parameters? + } else { + fes.expr.predef = new TTCN!PredefinedValue(); + fes.expr.predef.charString = "\"TODO: Not Implemented Yet\""; + } + + expr.specs.add(fes); + } + //TODO: handle unassigned members? -> add guards to corresponding rule + //TODO: handle special characters + var assigned = self.memberAssignment.collect(ma|ma.member); + for (m in self.dataType.allMembers().excludingAll(assigned)) { + (self.name + ": Skipping unassigned member "+m.name).log(1); + } + + } else { + (" TODO: "+self.~rule+" : What is going on here: "+self).log(1); + expr = new TTCN!ArrayExpression(); + } + return expr; + +} + +operation TDL!StaticDataUse transformWildcardMemberAssignment() : TTCN!FieldSpecList { + //dataInstance? or inferred type + //unassignedMember? + //argument -> ParameterBinding (parameter:Member, dataUse:DataUse) + //reduction? -> MemberReference + var field = new TTCN!FieldSpecList(); + var t; + if (self.dataInstance.isDefined()) { + t = self.dataInstance.dataType; + ("DI:"+self.dataInstance.name).log(1); + } else { + if (self.eContainer.isKindOf(TDL!ParameterBinding)) { + t = self.eContainer.parameter.dataType; + } else if (self.eContainer.isKindOf(TDL!MemberAssignment)) { + t = self.eContainer.member.dataType; + } else { + (" TODO: "+self.~rule+" : Context Not Implemented Yet").log(1); + } + } + if (self.item.isDefined() or t.isKindOf(TDL!CcollectionDataType)) { + (" TODO: "+self.~rule+" : Collections not supported yet: "+self).log(1); + (" "+t.name).log(1); + var it = t.itemType; + + var fs = new TTCN!FieldSpec(); + field.spec.add(fs); + } else { + for (m in t.allMembers()) { + var fs = new TTCN!FieldSpec(); + fs.ref = m.equivalent(); + + var mad; + var ma = self.argument.selectOne(a|a.parameter = m); + //default: no wildcard, defined + //in case not defined, check for inherited + if (ma.isDefined()) { + mad = ma.dataUse; + } else if (ma.isUndefined() + and self.isKindOf(TDL!DataInstanceUse) + and self.dataInstance.isDefined()) { + var mai = self.dataInstance.memberAssignment.selectOne(a|a.member = m); + if (mai.isDefined()) { + mad = mai.memberSpec; + } + } else { + + } + + fs.body = self.transformSingleMemberAssignment(m, mad); + field.spec.add(fs); + } + } + return field; +} + +operation TDL!StructuredDataInstance transformWildcardMemberAssignment() : TTCN!FieldSpecList { + var field = new TTCN!FieldSpecList(); + for (m in self.dataType.allMembers()) { + var fs = new TTCN!FieldSpec(); + fs.ref = m.equivalent(); + + var ma = self.memberAssignment.selectOne(ma|ma.member = m); + var mad; + if (ma.isDefined()) { + mad = ma.memberSpec; + } + + fs.body = new TTCN!TemplateBody(); + fs.body = self.transformSingleMemberAssignment(m, mad); + field.spec.add(fs); + } + return field; +} + + +operation TDL!DataType getTTCNType() : TTCN!Type { + var type = new TTCN!Type(); + if (resolvePredefined and self.name == "String") { + //TODO: add support for universal + type.`pre` = "charstring"; + } else if (resolvePredefined and self.name == "Integer") { + type.`pre` = "integer"; + } else if (resolvePredefined and self.name == "Boolean") { + type.`pre` = "boolean"; + } else if (resolvePredefined and self.name == "Verdict") { + type.`pre` = "verdicttype"; + } else { + //TODO: use data mapping to overide predefined? + if (useDataMapping) { + //TODO: handle predefined types? + //t.`pre` = "TODO_"+dt.name; + //use mappings, simple approach + var mapping = TDL!DataElementMapping.allInstances().select(m|m.mappableDataElement = self).first(); + if (mapping.isDefined()) { + //t.ref = new TTCN!TypeReference(); + //TODO: check if defined + //t.ref.head = mapping.elementURI; + type.`pre` = mapping.elementURI.replaceAll("\"",""); + } else { + type.`pre` = "MAP_"+self.TTCNname(); + } + } else { + type.ref = new TTCN!TypeReference(); + //TODO: check if defined + type.ref.head = self.equivalent(); + } + } + + return type; +} + +@cached +operation TTCN!TTCN3Module getSDT() : TTCN!SubTypeDefNamed { + if (self.~sdt.isUndefined()) { + var sdt = new TTCN!SubTypeDefNamed(); + sdt.name = self.name+"_SimpleDataType"; + sdt.type = new TTCN!Type(); + //TODO: make configurable? + sdt.type.`pre` = "charstring"; + var body = self.createTypeDefBody(); + body.sub = sdt; + self.~sdt = sdt; + } + return self.~sdt; +} + +@cached +operation String getComponent() : TTCN!ComponentDef { + return TTCN!ComponentDef.allInstances().select(c|c.name = self).first(); +} + +@cached +operation String getFunction() : TTCN!FunctionDef { + return TTCN!FunctionDef.allInstances().select(c|c.name = self).first(); +} + +operation TDL!DataInstanceUse getDataUseValue() : TTCN!Value { + var value = new TTCN!Value(); + value.ref = new TTCN!ReferencedValue(); + value.ref.head = new TTCN!Head(); + if (self.dataInstance.isValue()) { + value.ref.head.target = self.dataInstance.equivalent().defs.list.first(); + } else { + value.ref.head.target = self.dataInstance.equivalent().base; + } + return value; +} + +operation TDL!GateReference checkGateReference() : Boolean { + var accepted = false; + if (self.component.role = TDL!ComponentInstanceRole#Tester) { + accepted = true; + } + if (self.component.role = TDL!ComponentInstanceRole#SUT) { + if (self.eContainer.isKindOf(TDL!Connection)) { + var opposite = self.eContainer.endPoint.select(e|e <> self).first(); + if (opposite.component.role = TDL!ComponentInstanceRole#Tester) { + accepted = true; + } + } + } + return accepted; +} + +operation TDL!GateReference mergeIntoSUT(sut : TTCN!TypeDefBody) { + var pe = new TTCN!PortElement(); + + pe.name = self.component.TTCNname()+"_"+self.gate.TTCNname(); + + var d = new TTCN!ComponentDefList(); + sut.structured.component.defs.add(d); + + d.sc = ";"; + d.element = new TTCN!ComponentElementDef(); + d.element.port = new TTCN!PortInstance(); + + d.element.port.ref = self.gate.type.equivalent(); + d.element.port.instances.add(pe); + + self.equivalent().port = pe; +} + +//TODO: remove parameter? +operation TDL!GateReference createConnectionPort() { + if (self.eContainer.isKindOf(TDL!Connection)) { + var opposite = self.eContainer.endPoint.select(e|e <> self).first(); + + var pe = new TTCN!PortElement(); + + pe.name = self.gate.TTCNname()+"_to_"+opposite.component.TTCNname()+"_"+opposite.gate.TTCNname(); + + var d = new TTCN!ComponentDefList(); + self.component.type.equivalent().defs.add(d); + + d.sc = ";"; + d.element = new TTCN!ComponentElementDef(); + d.element.port = new TTCN!PortInstance(); + + d.element.port.ref = self.gate.type.equivalent(); + d.element.port.instances.add(pe); + + //TODO: check this has no side effects + self.equivalent().port = pe; + } else { + //TODO: handle? + } +} + + +operation TDL!DataInstanceUse getTemplateBody() : TTCN!TemplateBody { + var tb = new TTCN!TemplateBody(); + tb.simple = new TTCN!SimpleSpec(); + tb.simple.expr = new TTCN!Value(); + if (useDataMapping) { + var mapping = TDL!DataElementMapping.allInstances().select(m|m.mappableDataElement = self.dataInstance).first(); + tb.simple.expr.predef = new TTCN!PredefinedValue(); + if (mapping.isDefined()) { + //t.ref = new TTCN!TypeReference(); + //TODO: check if defined + //t.ref.head = mapping.elementURI; + tb.simple.expr.predef.charString = mapping.elementURI.replaceAll("\"",""); + } else { + tb.simple.expr.predef.charString = "MAP_"+self.dataInstance.name; + } + } else { + if (self.dataInstance.isDefined()) { + tb.simple.expr.ref = new TTCN!ReferencedValue(); + tb.simple.expr.ref.head = new TTCN!Head(); + tb.simple.expr.ref.head.target = self.dataInstance.equivalent().base; + } else if (self.dataType.isDefined()) { + (" TODO: "+self.~rule+" : Not supported yet: "+self).log(1); + tb.simple.expr.predef = new TTCN!PredefinedValue(); + tb.simple.expr.predef.charString = "\"TODO_INLINE_DATA_INSTANCE_FOR_"+self.dataType.name+"\""; + } else if (self.item.isDefined()) { + (" TODO: "+self.~rule+" : Not supported yet: "+self).log(1); + tb.simple.expr.predef = new TTCN!PredefinedValue(); + tb.simple.expr.predef.charString = "\"TODO_INLINE_COLLECTION\""; + } else { + (" TODO: "+self.~rule+" : Not supported yet: "+self).log(1); + } + } + return tb; +} + +operation TDL!Behaviour getMainContext(component : TDL!ComponentInstance) : String { + return self.getTestDescription().getMainContext(component); +} + +operation TDL!TestDescription getMainContext(component : TDL!ComponentInstance) : String { + return self.TTCNname()+"_"+component.TTCNname()+"_main"; +} + + +operation TDL!TimeOut getGuardOp() : TTCN!GuardOp { + var op = new TTCN!GuardOp(); + op.timeout = new TTCN!TimeoutStatement(); + op.timeout.ref = new TTCN!TimerRefOrAny(); + op.timeout.ref.ref = self.timer.equivalent(); + return op; +} + +operation TDL!Interaction getGuardOp() : TTCN!GuardOp { + var op = new TTCN!GuardOp(); + op.receive = new TTCN!ReceiveStatement(); + op.receive.any = new TTCN!PortOrAny(); + //TODO: handle broadcast? + //op.receive.any.ref = self.target.first().targetGate.gate.equivalent(); + op.receive.any.ref = self.target.first().targetGate.equivalent().port; + op.receive.receive = new TTCN!PortReceiveOp(); + op.receive.receive.template = new TTCN!InLineTemplate(); + op.receive.receive.template.template = self.argument.getTemplateBody(); + + var t = self.target.first(); + if (not t.valueAssignment.isEmpty()) { + var pr = new TTCN!PortRedirect(); + op.receive.receive.redirect = pr; + pr.value = new TTCN!ValueSpec(); + pr.value.variable = new TTCN!VariableRef(); + pr.value.variable.ref = new TTCN!ReferencedValue(); + pr.value.variable.ref.head = new TTCN!Head(); + pr.value.variable.ref.head.target = t.valueAssignment.get(0).variable.equivalent(); + } + + return op; +} + +operation String getVerdictStatement() : TTCN!FunctionStatement { + var sfs = new TTCN!FunctionStatement(); + sfs.verdict = new TTCN!SetLocalVerdict(); + sfs.verdict.expression = new TTCN!Value(); + //TODO: handle corresponding verdict properly + sfs.verdict.expression.predef = new TTCN!PredefinedValue(); + if (self = "pass") { + sfs.verdict.expression.predef.verdictType = TTCN!VerdictTypeValue#pass; + } else if (self = "fail") { + sfs.verdict.expression.predef.verdictType = TTCN!VerdictTypeValue#fail; + } else if (self = "inconclusive") { + sfs.verdict.expression.predef.verdictType = TTCN!VerdictTypeValue#inconc; + } else { + //TODO + } + return sfs; +} + +operation TDL!DataUse getVerdictStatement() : TTCN!FunctionStatement { + var sfs = new TTCN!FunctionStatement(); + sfs.verdict = new TTCN!SetLocalVerdict(); + sfs.verdict.expression = new TTCN!Value(); + //TODO: handle corresponding verdict properly + if (self.isKindOf(TDL!DataInstanceUse)) { + sfs.verdict.expression.predef = new TTCN!PredefinedValue(); + if (self.dataInstance.name = "pass") { + sfs.verdict.expression.predef.verdictType = TTCN!VerdictTypeValue#pass; + } else if (self.dataInstance.name = "fail") { + sfs.verdict.expression.predef.verdictType = TTCN!VerdictTypeValue#fail; + } else if (self.dataInstance.name = "inconclusive") { + sfs.verdict.expression.predef.verdictType = TTCN!VerdictTypeValue#inconc; + } else { + //TODO + } + } else { + //TODO + } + return sfs; +} + diff --git a/plugins/org.etsi.mts.tdl.ttcn3/epsilon/ttcn3mapping.etl b/plugins/org.etsi.mts.tdl.ttcn3/epsilon/ttcn3mapping.etl index 82d65467..0d9acf99 100644 --- a/plugins/org.etsi.mts.tdl.ttcn3/epsilon/ttcn3mapping.etl +++ b/plugins/org.etsi.mts.tdl.ttcn3/epsilon/ttcn3mapping.etl @@ -2,6 +2,8 @@ import "logging.eol"; import "common.eol"; import "helper.eol"; import "debug.eol"; +import "reusable.eol"; +import "execution.eol"; pre { var modelFile = new Native("java.io.File") (TDL.getModelImpl().getURI().toString().replaceAll("^file:","")); @@ -130,7 +132,7 @@ rule ElementImport2ImportDef e.~kind = e.`function`; } else { //TODO: handle others - ("Imports for " + ie.type.name + " are not supported yet!").log(1); + (" TODO: "+self+" : Imports for " + ie.type.name + " are not supported yet!").log(1); delete e; continue; } @@ -151,11 +153,8 @@ rule ElementImport2ImportDef } else { i.all = new TTCN!AllWithExcepts(); } - - } - rule DRM2ImportDef transform drm : TDL!DataResourceMapping to i : TTCN!ImportDef { @@ -192,8 +191,9 @@ rule DEM2ImportElement e.template.idOrAll.idList = new TTCN!IdentifierList(); e.template.idOrAll.idList.ids.add(dem.elementURI.replaceAll("\"","")); } else { + (" TODO: "+self+" : Not implemented yet: "+dem.mappableDataElement.type.name).log(1); + //TODO: handle others } - //TODO: handle others } } @@ -255,7 +255,6 @@ rule CollectionDT2RoR r.type = dt.itemType.getTTCNType(); } - rule M2SFD transform m : TDL!Member to f : TTCN!StructFieldDef { @@ -277,36 +276,7 @@ rule Action2FD to fd : TTCN!FunctionDef { guard : not useDataMapping - fd.name = a.TTCNname(); - - var md = new TTCN!ModuleDefinition(); - md.def = fd; - var m = a.eContainer.equivalent(); - m.defs.definitions.add(md); - - fd.statement = new TTCN!StatementBlock(); - - //TODO: fix formatting - if (a.formalParameter.notEmpty()) { - fd.parameterList = new TTCN!FunctionFormalParList(); - for (p in a.formalParameter) { - var fp = new TTCN!FunctionFormalPar(); - //TODO: support for value parameters? - // -> process annotation - // -> extract into a rule to make use of equivalent? - fp.template = new TTCN!FormalTemplatePar(); - fp.~kind = fp.template; - - fp.~kind.name = p.TTCNname(); - - //TODO: direction support? - - fp.~kind.type = p.dataType.getTTCNType(); - - fd.parameterList.params.add(fp); - } - } - //TODO: add support for body? + a.transformTo(fd); } //Generative, use mappings instead @@ -314,43 +284,14 @@ rule Function2FD transform f : TDL!Function to fd : TTCN!FunctionDef { guard : not useDataMapping - - fd.name = f.TTCNname(); - var md = new TTCN!ModuleDefinition(); - md.def = fd; - var m = f.eContainer.equivalent(); - m.defs.definitions.add(md); - - fd.statement = new TTCN!StatementBlock(); - - //TODO: fix formatting - if (f.formalParameter.notEmpty()) { - fd.parameterList = new TTCN!FunctionFormalParList(); - for (p in f.formalParameter) { - var fp = new TTCN!FunctionFormalPar(); - //TODO: support for value parameters? - // -> process annotation - // -> extract into a rule to make use of equivalent? - fp.template = new TTCN!FormalTemplatePar(); - fp.~kind = fp.template; - - fp.~kind.name = p.TTCNname(); - - //TODO: direction support? - - fp.~kind.type = p.dataType.getTTCNType(); - - fd.parameterList.params.add(fp); - } - } + f.transformTo(fd); + fd.returnType = new TTCN!ReturnType(); fd.returnType.type = f.returnType.getTTCNType(); - //TODO: add support for body? //TODO: add distinction between value and template? } - rule TC2FD transform tc : TDL!TestConfiguration to fd : TTCN!FunctionDef { @@ -823,6 +764,8 @@ rule StructuredDI2TD //guard : false guard : not useDataMapping and not di.isValue() + di.~rule = self; + var md = new TTCN!ModuleDefinition(); md.def = td; var m = di.eContainer.equivalent(); @@ -869,6 +812,8 @@ rule StructuredDI2C //guard : false guard : not useDataMapping and di.isValue() + di.~rule = self; + var md = new TTCN!ModuleDefinition(); md.def = cd; var m = di.eContainer.equivalent(); @@ -946,6 +891,8 @@ rule CollectionDI2C //guard : false guard : not useDataMapping and di.isValue() + di.~rule = self; + var md = new TTCN!ModuleDefinition(); md.def = cd; var m = di.eContainer.equivalent(); @@ -985,1144 +932,3 @@ rule CollectionDI2C cd.defs.list.add(scd); } - -operation Any getModule() : TTCN!TTCN3Module { - if (self.eContainer.isDefined()) { - if (not self.eContainer.isKindOf(TTCN!TTCN3Module)) { - return self.eContainer.getModule(); - } else { - return self.eContainer; - } - } -} - - -operation Any getElapsedTime() : Any { - var mpElapsedTime = self.getModule().getElapsedTime(); - return mpElapsedTime; -} - -operation TTCN!TTCN3Module getElapsedTime() : Any { - var mpElapsedTime = self.~mpElapsedTime; - return mpElapsedTime; -} - -operation TTCN!TTCN3Module createTypeDefBody() : TTCN!TypeDefBody{ - var md = new TTCN!ModuleDefinition(); - md.def = new TTCN!TypeDef(); - md.def.body = new TTCN!TypeDefBody(); - self.defs.definitions.add(md); - return md.def.body; -} - -operation Any transformSingleMemberAssignment(m : TDL!Member, mad : TDL!DataUse) : TTCN!TemplateBody { - var body = new TTCN!TemplateBody(); - if (mad.isDefined() and mad.isKindOf(TDL!DataInstanceUse)) { - if (mad.dataInstance.isDefined() and mad.argument.isEmpty()) { - body.simple = new TTCN!SimpleSpec(); - body.simple.expr = new TTCN!Value(); - body.simple.expr.ref = new TTCN!ReferencedValue(); - body.simple.expr.ref.head = new TTCN!Head(); - - //Template ->target = BaseTemplate reference - //Constant ->target = SingleConstDef reference - var e = mad.dataInstance.equivalent(); - if (e.isKindOf(TTCN!TemplateDef)) { - body.simple.expr.ref.head.target = e.base; - } else if (e.isKindOf(TTCN!ConstDef)) { - body.simple.expr.ref.head.target = e.defs.list.get(0); - } else { - //what else can it be? - } - - //reduction - //use extended field references - var useEFR = mad.reduction.exists(mr|mr.collectionIndex.isDefined()); - - if (useEFR) { - for (mr in mad.reduction) { - if (mr.member.isDefined()) { - var efr = new TTCN!ExtendedFieldReference(); - efr.field = mr.member.equivalent(); - - body.simple.expr.ref.fields.add(efr); - } - if (mr.collectionIndex.isDefined() - and mr.collectionIndex.dataInstance.isDefined()) { - var efr = new TTCN!ExtendedFieldReference(); - efr.array = new TTCN!Value(); - efr.array.ref = new TTCN!ReferencedValue(); - efr.array.ref.head = new TTCN!Head(); - - var ci = mr.collectionIndex.dataInstance.equivalent(); - if (ci.isKindOf(TTCN!TemplateDef)) { - efr.array.ref.head.target = ci.base; - } else if (ci.isKindOf(TTCN!ConstDef)) { - efr.array.ref.head.target = ci.defs.list.get(0); - } else { - //what else can it be? - } - - body.simple.expr.ref.fields.add(efr); - } - } - } else { - var t = body.simple.expr.ref.head; - for (mr in mad.reduction) { - if (mr.member.isDefined()) { - t.tail = new TTCN!RefValueTail(); - t.tail.value = mr.member.equivalent(); - - } - t = t.tail; - } - } - - } else { - //nested anonymous definitions - //or overriding - (" : "+mad.item).log(1); - if (mad.item.isDefined()) { - body = self.transformDefaultMatchingSymbol(m, mad); - } else { - body.field = mad.transformWildcardMemberAssignment(); - } - } - } else { - body = self.transformDefaultMatchingSymbol(m, mad); - } - return body; -} - -operation Any transformDefaultMatchingSymbol(m : TDL!Member, mad : TDL!DataUse) : TTCN!TemplateBody { - var body = new TTCN!TemplateBody(); - body.simple = new TTCN!SimpleSpec(); - if (mad.isUndefined() - or not mad.isKindOf(TDL!LiteralValueUse)) { - body.simple.spec = new TTCN!SimpleTemplateSpec(); - body.simple.spec.expr = new TTCN!SingleTemplateExpression(); - body.simple.spec.expr.symbol = new TTCN!MatchingSymbol(); - } - if (mad.isUndefined() - and self.unassignedMember.isDefined() - and self.unassignedMember.name = "AnyValueOrOmit") { - if (m.isOptional) { - body.simple.spec.expr.symbol.anyornone = "*"; - } else { - body.simple.spec.expr.symbol.any = "?"; - } - } else if (mad.isUndefined() - and self.unassignedMember.isDefined() - and self.unassignedMember.name = "AnyValue") { - body.simple.spec.expr.symbol.any = "?"; - } else if (mad.isDefined() - and mad.isKindOf(TDL!AnyValue)) { - body.simple.spec.expr.symbol.any = "?"; - } else if (mad.isDefined() - and mad.isKindOf(TDL!AnyValueOrOmit)) { - body.simple.spec.expr.symbol.anyornone = "*"; - } else if (mad.isDefined() - and mad.isKindOf(TDL!LiteralValueUse)) { - //("TODO: Implement full support for literal values : "+mad).log(1); - body.simple.spec = null; - body.simple.expr = new TTCN!Value(); - body.simple.expr.predef = new TTCN!PredefinedValue(); - body.simple.expr.predef.charString = mad.value; - } else if (mad.isDefined()) { - ("TODO: Not Implemented Yet : "+mad).log(1); - body.simple.spec = null; - body.simple.expr = new TTCN!Value(); - body.simple.expr.predef = new TTCN!PredefinedValue(); - body.simple.expr.predef.charString = "\"TODO_NOT_SUPPORTED_YET\""; - } - return body; -} - -operation TDL!StaticDataUse transformWildcardMemberAssignment() : TTCN!FieldSpecList { - //dataInstance? or inferred type - //unassignedMember? - //argument -> ParameterBinding (parameter:Member, dataUse:DataUse) - //reduction? -> MemberReference - var field = new TTCN!FieldSpecList(); - var t; - if (self.dataInstance.isDefined()) { - t = self.dataInstance.dataType; - ("DI:"+self.dataInstance.name).log(1); - } else { - if (self.eContainer.isKindOf(TDL!ParameterBinding)) { - t = self.eContainer.parameter.dataType; - } else if (self.eContainer.isKindOf(TDL!MemberAssignment)) { - t = self.eContainer.member.dataType; - } else { - ("TODO: Context Not Implemented Yet").log(1); - } - } - if (self.item.isDefined() or t.isKindOf(TDL!CcollectionDataType)) { - ("TODO: Collections not supported yet: "+self).log(1); - (" "+t.name).log(1); - var it = t.itemType; - - var fs = new TTCN!FieldSpec(); - field.spec.add(fs); - } else { - for (m in t.allMembers()) { - var fs = new TTCN!FieldSpec(); - fs.ref = m.equivalent(); - - var mad; - var ma = self.argument.selectOne(a|a.parameter = m); - //default: no wildcard, defined - //in case not defined, check for inherited - if (ma.isDefined()) { - mad = ma.dataUse; - } else if (ma.isUndefined() - and self.isKindOf(TDL!DataInstanceUse) - and self.dataInstance.isDefined()) { - var mai = self.dataInstance.memberAssignment.selectOne(a|a.member = m); - if (mai.isDefined()) { - mad = mai.memberSpec; - } - } else { - - } - - fs.body = self.transformSingleMemberAssignment(m, mad); - field.spec.add(fs); - } - } - return field; -} - -operation TDL!StructuredDataInstance transformWildcardMemberAssignment() : TTCN!FieldSpecList { - var field = new TTCN!FieldSpecList(); - for (m in self.dataType.allMembers()) { - var fs = new TTCN!FieldSpec(); - fs.ref = m.equivalent(); - - var ma = self.memberAssignment.selectOne(ma|ma.member = m); - var mad; - if (ma.isDefined()) { - mad = ma.memberSpec; - } - - fs.body = new TTCN!TemplateBody(); - fs.body = self.transformSingleMemberAssignment(m, mad); - field.spec.add(fs); - } - return field; -} - -//TODO: deprecated? -operation TDL!StructuredDataInstance transformMemberAssignment() : TTCN!CompoundExpression { - var expr; - if (not self.memberAssignment.isEmpty()) { - expr = new TTCN!FieldExpressionList(); - for (ma in self.memberAssignment) { - var fes = new TTCN!FieldExpressionSpec(); - fes.fieldRef = ma.member.equivalent(); - - //ma.memberSpec - fes.expr = new TTCN!Value(); - if (ma.memberSpec.isKindOf(TDL!DataInstanceUse) - and ma.memberSpec.dataInstance.isDefined()) { - fes.expr.ref = new TTCN!ReferencedValue(); - fes.expr.ref.head = new TTCN!Head(); - - //Template ->target = BaseTemplate reference - //Constant ->target = SingleConstDef reference - var e = ma.memberSpec.dataInstance.equivalent(); - if (e.isKindOf(TTCN!TemplateDef)) { - fes.expr.ref.head.target = e.base; - } else if (e.isKindOf(TTCN!ConstDef)) { - fes.expr.ref.head.target = e.defs.list.get(0); - } else { - //what else can it be? - } - //TODO: handle overriding parameters? - } else { - fes.expr.predef = new TTCN!PredefinedValue(); - fes.expr.predef.charString = "\"TODO: Not Implemented Yet\""; - } - - expr.specs.add(fes); - } - //TODO: handle unassigned members? -> add guards to corresponding rule - //TODO: handle special characters - var assigned = self.memberAssignment.collect(ma|ma.member); - for (m in self.dataType.allMembers().excludingAll(assigned)) { - (self.name + ": Skipping unassigned member "+m.name).log(1); - } - - } else { - (" TODO: What is going on here: "+self).log(1); - expr = new TTCN!ArrayExpression(); - } - return expr; - -} - -operation TDL!DataType getTTCNType() : TTCN!Type { - var type = new TTCN!Type(); - if (resolvePredefined and self.name == "String") { - //TODO: add support for universal - type.`pre` = "charstring"; - } else if (resolvePredefined and self.name == "Integer") { - type.`pre` = "integer"; - } else if (resolvePredefined and self.name == "Boolean") { - type.`pre` = "boolean"; - } else if (resolvePredefined and self.name == "Verdict") { - type.`pre` = "verdicttype"; - } else { - //TODO: use data mapping to overide predefined? - if (useDataMapping) { - //TODO: handle predefined types? - //t.`pre` = "TODO_"+dt.name; - //use mappings, simple approach - var mapping = TDL!DataElementMapping.allInstances().select(m|m.mappableDataElement = self).first(); - if (mapping.isDefined()) { - //t.ref = new TTCN!TypeReference(); - //TODO: check if defined - //t.ref.head = mapping.elementURI; - type.`pre` = mapping.elementURI.replaceAll("\"",""); - } else { - type.`pre` = "MAP_"+self.TTCNname(); - } - } else { - type.ref = new TTCN!TypeReference(); - //TODO: check if defined - type.ref.head = self.equivalent(); - } - } - - return type; -} - -@cached -operation TTCN!TTCN3Module getSDT() : TTCN!SubTypeDefNamed { - if (self.~sdt.isUndefined()) { - var sdt = new TTCN!SubTypeDefNamed(); - sdt.name = self.name+"_SimpleDataType"; - sdt.type = new TTCN!Type(); - //TODO: make configurable? - sdt.type.`pre` = "charstring"; - var body = self.createTypeDefBody(); - body.sub = sdt; - self.~sdt = sdt; - } - return self.~sdt; -} - -@cached -operation String getComponent() : TTCN!ComponentDef { - return TTCN!ComponentDef.allInstances().select(c|c.name = self).first(); -} - -@cached -operation String getFunction() : TTCN!FunctionDef { - return TTCN!FunctionDef.allInstances().select(c|c.name = self).first(); -} - -operation TDL!DataInstanceUse getDataUseValue() : TTCN!Value { - var value = new TTCN!Value(); - value.ref = new TTCN!ReferencedValue(); - value.ref.head = new TTCN!Head(); - if (self.dataInstance.isValue()) { - value.ref.head.target = self.dataInstance.equivalent().defs.list.first(); - } else { - value.ref.head.target = self.dataInstance.equivalent().base; - } - return value; -} - -operation TDL!GateReference checkGateReference() : Boolean { - var accepted = false; - if (self.component.role = TDL!ComponentInstanceRole#Tester) { - accepted = true; - } - if (self.component.role = TDL!ComponentInstanceRole#SUT) { - if (self.eContainer.isKindOf(TDL!Connection)) { - var opposite = self.eContainer.endPoint.select(e|e <> self).first(); - if (opposite.component.role = TDL!ComponentInstanceRole#Tester) { - accepted = true; - } - } - } - return accepted; -} - -operation TDL!GateReference mergeIntoSUT(sut : TTCN!TypeDefBody) { - var pe = new TTCN!PortElement(); - - pe.name = self.component.TTCNname()+"_"+self.gate.TTCNname(); - - var d = new TTCN!ComponentDefList(); - sut.structured.component.defs.add(d); - - d.sc = ";"; - d.element = new TTCN!ComponentElementDef(); - d.element.port = new TTCN!PortInstance(); - - d.element.port.ref = self.gate.type.equivalent(); - d.element.port.instances.add(pe); - - self.equivalent().port = pe; -} - -//TODO: remove parameter? -operation TDL!GateReference createConnectionPort() { - if (self.eContainer.isKindOf(TDL!Connection)) { - var opposite = self.eContainer.endPoint.select(e|e <> self).first(); - - var pe = new TTCN!PortElement(); - - pe.name = self.gate.TTCNname()+"_to_"+opposite.component.TTCNname()+"_"+opposite.gate.TTCNname(); - - var d = new TTCN!ComponentDefList(); - self.component.type.equivalent().defs.add(d); - - d.sc = ";"; - d.element = new TTCN!ComponentElementDef(); - d.element.port = new TTCN!PortInstance(); - - d.element.port.ref = self.gate.type.equivalent(); - d.element.port.instances.add(pe); - - //TODO: check this has no side effects - self.equivalent().port = pe; - } else { - //TODO: handle? - } -} - - -operation TDL!DataInstanceUse getTemplateBody() : TTCN!TemplateBody { - var tb = new TTCN!TemplateBody(); - tb.simple = new TTCN!SimpleSpec(); - tb.simple.expr = new TTCN!Value(); - if (useDataMapping) { - var mapping = TDL!DataElementMapping.allInstances().select(m|m.mappableDataElement = self.dataInstance).first(); - tb.simple.expr.predef = new TTCN!PredefinedValue(); - if (mapping.isDefined()) { - //t.ref = new TTCN!TypeReference(); - //TODO: check if defined - //t.ref.head = mapping.elementURI; - tb.simple.expr.predef.charString = mapping.elementURI.replaceAll("\"",""); - } else { - tb.simple.expr.predef.charString = "MAP_"+self.dataInstance.name; - } - } else { - if (self.dataInstance.isDefined()) { - tb.simple.expr.ref = new TTCN!ReferencedValue(); - tb.simple.expr.ref.head = new TTCN!Head(); - tb.simple.expr.ref.head.target = self.dataInstance.equivalent().base; - } else if (self.dataType.isDefined()) { - tb.simple.expr.predef = new TTCN!PredefinedValue(); - tb.simple.expr.predef.charString = "\"TODO_INLINE_DATA_INSTANCE_FOR_"+self.dataType.name+"\""; - } else if (self.item.isDefined()) { - tb.simple.expr.predef = new TTCN!PredefinedValue(); - tb.simple.expr.predef.charString = "\"TODO_INLINE_COLLECTION\""; - } else { - ("Not supported yet: "+self).log(1); - } - } - return tb; -} - -operation TDL!Interaction executeSource() : TTCN!FunctionStatementList { - var ssl = new TTCN!FunctionStatementList(); - - var sfs = new TTCN!FunctionStatement(); - sfs.communication = new TTCN!CommunicationStatements(); - sfs.communication.send = new TTCN!SendStatement(); - //sfs.communication.send.port = self.sourceGate.gate.equivalent(); - sfs.communication.send.port = self.sourceGate.equivalent().port; - sfs.communication.send.send = new TTCN!PortSendOp(); - sfs.communication.send.send.template = new TTCN!InLineTemplate(); - sfs.communication.send.send.template.template = self.argument.getTemplateBody(); - - ssl.statements.add(sfs); - ssl.sc.add(";"); - return ssl; -} - -operation TDL!Interaction executeTarget(t : TDL!Target) : TTCN!FunctionStatementList { - var tsl = new TTCN!FunctionStatementList(); - - var tfs = new TTCN!FunctionStatement(); - tfs.communication = new TTCN!CommunicationStatements(); - tfs.communication.receive = new TTCN!ReceiveStatement(); - tfs.communication.receive.any = new TTCN!PortOrAny(); - //tfs.communication.receive.any.ref = t.targetGate.gate.equivalent(); - tfs.communication.receive.any.ref = t.targetGate.equivalent().port; - tfs.communication.receive.receive = new TTCN!PortReceiveOp(); - tfs.communication.receive.receive.template = new TTCN!InLineTemplate(); - tfs.communication.receive.receive.template.template = self.argument.getTemplateBody(); - - if (not t.valueAssignment.isEmpty()) { - var pr = new TTCN!PortRedirect(); - tfs.communication.receive.receive.redirect = pr; - pr.value = new TTCN!ValueSpec(); - pr.value.variable = new TTCN!VariableRef(); - pr.value.variable.ref = new TTCN!ReferencedValue(); - pr.value.variable.ref.head = new TTCN!Head(); - pr.value.variable.ref.head.target = t.valueAssignment.get(0).variable.equivalent(); - } - - tsl.statements.add(tfs); - tsl.sc.add(";"); - return tsl; -} - -operation TDL!Interaction execute() { - //TODO: needs adapting to context - // add a statement block stack for each component during transformation? - - //TODO: simplify - - //source behaviour - if ((simulateSUT or self.sourceGate.component.role = TDL!ComponentInstanceRole#Tester) - and (currentScope.isUndefined() or currentScope = self.sourceGate.component) - ) { - var sc = self.getMainContext(self.sourceGate.component); - var sb = stack.get(sc).last(); - var ssl = self.executeSource(); - sb.stat.add(ssl); - } - - //TODO: handle multicast? - //target behaviour - if ((simulateSUT or self.target.first().targetGate.component.role = TDL!ComponentInstanceRole#Tester) - and (currentScope.isUndefined() or currentScope = self.target.first().targetGate.component) - ) { - var tc = self.getMainContext(self.target.first().targetGate.component); - var tb = stack.get(tc).last(); - var t = self.target.first(); - var tsl = self.executeTarget(t); - tb.stat.add(tsl); - } - //inlined above - //self.execute(sb, tb); -} - -//TODO: remove? (inlined above) -operation TDL!Interaction execute(sourceContext : TTCN!StatementBlock, targetContext : TTCN!StatementBlock) { - //source behaviour - var ssl = self.executeSource(); - sourceContext.stat.add(ssl); - //TODO: handle multicast? - //target behaviour - var t = self.target.first(); - var tsl = self.executeTarget(t); - targetContext.stat.add(tsl); -} - -operation TDL!Behaviour getMainContext(component : TDL!ComponentInstance) : String { - return self.getTestDescription().getMainContext(component); -} - -operation TDL!TestDescription getMainContext(component : TDL!ComponentInstance) : String { - return self.TTCNname()+"_"+component.TTCNname()+"_main"; -} - - -operation TDL!AlternativeBehaviour execute() { - if (not transformAlt) return; - var td = self.getTestDescription(); - //TODO: naive simplified assumption - var fb = self.block.first().behaviour.first(); - if (fb.isKindOf(TDL!Interaction)) { - if (simulateSUT or fb.sourceGate.component.role = TDL!ComponentInstanceRole#Tester) { - var sc = self.getMainContext(fb.sourceGate.component); - var sb = stack.get(sc).last(); - self.executeSource(sb); - } - - if (simulateSUT or fb.target.first().targetGate.component.role = TDL!ComponentInstanceRole#Tester) { - var tc = self.getMainContext(fb.target.first().targetGate.component); - var tb = stack.get(tc).last(); - self.executeTarget(tb); - } - } - -} - -operation TDL!AlternativeBehaviour executeTarget(targetContext : TTCN!StatementBlock) { - var tsl = self.executeTarget(); - targetContext.stat.add(tsl); -} - -operation TDL!AlternativeBehaviour executeSource(sourceContext : TTCN!StatementBlock) { - //TODO: simple assumption - trigger first - //TODO: needs to follow path, right now triggers first interactions in other branches as well - var fb = self.block.first().behaviour.first(); - if (fb.isKindOf(TDL!Interaction)) { - var ssl = fb.executeSource(); - sourceContext.stat.add(ssl); - } -} - -operation TDL!AlternativeBehaviour checkPath() : Boolean { - var first = true; - if (self.eContainer.isDefined()) { - if (self.eContainer.isKindOf(TDL!Block)) { - if (self.eContainer.eContainer.isKindOf(TDL!AlternativeBehaviour)) { - if (self.eContainer.eContainer.block.indexOf(self.eContainer) <> 0) { - first = false; - } else { - first = self.eContainer.eContainer.checkPath(); - } - } - } - } - - return first; -} - - -operation TDL!AlternativeBehaviour executeTarget() : TTCN!FunctionStatementList { - if (not transformAlt) return; - //TODO - - //target only so far.. - //where should this be placed? in the receiving side? - //how about source - //TODO: add explicit scoping - - var tsl = new TTCN!FunctionStatementList(); - - var fs = new TTCN!FunctionStatement(); - fs.behavior = new TTCN!BehaviourStatements(); - fs.behavior.alt = new TTCN!AltConstruct(); - fs.behavior.alt.agList = new TTCN!AltGuardList(); - - for (block in self.block) { - var gs = block.executeAltBlock(); - fs.behavior.alt.agList.guardList.add(gs); - } - - tsl.statements.add(fs); - //tsl.sc.add(";"); - return tsl; -} - - -operation TDL!Block executeAltBlock() : TTCN!GuardStatement { - var gs = new TTCN!GuardStatement(); - gs.`guard` = new TTCN!AltGuardChar(); - //TODO: expression - - gs.block = new TTCN!StatementBlock(); - - //naive assumption - if (self.behaviour.first().isKindOf(TDL!Interaction)) { - var cf = self.behaviour.first().getMainContext(self.behaviour.first().target.first().targetGate.component); - stack.get(cf).add(gs.block); - - var i = 0; - for (b in self.behaviour) { - if (i==0) { - //this should be redundant now - if (b.isKindOf(TDL!Interaction)) { - gs.op = b.getGuardOp(); - } else { - //TODO: handle other behaviours? - } - } else { - b.execute(); - } - i = i+1; - } - - stack.get(cf).remove(gs.block); - } else if (self.behaviour.first().isKindOf(TDL!TimeOut)) { - var cf = self.behaviour.first().getMainContext(self.behaviour.first().componentInstance); - stack.get(cf).add(gs.block); - - var i = 0; - for (b in self.behaviour) { - if (i==0) { - //this should be redundant now - if (b.isKindOf(TDL!TimeOut)) { - gs.op = b.getGuardOp(); - } else { - //TODO: handle other behaviours? - } - } else { - b.execute(); - } - i = i+1; - } - - stack.get(cf).remove(gs.block); - - } else { - //TODO - } - - //TODO: statement block - return gs; -} - -operation TDL!TimeOut getGuardOp() : TTCN!GuardOp { - var op = new TTCN!GuardOp(); - op.timeout = new TTCN!TimeoutStatement(); - op.timeout.ref = new TTCN!TimerRefOrAny(); - op.timeout.ref.ref = self.timer.equivalent(); - return op; -} - -operation TDL!Interaction getGuardOp() : TTCN!GuardOp { - var op = new TTCN!GuardOp(); - op.receive = new TTCN!ReceiveStatement(); - op.receive.any = new TTCN!PortOrAny(); - //TODO: handle broadcast? - //op.receive.any.ref = self.target.first().targetGate.gate.equivalent(); - op.receive.any.ref = self.target.first().targetGate.equivalent().port; - op.receive.receive = new TTCN!PortReceiveOp(); - op.receive.receive.template = new TTCN!InLineTemplate(); - op.receive.receive.template.template = self.argument.getTemplateBody(); - - var t = self.target.first(); - if (not t.valueAssignment.isEmpty()) { - var pr = new TTCN!PortRedirect(); - op.receive.receive.redirect = pr; - pr.value = new TTCN!ValueSpec(); - pr.value.variable = new TTCN!VariableRef(); - pr.value.variable.ref = new TTCN!ReferencedValue(); - pr.value.variable.ref.head = new TTCN!Head(); - pr.value.variable.ref.head.target = t.valueAssignment.get(0).variable.equivalent(); - } - - return op; -} - -operation TDL!BoundedLoopBehaviour execute() { - //TODO: no component? - for (le in self.numIteration) { - currentScope = le.scope; - var sc = self.getMainContext(le.scope); - var sb = stack.get(sc).last(); - - var tsl = new TTCN!FunctionStatementList(); - sb.stat.add(tsl); - - var fs = new TTCN!FunctionStatement(); - fs.basic = new TTCN!BasicStatements(); - fs.basic.loop = new TTCN!LoopConstruct(); - fs.basic.loop.forStm = new TTCN!ForStatement(); - - tsl.statements.add(fs); - - var init = new TTCN!Initial(); - fs.basic.loop.forStm.init = init; - - var cv = new TTCN!SingleVarInstance(); - - var exp = new TTCN!RelExpression(); - fs.basic.loop.forStm.expression = exp; - - //init - if (le.expression.isKindOf(TDL!DataInstanceUse)) { - - cv.name = "cv"; - cv.ac = ":="; - cv.expr = new TTCN!Value(); - cv.expr.predef = new TTCN!PredefinedValue(); - cv.expr.predef.integer = "0"; - - init.variable = new TTCN!VarInstance(); - //TODO: add more comprehensive resolution - init.variable.listType = le.expression.dataInstance.dataType.getTTCNType(); - init.variable.list = new TTCN!VarList(); - init.variable.list.variables.add(cv); - - //TODO: the TTCN3 grammar needs to save the operators - - //control - exp.left = new TTCN!Value(); - exp.left.ref = new TTCN!ReferencedValue(); - exp.left.ref.head = new TTCN!Head(); - exp.left.ref.head.target = cv; - - exp.right = new TTCN!Value(); - exp.right.ref = new TTCN!ReferencedValue(); - exp.right.ref.head = new TTCN!Head(); - if (le.expression.dataInstance.isValue()) { - exp.right.ref.head.target = le.expression.dataInstance.equivalent().defs.list.first(); - } else { - //can it even be template? - exp.right.ref.head.target = le.expression.dataInstance.equivalent().base; - } - - } else { - //TODO: - } - - //increment - var assign = new TTCN!Assignment(); - assign.ref = new TTCN!VariableRef(); - assign.ref.ref = new TTCN!ReferencedValue(); - assign.ref.ref.head = new TTCN!Head(); - assign.ref.ref.head.target = cv; - - assign.expression = new TTCN!AddExpression(); - assign.expression.left = new TTCN!Value(); - assign.expression.left.ref = new TTCN!ReferencedValue(); - assign.expression.left.ref.head = new TTCN!Head(); - assign.expression.left.ref.head.target = cv; - - assign.expression.right = new TTCN!Value(); - assign.expression.right.predef = new TTCN!PredefinedValue(); - assign.expression.right.predef.integer = "1"; - - fs.basic.loop.forStm.assign = assign; - - var block = new TTCN!StatementBlock(); - - fs.basic.loop.forStm.statement = block; - - var cf = self.getMainContext(le.scope); - stack.get(cf).add(block); - - for (b in self.block.behaviour) { - b.execute(); - } - - stack.get(cf).remove(block); - currentScope = null; - } - -} - -operation TDL!UnboundedLoopBehaviour execute() { - //TODO - for (b in self.block.behaviour) { - b.execute(); - } -} - - -operation TDL!ConditionalBehaviour execute() { - var guards = self.block.get(0).`guard`; - - for (le in guards) { - currentScope = le.scope; - var sc = self.getMainContext(le.scope); - var sb = stack.get(sc).last(); - - var tsl = new TTCN!FunctionStatementList(); - sb.stat.add(tsl); - - var sfs = new TTCN!FunctionStatement(); - sfs.basic = new TTCN!BasicStatements(); - sfs.basic.conditional = new TTCN!ConditionalConstruct(); - - //condition - sfs.basic.conditional.expression = le.expression.getDataUseValue(); - - tsl.statements.add(sfs); - - //main block - var block = new TTCN!StatementBlock(); - sfs.basic.conditional.statement = block; - - var cf = self.getMainContext(le.scope); - stack.get(cf).add(block); - - for (b in self.block.get(0).behaviour) { - b.execute(); - } - - stack.get(cf).remove(block); - - //TODO: else ifs - //else block - if (self.block.size() > 1) { - sfs.basic.conditional.`else` = new TTCN!ElseClause(); - - var eBlock = new TTCN!StatementBlock(); - sfs.basic.conditional.`else`.statement = eBlock; - - stack.get(cf).add(eBlock); - for (b in self.block.last().behaviour) { - b.execute(); - } - stack.get(cf).remove(eBlock); - } - - currentScope = null; - } -} - - -operation TDL!tdl::Assignment execute() { - var ci = self.variable.componentInstance; - if (simulateSUT or ci.role = TDL!ComponentInstanceRole#Tester) { - var sc = self.getMainContext(ci); - var sb = stack.get(sc).last(); - - var ssl = new TTCN!FunctionStatementList(); - - var sfs = new TTCN!FunctionStatement(); - - sfs.basic = new TTCN!BasicStatements(); - sfs.basic.assign = new TTCN!Assignment(); - sfs.basic.assign.ref = new TTCN!VariableRef(); - sfs.basic.assign.ref.ref = new TTCN!ReferencedValue(); - sfs.basic.assign.ref.ref.head = new TTCN!Head(); - sfs.basic.assign.ref.ref.head.target = self.variable.variable.equivalent(); - - sfs.basic.assign.expression = self.expression.getDataUseValue(); - - ssl.statements.add(sfs); - ssl.sc.add(";"); - - sb.stat.add(ssl); - } -} - -operation TDL!Assertion execute() { - var ci = self.componentInstance; - if (simulateSUT or ci.role = TDL!ComponentInstanceRole#Tester) { - var sc = self.getMainContext(ci); - var sb = stack.get(sc).last(); - var ssl = new TTCN!FunctionStatementList(); - - var sfs = new TTCN!FunctionStatement(); - sfs.basic = new TTCN!BasicStatements(); - sfs.basic.conditional = new TTCN!ConditionalConstruct(); - - //condition - sfs.basic.conditional.expression = self.condition.getDataUseValue(); - - //statements - pass - sfs.basic.conditional.statement = new TTCN!StatementBlock(); - var psl = new TTCN!FunctionStatementList(); - psl.statements.add("pass".getVerdictStatement()); - sfs.basic.conditional.statement.stat.add(psl); - - //else - otherwise verdict - sfs.basic.conditional.`else` = new TTCN!ElseClause(); - sfs.basic.conditional.`else`.statement = new TTCN!StatementBlock(); - var osl = new TTCN!FunctionStatementList(); - if (self.otherwise.isDefined()) { - osl.statements.add(self.otherwise.getVerdictStatement()); - } else { - osl.statements.add("fail".getVerdictStatement()); - } - sfs.basic.conditional.`else`.statement.stat.add(osl); - - ssl.statements.add(sfs); - ssl.sc.add(";"); - - sb.stat.add(ssl); - } -} - -operation TDL!ActionReference execute() { - var ci = self.componentInstance; - if (simulateSUT or ci.role = TDL!ComponentInstanceRole#Tester) { - var sc = self.getMainContext(ci); - var sb = stack.get(sc).last(); - var ssl = new TTCN!FunctionStatementList(); - - var sfs = new TTCN!FunctionStatement(); - - sfs.behavior = new TTCN!BehaviourStatements(); - sfs.behavior.`function` = new TTCN!FunctionInstance(); - sfs.behavior.`function`.ref = self.action.equivalent(); - - if (not self.actualParameter.isEmpty()) { - var pl = new TTCN!FunctionActualParList(); - sfs.behavior.`function`.params = pl; - - for (ap in self.actualParameter) { - var p = new TTCN!FunctionActualPar(); - p.template = new TTCN!InLineTemplate(); - p.template.template = new TTCN!TemplateBody(); - p.template.template.simple = new TTCN!SimpleSpec(); - p.template.template.simple.expr = ap.dataUse.getDataUseValue(); - pl.params.add(p); - } - } - - ssl.statements.add(sfs); - ssl.sc.add(";"); - - sb.stat.add(ssl); - } -} - -operation TDL!TestDescriptionReference execute() { - //TODO: support parameters (also in initialisation in TD2FD) - //TODO: support bindings - for (ci in self.getTestDescription().testConfiguration.componentInstance.select(c|simulateSUT or c.role = TDL!ComponentInstanceRole#Tester)) { - var sc = self.getMainContext(ci); - var sb = stack.get(sc).last(); - - var tc = self.testDescription.getMainContext(ci); - var cf = TTCN!FunctionDef.all().select(f|f.name = tc).first(); - if (cf.isDefined()) { - var ssl = new TTCN!FunctionStatementList(); - var s = new TTCN!FunctionStatement(); - s.behavior = new TTCN!BehaviourStatements(); - s.behavior.`function` = new TTCN!FunctionInstance(); - s.behavior.`function`.ref = cf; - ssl.statements.add(s); - ssl.sc.add(";"); - sb.stat.add(ssl); - } else { - (" Could not resolve "+tc).log(1); - //TODO - } - } -} - - -operation TDL!VerdictAssignment execute() { - for (ci in self.getTestDescription().testConfiguration.componentInstance.select(c|simulateSUT or c.role = TDL!ComponentInstanceRole#Tester)) { - var sc = self.getMainContext(ci); - var sb = stack.get(sc).last(); - - var ssl = new TTCN!FunctionStatementList(); - - var sfs = self.verdict.getVerdictStatement(); - - ssl.statements.add(sfs); - ssl.sc.add(";"); - - sb.stat.add(ssl); - } -} - -operation String getVerdictStatement() : TTCN!FunctionStatement { - var sfs = new TTCN!FunctionStatement(); - sfs.verdict = new TTCN!SetLocalVerdict(); - sfs.verdict.expression = new TTCN!Value(); - //TODO: handle corresponding verdict properly - sfs.verdict.expression.predef = new TTCN!PredefinedValue(); - if (self = "pass") { - sfs.verdict.expression.predef.verdictType = TTCN!VerdictTypeValue#pass; - } else if (self = "fail") { - sfs.verdict.expression.predef.verdictType = TTCN!VerdictTypeValue#fail; - } else if (self = "inconclusive") { - sfs.verdict.expression.predef.verdictType = TTCN!VerdictTypeValue#inconc; - } else { - //TODO - } - return sfs; -} - - -operation TDL!DataUse getVerdictStatement() : TTCN!FunctionStatement { - var sfs = new TTCN!FunctionStatement(); - sfs.verdict = new TTCN!SetLocalVerdict(); - sfs.verdict.expression = new TTCN!Value(); - //TODO: handle corresponding verdict properly - if (self.isKindOf(TDL!DataInstanceUse)) { - sfs.verdict.expression.predef = new TTCN!PredefinedValue(); - if (self.dataInstance.name = "pass") { - sfs.verdict.expression.predef.verdictType = TTCN!VerdictTypeValue#pass; - } else if (self.dataInstance.name = "fail") { - sfs.verdict.expression.predef.verdictType = TTCN!VerdictTypeValue#fail; - } else if (self.dataInstance.name = "inconclusive") { - sfs.verdict.expression.predef.verdictType = TTCN!VerdictTypeValue#inconc; - } else { - //TODO - } - } else { - //TODO - } - return sfs; -} - -operation TDL!CompoundBehaviour execute() { - //TODO - for (b in self.block.behaviour) { - b.execute(); - } -} - - -operation TDL!TimerStart execute() { - var ci = self.componentInstance; - if (simulateSUT or ci.role = TDL!ComponentInstanceRole#Tester) { - var sc = self.getMainContext(ci); - var sb = stack.get(sc).last(); - var ssl = new TTCN!FunctionStatementList(); - - var sfs = new TTCN!FunctionStatement(); - - sfs.timer = new TTCN!TimerStatements(); - sfs.timer.start = new TTCN!StartTimerStatement(); - sfs.timer.start.ref = self.timer.equivalent(); - sfs.timer.start.expr = self.period.getDataUseValue(); - - ssl.statements.add(sfs); - ssl.sc.add(";"); - - sb.stat.add(ssl); - } -} - -operation TDL!TimerStop execute() { - var ci = self.componentInstance; - if (simulateSUT or ci.role = TDL!ComponentInstanceRole#Tester) { - var sc = self.getMainContext(ci); - var sb = stack.get(sc).last(); - var ssl = new TTCN!FunctionStatementList(); - - var sfs = new TTCN!FunctionStatement(); - - sfs.timer = new TTCN!TimerStatements(); - sfs.timer.stop = new TTCN!StopTimerStatement(); - sfs.timer.stop.ref = new TTCN!TimerRefOrAll(); - sfs.timer.stop.ref.ref = self.timer.equivalent(); - - ssl.statements.add(sfs); - ssl.sc.add(";"); - - sb.stat.add(ssl); - } -} - -operation TDL!TimeOut execute() { - //TODO: handle in an alt statement? - var ci = self.componentInstance; - if (simulateSUT or ci.role = TDL!ComponentInstanceRole#Tester) { - var sc = self.getMainContext(ci); - var sb = stack.get(sc).last(); - var ssl = new TTCN!FunctionStatementList(); - - var sfs = new TTCN!FunctionStatement(); - - sfs.timer = new TTCN!TimerStatements(); - sfs.timer.timeout = new TTCN!TimeoutStatement(); - sfs.timer.timeout.ref = new TTCN!TimerRefOrAny(); - sfs.timer.timeout.ref.ref = self.timer.equivalent(); - - ssl.statements.add(sfs); - ssl.sc.add(";"); - - sb.stat.add(ssl); - } -} - - -operation TDL!Behaviour execute() { - (" Skipping " +self.type.name+" (not yet supported)").println(); - if (self.type.name = "ParallelBehaviour" and false) { - (indent+"group Parallel").printlno(); - var i = 0; - for (block in self.block) { - for (b in block.behaviour) { - b.execute(indent+" "); - } - if (i <= block.size()) { - (indent+"else").printlno(); - } - i = i+1; - } - (indent+"end").printlno(); - } -} -- GitLab