diff --git a/test-data/cobol/HINA001.cbl b/test-data/cobol/HINA001.cbl new file mode 100644 index 0000000..0afbcae --- /dev/null +++ b/test-data/cobol/HINA001.cbl @@ -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. diff --git a/test-data/cobol/HINA004.cbl b/test-data/cobol/HINA004.cbl new file mode 100644 index 0000000..4572bea --- /dev/null +++ b/test-data/cobol/HINA004.cbl @@ -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. diff --git a/test-data/cobol/HINA005.cbl b/test-data/cobol/HINA005.cbl new file mode 100644 index 0000000..1fe7060 --- /dev/null +++ b/test-data/cobol/HINA005.cbl @@ -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. diff --git a/test-data/cobol/HINA006.cbl b/test-data/cobol/HINA006.cbl new file mode 100644 index 0000000..1fe7060 --- /dev/null +++ b/test-data/cobol/HINA006.cbl @@ -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. diff --git a/test-data/cobol/HINA007.cbl b/test-data/cobol/HINA007.cbl new file mode 100644 index 0000000..c829553 --- /dev/null +++ b/test-data/cobol/HINA007.cbl @@ -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. diff --git a/test-data/cobol/HINA013.cbl b/test-data/cobol/HINA013.cbl new file mode 100644 index 0000000..1fe7060 --- /dev/null +++ b/test-data/cobol/HINA013.cbl @@ -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. diff --git a/test-data/cobol/HINA024.cbl b/test-data/cobol/HINA024.cbl new file mode 100644 index 0000000..db619ff --- /dev/null +++ b/test-data/cobol/HINA024.cbl @@ -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. diff --git a/test-data/cobol/HINA025.cbl b/test-data/cobol/HINA025.cbl new file mode 100644 index 0000000..05bf52f --- /dev/null +++ b/test-data/cobol/HINA025.cbl @@ -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. diff --git a/test-data/cobol/HINA034.cbl b/test-data/cobol/HINA034.cbl new file mode 100644 index 0000000..faaa134 --- /dev/null +++ b/test-data/cobol/HINA034.cbl @@ -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. diff --git a/test-data/cobol/HINA101.cbl b/test-data/cobol/HINA101.cbl new file mode 100644 index 0000000..c03bf20 --- /dev/null +++ b/test-data/cobol/HINA101.cbl @@ -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. diff --git a/test-data/run_validation.py b/test-data/run_validation.py new file mode 100644 index 0000000..a29b094 --- /dev/null +++ b/test-data/run_validation.py @@ -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()) diff --git a/test-data/test-report.json b/test-data/test-report.json new file mode 100644 index 0000000..c02723e --- /dev/null +++ b/test-data/test-report.json @@ -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": [] + } +] \ No newline at end of file