diff --git a/rpgJavaInterpreter-core/src/main/kotlin/com/smeup/rpgparser/interpreter/interpretation_utils.kt b/rpgJavaInterpreter-core/src/main/kotlin/com/smeup/rpgparser/interpreter/interpretation_utils.kt index 778f7e8b5..d9578b0e9 100644 --- a/rpgJavaInterpreter-core/src/main/kotlin/com/smeup/rpgparser/interpreter/interpretation_utils.kt +++ b/rpgJavaInterpreter-core/src/main/kotlin/com/smeup/rpgparser/interpreter/interpretation_utils.kt @@ -54,7 +54,7 @@ fun CompilationUnit.activationGroupType(): ActivationGroupType? { } } -fun ActivationGroupType.assignedName(current: RpgProgram, caller: RpgProgram?): String { +fun ActivationGroupType.assignedName(caller: RpgProgram?): String { return when (this) { is CallerActivationGroup -> { require(caller != null) { "caller is mandatory" } @@ -62,7 +62,6 @@ fun ActivationGroupType.assignedName(current: RpgProgram, caller: RpgProgram?): } is NewActivationGroup -> UUID.randomUUID().toString() is NamedActivationGroup -> groupName - else -> error("$this ActivationGroupType is not yet handled") } } diff --git a/rpgJavaInterpreter-core/src/main/kotlin/com/smeup/rpgparser/interpreter/program.kt b/rpgJavaInterpreter-core/src/main/kotlin/com/smeup/rpgparser/interpreter/program.kt index c885eceec..65e48b7c5 100644 --- a/rpgJavaInterpreter-core/src/main/kotlin/com/smeup/rpgparser/interpreter/program.kt +++ b/rpgJavaInterpreter-core/src/main/kotlin/com/smeup/rpgparser/interpreter/program.kt @@ -130,17 +130,21 @@ class RpgProgram(val cu: CompilationUnit, val name: String = " NamedActivationGroup(MainExecutionContext.getConfiguration().defaultActivationGroupName) - else -> { - CallerActivationGroup - } + val activationGroupType = cu.activationGroupType()?.let { + when { + // When there is no caller use the default activation group + it is CallerActivationGroup && caller == null -> + NamedActivationGroup(MainExecutionContext.getConfiguration().defaultActivationGroupName) + else -> it } - activationGroupType.let { - activationGroup = ActivationGroup(it, it.assignedName(this, caller)) + } ?: when (caller) { + // for main program, which does not have a caller, activation group is fixed by config + null -> NamedActivationGroup(MainExecutionContext.getConfiguration().defaultActivationGroupName) + else -> CallerActivationGroup } + + activationGroup = ActivationGroup(activationGroupType, activationGroupType.assignedName(caller)) } MainExecutionContext.getProgramStack().push(this) MainExecutionContext.getConfiguration().jarikoCallback.onEnterPgm(name, interpreter.getGlobalSymbolTable()) diff --git a/rpgJavaInterpreter-core/src/test/kotlin/com/smeup/rpgparser/interpreter/ActivationGroupTest.kt b/rpgJavaInterpreter-core/src/test/kotlin/com/smeup/rpgparser/interpreter/ActivationGroupTest.kt index 000c36073..ab809d2fc 100644 --- a/rpgJavaInterpreter-core/src/test/kotlin/com/smeup/rpgparser/interpreter/ActivationGroupTest.kt +++ b/rpgJavaInterpreter-core/src/test/kotlin/com/smeup/rpgparser/interpreter/ActivationGroupTest.kt @@ -36,6 +36,30 @@ open class ActivationGroupTest : AbstractTest() { commandLineProgram.singleCall(emptyList(), conf) } + /** + * Assigned activation group name should be the default from configuration + * */ + @Test + fun testUnspecifiedCaller() { + val pgm = " H ACTGRP(*CALLER)\n" + + " C SETON RT" + + val conf = Configuration( + jarikoCallback = JarikoCallback( + getActivationGroup = { + _: String, associatedActivationGroup: ActivationGroup? -> + println("associatedActivationGroupName: ${associatedActivationGroup?.assignedName}") + assertEquals(Configuration().defaultActivationGroupName, associatedActivationGroup?.assignedName) + assertEquals(DEFAULT_ACTIVATION_GROUP_NAME, associatedActivationGroup?.assignedName) + null + } + ) + ) + conf.adaptForTestCase(this) + val commandLineProgram = getProgram(pgm) + commandLineProgram.singleCall(emptyList(), conf) + } + /** * Assigned activation group name should be from declaration * */ diff --git a/rpgJavaInterpreter-core/src/test/kotlin/com/smeup/rpgparser/smeup/MULANGT02ConstAndDSpecTest.kt b/rpgJavaInterpreter-core/src/test/kotlin/com/smeup/rpgparser/smeup/MULANGT02ConstAndDSpecTest.kt index 678a6b17b..e273da003 100644 --- a/rpgJavaInterpreter-core/src/test/kotlin/com/smeup/rpgparser/smeup/MULANGT02ConstAndDSpecTest.kt +++ b/rpgJavaInterpreter-core/src/test/kotlin/com/smeup/rpgparser/smeup/MULANGT02ConstAndDSpecTest.kt @@ -352,4 +352,14 @@ open class MULANGT02ConstAndDSpecTest : MULANGTTest() { val expected = listOf("ok") assertEquals(expected, "smeup/MUDRNRAPU00219".outputOf(configuration = smeupConfig)) } + + /** + * Caller activation group with no actual caller + * @see #LS24003137 + */ + @Test + fun executeMUDRNRAPU00221() { + val expected = listOf("ok") + assertEquals(expected, "smeup/MUDRNRAPU00221".outputOf(configuration = smeupConfig)) + } } \ No newline at end of file diff --git a/rpgJavaInterpreter-core/src/test/resources/smeup/MUDRNRAPU00221.rpgle b/rpgJavaInterpreter-core/src/test/resources/smeup/MUDRNRAPU00221.rpgle new file mode 100644 index 000000000..04b255e26 --- /dev/null +++ b/rpgJavaInterpreter-core/src/test/resources/smeup/MUDRNRAPU00221.rpgle @@ -0,0 +1,5 @@ + D £DBG_Str S 2 + H DECEDIT(*JOBRUN) DATEDIT(*DMY/) DFTACTGRP(*NO) ACTGRP(*CALLER) + H OPTION(*NODEBUGIO:*SRCSTMT:*NOUNREF) CCSID(*CHAR : *JOBRUN) DEBUG(*INPUT) + C EVAL £DBG_Str='ok' + C £DBG_Str DSPLY \ No newline at end of file