test: add HINA type-specific COBOL test data suite (10 programs, 8/10 pass)
This commit is contained in:
@@ -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.
|
||||||
@@ -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.
|
||||||
@@ -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.
|
||||||
@@ -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.
|
||||||
@@ -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.
|
||||||
@@ -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.
|
||||||
@@ -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.
|
||||||
@@ -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.
|
||||||
@@ -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.
|
||||||
@@ -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.
|
||||||
@@ -0,0 +1,112 @@
|
|||||||
|
"""
|
||||||
|
HINA 类型别 COBOL 测试数据验证器
|
||||||
|
全テストプログラムに対して extract_structure + HINA + 数据生成を実行
|
||||||
|
"""
|
||||||
|
import sys, json
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
|
sys.path.insert(0, str(Path(__file__).parent.parent))
|
||||||
|
from cobol_testgen import extract_structure, generate_data
|
||||||
|
from cobol_testgen.coverage import check_coverage
|
||||||
|
from hina.classifier import compute_confidence
|
||||||
|
|
||||||
|
TEST_DIR = Path(__file__).parent / "cobol"
|
||||||
|
|
||||||
|
EXPECTED = {
|
||||||
|
"HINA001": {"name": "1:1 マッチング", "min_para": 8, "min_br": 0, "min_dp": 0, "fc": 3,
|
||||||
|
"note": "PERFORM内IFは静的解析対象外"},
|
||||||
|
"HINA005": {"name": "IF条件分岐", "min_para": 1, "min_br": 6, "min_dp": 3, "fc": 0},
|
||||||
|
"HINA006": {"name": "EVALUATE分岐", "min_para": 1, "min_br": 6, "min_dp": 3, "fc": 0},
|
||||||
|
"HINA007": {"name": "キーブレイク集計", "min_para": 3, "min_br": 0, "min_dp": 0, "fc": 2,
|
||||||
|
"note": "PERFORM内IFは静的解析対象外"},
|
||||||
|
"HINA024": {"name": "内部テーブル検索", "min_para": 1, "min_br": 2, "min_dp": 2, "fc": 0,
|
||||||
|
"note": "Lark文法制限: ASCENDING KEY未対応"},
|
||||||
|
"HINA013": {"name": "項目チェック", "min_para": 1, "min_br": 6, "min_dp": 3, "fc": 0},
|
||||||
|
"HINA004": {"name": "編集出力(GETPUT)", "min_para": 3, "min_br": 0, "min_dp": 0, "fc": 2,
|
||||||
|
"note": "PERFORM内IFは静的解析対象外"},
|
||||||
|
"HINA025": {"name": "サブプログラムCALL", "min_para": 2, "min_br": 0, "min_dp": 0, "fc": 0,
|
||||||
|
"hina_type": "子程序调用", "hina_method": "keyword"},
|
||||||
|
"HINA034": {"name": "SORT処理", "min_para": 1, "min_br": 0, "min_dp": 0, "fc": 3,
|
||||||
|
"hina_type": "SORT", "hina_method": "keyword",
|
||||||
|
"note": "Lark文法制限: SD未対応"},
|
||||||
|
"HINA101": {"name": "EXEC SQL", "min_para": 1, "min_br": 1, "min_dp": 1, "fc": 0,
|
||||||
|
"hina_type": "DB操作", "hina_method": "keyword"},
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
results = []
|
||||||
|
passed = failed = 0
|
||||||
|
cbl_files = sorted(TEST_DIR.glob("HINA*.cbl"))
|
||||||
|
print("=" * 70)
|
||||||
|
print(" HINA 类型别 COBOL 测试数据集 - 验证报告")
|
||||||
|
print("=" * 70)
|
||||||
|
print(f"\n 测试程序数: {len(cbl_files)}\n")
|
||||||
|
|
||||||
|
for cbl_path in cbl_files:
|
||||||
|
stem = cbl_path.stem
|
||||||
|
exp = EXPECTED.get(stem, {})
|
||||||
|
name = exp.get("name", stem)
|
||||||
|
src = cbl_path.read_text(encoding="utf-8")
|
||||||
|
|
||||||
|
try:
|
||||||
|
struct = extract_structure(src)
|
||||||
|
records = generate_data(src, struct)
|
||||||
|
cov = check_coverage(struct, records)
|
||||||
|
hina = compute_confidence(src, struct)
|
||||||
|
|
||||||
|
issues = []
|
||||||
|
if struct["total_paragraphs"] < exp.get("min_para", 0):
|
||||||
|
issues.append(f"段落不足: {struct['total_paragraphs']}<{exp.get('min_para')}")
|
||||||
|
if struct["total_branches"] < exp.get("min_br", 0):
|
||||||
|
issues.append(f"分岐不足: {struct['total_branches']}<{exp.get('min_br')}")
|
||||||
|
if len(struct["decision_points"]) < exp.get("min_dp", 0):
|
||||||
|
issues.append(f"決定点不足: {len(struct['decision_points'])}<{exp.get('min_dp')}")
|
||||||
|
if exp.get("hina_type") and hina.get("category") != exp["hina_type"]:
|
||||||
|
issues.append(f"HINA類型違い: {hina.get('category')}!={exp['hina_type']}")
|
||||||
|
if exp.get("hina_method") and hina.get("method") != exp["hina_method"]:
|
||||||
|
issues.append(f"HINA方法違い: {hina.get('method')}!={exp['hina_method']}")
|
||||||
|
|
||||||
|
status = "PASS" if not issues else "FAIL"
|
||||||
|
if status == "PASS":
|
||||||
|
passed += 1
|
||||||
|
else:
|
||||||
|
failed += 1
|
||||||
|
|
||||||
|
results.append({
|
||||||
|
"program": stem, "status": status,
|
||||||
|
"paragraphs": struct["total_paragraphs"],
|
||||||
|
"branches": struct["total_branches"],
|
||||||
|
"decision_points": len(struct["decision_points"]),
|
||||||
|
"file_count": struct["file_count"],
|
||||||
|
"records": len(records),
|
||||||
|
"hina_type": hina.get("category", "?"),
|
||||||
|
"hina_confidence": hina.get("confidence", 0.0),
|
||||||
|
"hina_method": hina.get("method", "?"),
|
||||||
|
"issues": issues,
|
||||||
|
})
|
||||||
|
|
||||||
|
print(f" [{status}] {stem} - {name}")
|
||||||
|
print(f" 段落={struct['total_paragraphs']} 分岐={struct['total_branches']} "
|
||||||
|
f"決定点={len(struct['decision_points'])} ファイル={struct['file_count']}")
|
||||||
|
print(f" HINA: {hina.get('category','?')} ({hina.get('confidence',0):.0%}) method={hina.get('method','?')}")
|
||||||
|
print(f" 生成データ: {len(records)}件")
|
||||||
|
for i in issues:
|
||||||
|
print(f" ⚠️ {i}")
|
||||||
|
print()
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
failed += 1
|
||||||
|
print(f" [ERROR] {stem} - {name}: {str(e)[:80]}\n")
|
||||||
|
|
||||||
|
print("-" * 70)
|
||||||
|
print(f" 总计: {passed} passed, {failed} failed / {len(cbl_files)} total")
|
||||||
|
|
||||||
|
report_path = TEST_DIR.parent / "test-report.json"
|
||||||
|
json.dump(results, open(report_path, "w", encoding="utf-8"), indent=2, ensure_ascii=False)
|
||||||
|
print(f" 详细报告: {report_path}")
|
||||||
|
return 0 if failed == 0 else 1
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
sys.exit(main())
|
||||||
@@ -0,0 +1,106 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
"program": "HINA001",
|
||||||
|
"status": "PASS",
|
||||||
|
"paragraphs": 9,
|
||||||
|
"branches": 0,
|
||||||
|
"decision_points": 0,
|
||||||
|
"file_count": 3,
|
||||||
|
"records": 5,
|
||||||
|
"hina_type": "文件编成",
|
||||||
|
"hina_confidence": 0.99,
|
||||||
|
"hina_method": "keyword",
|
||||||
|
"issues": []
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"program": "HINA004",
|
||||||
|
"status": "PASS",
|
||||||
|
"paragraphs": 3,
|
||||||
|
"branches": 0,
|
||||||
|
"decision_points": 0,
|
||||||
|
"file_count": 2,
|
||||||
|
"records": 3,
|
||||||
|
"hina_type": "文件编成",
|
||||||
|
"hina_confidence": 0.99,
|
||||||
|
"hina_method": "keyword",
|
||||||
|
"issues": []
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"program": "HINA005",
|
||||||
|
"status": "PASS",
|
||||||
|
"paragraphs": 1,
|
||||||
|
"branches": 6,
|
||||||
|
"decision_points": 3,
|
||||||
|
"file_count": 0,
|
||||||
|
"records": 6,
|
||||||
|
"hina_type": "unknown",
|
||||||
|
"hina_confidence": 0.0,
|
||||||
|
"hina_method": "none",
|
||||||
|
"issues": []
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"program": "HINA006",
|
||||||
|
"status": "PASS",
|
||||||
|
"paragraphs": 1,
|
||||||
|
"branches": 6,
|
||||||
|
"decision_points": 3,
|
||||||
|
"file_count": 0,
|
||||||
|
"records": 6,
|
||||||
|
"hina_type": "unknown",
|
||||||
|
"hina_confidence": 0.0,
|
||||||
|
"hina_method": "none",
|
||||||
|
"issues": []
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"program": "HINA007",
|
||||||
|
"status": "PASS",
|
||||||
|
"paragraphs": 4,
|
||||||
|
"branches": 0,
|
||||||
|
"decision_points": 0,
|
||||||
|
"file_count": 2,
|
||||||
|
"records": 4,
|
||||||
|
"hina_type": "文件编成",
|
||||||
|
"hina_confidence": 0.99,
|
||||||
|
"hina_method": "keyword",
|
||||||
|
"issues": []
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"program": "HINA013",
|
||||||
|
"status": "PASS",
|
||||||
|
"paragraphs": 1,
|
||||||
|
"branches": 6,
|
||||||
|
"decision_points": 3,
|
||||||
|
"file_count": 0,
|
||||||
|
"records": 6,
|
||||||
|
"hina_type": "unknown",
|
||||||
|
"hina_confidence": 0.0,
|
||||||
|
"hina_method": "none",
|
||||||
|
"issues": []
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"program": "HINA025",
|
||||||
|
"status": "PASS",
|
||||||
|
"paragraphs": 2,
|
||||||
|
"branches": 0,
|
||||||
|
"decision_points": 0,
|
||||||
|
"file_count": 0,
|
||||||
|
"records": 1,
|
||||||
|
"hina_type": "子程序调用",
|
||||||
|
"hina_confidence": 0.9,
|
||||||
|
"hina_method": "keyword",
|
||||||
|
"issues": []
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"program": "HINA101",
|
||||||
|
"status": "PASS",
|
||||||
|
"paragraphs": 2,
|
||||||
|
"branches": 2,
|
||||||
|
"decision_points": 1,
|
||||||
|
"file_count": 0,
|
||||||
|
"records": 2,
|
||||||
|
"hina_type": "DB操作",
|
||||||
|
"hina_confidence": 0.95,
|
||||||
|
"hina_method": "keyword",
|
||||||
|
"issues": []
|
||||||
|
}
|
||||||
|
]
|
||||||
Reference in New Issue
Block a user