diff --git a/cobol-parser/src/test/scala/za/co/absa/cobrix/cobol/reader/iterator/VRLRecordReaderSpec.scala b/cobol-parser/src/test/scala/za/co/absa/cobrix/cobol/reader/iterator/VRLRecordReaderSpec.scala index 4992c2c2b..c7bc2d522 100644 --- a/cobol-parser/src/test/scala/za/co/absa/cobrix/cobol/reader/iterator/VRLRecordReaderSpec.scala +++ b/cobol-parser/src/test/scala/za/co/absa/cobrix/cobol/reader/iterator/VRLRecordReaderSpec.scala @@ -225,6 +225,58 @@ class VRLRecordReaderSpec extends AnyWordSpec { assert(ex.getMessage == "The record length field LEN must be an integral type or a value mapping must be specified.") } + + "the length mapping with default record length" in { + val copybookWithLenbgthMap = + """ 01 RECORD. + 05 LEN_SPEC PIC X(1). + 05 N PIC 9(2). + 05 A PIC X(3). + """ + + val records = Array( + 0xC1, 0xF1, 0xF2, 0xC1, + 0xC2, 0xF3, 0xF4, 0xC2, 0xC3, + 0xC3, 0xF5, 0xF6, 0xC4, 0xC5, 0xC6 + ).map(_.toByte) + + val streamH = new ByteStreamMock(records) + val streamD = new ByteStreamMock(records) + val context = RawRecordContext(0, streamH, streamD, CopybookParser.parseSimple(copybookWithLenbgthMap), null, null, "") + + val readerParameters = ReaderParameters( + lengthFieldExpression = Some("LEN_SPEC"), + lengthFieldMap = Map("A" -> 4, "B" -> 5, "_" -> 6)) + + val reader = getUseCase( + copybook = copybookWithLenbgthMap, + records = records, + lengthFieldExpression = Some("LEN_SPEC"), + recordExtractor = Some(new FixedWithRecordLengthExprRawRecordExtractor(context, readerParameters))) + + assert(reader.hasNext) + val (segment1, record1) = reader.next() + assert(reader.hasNext) + val (segment2, record2) = reader.next() + assert(reader.hasNext) + val (segment3, record3) = reader.next() + assert(!reader.hasNext) + + assert(segment1.isEmpty) + assert(segment2.isEmpty) + assert(segment3.isEmpty) + assert(record1.length == 4) + assert(record2.length == 5) + assert(record3.length == 6) + assert(record1(0) == 0xC1.toByte) + assert(record1(1) == 0xF1.toByte) + assert(record1(2) == 0xF2.toByte) + assert(record1(3) == 0xC1.toByte) + assert(record2(0) == 0xC2.toByte) + assert(record2(1) == 0xF3.toByte) + assert(record3(0) == 0xC3.toByte) + assert(record3(1) == 0xF5.toByte) + } } "work with record length expressions" in {