From 37582f2479e27558371458bd528a001751589e1d Mon Sep 17 00:00:00 2001 From: Davide Palladino Date: Wed, 13 Nov 2024 11:05:00 +0100 Subject: [PATCH 01/10] Added test --- .../rpgparser/smeup/MULANGT10BaseCodopTest.kt | 10 +++++++ .../test/resources/smeup/MUDRNRAPU00166.rpgle | 27 +++++++++++++++++++ 2 files changed, 37 insertions(+) create mode 100644 rpgJavaInterpreter-core/src/test/resources/smeup/MUDRNRAPU00166.rpgle diff --git a/rpgJavaInterpreter-core/src/test/kotlin/com/smeup/rpgparser/smeup/MULANGT10BaseCodopTest.kt b/rpgJavaInterpreter-core/src/test/kotlin/com/smeup/rpgparser/smeup/MULANGT10BaseCodopTest.kt index b84cf92be..ffd48b52f 100644 --- a/rpgJavaInterpreter-core/src/test/kotlin/com/smeup/rpgparser/smeup/MULANGT10BaseCodopTest.kt +++ b/rpgJavaInterpreter-core/src/test/kotlin/com/smeup/rpgparser/smeup/MULANGT10BaseCodopTest.kt @@ -624,4 +624,14 @@ open class MULANGT10BaseCodopTest : MULANGTTest() { val expected = listOf("", "0") assertEquals(expected, "smeup/MUDRNRAPU00161".outputOf(configuration = smeupConfig)) } + + /** + * Assignment of a boolean value to an array by using MOVEA. + * @see #LS24004909 + */ + @Test + fun executeMUDRNRAPU00166() { + val expected = listOf("1", "1", "1", "0", "0", "0") + assertEquals(expected, "smeup/MUDRNRAPU00166".outputOf(configuration = smeupConfig)) + } } \ No newline at end of file diff --git a/rpgJavaInterpreter-core/src/test/resources/smeup/MUDRNRAPU00166.rpgle b/rpgJavaInterpreter-core/src/test/resources/smeup/MUDRNRAPU00166.rpgle new file mode 100644 index 000000000..22c067299 --- /dev/null +++ b/rpgJavaInterpreter-core/src/test/resources/smeup/MUDRNRAPU00166.rpgle @@ -0,0 +1,27 @@ + V* ============================================================== + V* 13/11/2024 APU001 Creation + V* ============================================================== + O * PROGRAM GOAL + O * Assignment of a boolean value to an array by using MOVEA. + V* ============================================================== + O * JARIKO ANOMALY + O * Before the fix: + O * `An operation is not implemented: Converting BooleanValue + O * to ArrayType` + V* ============================================================== + D ARR S 1 DIM(3) INZ(*ON) + D I S 1 0 + D MSG S 1 + + C EXSR SHOW_RES + C MOVEA *OFF ARR #An operation is not implemented: Converting BooleanValue to ArrayType + C EXSR SHOW_RES + + C SETON LR + + C SHOW_RES BEGSR + C FOR I=1 TO %ELEM(ARR) + C EVAL MSG=%CHAR(ARR(I)) + C MSG DSPLY + C ENDFOR + C ENDSR \ No newline at end of file From e98b04c4148d254cf66041a4beff6d5e3cb04e55 Mon Sep 17 00:00:00 2001 From: Davide Palladino Date: Wed, 13 Nov 2024 11:15:42 +0100 Subject: [PATCH 02/10] Applied fix --- .../main/kotlin/com/smeup/rpgparser/interpreter/coercing.kt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/rpgJavaInterpreter-core/src/main/kotlin/com/smeup/rpgparser/interpreter/coercing.kt b/rpgJavaInterpreter-core/src/main/kotlin/com/smeup/rpgparser/interpreter/coercing.kt index e826c77de..ab07c0f15 100644 --- a/rpgJavaInterpreter-core/src/main/kotlin/com/smeup/rpgparser/interpreter/coercing.kt +++ b/rpgJavaInterpreter-core/src/main/kotlin/com/smeup/rpgparser/interpreter/coercing.kt @@ -190,6 +190,10 @@ private fun coerceBoolean(value: BooleanValue, type: Type): Value { is BooleanType -> value is StringType -> value.asString() is UnlimitedStringType -> value.asUnlimitedString() + is ArrayType -> { + val coercedValue = coerce(value, type.element) + ConcreteArrayValue(MutableList(type.nElements) { coercedValue }, type.element) + } else -> TODO("Converting BooleanValue to $type") } } From ceca54532fa6ecb113cb6333225b60c2cc46c860 Mon Sep 17 00:00:00 2001 From: Davide Palladino Date: Wed, 13 Nov 2024 11:17:15 +0100 Subject: [PATCH 03/10] Added another test --- .../rpgparser/smeup/MULANGT10BaseCodopTest.kt | 12 ++++++++- .../test/resources/smeup/MUDRNRAPU00167.rpgle | 27 +++++++++++++++++++ 2 files changed, 38 insertions(+), 1 deletion(-) create mode 100644 rpgJavaInterpreter-core/src/test/resources/smeup/MUDRNRAPU00167.rpgle diff --git a/rpgJavaInterpreter-core/src/test/kotlin/com/smeup/rpgparser/smeup/MULANGT10BaseCodopTest.kt b/rpgJavaInterpreter-core/src/test/kotlin/com/smeup/rpgparser/smeup/MULANGT10BaseCodopTest.kt index ffd48b52f..a5fd2bcc1 100644 --- a/rpgJavaInterpreter-core/src/test/kotlin/com/smeup/rpgparser/smeup/MULANGT10BaseCodopTest.kt +++ b/rpgJavaInterpreter-core/src/test/kotlin/com/smeup/rpgparser/smeup/MULANGT10BaseCodopTest.kt @@ -626,7 +626,7 @@ open class MULANGT10BaseCodopTest : MULANGTTest() { } /** - * Assignment of a boolean value to an array by using MOVEA. + * Assignment of a boolean value (*OFF) to an array by using MOVEA. * @see #LS24004909 */ @Test @@ -634,4 +634,14 @@ open class MULANGT10BaseCodopTest : MULANGTTest() { val expected = listOf("1", "1", "1", "0", "0", "0") assertEquals(expected, "smeup/MUDRNRAPU00166".outputOf(configuration = smeupConfig)) } + + /** + * Assignment of a boolean value (*ON) to an array by using MOVEA. + * @see #LS24004909 + */ + @Test + fun executeMUDRNRAPU00167() { + val expected = listOf("0", "0", "0", "1", "1", "1") + assertEquals(expected, "smeup/MUDRNRAPU00167".outputOf(configuration = smeupConfig)) + } } \ No newline at end of file diff --git a/rpgJavaInterpreter-core/src/test/resources/smeup/MUDRNRAPU00167.rpgle b/rpgJavaInterpreter-core/src/test/resources/smeup/MUDRNRAPU00167.rpgle new file mode 100644 index 000000000..667f7fea6 --- /dev/null +++ b/rpgJavaInterpreter-core/src/test/resources/smeup/MUDRNRAPU00167.rpgle @@ -0,0 +1,27 @@ + V* ============================================================== + V* 13/11/2024 APU001 Creation + V* ============================================================== + O * PROGRAM GOAL + O * Assignment of a boolean value to an array by using MOVEA. + V* ============================================================== + O * JARIKO ANOMALY + O * Before the fix: + O * `An operation is not implemented: Converting BooleanValue + O * to ArrayType` + V* ============================================================== + D ARR S 1 DIM(3) INZ(*OFF) + D I S 1 0 + D MSG S 1 + + C EXSR SHOW_RES + C MOVEA *ON ARR #An operation is not implemented: Converting BooleanValue to ArrayType + C EXSR SHOW_RES + + C SETON LR + + C SHOW_RES BEGSR + C FOR I=1 TO %ELEM(ARR) + C EVAL MSG=%CHAR(ARR(I)) + C MSG DSPLY + C ENDFOR + C ENDSR \ No newline at end of file From eb93dabd6dd91637de8f2b8b7836596f96a8ce25 Mon Sep 17 00:00:00 2001 From: Davide Palladino Date: Wed, 13 Nov 2024 16:02:06 +0100 Subject: [PATCH 04/10] Added a method to find a data defined inline, like for `getDataOrFieldDefinition` --- .../kotlin/com/smeup/rpgparser/parsing/ast/cu_components.kt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/rpgJavaInterpreter-core/src/main/kotlin/com/smeup/rpgparser/parsing/ast/cu_components.kt b/rpgJavaInterpreter-core/src/main/kotlin/com/smeup/rpgparser/parsing/ast/cu_components.kt index a8fb20eb7..6e8b69b5c 100644 --- a/rpgJavaInterpreter-core/src/main/kotlin/com/smeup/rpgparser/parsing/ast/cu_components.kt +++ b/rpgJavaInterpreter-core/src/main/kotlin/com/smeup/rpgparser/parsing/ast/cu_components.kt @@ -120,6 +120,8 @@ data class CompilationUnit( ?: dataDefinitions.mapNotNull { it -> it.fields.find { it.name.equals(name, ignoreCase = true) } }.firstOrNull() ?: throw IllegalArgumentException("Data or field definition $name was not found") + fun getInStatementDataDefinition(name: String) = inStatementsDataDefinitions.firstOrNull { it.name.equals(name, ignoreCase = true) } + fun hasAnyDataDefinition(name: String) = allDataDefinitions.any { it.name.equals(name, ignoreCase = true) } fun getAnyDataDefinition(name: String) = allDataDefinitions.first { it.name.equals(name, ignoreCase = true) } From 875f14f3aba31d65b33bfa3b24ed10d290049944 Mon Sep 17 00:00:00 2001 From: Davide Palladino Date: Wed, 13 Nov 2024 16:02:17 +0100 Subject: [PATCH 05/10] Added smoke test --- .../smeup/rpgparser/parsing/ast/ToAstSmokeTest.kt | 12 ++++++++++++ .../src/test/resources/SQL01.rpgle | 10 ++++++++++ 2 files changed, 22 insertions(+) create mode 100644 rpgJavaInterpreter-core/src/test/resources/SQL01.rpgle diff --git a/rpgJavaInterpreter-core/src/test/kotlin/com/smeup/rpgparser/parsing/ast/ToAstSmokeTest.kt b/rpgJavaInterpreter-core/src/test/kotlin/com/smeup/rpgparser/parsing/ast/ToAstSmokeTest.kt index 4d97fb098..984d575a5 100644 --- a/rpgJavaInterpreter-core/src/test/kotlin/com/smeup/rpgparser/parsing/ast/ToAstSmokeTest.kt +++ b/rpgJavaInterpreter-core/src/test/kotlin/com/smeup/rpgparser/parsing/ast/ToAstSmokeTest.kt @@ -384,4 +384,16 @@ open class ToAstSmokeTest : AbstractTest() { assertNotNull(this.getDataOrFieldDefinition("FIRST_F2"), "FIRST_F1 is defined like SECOND_F1") } } + + /** + * + */ + @Test + fun buildAstForSQL01() { + assertASTCanBeProduced(exampleName = "SQL01", printTree = false).apply { + this.resolveAndValidate() + assertNotNull(this.getInStatementDataDefinition("SQLCOD"), "SQLCOD is defined") + assertNotNull(this.getInStatementDataDefinition("SQLERM"), "SQLERM is defined") + } + } } \ No newline at end of file diff --git a/rpgJavaInterpreter-core/src/test/resources/SQL01.rpgle b/rpgJavaInterpreter-core/src/test/resources/SQL01.rpgle new file mode 100644 index 000000000..3ff1eaff3 --- /dev/null +++ b/rpgJavaInterpreter-core/src/test/resources/SQL01.rpgle @@ -0,0 +1,10 @@ + D SQL_DAT DS + + C EXSR EXEC_SQL + C SETON LR + + C EXEC_SQL BEGSR + C/EXEC SQL + C+ FETCH C1 INTO :SQL_DAT + C/END-EXEC + C ENDSR \ No newline at end of file From a662bd71d81f2acbedd750f327ea146aa5c2bda1 Mon Sep 17 00:00:00 2001 From: Davide Palladino Date: Mon, 18 Nov 2024 09:04:06 +0100 Subject: [PATCH 06/10] Removed unused method --- .../kotlin/com/smeup/rpgparser/parsing/ast/cu_components.kt | 2 -- 1 file changed, 2 deletions(-) diff --git a/rpgJavaInterpreter-core/src/main/kotlin/com/smeup/rpgparser/parsing/ast/cu_components.kt b/rpgJavaInterpreter-core/src/main/kotlin/com/smeup/rpgparser/parsing/ast/cu_components.kt index 6e8b69b5c..a8fb20eb7 100644 --- a/rpgJavaInterpreter-core/src/main/kotlin/com/smeup/rpgparser/parsing/ast/cu_components.kt +++ b/rpgJavaInterpreter-core/src/main/kotlin/com/smeup/rpgparser/parsing/ast/cu_components.kt @@ -120,8 +120,6 @@ data class CompilationUnit( ?: dataDefinitions.mapNotNull { it -> it.fields.find { it.name.equals(name, ignoreCase = true) } }.firstOrNull() ?: throw IllegalArgumentException("Data or field definition $name was not found") - fun getInStatementDataDefinition(name: String) = inStatementsDataDefinitions.firstOrNull { it.name.equals(name, ignoreCase = true) } - fun hasAnyDataDefinition(name: String) = allDataDefinitions.any { it.name.equals(name, ignoreCase = true) } fun getAnyDataDefinition(name: String) = allDataDefinitions.first { it.name.equals(name, ignoreCase = true) } From aed3787de358b1c9dbba45a0a9becae0285b6876 Mon Sep 17 00:00:00 2001 From: Davide Palladino Date: Mon, 18 Nov 2024 13:01:07 +0100 Subject: [PATCH 07/10] =?UTF-8?q?Added=20new=20data=20definitions=20to=20`?= =?UTF-8?q?=C2=A3JAX=5FD1`=20file?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/test/resources/QILEGEN/\302\243JAX_D1.rpgle" | 7 +++++++ 1 file changed, 7 insertions(+) diff --git "a/rpgJavaInterpreter-core/src/test/resources/QILEGEN/\302\243JAX_D1.rpgle" "b/rpgJavaInterpreter-core/src/test/resources/QILEGEN/\302\243JAX_D1.rpgle" index 37d373fe9..6326c4343 100644 --- "a/rpgJavaInterpreter-core/src/test/resources/QILEGEN/\302\243JAX_D1.rpgle" +++ "b/rpgJavaInterpreter-core/src/test/resources/QILEGEN/\302\243JAX_D1.rpgle" @@ -266,3 +266,10 @@ Cod ce* Descrizione - D £Jax_ModPS C CONST('PS') * . Temporaneo in sezione (a scomparsa) D £Jax_ModTS C CONST('TS') + * Variabili + D £JaxVBf S 3023 DIM(200) VARYING Schiera buffer var + D £JaxVBfI S 4 0 INZ + D £JaxDSVar DS DS Variabili + D £JaxVarNam 20 INZ . nome variabile + D £JaxVarTip 3 INZ . tipo var - dft:Sch + D £JaxVarVal 3000 INZ VARYING \ No newline at end of file From 8f2e3b691ba3bc16d6c195dc2ecc896f6c1c8033 Mon Sep 17 00:00:00 2001 From: Davide Palladino Date: Thu, 21 Nov 2024 11:31:23 +0100 Subject: [PATCH 08/10] Removed declarations from `JAX_D1` --- .../src/test/resources/QILEGEN/\302\243JAX_D1.rpgle" | 7 ------- 1 file changed, 7 deletions(-) diff --git "a/rpgJavaInterpreter-core/src/test/resources/QILEGEN/\302\243JAX_D1.rpgle" "b/rpgJavaInterpreter-core/src/test/resources/QILEGEN/\302\243JAX_D1.rpgle" index 6326c4343..807ae5cfa 100644 --- "a/rpgJavaInterpreter-core/src/test/resources/QILEGEN/\302\243JAX_D1.rpgle" +++ "b/rpgJavaInterpreter-core/src/test/resources/QILEGEN/\302\243JAX_D1.rpgle" @@ -231,13 +231,6 @@ Cod ce* Descrizione - D £JaxMGra 10 INZ * Testo completo (secondo livello) D £JaxMTx2 S 20000 VARYING - * Variabili - D £JaxVBf S 3023 DIM(100) VARYING Schiera buffer var - D £JaxVBfI S 4 0 INZ Contatore variabili - D £JaxDSVar DS DS Variabili - D £JaxVarNam 20 INZ . nome variabile - D £JaxVarTip 3 INZ . tipo var - dft:Sch - D £JaxVarVal 3000 INZ VARYING . valore variabile * Esempi (da completare) * Attributi di Riga D £JaxRowHt S 10 INZ Altezza di riga From e90dc3a460e6fdc843b303ae08d27f877a4862ee Mon Sep 17 00:00:00 2001 From: Davide Palladino Date: Thu, 21 Nov 2024 11:34:33 +0100 Subject: [PATCH 09/10] Restored declarations from `JAX_D1` --- .../test/resources/QILEGEN/\302\243JAX_D1.rpgle" | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git "a/rpgJavaInterpreter-core/src/test/resources/QILEGEN/\302\243JAX_D1.rpgle" "b/rpgJavaInterpreter-core/src/test/resources/QILEGEN/\302\243JAX_D1.rpgle" index 807ae5cfa..c816fee48 100644 --- "a/rpgJavaInterpreter-core/src/test/resources/QILEGEN/\302\243JAX_D1.rpgle" +++ "b/rpgJavaInterpreter-core/src/test/resources/QILEGEN/\302\243JAX_D1.rpgle" @@ -231,6 +231,13 @@ Cod ce* Descrizione - D £JaxMGra 10 INZ * Testo completo (secondo livello) D £JaxMTx2 S 20000 VARYING + * Variabili + D £JaxVBf S 3023 DIM(100) VARYING Schiera buffer var + D £JaxVBfI S 4 0 INZ Contatore variabili + D £JaxDSVar DS DS Variabili + D £JaxVarNam 20 INZ . nome variabile + D £JaxVarTip 3 INZ . tipo var - dft:Sch + D £JaxVarVal 3000 INZ VARYING . valore variabile * Esempi (da completare) * Attributi di Riga D £JaxRowHt S 10 INZ Altezza di riga @@ -258,11 +265,4 @@ Cod ce* Descrizione - * . Permanente in sezione (da chiudere) D £Jax_ModPS C CONST('PS') * . Temporaneo in sezione (a scomparsa) - D £Jax_ModTS C CONST('TS') - * Variabili - D £JaxVBf S 3023 DIM(200) VARYING Schiera buffer var - D £JaxVBfI S 4 0 INZ - D £JaxDSVar DS DS Variabili - D £JaxVarNam 20 INZ . nome variabile - D £JaxVarTip 3 INZ . tipo var - dft:Sch - D £JaxVarVal 3000 INZ VARYING \ No newline at end of file + D £Jax_ModTS C CONST('TS') \ No newline at end of file From 4f34edbde2b55b9ff9b9437559706785be21cb68 Mon Sep 17 00:00:00 2001 From: Davide Palladino Date: Thu, 21 Nov 2024 11:34:59 +0100 Subject: [PATCH 10/10] Restored declarations from `JAX_D1` --- .../src/test/resources/QILEGEN/\302\243JAX_D1.rpgle" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/rpgJavaInterpreter-core/src/test/resources/QILEGEN/\302\243JAX_D1.rpgle" "b/rpgJavaInterpreter-core/src/test/resources/QILEGEN/\302\243JAX_D1.rpgle" index c816fee48..37d373fe9 100644 --- "a/rpgJavaInterpreter-core/src/test/resources/QILEGEN/\302\243JAX_D1.rpgle" +++ "b/rpgJavaInterpreter-core/src/test/resources/QILEGEN/\302\243JAX_D1.rpgle" @@ -265,4 +265,4 @@ Cod ce* Descrizione - * . Permanente in sezione (da chiudere) D £Jax_ModPS C CONST('PS') * . Temporaneo in sezione (a scomparsa) - D £Jax_ModTS C CONST('TS') \ No newline at end of file + D £Jax_ModTS C CONST('TS')