diff --git a/dspfparser/src/main/kotlin/com/smeup/dspfparser/domain/DSPF.kt b/dspfparser/src/main/kotlin/com/smeup/dspfparser/domain/DSPF.kt index ce912567e..5bd499190 100644 --- a/dspfparser/src/main/kotlin/com/smeup/dspfparser/domain/DSPF.kt +++ b/dspfparser/src/main/kotlin/com/smeup/dspfparser/domain/DSPF.kt @@ -4,7 +4,7 @@ package com.smeup.dspfparser.domain * Models a display file as a whole logical unit. */ interface DSPF { - val name: String? + val records: List /** * Retrieve a [DSPFRecord] given its name. diff --git a/dspfparser/src/main/kotlin/com/smeup/dspfparser/domain/DSPFField.kt b/dspfparser/src/main/kotlin/com/smeup/dspfparser/domain/DSPFField.kt index 2bfae31bb..28490cb40 100644 --- a/dspfparser/src/main/kotlin/com/smeup/dspfparser/domain/DSPFField.kt +++ b/dspfparser/src/main/kotlin/com/smeup/dspfparser/domain/DSPFField.kt @@ -10,7 +10,7 @@ interface DSPFField { val length: Int? val precision: Int? val type: DSPFFieldType - val x: Int - val y: Int + val x: Int? + val y: Int? val hasError: Boolean } diff --git a/dspfparser/src/main/kotlin/com/smeup/dspfparser/linesclassifier/DSPFFieldSpecifications.kt b/dspfparser/src/main/kotlin/com/smeup/dspfparser/linesclassifier/DSPFFieldSpecifications.kt index 2d2db5c16..17a1ef941 100644 --- a/dspfparser/src/main/kotlin/com/smeup/dspfparser/linesclassifier/DSPFFieldSpecifications.kt +++ b/dspfparser/src/main/kotlin/com/smeup/dspfparser/linesclassifier/DSPFFieldSpecifications.kt @@ -14,8 +14,8 @@ internal data class DSPFFieldSpecifications private constructor( override val length: Int? = null, override val precision: Int? = null, override val type: DSPFFieldType, - override val x: Int, - override val y: Int, + override val x: Int?, + override val y: Int?, override var hasError: Boolean = false ) : DSPFField { @@ -31,8 +31,8 @@ internal data class DSPFFieldSpecifications private constructor( length = declaration.length, precision = declaration.decimalsPositions, type = this.getType(declaration), - x = declaration.x!!, - y = declaration.y!! + x = declaration.x, + y = declaration.y ) } diff --git a/dspfparser/src/main/kotlin/com/smeup/dspfparser/linesclassifier/DSPFSpecifications.kt b/dspfparser/src/main/kotlin/com/smeup/dspfparser/linesclassifier/DSPFSpecifications.kt index 81afcf301..0d3d32006 100644 --- a/dspfparser/src/main/kotlin/com/smeup/dspfparser/linesclassifier/DSPFSpecifications.kt +++ b/dspfparser/src/main/kotlin/com/smeup/dspfparser/linesclassifier/DSPFSpecifications.kt @@ -6,16 +6,13 @@ import kotlinx.serialization.Serializable @Serializable internal data class DSPFSpecifications( - override val name: String? + override val records: MutableList = mutableListOf() ) : DSPF { - val records: MutableList = mutableListOf() - companion object { fun fromLines( - lines: MutableList, - name: String? = null + lines: MutableList ): DSPFSpecifications { - return DSPFSpecificationsFactory(name, lines).create() + return DSPFSpecificationsFactory(lines).create() } } @@ -39,10 +36,9 @@ private class DSPFSpecificationsFactory { private var isLineNone: Boolean = false private var isLineRecord: Boolean = false private var isLineField: Boolean = false - private var result: DSPFSpecifications + private var result: DSPFSpecifications = DSPFSpecifications() - constructor(name: String?, lines: MutableList) { - this.result = DSPFSpecifications(name) + constructor(lines: MutableList) { this.updateResultWith(lines) } diff --git a/rpgJavaInterpreter-core/build.gradle b/rpgJavaInterpreter-core/build.gradle index 0bbc18f97..bc1c14049 100644 --- a/rpgJavaInterpreter-core/build.gradle +++ b/rpgJavaInterpreter-core/build.gradle @@ -54,6 +54,7 @@ dependencies { implementation "org.jetbrains.kotlin:kotlin-reflect:$kotlinVersion" implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlinVersion" api project(":kolasu") + api project(":dspfparser") implementation "org.apache.logging.log4j:log4j-api-kotlin:1.0.0" implementation "org.apache.logging.log4j:log4j-api:2.23.0" diff --git a/rpgJavaInterpreter-core/src/main/kotlin/com/smeup/rpgparser/execution/Configuration.kt b/rpgJavaInterpreter-core/src/main/kotlin/com/smeup/rpgparser/execution/Configuration.kt index 853694255..5af34f655 100644 --- a/rpgJavaInterpreter-core/src/main/kotlin/com/smeup/rpgparser/execution/Configuration.kt +++ b/rpgJavaInterpreter-core/src/main/kotlin/com/smeup/rpgparser/execution/Configuration.kt @@ -43,14 +43,15 @@ data class Configuration( val memorySliceStorage: IMemorySliceStorage? = null, var jarikoCallback: JarikoCallback = JarikoCallback(), var reloadConfig: ReloadConfig? = null, + var dspfConfig: DspfConfig? = null, val defaultActivationGroupName: String = DEFAULT_ACTIVATION_GROUP_NAME, var options: Options = Options() ) { constructor(memorySliceStorage: IMemorySliceStorage?) : - this(memorySliceStorage, JarikoCallback(), null, DEFAULT_ACTIVATION_GROUP_NAME, Options()) + this(memorySliceStorage, JarikoCallback(), null, null, DEFAULT_ACTIVATION_GROUP_NAME, Options()) constructor(memorySliceStorage: IMemorySliceStorage?, defaultActivationGroupName: String) : - this(memorySliceStorage, JarikoCallback(), null, defaultActivationGroupName, Options()) + this(memorySliceStorage, JarikoCallback(), null, null, defaultActivationGroupName, Options()) } /** @@ -64,6 +65,14 @@ data class ReloadConfig( val metadataProducer: (dbFile: String) -> FileMetadata ) +/** + * DSPF parser configuration + * @param metadataProducer Produce metadata for a displayFile + * */ +data class DspfConfig( + val metadataProducer: (displayFile: String) -> FileMetadata +) + /** * Options object * @param muteSupport Used to enable/disable scan execution of mute annotations into rpg sources diff --git a/rpgJavaInterpreter-core/src/main/kotlin/com/smeup/rpgparser/execution/SimpleDspfConfig.kt b/rpgJavaInterpreter-core/src/main/kotlin/com/smeup/rpgparser/execution/SimpleDspfConfig.kt new file mode 100644 index 000000000..f40bea2e6 --- /dev/null +++ b/rpgJavaInterpreter-core/src/main/kotlin/com/smeup/rpgparser/execution/SimpleDspfConfig.kt @@ -0,0 +1,33 @@ +package com.smeup.rpgparser.execution + +import com.smeup.dspfparser.domain.DisplayFileParser +import com.smeup.rpgparser.interpreter.FileMetadata +import com.smeup.rpgparser.interpreter.getDbFields +import kotlinx.serialization.Serializable +import java.io.File + +/** + * Helper class used to load dspf configuration from a display file + * @param displayFilePath path where display file is located + * */ +@Serializable +internal data class SimpleDspfConfig(var displayFilePath: String? = null) { + + internal fun getMetadata(displayFile: String): FileMetadata { + val videoFile = File(displayFilePath, "$displayFile.dspf") + require(videoFile.exists()) { "$videoFile doesn't exist" } + + return videoFile.bufferedReader().use { reader -> + val dspf = DisplayFileParser.parse(reader) + val fields = dspf.getDbFields() + + FileMetadata( + name = displayFile, + tableName = "", + recordFormat = "", + fields = fields, + accessFields = emptyList() + ) + } + } +} \ No newline at end of file diff --git a/rpgJavaInterpreter-core/src/main/kotlin/com/smeup/rpgparser/interpreter/video.kt b/rpgJavaInterpreter-core/src/main/kotlin/com/smeup/rpgparser/interpreter/video.kt new file mode 100644 index 000000000..9433b9f76 --- /dev/null +++ b/rpgJavaInterpreter-core/src/main/kotlin/com/smeup/rpgparser/interpreter/video.kt @@ -0,0 +1,33 @@ +package com.smeup.rpgparser.interpreter + +import com.smeup.dspfparser.domain.DSPF +import com.smeup.rpgparser.parsing.parsetreetoast.RpgType + +internal fun DSPF.getDbFields(): List { + val fields = mutableListOf() + + records.forEach { record -> + record.fields.forEach { field -> + val type: Type + val rpgType: RpgType + // currently parser can't handle REFFLD, so I created random fallback values + val fallbackLength = 10 + val fallbackPrecision = 10 + + if (field.isNumeric) { + if (field.precision!! > 0) rpgType = RpgType.ZONED + else rpgType = RpgType.INTEGER + + type = NumberType( + field.length ?: fallbackLength, + field.precision ?: fallbackPrecision, rpgType + ) + } else { + type = StringType.createInstance(field.length ?: fallbackLength) + } + fields.add(DbField(fieldName = field.name, type = type)) + } + } + + return fields +} \ No newline at end of file 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 e2cdcfb63..ff88e7eef 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 @@ -187,16 +187,39 @@ private fun MutableMap.addIfNotPresent(dataDefinition: D } } +private fun FileDefinition.loadMetadata(): FileMetadata { + return when { + (fileType == FileType.DB) -> { + val reloadConfig = MainExecutionContext.getConfiguration() + .reloadConfig + ?: error("Not found metadata for $this because missing property reloadConfig in configuration") + + kotlin.runCatching { + reloadConfig.metadataProducer.invoke(name) + }.onFailure { error -> + error("Not found metadata for $this", error) + }.getOrNull() ?: error("Not found metadata for $this") + } + (fileType == FileType.VIDEO) -> { + val dspfConfig = MainExecutionContext.getConfiguration() + .dspfConfig ?: error("Not found metadata for $this because missing property dspfConfig in configuration") + + kotlin.runCatching { + dspfConfig.metadataProducer.invoke(name) + }.onFailure { error -> + error("Not found metadata for $this", error) + }.getOrNull() ?: error("Not found metadata for $this") + } + else -> error("Unhandled file type $fileType") + } +} + internal fun FileDefinition.toDataDefinitions(): List { val dataDefinitions = mutableListOf() - val reloadConfig = MainExecutionContext.getConfiguration() - .reloadConfig ?: error("Not found metadata for $this because missing property reloadConfig in configuration") - val metadata = kotlin.runCatching { - reloadConfig.metadataProducer.invoke(name) - }.onFailure { error -> - error("Not found metadata for $this", error) - }.getOrNull() ?: error("Not found metadata for $this") + val metadata = loadMetadata() + if (internalFormatName == null) internalFormatName = metadata.recordFormat + dataDefinitions.addAll( metadata.fields.map { dbField -> dbField.toDataDefinition(prefix = prefix, position = position).apply { @@ -204,6 +227,7 @@ internal fun FileDefinition.toDataDefinitions(): List { } } ) + // These are the fields related the record format, these fields will // be used in assignment operation to lookup for the DataDefinitions related these fields val fieldsDefinition = dataDefinitions.map { @@ -218,8 +242,10 @@ internal fun FileDefinition.toDataDefinitions(): List { position = position, fields = fieldsDefinition ) + dataDefinitions.add(recordFormatDefinition) } + return dataDefinitions } diff --git a/rpgJavaInterpreter-core/src/test/kotlin/com/smeup/rpgparser/smeup/MULANGTTest.kt b/rpgJavaInterpreter-core/src/test/kotlin/com/smeup/rpgparser/smeup/MULANGTTest.kt index a289fdffb..0d51cefbe 100644 --- a/rpgJavaInterpreter-core/src/test/kotlin/com/smeup/rpgparser/smeup/MULANGTTest.kt +++ b/rpgJavaInterpreter-core/src/test/kotlin/com/smeup/rpgparser/smeup/MULANGTTest.kt @@ -4,7 +4,9 @@ import com.smeup.dbnative.DBNativeAccessConfig import com.smeup.rpgparser.AbstractTest import com.smeup.rpgparser.execution.Configuration import com.smeup.rpgparser.execution.ConnectionConfig +import com.smeup.rpgparser.execution.DspfConfig import com.smeup.rpgparser.execution.ReloadConfig +import com.smeup.rpgparser.execution.SimpleDspfConfig import com.smeup.rpgparser.execution.SimpleReloadConfig import kotlin.test.AfterTest import kotlin.test.BeforeTest @@ -46,6 +48,10 @@ abstract class MULANGTTest : AbstractTest() { ) }), metadataProducer = { dbFile: String -> reloadConfig.getMetadata(dbFile = dbFile) }) + val dspfConfig = SimpleDspfConfig(displayFilePath = path) + smeupConfig.dspfConfig = DspfConfig { displayFile -> + dspfConfig.getMetadata(displayFile) + } } @AfterTest() diff --git a/rpgJavaInterpreter-core/src/test/kotlin/com/smeup/rpgparser/testing_utils.kt b/rpgJavaInterpreter-core/src/test/kotlin/com/smeup/rpgparser/testing_utils.kt index 58f783352..d7b81edf0 100644 --- a/rpgJavaInterpreter-core/src/test/kotlin/com/smeup/rpgparser/testing_utils.kt +++ b/rpgJavaInterpreter-core/src/test/kotlin/com/smeup/rpgparser/testing_utils.kt @@ -680,6 +680,16 @@ fun compileAllMutes( ?: error("resource $dbFile.json not found in $metadataPaths") } ) + + dspfConfig = DspfConfig { displayFile -> + metadataPaths.asSequence() + .map { Path.of(rpgTestSrcDir, it) } + .map { it.resolve("$displayFile.dspf").toFile() } + .firstOrNull { it.exists() }?.let { + SimpleDspfConfig(displayFilePath = it!!.parent).getMetadata(displayFile) + } ?: error("resource $displayFile.dspf not found in $metadataPaths") + } + options = Options(debuggingInformation = true) jarikoCallback.onError = { error -> error.sourceReference?.let { sourceReference -> diff --git a/rpgJavaInterpreter-core/src/test/kotlin/com/smeup/rpgparser/video/VideoInterpeterTest.kt b/rpgJavaInterpreter-core/src/test/kotlin/com/smeup/rpgparser/video/VideoInterpeterTest.kt index cf98fe8c2..5c6474ca1 100644 --- a/rpgJavaInterpreter-core/src/test/kotlin/com/smeup/rpgparser/video/VideoInterpeterTest.kt +++ b/rpgJavaInterpreter-core/src/test/kotlin/com/smeup/rpgparser/video/VideoInterpeterTest.kt @@ -1,12 +1,10 @@ package com.smeup.rpgparser.video -import com.smeup.dbnative.DBNativeAccessConfig import com.smeup.rpgparser.AbstractTest import com.smeup.rpgparser.execution.Configuration -import com.smeup.rpgparser.execution.ReloadConfig -import com.smeup.rpgparser.execution.SimpleReloadConfig +import com.smeup.rpgparser.execution.DspfConfig +import com.smeup.rpgparser.execution.SimpleDspfConfig import kotlin.test.BeforeTest -import kotlin.test.DefaultAsserter import kotlin.test.Test import kotlin.test.assertEquals @@ -18,17 +16,14 @@ class VideoInterpeterTest : AbstractTest() { fun setUp() { configuration = Configuration() val path = javaClass.getResource("/video/metadata")!!.path - val reloadConfig = SimpleReloadConfig(metadataPath = path, connectionConfigs = listOf()) - configuration.reloadConfig = ReloadConfig( - nativeAccessConfig = DBNativeAccessConfig(emptyList()), - metadataProducer = { dbFile: String -> reloadConfig.getMetadata(dbFile = dbFile) }) + val dspfConfig = SimpleDspfConfig(displayFilePath = path) + configuration.dspfConfig = DspfConfig( + metadataProducer = { displayFile: String -> dspfConfig.getMetadata(displayFile = displayFile) } + ) } @Test fun executeFILEDEF() { - configuration.jarikoCallback.onExitPgm = { _, symbolTable, _ -> - DefaultAsserter.assertNotNull(message = "field £RASDI should be defined", actual = symbolTable["£RASDI"]) - } val expected = listOf("W\$PERI:12", "£RASDI:HELLO_WORLD") assertEquals(expected = expected, actual = "video/FILEDEF".outputOf(configuration = configuration)) } diff --git a/rpgJavaInterpreter-core/src/test/resources/smeup/metadata/MLNGT60AV.dspf b/rpgJavaInterpreter-core/src/test/resources/smeup/metadata/MLNGT60AV.dspf new file mode 100644 index 000000000..8117d146e --- /dev/null +++ b/rpgJavaInterpreter-core/src/test/resources/smeup/metadata/MLNGT60AV.dspf @@ -0,0 +1,30 @@ + A*%%TS SD 20240119 112614 GUAGIA REL-V7R4M0 5770-WDS + A*%%EC + A DSPSIZ(24 80 *DS3) + A REF(*LIBL/DIZ_BR) + A CHGINPDFT(HI CS) + A PRINT + A CA22 + A CF02 + A R FMT1 + A*%%TS SD 20240119 112614 GUAGIA REL-V7R4M0 5770-WDS + A TEXT('Videata Guida') + A CF03 + A CF14 + A £RASDI 15A O 1 2DSPATR(HI) + A 1 26'** GESTIONE ARTICOLI (Menu) **' + A DSPATR(RI) + A 1 60SYSNAME + A £PDSNP 10A O 1 71 + A 2 2DATE + A EDTCDE(Y) + A 2 34'Formato guida' + A DSPATR(HI) + A £PDSJN 10A O 2 60 + A £PDSNU 10A O 2 71 + A 22 2'F14=Entra nella schermata' + A 23 2'F03=Fine Lavoro' + A 60 W$MESV 76A O 24 2DSPATR(RI) + A W$RISC 8A B 3 72 + A 62 DSPATR(RI) + A 62 DSPATR(PC) diff --git a/rpgJavaInterpreter-core/src/test/resources/smeup/metadata/MLNGT60BV.dspf b/rpgJavaInterpreter-core/src/test/resources/smeup/metadata/MLNGT60BV.dspf new file mode 100644 index 000000000..f3e466f7f --- /dev/null +++ b/rpgJavaInterpreter-core/src/test/resources/smeup/metadata/MLNGT60BV.dspf @@ -0,0 +1,59 @@ + A*%%TS SD 20230912 144404 DESVER REL-V7R4M0 5770-WDS + A*%%EC + A DSPSIZ(24 80 *DS3) + A REF(*LIBL/DIZ_BR) + A CHGINPDFT(HI CS) + A PRINT + A CA22 + A CF02 + A R SFL1 SFL + A*%%TS SD 20230907 103200 DESVER REL-V7R4M0 5770-WDS + A TEXT('Videata Lista (Subfile)') + A SHDEAR R H REFFLD(DEAR) + A S$OPZI 2A B 7 2 + A 63 DSPATR(RI) + A 63 DSPATR(PC) + A 54 DSPATR(PR) + A N54 DSPATR(CS) + A X$FLD1 50A B 7 5DSPATR(HI) + A 42 DSPATR(PR) + A N42 DSPATR(CS) + A R SFC1 SFLCTL(SFL1) + A*%%TS SD 20230912 144404 DESVER REL-V7R4M0 5770-WDS + A SFLSIZ(9999) + A SFLPAG(0013) + A TEXT('Videata Lista (Controller)') + A CA12 + A ROLLUP(96) + A CA03 + A CA05 + A CA06 + A OVERLAY + A PUTRETAIN + A N92N93 SFLDSP + A N92 SFLDSPCTL + A 92 SFLCLR + A 94 SFLEND(*MORE) + A RRN01 4S 0H SFLRCDNBR(CURSOR) + A £RASDI 15A O 1 2DSPATR(HI) + A 1 60SYSNAME + A £PDSNP 10A O 1 71 + A £PDSJN 10A O 2 60 + A £PDSNU 10A O 2 71 + A 6 2'Op' + A DSPATR(HI) + A DSPATR(UL) + A 6 5' INTESTAZIONE COLONNA- + A ' + A DSPATR(UL) + A DSPATR(HI) + A 1 21'TEST SFL CHE CHIAMA ALTRO SFL' + A DSPATR(HI) + A COLOR(PNK) + A 3 2'X=Scelta' + A DSPATR(HI) + A R SFP1 + A TEXT('Videata Lista (Piede)') + A 23 11'F12=Ritorno' + A 60 W$MESV 76A O 24 2DSPATR(RI) + A 23 2'F03=Fine' diff --git a/rpgJavaInterpreter-core/src/test/resources/video/EXFMT_MOCK.rpgle b/rpgJavaInterpreter-core/src/test/resources/video/EXFMT_MOCK.rpgle index ad7217eba..b9904905a 100644 --- a/rpgJavaInterpreter-core/src/test/resources/video/EXFMT_MOCK.rpgle +++ b/rpgJavaInterpreter-core/src/test/resources/video/EXFMT_MOCK.rpgle @@ -1,4 +1,4 @@ - FB£DIR40V CF E WORKSTN USROPN + FEXFMT_MV CF E WORKSTN USROPN F INFDS(DSSF01) D MSG S 50 VARYING diff --git a/rpgJavaInterpreter-core/src/test/resources/video/FILEDEF.rpgle b/rpgJavaInterpreter-core/src/test/resources/video/FILEDEF.rpgle index 6b5da06b2..f6a111e63 100644 --- a/rpgJavaInterpreter-core/src/test/resources/video/FILEDEF.rpgle +++ b/rpgJavaInterpreter-core/src/test/resources/video/FILEDEF.rpgle @@ -4,14 +4,14 @@ V* ============================================================== - FB£DIR40V CF E WORKSTN USROPN + FFILEDEFV CF E WORKSTN USROPN F INFDS(DSSF01) D MSG S 50 VARYING D WFUND1 DS D WSDATA 8 0 - * This field definition is assumed by B£DIR40V + * This field definition is assumed by FILEDEFV D W$PERI C EVAL W$PERI=12 @@ -19,7 +19,7 @@ * EXPECTED: W$PERI:12 C MSG DSPLY - * This field is defined in B£DIR40V + * This field is defined in FILEDEFV C EVAL £RASDI='HELLO_WORLD' C EVAL MSG='£RASDI:' + %CHAR(£RASDI) * EXPECTED: £RASDI=:HELLO_WORLD diff --git a/rpgJavaInterpreter-core/src/test/resources/video/READC_MOCK.rpgle b/rpgJavaInterpreter-core/src/test/resources/video/READC_MOCK.rpgle index d93343734..b6f477d1e 100644 --- a/rpgJavaInterpreter-core/src/test/resources/video/READC_MOCK.rpgle +++ b/rpgJavaInterpreter-core/src/test/resources/video/READC_MOCK.rpgle @@ -1,4 +1,4 @@ - FB£DIR40V CF E WORKSTN SFILE(B£DIR40VSUB:RRN) + FREADC_MV CF E WORKSTN SFILE(SUB:RRN) F INFDS(DSSF01) D MSG S 50 VARYING @@ -7,6 +7,6 @@ D WSDATA 8 0 C EXFMT W$PERI - C READC B£DIR40VSUB + C READC SUB C EVAL MSG='' C MSG DSPLY diff --git a/rpgJavaInterpreter-core/src/test/resources/video/UNLOCK_MOCK.rpgle b/rpgJavaInterpreter-core/src/test/resources/video/UNLOCK_MOCK.rpgle index 54d070435..6865b7be2 100644 --- a/rpgJavaInterpreter-core/src/test/resources/video/UNLOCK_MOCK.rpgle +++ b/rpgJavaInterpreter-core/src/test/resources/video/UNLOCK_MOCK.rpgle @@ -1,4 +1,4 @@ - FB£DIR40V CF E WORKSTN SFILE(B£DIR40VSUB:RRN) + FUNLOCK_MV CF E WORKSTN SFILE(SUB:RRN) F INFDS(DSSF01) D MSG S 50 VARYING diff --git a/rpgJavaInterpreter-core/src/test/resources/video/metadata/EXFMT_MV.dspf b/rpgJavaInterpreter-core/src/test/resources/video/metadata/EXFMT_MV.dspf new file mode 100644 index 000000000..00581d040 --- /dev/null +++ b/rpgJavaInterpreter-core/src/test/resources/video/metadata/EXFMT_MV.dspf @@ -0,0 +1,2 @@ + R FMT1 + W$PERI 10 0 0 0 \ No newline at end of file diff --git a/rpgJavaInterpreter-core/src/test/resources/video/metadata/FILEDEFV.dspf b/rpgJavaInterpreter-core/src/test/resources/video/metadata/FILEDEFV.dspf new file mode 100644 index 000000000..26d8fa397 --- /dev/null +++ b/rpgJavaInterpreter-core/src/test/resources/video/metadata/FILEDEFV.dspf @@ -0,0 +1,3 @@ + R FMT1 + £RASDI 11 0 0 + W$PERI 10 0 0 0 \ No newline at end of file diff --git a/rpgJavaInterpreter-core/src/test/resources/video/metadata/READC_MV.dspf b/rpgJavaInterpreter-core/src/test/resources/video/metadata/READC_MV.dspf new file mode 100644 index 000000000..00581d040 --- /dev/null +++ b/rpgJavaInterpreter-core/src/test/resources/video/metadata/READC_MV.dspf @@ -0,0 +1,2 @@ + R FMT1 + W$PERI 10 0 0 0 \ No newline at end of file diff --git a/rpgJavaInterpreter-core/src/test/resources/video/metadata/SUB.dspf b/rpgJavaInterpreter-core/src/test/resources/video/metadata/SUB.dspf new file mode 100644 index 000000000..e69de29bb diff --git a/rpgJavaInterpreter-core/src/test/resources/video/metadata/UNLOCK_MV.dspf b/rpgJavaInterpreter-core/src/test/resources/video/metadata/UNLOCK_MV.dspf new file mode 100644 index 000000000..00581d040 --- /dev/null +++ b/rpgJavaInterpreter-core/src/test/resources/video/metadata/UNLOCK_MV.dspf @@ -0,0 +1,2 @@ + R FMT1 + W$PERI 10 0 0 0 \ No newline at end of file