Files
cobol-java-v3/benchmark-programs/25-subprogram/caller-nested.cbl
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

126 lines
4.2 KiB
COBOL

*> ============================================================
*> caller-nested : 计费子程序嵌套调用 (Nested Subprogram Call)
*> Input : WS-VAL-A, WS-VAL-B (传递参数)
*> Output: WS-RESULT (嵌套计算结果)
*> Coverage: C-N009
*> ============================================================
IDENTIFICATION DIVISION.
PROGRAM-ID. CallerNested.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-LEVEL PIC 9(1).
01 WS-VAL-A PIC 9(5).
01 WS-VAL-B PIC 9(5).
01 WS-RESULT PIC 9(10).
01 WS-PASS PIC 9(2) VALUE 0.
01 WS-FAIL PIC 9(2) VALUE 0.
PROCEDURE DIVISION.
MAIN.
DISPLAY "CALLER-NESTED: 3-level CALL test (C-N009)"
*> Test: CALLER → SUB-A → SUB-B → SUB-C RETURNING
MOVE 1 TO WS-LEVEL.
MOVE 10 TO WS-VAL-A.
MOVE 20 TO WS-VAL-B.
CALL 'SUB-A' USING WS-LEVEL WS-VAL-A WS-VAL-B WS-RESULT.
IF WS-RESULT = 100 *> (10+20) + (10+20) + 20 = 100
ADD 1 TO WS-PASS
DISPLAY "C-N009: PASS - 3-level result=" WS-RESULT
ELSE
ADD 1 TO WS-FAIL
DISPLAY "C-N009: FAIL - result=" WS-RESULT
END-IF.
*> Test: CALL with RETURN-CODE from nested
MOVE 2 TO WS-LEVEL.
MOVE 5 TO WS-VAL-A.
MOVE 7 TO WS-VAL-B.
CALL 'SUB-A' USING WS-LEVEL WS-VAL-A WS-VAL-B WS-RESULT.
IF WS-RESULT = 31 *> (5+7) + (5+7) + 7 = 31
ADD 1 TO WS-PASS
DISPLAY "C-N009-2: PASS - nested result=" WS-RESULT
ELSE
ADD 1 TO WS-FAIL
DISPLAY "C-N009-2: FAIL - result=" WS-RESULT
END-IF.
*> CALL nonexistent program (TC-A051)
DISPLAY "TC-A051: CALL non-existent program"
CALL 'NOPGM00' USING WS-VAL-A
ON EXCEPTION
ADD 1 TO WS-PASS
DISPLAY "TC-A051: PASS - exception raised"
NOT ON EXCEPTION
ADD 1 TO WS-FAIL
DISPLAY "TC-A051: FAIL - no exception"
END-CALL.
DISPLAY " "
DISPLAY "CALLER-NESTED: PASS=" WS-PASS " FAIL=" WS-FAIL
IF WS-FAIL = 0
DISPLAY "CALLER-NESTED: ALL PASSED"
STOP RUN RETURNING 0
ELSE
DISPLAY "CALLER-NESTED: FAILED"
STOP RUN RETURNING 1
END-IF
.
END PROGRAM CallerNested.
IDENTIFICATION DIVISION.
PROGRAM-ID. SUB-A.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-RET PIC 9(10).
LINKAGE SECTION.
01 LK-LEVEL PIC 9(1).
01 LK-VAL-A PIC 9(5).
01 LK-VAL-B PIC 9(5).
01 LK-RESULT PIC 9(10).
PROCEDURE DIVISION USING LK-LEVEL LK-VAL-A LK-VAL-B LK-RESULT.
ADD LK-VAL-A TO LK-VAL-B GIVING WS-RET.
CALL 'SUB-B' USING LK-LEVEL LK-VAL-A LK-VAL-B WS-RET LK-RESULT.
GOBACK.
END PROGRAM SUB-A.
IDENTIFICATION DIVISION.
PROGRAM-ID. SUB-B.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-TEMP PIC 9(10).
LINKAGE SECTION.
01 LK-LEVEL PIC 9(1).
01 LK-VAL-A PIC 9(5).
01 LK-VAL-B PIC 9(5).
01 LK-INPUT PIC 9(10).
01 LK-RESULT PIC 9(10).
PROCEDURE DIVISION USING LK-LEVEL LK-VAL-A LK-VAL-B
LK-INPUT LK-RESULT.
COMPUTE WS-TEMP = LK-INPUT + LK-VAL-B.
IF LK-LEVEL = 1
COMPUTE LK-RESULT = WS-TEMP
ELSE
CALL 'SUB-C' USING LK-VAL-A LK-VAL-B WS-TEMP LK-RESULT
END-IF.
GOBACK.
END PROGRAM SUB-B.
IDENTIFICATION DIVISION.
PROGRAM-ID. SUB-C.
DATA DIVISION.
LINKAGE SECTION.
01 LK-VAL-A PIC 9(5).
01 LK-VAL-B PIC 9(5).
01 LK-INPUT PIC 9(10).
01 LK-RESULT PIC 9(10).
PROCEDURE DIVISION USING LK-VAL-A LK-VAL-B LK-INPUT LK-RESULT.
COMPUTE LK-RESULT = LK-INPUT + LK-VAL-B.
GOBACK.
END PROGRAM SUB-C.