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.