Files
cobol-java-v3/benchmark-programs/cross-cutting/edge-cases/matching-edge.cbl
T
NB-076 94400d50d4 feat: add benchmark-programs — 58 telecom COBOL test programs
作为子目录纳入系统,与核心测试管道协同

Co-Authored-By: Claude <noreply@anthropic.com>
2026-06-25 09:53:21 +08:00

215 lines
6.9 KiB
COBOL

IDENTIFICATION DIVISION.
PROGRAM-ID. MatchingEdge.
*> ============================================================
*> マッチング境界テスト (Matching Boundary Edge Cases)
*> 0%一致, 100%一致, 全重複キー, 降順入力,
*> 片方のみ全件, 全件同じキー
*> ============================================================
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT FILE-M ASSIGN TO "M.DAT"
ORGANIZATION IS SEQUENTIAL.
SELECT FILE-D ASSIGN TO "D.DAT"
ORGANIZATION IS SEQUENTIAL.
SELECT FILE-O ASSIGN TO "M-OUT.DAT"
ORGANIZATION IS SEQUENTIAL.
DATA DIVISION.
FILE SECTION.
FD FILE-M RECORD CONTAINS 30 CHARACTERS.
01 M-REC.
05 M-KEY PIC X(10).
05 M-DATA PIC X(20).
FD FILE-D RECORD CONTAINS 30 CHARACTERS.
01 D-REC.
05 D-KEY PIC X(10).
05 D-DATA PIC X(20).
FD FILE-O RECORD CONTAINS 40 CHARACTERS.
01 O-REC.
05 O-KEY PIC X(10).
05 O-RESULT PIC X(30).
WORKING-STORAGE SECTION.
*> テストデータ
01 TEST-CASE.
05 TC-ID PIC X(5).
05 TC-DESC PIC X(30).
01 WS-EOF PIC X(1) VALUE 'N'.
88 WS-EOF-Y VALUE 'Y'.
01 WS-MATCH PIC 9(5).
01 WS-UNMATCH-M PIC 9(5).
01 WS-UNMATCH-D PIC 9(5).
01 WS-TOTAL PIC 9(5).
01 WS-I PIC 9(3).
01 WS-PASS PIC 9(2) VALUE 0.
01 WS-FAIL PIC 9(2) VALUE 0.
01 WS-KEY PIC X(10).
PROCEDURE DIVISION.
MAIN.
DISPLAY "MATCHING-EDGE: Matching boundary edge tests"
*> T1: 片方0件 (masterあり detailなし)
DISPLAY "T1: Master=5 Detail=0 (0% match)"
PERFORM INIT-FILE-M
: > D.DAT
OPEN INPUT FILE-M FILE-D.
OPEN OUTPUT FILE-O.
MOVE 0 TO WS-MATCH.
PERFORM MATCH-LOOP.
CLOSE FILE-M FILE-D FILE-O.
IF WS-MATCH = 0
DISPLAY "T1: 0 matches PASS"
ADD 1 TO WS-PASS
ELSE
DISPLAY "T1: " WS-MATCH " matches FAIL"
ADD 1 TO WS-FAIL
END-IF.
*> T2: 100%一致
DISPLAY "T2: Master=5 Detail=5 (100% match)"
PERFORM INIT-FILE-M
PERFORM INIT-FILE-D-MATCH
OPEN INPUT FILE-M FILE-D.
OPEN OUTPUT FILE-O.
MOVE 0 TO WS-MATCH.
PERFORM MATCH-LOOP.
CLOSE FILE-M FILE-D FILE-O.
IF WS-MATCH = 5
DISPLAY "T2: 5/5 matches PASS"
ADD 1 TO WS-PASS
ELSE
DISPLAY "T2: " WS-MATCH " matches FAIL"
ADD 1 TO WS-FAIL
END-IF.
*> T3: 全件同キー
DISPLAY "T3: All same key (KEY000001 x5)"
PERFORM INIT-FILE-M-SAMEKEY
PERFORM INIT-FILE-D-SAMEKEY
OPEN INPUT FILE-M FILE-D.
OPEN OUTPUT FILE-O.
MOVE 0 TO WS-MATCH.
PERFORM MATCH-LOOP.
CLOSE FILE-M FILE-D FILE-O.
IF WS-MATCH > 0
DISPLAY "T3: " WS-MATCH " matches (all same key) PASS"
ADD 1 TO WS-PASS
ELSE
ADD 1 TO WS-FAIL
END-IF.
*> T4: 降順入力 (昇順アサンプション違反)
DISPLAY "T4: Descending input (violation)"
PERFORM INIT-FILE-DESC
OPEN INPUT FILE-M.
SET WS-EOF-Y TO FALSE.
MOVE 0 TO WS-TOTAL.
PERFORM UNTIL WS-EOF-Y
READ FILE-M INTO M-REC
AT END SET WS-EOF-Y TO TRUE
NOT AT END
ADD 1 TO WS-TOTAL
END-READ
END-PERFORM.
CLOSE FILE-M.
IF WS-TOTAL = 5
DISPLAY "T4: Read=" WS-TOTAL " (reverse order) PASS"
ADD 1 TO WS-PASS
ELSE
ADD 1 TO WS-FAIL
END-IF.
DISPLAY " "
DISPLAY "MATCHING-EDGE: PASS=" WS-PASS " FAIL=" WS-FAIL
IF WS-FAIL = 0
DISPLAY "ALL PASSED"
STOP RUN RETURNING 0
ELSE
STOP RUN RETURNING 1
END-IF
.
MATCH-LOOP.
SET WS-EOF-Y TO FALSE.
PERFORM UNTIL WS-EOF-Y
READ FILE-M INTO M-REC
AT END SET WS-EOF-Y TO TRUE
NOT AT END
READ FILE-D INTO D-REC
AT END
ADD 1 TO WS-UNMATCH-M
MOVE M-KEY TO O-KEY
MOVE "UNMATCHED-MASTER" TO O-RESULT
WRITE O-REC
NOT AT END
IF M-KEY = D-KEY
ADD 1 TO WS-MATCH
MOVE M-KEY TO O-KEY
MOVE "MATCHED" TO O-RESULT
WRITE O-REC
ELSE IF M-KEY < D-KEY
ADD 1 TO WS-UNMATCH-M
ELSE
ADD 1 TO WS-UNMATCH-D
END-IF
END-READ
END-READ
END-PERFORM.
.
*> データ生成補助段落
INIT-FILE-M.
OPEN OUTPUT FILE-M.
PERFORM VARYING WS-I FROM 1 BY 1 UNTIL WS-I > 5
MOVE WS-I TO M-KEY
MOVE "MASTER-DATA" TO M-DATA
WRITE M-REC
END-PERFORM.
CLOSE FILE-M.
.
INIT-FILE-D-MATCH.
OPEN OUTPUT FILE-D.
PERFORM VARYING WS-I FROM 1 BY 1 UNTIL WS-I > 5
MOVE WS-I TO D-KEY
MOVE "DETAIL-DATA" TO D-DATA
WRITE D-REC
END-PERFORM.
CLOSE FILE-D.
.
INIT-FILE-M-SAMEKEY.
OPEN OUTPUT FILE-M.
PERFORM VARYING WS-I FROM 1 BY 1 UNTIL WS-I > 5
MOVE "KEY000001" TO M-KEY
MOVE "SAME-KEY-M" TO M-DATA
WRITE M-REC
END-PERFORM.
CLOSE FILE-M.
OPEN OUTPUT FILE-D.
PERFORM VARYING WS-I FROM 1 BY 1 UNTIL WS-I > 3
MOVE "KEY000001" TO D-KEY
MOVE "SAME-KEY-D" TO D-DATA
WRITE D-REC
END-PERFORM.
CLOSE FILE-D.
.
INIT-FILE-DESC.
OPEN OUTPUT FILE-M.
PERFORM VARYING WS-I FROM 5 BY -1 UNTIL WS-I < 1
MOVE WS-I TO M-KEY
MOVE "DESC-DATA" TO M-DATA
WRITE M-REC
END-PERFORM.
CLOSE FILE-M.
.
END PROGRAM MatchingEdge.