From 10894cc94badc9ea6332cdaeb2ca6d3855395db6 Mon Sep 17 00:00:00 2001 From: Domenico Date: Tue, 19 Mar 2024 11:40:17 +0100 Subject: [PATCH 1/3] Add unit test --- .../rpgparser/smeup/MULANGT40ArrayAndDSTest.kt | 15 ++++++++++++++- .../src/test/resources/smeup/T40_A10_P10.rpgle | 7 +++++++ 2 files changed, 21 insertions(+), 1 deletion(-) create mode 100644 rpgJavaInterpreter-core/src/test/resources/smeup/T40_A10_P10.rpgle diff --git a/rpgJavaInterpreter-core/src/test/kotlin/com/smeup/rpgparser/smeup/MULANGT40ArrayAndDSTest.kt b/rpgJavaInterpreter-core/src/test/kotlin/com/smeup/rpgparser/smeup/MULANGT40ArrayAndDSTest.kt index 53c400fe2..d88696736 100644 --- a/rpgJavaInterpreter-core/src/test/kotlin/com/smeup/rpgparser/smeup/MULANGT40ArrayAndDSTest.kt +++ b/rpgJavaInterpreter-core/src/test/kotlin/com/smeup/rpgparser/smeup/MULANGT40ArrayAndDSTest.kt @@ -1,3 +1,16 @@ package com.smeup.rpgparser.smeup -open class MULANGT40ArrayAndDSTest : MULANGTTest() \ No newline at end of file +import org.junit.Test +import kotlin.test.assertEquals + +open class MULANGT40ArrayAndDSTest : MULANGTTest() { + /** + * Reset con definizione inline + * @see #242 + */ + @Test + fun executeT40_A10_P10() { + val expected = listOf("Contenuto Pre-RESET: AAA - Contenuto Post-RESET:") + assertEquals(expected, "smeup/T40_A10_P10".outputOf(configuration = smeupConfig)) + } +} \ No newline at end of file diff --git a/rpgJavaInterpreter-core/src/test/resources/smeup/T40_A10_P10.rpgle b/rpgJavaInterpreter-core/src/test/resources/smeup/T40_A10_P10.rpgle new file mode 100644 index 000000000..fc9ee5879 --- /dev/null +++ b/rpgJavaInterpreter-core/src/test/resources/smeup/T40_A10_P10.rpgle @@ -0,0 +1,7 @@ + D £DBG_Str S 150 VARYING + C EVAL A10_D1='AAA' + C EVAL £DBG_Str='Contenuto Pre-RESET: '+A10_D1 + C RESET A10_D1 10 + C EVAL £DBG_Str=%TRIMR(£DBG_Str) + C +' - Contenuto Post-RESET: '+A10_D1 + C £DBG_Str DSPLY From 7b65b54b31f13499672add6443a02170bea11742 Mon Sep 17 00:00:00 2001 From: Domenico Date: Tue, 19 Mar 2024 11:40:54 +0100 Subject: [PATCH 2/3] Add support for ResetStmt inline declarations --- .../smeup/rpgparser/parsing/ast/statements.kt | 27 +++++++++++-------- .../rpgparser/parsing/parsetreetoast/misc.kt | 5 ++++ 2 files changed, 21 insertions(+), 11 deletions(-) diff --git a/rpgJavaInterpreter-core/src/main/kotlin/com/smeup/rpgparser/parsing/ast/statements.kt b/rpgJavaInterpreter-core/src/main/kotlin/com/smeup/rpgparser/parsing/ast/statements.kt index 16d630be7..512924a9f 100644 --- a/rpgJavaInterpreter-core/src/main/kotlin/com/smeup/rpgparser/parsing/ast/statements.kt +++ b/rpgJavaInterpreter-core/src/main/kotlin/com/smeup/rpgparser/parsing/ast/statements.kt @@ -1968,22 +1968,27 @@ data class XlateStmt( @Serializable data class ResetStmt( val name: String, + @Derived val dataDefinition: InStatementDataDefinition? = null, override val position: Position? = null -) : Statement(position) { +) : Statement(position), StatementThatCanDefineData { override fun execute(interpreter: InterpreterCore) { - val dataDefinition = interpreter.dataDefinitionByName(name) - require(dataDefinition != null) { - this.error("Data definition $name not found") - } - require(dataDefinition is DataDefinition) { - this.error("Data definition $name is not an instance of DataDefinition") - } - require(dataDefinition.defaultValue != null) { - this.error("Data definition $name has no default value") + when (val dataDefinition = interpreter.dataDefinitionByName(name)) { + null -> this.error("Data definition $name not found") + is DataDefinition -> { + require(dataDefinition.defaultValue != null) { + this.error("Data definition $name has no default value") + } + interpreter.assign(dataDefinition, dataDefinition.defaultValue!!) + } + is InStatementDataDefinition -> { + interpreter.assign(dataDefinition, dataDefinition.type.blank()) + } + else -> this.error("Data definition $name is not a valid instance of DataDefinition") } - interpreter.assign(dataDefinition, dataDefinition.defaultValue!!) } + + override fun dataDefinition(): List = dataDefinition?.let { listOf(it) } ?: emptyList() } @Serializable diff --git a/rpgJavaInterpreter-core/src/main/kotlin/com/smeup/rpgparser/parsing/parsetreetoast/misc.kt b/rpgJavaInterpreter-core/src/main/kotlin/com/smeup/rpgparser/parsing/parsetreetoast/misc.kt index e9cc0ddf4..4c07b4b23 100644 --- a/rpgJavaInterpreter-core/src/main/kotlin/com/smeup/rpgparser/parsing/parsetreetoast/misc.kt +++ b/rpgJavaInterpreter-core/src/main/kotlin/com/smeup/rpgparser/parsing/parsetreetoast/misc.kt @@ -1940,6 +1940,7 @@ internal fun CsCLOSEContext.toAst(conf: ToAstConfiguration = ToAstConfiguration( internal fun CsRESETContext.toAst(conf: ToAstConfiguration = ToAstConfiguration()): Statement { val position = toPosition(conf.considerPosition) + require(this.cspec_fixed_standard_parts().factor().text.isEmptyTrim()) { "RESET operation does not support factor1" } @@ -1950,8 +1951,12 @@ internal fun CsRESETContext.toAst(conf: ToAstConfiguration = ToAstConfiguration( require(!result.isEmptyTrim()) { "RESET operation requires result" } + + val dataDefinition = this.cspec_fixed_standard_parts().toDataDefinition(result, position, conf) + return ResetStmt( name = result, + dataDefinition = dataDefinition, position = position ) } From 933c6eee4674e91a5311eeb3199d6ddaceaf8893 Mon Sep 17 00:00:00 2001 From: Domenico Date: Tue, 19 Mar 2024 13:04:50 +0100 Subject: [PATCH 3/3] Update test description --- .../kotlin/com/smeup/rpgparser/smeup/MULANGT40ArrayAndDSTest.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rpgJavaInterpreter-core/src/test/kotlin/com/smeup/rpgparser/smeup/MULANGT40ArrayAndDSTest.kt b/rpgJavaInterpreter-core/src/test/kotlin/com/smeup/rpgparser/smeup/MULANGT40ArrayAndDSTest.kt index d88696736..5a740c0e4 100644 --- a/rpgJavaInterpreter-core/src/test/kotlin/com/smeup/rpgparser/smeup/MULANGT40ArrayAndDSTest.kt +++ b/rpgJavaInterpreter-core/src/test/kotlin/com/smeup/rpgparser/smeup/MULANGT40ArrayAndDSTest.kt @@ -5,7 +5,7 @@ import kotlin.test.assertEquals open class MULANGT40ArrayAndDSTest : MULANGTTest() { /** - * Reset con definizione inline + * Reset with inline declaration * @see #242 */ @Test