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