IDENTIFICATION DIVISION. *> PROGRAM-ID: RerunTest *> Cross-cutting: RERUN/RESTART idempotency *> Tests: RR-N001 through RR-N004 PROGRAM-ID. RerunTest. ENVIRONMENT DIVISION. INPUT-OUTPUT SECTION. FILE-CONTROL. SELECT INPUT-FILE ASSIGN TO "input.dat" ORGANIZATION IS SEQUENTIAL ACCESS MODE IS SEQUENTIAL FILE STATUS IS FS-INPUT. SELECT OUTPUT-FILE ASSIGN TO "output.dat" ORGANIZATION IS SEQUENTIAL ACCESS MODE IS SEQUENTIAL FILE STATUS IS FS-OUTPUT. DATA DIVISION. FILE SECTION. FD INPUT-FILE. 01 IN-REC. 05 IN-KEY PIC X(04). 05 IN-VALUE PIC 9(03). FD OUTPUT-FILE. 01 OUT-REC. 05 OUT-KEY PIC X(04). 05 OUT-VALUE PIC 9(06). WORKING-STORAGE SECTION. 77 FS-INPUT PIC XX. 77 FS-OUTPUT PIC XX. 77 WS-SUM PIC 9(06). 77 WS-COUNT PIC 9(03). 77 TC PIC 99 VALUE 0. PROCEDURE DIVISION. * * RR-N001: Initial run - create input and output * RR-N001. ADD 1 TO TC. DISPLAY "RR-N001: Create initial input data". OPEN OUTPUT INPUT-FILE. IF FS-INPUT NOT = "00" DISPLAY "FAIL: CREATE INPUT FS=" FS-INPUT STOP RUN. MOVE "R001" TO IN-KEY. MOVE 100 TO IN-VALUE. WRITE IN-REC. MOVE "R002" TO IN-KEY. MOVE 200 TO IN-VALUE. WRITE IN-REC. MOVE "R003" TO IN-KEY. MOVE 300 TO IN-VALUE. WRITE IN-REC. MOVE "R004" TO IN-KEY. MOVE 400 TO IN-VALUE. WRITE IN-REC. MOVE "R005" TO IN-KEY. MOVE 500 TO IN-VALUE. WRITE IN-REC. CLOSE INPUT-FILE. DISPLAY "RR-N001: PASS". * * RR-N002: Process input to output (idempotent operation) * RR-N002. ADD 1 TO TC. DISPLAY "RR-N002: Process input -> output". OPEN INPUT INPUT-FILE. IF FS-INPUT NOT = "00" DISPLAY "FAIL: OPEN INPUT FS=" FS-INPUT STOP RUN. OPEN OUTPUT OUTPUT-FILE. IF FS-OUTPUT NOT = "00" DISPLAY "FAIL: OPEN OUTPUT FS=" FS-OUTPUT STOP RUN. MOVE 0 TO WS-SUM. MOVE 0 TO WS-COUNT. PERFORM UNTIL FS-INPUT NOT = "00" READ INPUT-FILE AT END EXIT PERFORM NOT AT END ADD 1 TO WS-COUNT MULTIPLY IN-VALUE BY 2 GIVING OUT-VALUE MOVE IN-KEY TO OUT-KEY WRITE OUT-REC ADD IN-VALUE TO WS-SUM END-READ END-PERFORM. CLOSE INPUT-FILE. CLOSE OUTPUT-FILE. DISPLAY " RECORDS=" WS-COUNT " SUM=" WS-SUM. IF WS-COUNT = 5 AND WS-SUM = 1500 DISPLAY " PROCESS OK" ELSE DISPLAY " PROCESS FAIL" END-IF. DISPLAY "RR-N002: PASS". * * RR-N003: Re-run idempotent - same input, same result * RR-N003. ADD 1 TO TC. DISPLAY "RR-N003: Re-run idempotent verification". OPEN INPUT INPUT-FILE. MOVE 0 TO WS-SUM. MOVE 0 TO WS-COUNT. PERFORM UNTIL FS-INPUT NOT = "00" READ INPUT-FILE AT END EXIT PERFORM NOT AT END ADD 1 TO WS-COUNT ADD IN-VALUE TO WS-SUM END-READ END-PERFORM. CLOSE INPUT-FILE. IF WS-COUNT = 5 AND WS-SUM = 1500 DISPLAY " IDEMPOTENT READ OK (same count=" WS-COUNT " sum=" WS-SUM ")" ELSE DISPLAY " IDEMPOTENT READ FAIL count=" WS-COUNT " sum=" WS-SUM END-IF. DISPLAY "RR-N003: PASS". * * RR-N004: Output file already exists (STATUS 95 emulation) * RR-N004. ADD 1 TO TC. DISPLAY "RR-N004: Output file already exists". OPEN EXTEND OUTPUT-FILE. IF FS-OUTPUT = "00" DISPLAY " EXTEND OPEN OK (file exists, FS=" FS-OUTPUT ")" ELSE DISPLAY " EXTEND FS=" FS-OUTPUT END-IF. MOVE "R999" TO OUT-KEY. MOVE 999999 TO OUT-VALUE. WRITE OUT-REC. IF FS-OUTPUT = "00" DISPLAY " APPEND OK" ELSE DISPLAY " APPEND FAIL FS=" FS-OUTPUT END-IF. CLOSE OUTPUT-FILE. DISPLAY "RR-N004: PASS". * * Summary * END-TEST. DISPLAY "RERUN: ALL " TC " TESTS DONE". STOP RUN.