@@ -88,6 +88,33 @@ class SegmentRedefinesSpec extends AnyFunSuite {
8888 assert(! parsedCopybook.ast.children.head.asInstanceOf [Group ].children(4 ).asInstanceOf [Group ].isSegmentRedefine)
8989 }
9090
91+ test (" Test allow gaps in segment redefines as long as they are in the same group" ) {
92+ val copybook =
93+ """ 01 RECORD.
94+ | 02 A-RECORD.
95+ | 03 FIELD0 PIC X(2).
96+ | 02 SEGMENT-A.
97+ | 03 FIELD1 PIC X(2).
98+ | 02 SEGMENT-B REDEFINES SEGMENT-A.
99+ | 03 FIELD1 PIC X(2).
100+ | 02 SEGMENT-C REDEFINES SEGMENT-A.
101+ | 03 FIELD4 PICTURE S9(6)USAGE COMP.
102+ | 02 SEGMENT-D REDEFINES SEGMENT-A.
103+ | 03 FIELD4 PICTURE S9(6)USAGE COMP.
104+ | 02 Z-RECORD.
105+ | 03 FIELD5 PIC X(2).
106+ """ .stripMargin
107+
108+ val segmentRedefines = " SEGMENT-A" :: " SEGMENT-C" :: " SEGMENT-D" :: Nil
109+
110+ val parsedCopybook = CopybookParser .parseTree(copybook, dropGroupFillers = false , dropValueFillers = true , fillerNamingPolicy = FillerNamingPolicy .SequenceNumbers , segmentRedefines)
111+
112+ assert(! parsedCopybook.ast.children.head.asInstanceOf [Group ].children(0 ).asInstanceOf [Group ].isSegmentRedefine)
113+ assert(parsedCopybook.ast.children.head.asInstanceOf [Group ].children(1 ).asInstanceOf [Group ].isSegmentRedefine)
114+ assert(! parsedCopybook.ast.children.head.asInstanceOf [Group ].children(2 ).asInstanceOf [Group ].isSegmentRedefine)
115+ assert(parsedCopybook.ast.children.head.asInstanceOf [Group ].children(3 ).asInstanceOf [Group ].isSegmentRedefine)
116+ }
117+
91118 test (" Test segment redefines should be in the same redefined group" ) {
92119 val copybook =
93120 """ 01 RECORD.
@@ -115,5 +142,55 @@ class SegmentRedefinesSpec extends AnyFunSuite {
115142 assert(exception1.getMessage.contains(" The 'SEGMENT_C' field is specified to be a segment redefine." ))
116143 }
117144
145+ test (" Test first segment should be redefined" ) {
146+ val copybook =
147+ """ 01 RECORD.
148+ | 02 A-RECORD.
149+ | 03 FIELD0 PIC X(2).
150+ | 02 SEGMENT-A.
151+ | 03 FIELD1 PIC X(2).
152+ | 02 SEGMENT-B.
153+ | 03 FIELD1 PIC X(2).
154+ | 02 SEGMENT-C REDEFINES SEGMENT-B.
155+ | 03 FIELD4 PICTURE S9(6)USAGE COMP.
156+ | 02 SEGMENT-D REDEFINES SEGMENT-C.
157+ | 03 FIELD4 PICTURE S9(6)USAGE COMP.
158+ | 02 Z-RECORD.
159+ | 03 FIELD5 PIC X(2).
160+ """ .stripMargin
161+
162+ val segmentRedefines = " SEGMENT-A" :: " SEGMENT-B" :: " SEGMENT-C" :: " SEGMENT-D" :: Nil
163+
164+ val exception1 = intercept[IllegalStateException ] {
165+ CopybookParser .parseTree(copybook, dropGroupFillers = false , dropValueFillers = true , fillerNamingPolicy = FillerNamingPolicy .SequenceNumbers , segmentRedefines)
166+ }
167+ assert(exception1.getMessage.contains(" The following segment redefines not found: [ SEGMENT_A ]." ))
168+ }
169+
170+ test (" Test don't allow non-redefined fields in between segment redefines" ) {
171+ val copybook =
172+ """ 01 RECORD.
173+ | 02 A-RECORD.
174+ | 03 FIELD0 PIC X(2).
175+ | 02 SEGMENT-A.
176+ | 03 FIELD1 PIC X(2).
177+ | 02 SEGMENT-B REDEFINES SEGMENT-A.
178+ | 03 FIELD1 PIC X(2).
179+ | 02 SEGMENT-C.
180+ | 03 FIELD4 PICTURE S9(6)USAGE COMP.
181+ | 02 SEGMENT-D REDEFINES SEGMENT-C.
182+ | 03 FIELD4 PICTURE S9(6)USAGE COMP.
183+ | 02 Z-RECORD.
184+ | 03 FIELD5 PIC X(2).
185+ """ .stripMargin
186+
187+ val segmentRedefines = " SEGMENT-A" :: " SEGMENT-B" :: " SEGMENT-C" :: " SEGMENT-D" :: Nil
188+
189+ val exception1 = intercept[IllegalStateException ] {
190+ CopybookParser .parseTree(copybook, dropGroupFillers = false , dropValueFillers = true , fillerNamingPolicy = FillerNamingPolicy .SequenceNumbers , segmentRedefines)
191+ }
192+ assert(exception1.getMessage.contains(" The segment redefine field 'SEGMENT_C' is not a REDEFINE or redefined by another field." ))
193+ }
194+
118195
119196}
0 commit comments