IDENTIFICATION DIVISION. PROGRAM-ID. CallEdgeCase. *> ============================================================ *> CALL境界テスト (CALL Edge Cases) *> CALL CANCEL, 静的CALL, 動的CALL, *> CALL ON EXCEPTION, ネストプログラム *> ============================================================ DATA DIVISION. WORKING-STORAGE SECTION. 01 WS-PGM-NAME PIC X(8) VALUE "SUB-EDGE". 01 WS-VAL-A PIC 9(5) VALUE 100. 01 WS-VAL-B PIC 9(5) VALUE 200. 01 WS-RESULT PIC 9(10) VALUE 0. 01 WS-EXPECTED PIC 9(10) VALUE 300. 01 WS-PASS PIC 9(2) VALUE 0. 01 WS-FAIL PIC 9(2) VALUE 0. 01 WS-TC PIC 9(2) VALUE 0. PROCEDURE DIVISION. MAIN. DISPLAY "CALL-EDGE: CALL edge case tests" *> T1: CALL ON EXCEPTION (存在しないプログラム) ADD 1 TO WS-TC. DISPLAY "T1: CALL nonexistent ON EXCEPTION" CALL 'NOPGM000' USING WS-VAL-A ON EXCEPTION DISPLAY "T1: Exception caught PASS" ADD 1 TO WS-PASS NOT ON EXCEPTION DISPLAY "T1: No exception FAIL" ADD 1 TO WS-FAIL END-CALL. *> T2: CALL CANCEL (呼出→CANCEL→再呼出) ADD 1 TO WS-TC. DISPLAY "T2: CALL CANCEL cycle" MOVE 100 TO WS-VAL-A. MOVE 200 TO WS-VAL-B. CALL 'SUB-EDGE' USING WS-VAL-A WS-VAL-B WS-RESULT. DISPLAY "T2-1: RESULT=" WS-RESULT " (expect 300)". CANCEL 'SUB-EDGE'. MOVE 50 TO WS-VAL-A. MOVE 70 TO WS-VAL-B. CALL 'SUB-EDGE' USING WS-VAL-A WS-VAL-B WS-RESULT. IF WS-RESULT = 120 DISPLAY "T2: CANCEL+recall PASS" ADD 1 TO WS-PASS ELSE DISPLAY "T2: CANCEL+recall FAIL (result=" WS-RESULT ")" ADD 1 TO WS-FAIL END-IF. *> T3: CALL with RETURN-CODE ADD 1 TO WS-TC. MOVE 15 TO WS-VAL-A. MOVE 25 TO WS-VAL-B. CALL 'SUB-EDGE' USING WS-VAL-A WS-VAL-B WS-RESULT. IF RETURN-CODE = 0 DISPLAY "T3: RETURN-CODE=0 PASS" ADD 1 TO WS-PASS ELSE DISPLAY "T3: RETURN-CODE=" RETURN-CODE " FAIL" ADD 1 TO WS-FAIL END-IF. DISPLAY " " DISPLAY "CALL-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 . END PROGRAM CallEdgeCase. *> ============================================================ *> ネストサブプログラム (Nested Subprogram) *> ============================================================ IDENTIFICATION DIVISION. PROGRAM-ID. SUB-EDGE. DATA DIVISION. LINKAGE SECTION. 01 LK-A PIC 9(5). 01 LK-B PIC 9(5). 01 LK-RES PIC 9(10). PROCEDURE DIVISION USING LK-A LK-B LK-RES. COMPUTE LK-RES = LK-A + LK-B. GOBACK. END PROGRAM SUB-EDGE.