test: add HINA type-specific COBOL test data suite (10 programs, 8/10 pass)

This commit is contained in:
hangshuo652
2026-06-18 16:55:43 +08:00
parent 2e64f208ea
commit 9ad0e88a1a
12 changed files with 617 additions and 0 deletions
+84
View File
@@ -0,0 +1,84 @@
* HINA001 - 1:1 マッチング
>>SOURCE FORMAT IS FREE
* 2入力ファイル(R01/R02)をキー一致でマージ
* 期待: 2ファイル, 3 IF, 6 分岐, ~5 段落
IDENTIFICATION DIVISION.
PROGRAM-ID. HINA001.
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT R01-FILE ASSIGN TO "R01.DAT"
ORGANIZATION IS LINE SEQUENTIAL.
SELECT R02-FILE ASSIGN TO "R02.DAT"
ORGANIZATION IS LINE SEQUENTIAL.
SELECT W01-FILE ASSIGN TO "W01.DAT"
ORGANIZATION IS LINE SEQUENTIAL.
DATA DIVISION.
FILE SECTION.
FD R01-FILE.
01 R01-REC PIC X(30).
FD R02-FILE.
01 R02-REC PIC X(30).
FD W01-FILE.
01 W01-REC PIC X(60).
WORKING-STORAGE SECTION.
01 WS-R01-KEY PIC X(10).
01 WS-R02-KEY PIC X(10).
01 WS-R01-DATA PIC X(20).
01 WS-R02-DATA PIC X(20).
01 WS-EOF1 PIC X VALUE 'N'.
88 R01-EOF VALUE 'Y'.
01 WS-EOF2 PIC X VALUE 'N'.
88 R02-EOF VALUE 'Y'.
PROCEDURE DIVISION.
0000-MAIN.
OPEN INPUT R01-FILE R02-FILE.
OPEN OUTPUT W01-FILE.
PERFORM 1000-READ-R01.
PERFORM 2000-READ-R02.
PERFORM 3000-MATCH UNTIL R01-EOF AND R02-EOF.
CLOSE R01-FILE R02-FILE W01-FILE.
STOP RUN.
1000-READ-R01.
READ R01-FILE INTO R01-REC
AT END MOVE 'Y' TO WS-EOF1
NOT AT END PERFORM 1100-PARSE-R01.
1100-PARSE-R01.
MOVE R01-REC(1:10) TO WS-R01-KEY.
MOVE R01-REC(11:20) TO WS-R01-DATA.
2000-READ-R02.
READ R02-FILE INTO R02-REC
AT END MOVE 'Y' TO WS-EOF2
NOT AT END PERFORM 2100-PARSE-R02.
2100-PARSE-R02.
MOVE R02-REC(1:10) TO WS-R02-KEY.
MOVE R02-REC(11:20) TO WS-R02-DATA.
3000-MATCH.
IF R01-EOF THEN
PERFORM 4000-WRITE-R02-ONLY
PERFORM 2000-READ-R02
ELSE IF R02-EOF THEN
PERFORM 5000-WRITE-R01-ONLY
PERFORM 1000-READ-R01
ELSE IF WS-R01-KEY < WS-R02-KEY THEN
PERFORM 5000-WRITE-R01-ONLY
PERFORM 1000-READ-R01
ELSE IF WS-R01-KEY > WS-R02-KEY THEN
PERFORM 4000-WRITE-R02-ONLY
PERFORM 2000-READ-R02
ELSE
PERFORM 6000-WRITE-MATCH
PERFORM 1000-READ-R01
PERFORM 2000-READ-R02.
4000-WRITE-R02-ONLY.
STRING WS-R02-KEY WS-R02-DATA DELIMITED BY SIZE
INTO W01-REC.
WRITE W01-REC.
5000-WRITE-R01-ONLY.
STRING WS-R01-KEY WS-R01-DATA DELIMITED BY SIZE
INTO W01-REC.
WRITE W01-REC.
6000-WRITE-MATCH.
STRING WS-R01-KEY WS-R01-DATA WS-R02-DATA
DELIMITED BY SIZE INTO W01-REC.
WRITE W01-REC.
+54
View File
@@ -0,0 +1,54 @@
* HINA004 - 編集出力(GETPUT)
>>SOURCE FORMAT IS FREE
* レイアウト編集 レコード入出力
* 期待: 2ファイル, 1 IF, 5 段落
IDENTIFICATION DIVISION.
PROGRAM-ID. HINA004.
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT IN-FILE ASSIGN TO "IN.DAT"
ORGANIZATION IS LINE SEQUENTIAL.
SELECT OUT-FILE ASSIGN TO "OUT.DAT"
ORGANIZATION IS LINE SEQUENTIAL.
DATA DIVISION.
FILE SECTION.
FD IN-FILE.
01 IN-REC.
05 IN-ID PIC X(05).
05 IN-NAME PIC X(20).
05 IN-AMT PIC 9(07)V99.
FD OUT-FILE.
01 OUT-REC PIC X(80).
WORKING-STORAGE SECTION.
01 WS-EOF PIC X VALUE 'N'.
88 WS-EOF-Y VALUE 'Y'.
01 WS-HEADER PIC X(80).
01 WS-DETAIL PIC X(80).
01 WS-LINE-CNT PIC 9(02).
PROCEDURE DIVISION.
0000-MAIN.
OPEN INPUT IN-FILE.
OPEN OUTPUT OUT-FILE.
MOVE "ID NAME AMOUNT" TO WS-HEADER.
WRITE OUT-REC FROM WS-HEADER.
MOVE 0 TO WS-LINE-CNT.
PERFORM 1000-READ.
PERFORM 2000-PROCESS UNTIL WS-EOF-Y.
CLOSE IN-FILE OUT-FILE.
STOP RUN.
1000-READ.
READ IN-FILE INTO IN-REC
AT END MOVE 'Y' TO WS-EOF-Y.
2000-PROCESS.
IF WS-LINE-CNT > 50 THEN
MOVE SPACES TO WS-DETAIL
STRING "--- PAGE BREAK ---"
DELIMITED BY SIZE INTO WS-DETAIL
WRITE OUT-REC FROM WS-DETAIL
MOVE 0 TO WS-LINE-CNT.
STRING IN-ID IN-NAME IN-AMT DELIMITED BY SIZE
INTO WS-DETAIL.
WRITE OUT-REC FROM WS-DETAIL.
ADD 1 TO WS-LINE-CNT.
PERFORM 1000-READ.
+24
View File
@@ -0,0 +1,24 @@
* >>SOURCE FORMAT IS FREE
IDENTIFICATION DIVISION.
PROGRAM-ID. TEST.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-A PIC X(01).
01 WS-B PIC 9(05).
01 WS-C PIC X(20).
PROCEDURE DIVISION.
IF WS-A = 'A' THEN
MOVE 'HIGH' TO WS-C
IF WS-B > 1000 THEN
MOVE 'HIGH-1000' TO WS-C
ELSE
MOVE 'LOW-1000' TO WS-C
END-IF
ELSE IF WS-A = 'B' THEN
MOVE 'MED' TO WS-C
IF WS-B > 500 THEN
MOVE 'MED-500' TO WS-C
END-IF
ELSE
MOVE 'OTHER' TO WS-C.
GOBACK.
+24
View File
@@ -0,0 +1,24 @@
* >>SOURCE FORMAT IS FREE
IDENTIFICATION DIVISION.
PROGRAM-ID. TEST.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-A PIC X(01).
01 WS-B PIC 9(05).
01 WS-C PIC X(20).
PROCEDURE DIVISION.
IF WS-A = 'A' THEN
MOVE 'HIGH' TO WS-C
IF WS-B > 1000 THEN
MOVE 'HIGH-1000' TO WS-C
ELSE
MOVE 'LOW-1000' TO WS-C
END-IF
ELSE IF WS-A = 'B' THEN
MOVE 'MED' TO WS-C
IF WS-B > 500 THEN
MOVE 'MED-500' TO WS-C
END-IF
ELSE
MOVE 'OTHER' TO WS-C.
GOBACK.
+54
View File
@@ -0,0 +1,54 @@
* HINA007 - キーブレイク(集計)
>>SOURCE FORMAT IS FREE
* キー切替時の累計集計処理
* 期待: 2 IF, 1 PERFORM, 5 段落, キーブレイク有
IDENTIFICATION DIVISION.
PROGRAM-ID. HINA007.
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT IN-FILE ASSIGN TO "TRANS.DAT"
ORGANIZATION IS LINE SEQUENTIAL.
SELECT OUT-FILE ASSIGN TO "SUM.DAT"
ORGANIZATION IS LINE SEQUENTIAL.
DATA DIVISION.
FILE SECTION.
FD IN-FILE.
01 IN-REC.
05 IN-KEY PIC X(05).
05 IN-AMT PIC 9(07).
FD OUT-FILE.
01 OUT-REC PIC X(30).
WORKING-STORAGE SECTION.
01 WS-PREV-KEY PIC X(05).
01 WS-SUM PIC 9(10).
01 WS-EOF PIC X VALUE 'N'.
88 EOF-VALUE VALUE 'Y'.
01 WS-FIRST PIC X VALUE 'Y'.
88 FIRST-REC VALUE 'Y'.
PROCEDURE DIVISION.
0000-MAIN.
OPEN INPUT IN-FILE.
OPEN OUTPUT OUT-FILE.
PERFORM 1000-READ.
PERFORM 2000-PROCESS UNTIL EOF-VALUE.
PERFORM 3000-WRITE-BREAK.
CLOSE IN-FILE OUT-FILE.
STOP RUN.
1000-READ.
READ IN-FILE INTO IN-REC
AT END MOVE 'Y' TO WS-EOF.
2000-PROCESS.
IF FIRST-REC THEN
MOVE IN-KEY TO WS-PREV-KEY
MOVE 'N' TO WS-FIRST.
IF IN-KEY NOT = WS-PREV-KEY THEN
PERFORM 3000-WRITE-BREAK
MOVE IN-KEY TO WS-PREV-KEY
MOVE 0 TO WS-SUM.
ADD IN-AMT TO WS-SUM.
PERFORM 1000-READ.
3000-WRITE-BREAK.
STRING WS-PREV-KEY WS-SUM DELIMITED BY SIZE
INTO OUT-REC.
WRITE OUT-REC.
+24
View File
@@ -0,0 +1,24 @@
* >>SOURCE FORMAT IS FREE
IDENTIFICATION DIVISION.
PROGRAM-ID. TEST.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-A PIC X(01).
01 WS-B PIC 9(05).
01 WS-C PIC X(20).
PROCEDURE DIVISION.
IF WS-A = 'A' THEN
MOVE 'HIGH' TO WS-C
IF WS-B > 1000 THEN
MOVE 'HIGH-1000' TO WS-C
ELSE
MOVE 'LOW-1000' TO WS-C
END-IF
ELSE IF WS-A = 'B' THEN
MOVE 'MED' TO WS-C
IF WS-B > 500 THEN
MOVE 'MED-500' TO WS-C
END-IF
ELSE
MOVE 'OTHER' TO WS-C.
GOBACK.
+42
View File
@@ -0,0 +1,42 @@
* HINA024 - 内部テーブル検索(SEARCH ALL)
>>SOURCE FORMAT IS FREE
* OCCURS + SEARCH ALL によるテーブル検索
* 期待: SEARCH ALL, OCCURS, 2 IF, 5 段落
IDENTIFICATION DIVISION.
PROGRAM-ID. HINA024.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-TABLE.
05 WS-ENTRY OCCURS 10 TIMES
ASCENDING KEY IS WS-ENTRY-ID
INDEXED BY WS-IDX.
10 WS-ENTRY-ID PIC 9(03).
10 WS-ENTRY-NAME PIC X(10).
01 WS-SEARCH-ID PIC 9(03).
01 WS-FOUND PIC X VALUE 'N'.
88 FOUND-YES VALUE 'Y'.
01 WS-RESULT PIC X(30).
PROCEDURE DIVISION.
0000-MAIN.
PERFORM 1000-INIT.
MOVE 7 TO WS-SEARCH-ID.
PERFORM 2000-SEARCH.
DISPLAY WS-RESULT.
MOVE 99 TO WS-SEARCH-ID.
PERFORM 2000-SEARCH.
DISPLAY WS-RESULT.
STOP RUN.
1000-INIT.
MOVE 1 TO WS-ENTRY-ID(1) MOVE "ALPHA" TO WS-ENTRY-NAME(1).
MOVE 3 TO WS-ENTRY-ID(2) MOVE "BETA" TO WS-ENTRY-NAME(2).
MOVE 5 TO WS-ENTRY-ID(3) MOVE "GAMMA" TO WS-ENTRY-NAME(3).
MOVE 7 TO WS-ENTRY-ID(4) MOVE "DELTA" TO WS-ENTRY-NAME(4).
MOVE 9 TO WS-ENTRY-ID(5) MOVE "EPSLN" TO WS-ENTRY-NAME(5).
2000-SEARCH.
SET WS-IDX TO 1.
SEARCH ALL WS-ENTRY
AT END
MOVE "NOT FOUND" TO WS-RESULT
WHEN WS-ENTRY-ID(WS-IDX) = WS-SEARCH-ID
STRING "FOUND=" WS-ENTRY-NAME(WS-IDX)
DELIMITED BY SIZE INTO WS-RESULT.
+31
View File
@@ -0,0 +1,31 @@
* HINA025 - サブプログラムCALL
>>SOURCE FORMAT IS FREE
* CALL文によるサブプログラム呼び出し
* 期待: CALL文, LINKAGE SECTION, 2段落
IDENTIFICATION DIVISION.
PROGRAM-ID. HINA025.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-A PIC 9(05) VALUE 100.
01 WS-B PIC 9(05) VALUE 200.
01 WS-RESULT PIC 9(06).
PROCEDURE DIVISION.
0000-MAIN.
CALL 'HINA025SUB' USING WS-A WS-B WS-RESULT.
DISPLAY "RESULT=" WS-RESULT.
CALL 'HINA025SUB' USING WS-B WS-A WS-RESULT.
DISPLAY "RESULT2=" WS-RESULT.
STOP RUN.
* サブプログラム(インライン)
IDENTIFICATION DIVISION.
PROGRAM-ID. HINA025SUB.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-TEMP PIC 9(06).
LINKAGE SECTION.
01 X PIC 9(05).
01 Y PIC 9(05).
01 Z PIC 9(06).
PROCEDURE DIVISION USING X Y Z.
ADD X TO Y GIVING Z.
GOBACK.
+39
View File
@@ -0,0 +1,39 @@
* HINA034 - SORT処理
>>SOURCE FORMAT IS FREE
* SORT文によるファイルソート
* 期待: SORT文, INPUT/OUTPUT PROCEDURE
IDENTIFICATION DIVISION.
PROGRAM-ID. HINA034.
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT IN-FILE ASSIGN TO "SORTIN.DAT"
ORGANIZATION IS LINE SEQUENTIAL.
SELECT OUT-FILE ASSIGN TO "SORTOUT.DAT"
ORGANIZATION IS LINE SEQUENTIAL.
SELECT WORK-FILE ASSIGN TO "SORTWORK".
DATA DIVISION.
FILE SECTION.
FD IN-FILE.
01 IN-REC.
05 IN-KEY PIC 9(05).
05 IN-DATA PIC X(20).
FD OUT-FILE.
01 OUT-REC.
05 OUT-KEY PIC 9(05).
05 OUT-DATA PIC X(20).
SD WORK-FILE.
01 WORK-REC.
05 WORK-KEY PIC 9(05).
05 WORK-DATA PIC X(20).
WORKING-STORAGE SECTION.
01 WS-CNT PIC 9(05).
01 WS-MAX PIC 9(05).
PROCEDURE DIVISION.
0000-MAIN.
SORT WORK-FILE
ON ASCENDING KEY WORK-KEY
USING IN-FILE
GIVING OUT-FILE.
DISPLAY "SORT COMPLETE".
STOP RUN.
+23
View File
@@ -0,0 +1,23 @@
* HINA101 - EXEC SQL(SELECT条件)
>>SOURCE FORMAT IS FREE
* EXEC SQL 埋め込みSQL
* 期待: L1キーワード "EXEC SQL" で判定
IDENTIFICATION DIVISION.
PROGRAM-ID. HINA101.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-CUST-ID PIC X(10).
01 WS-CUST-NAME PIC X(30).
01 WS-SQLCODE PIC S9(09) COMP.
PROCEDURE DIVISION.
0000-MAIN.
EXEC SQL
SELECT CUST_NAME INTO :WS-CUST-NAME
FROM CUSTOMERS
WHERE CUST_ID = :WS-CUST-ID
END-EXEC.
IF SQLCODE = 0 THEN
DISPLAY "FOUND:" WS-CUST-NAME
ELSE
DISPLAY "NOT FOUND".
STOP RUN.