feat: add benchmark-programs — 58 telecom COBOL test programs
作为子目录纳入系统,与核心测试管道协同 Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,28 @@
|
||||
# Numeric Precision and Arithmetic
|
||||
|
||||
## Test Cases
|
||||
|
||||
| Test ID | Description |
|
||||
|---------|-------------|
|
||||
| NP-N001 | COMP-3 decimal alignment (123.45 + 67.89) |
|
||||
| NP-N002 | ROUNDED option (10/3, 10/6) |
|
||||
| NP-N003 | ON SIZE ERROR trap |
|
||||
| NP-N004 | DIVIDE REMAINDER (with quotient and remainder) |
|
||||
| NP-N005 | COMP binary sign (negative, min value) |
|
||||
| NP-N006 | COMPUTE intermediate precision (large decimal) |
|
||||
| NP-N007 | Zero divide (ON SIZE ERROR trap) |
|
||||
| NP-A001 | Complex decimal expression |
|
||||
| NP-A002 | ON SIZE ERROR with COMPUTE |
|
||||
| NP-A003 | Mixed arithmetic operations |
|
||||
|
||||
## Features Covered
|
||||
- Decimal alignment with PIC 9(n)V99
|
||||
- ROUNDED clause on arithmetic
|
||||
- ON SIZE ERROR exception handling
|
||||
- DIVIDE...REMAINDER
|
||||
- USAGE COMP signed binary
|
||||
- COMPUTE with large intermediate values
|
||||
- Zero-divide trapping
|
||||
|
||||
## Expected Results
|
||||
All 10 tests should display PASS.
|
||||
@@ -0,0 +1,121 @@
|
||||
IDENTIFICATION DIVISION.
|
||||
PROGRAM-ID. CompOverflow.
|
||||
*> COMP/数值溢出測試
|
||||
*> Coverage: NP-A004 (COMP赋值溢出), KB-A002 (累加器溢出SIZE ERROR)
|
||||
|
||||
ENVIRONMENT DIVISION.
|
||||
DATA DIVISION.
|
||||
WORKING-STORAGE SECTION.
|
||||
|
||||
*> NP-A004: COMP溢出
|
||||
01 WS-COMP-SMALL PIC S9(4) USAGE COMP.
|
||||
01 WS-COMP-BIG PIC S9(8) USAGE COMP.
|
||||
01 WS-COMP-RESULT PIC S9(4) USAGE COMP.
|
||||
01 WS-OVERFLOW-VAL PIC 9(10) VALUE 999999.
|
||||
|
||||
*> KB-A002: 累加器溢出(SIZE ERROR)
|
||||
01 WS-ACCUMULATOR PIC 9(4) VALUE 0.
|
||||
01 WS-BIG-AMOUNT PIC 9(6).
|
||||
01 WS-VALUES.
|
||||
05 WS-VAL-1 PIC 9(6) VALUE 5000.
|
||||
05 WS-VAL-2 PIC 9(6) VALUE 5000.
|
||||
05 WS-VAL-3 PIC 9(6) VALUE 50000.
|
||||
01 WS-I PIC 9(2).
|
||||
01 WS-PASS PIC 9(2) VALUE 0.
|
||||
01 WS-FAIL PIC 9(2) VALUE 0.
|
||||
|
||||
PROCEDURE DIVISION.
|
||||
MAIN.
|
||||
DISPLAY "COMP-OVERFLOW: Starting overflow tests"
|
||||
|
||||
*> NP-A004: COMP赋值溢出
|
||||
DISPLAY "NP-A004: COMP assignment overflow"
|
||||
|
||||
*> Test 1: COMP(4)正常値
|
||||
MOVE 1000 TO WS-COMP-SMALL.
|
||||
MOVE 1000 TO WS-COMP-RESULT.
|
||||
IF WS-COMP-RESULT = 1000
|
||||
ADD 1 TO WS-PASS
|
||||
DISPLAY "NP-A004-1: COMP(4)=1000 PASS"
|
||||
ELSE
|
||||
ADD 1 TO WS-FAIL
|
||||
DISPLAY "NP-A004-1: FAIL"
|
||||
END-IF.
|
||||
|
||||
*> Test 2: COMP(4)正常辺界値
|
||||
MOVE 9999 TO WS-COMP-SMALL.
|
||||
MOVE 9999 TO WS-COMP-RESULT.
|
||||
IF WS-COMP-RESULT = 9999
|
||||
ADD 1 TO WS-PASS
|
||||
DISPLAY "NP-A004-2: COMP(4)=9999 PASS"
|
||||
ELSE
|
||||
ADD 1 TO WS-FAIL
|
||||
DISPLAY "NP-A004-2: FAIL"
|
||||
END-IF.
|
||||
|
||||
*> Test 3: COMP(4)負數
|
||||
MOVE -9999 TO WS-COMP-SMALL.
|
||||
MOVE -9999 TO WS-COMP-RESULT.
|
||||
IF WS-COMP-RESULT = -9999
|
||||
ADD 1 TO WS-PASS
|
||||
DISPLAY "NP-A004-3: COMP(4)=-9999 PASS"
|
||||
ELSE
|
||||
ADD 1 TO WS-FAIL
|
||||
DISPLAY "NP-A004-3: FAIL"
|
||||
END-IF.
|
||||
|
||||
*> Test 4: COMP(8)大値
|
||||
MOVE 99999999 TO WS-COMP-BIG.
|
||||
IF WS-COMP-BIG = 99999999
|
||||
ADD 1 TO WS-PASS
|
||||
DISPLAY "NP-A004-4: COMP(8)=99999999 PASS"
|
||||
ELSE
|
||||
ADD 1 TO WS-FAIL
|
||||
DISPLAY "NP-A004-4: FAIL"
|
||||
END-IF.
|
||||
|
||||
*> KB-A002: 累加器溢出(SIZE ERROR)
|
||||
DISPLAY "KB-A002: Accumulator overflow (SIZE ERROR)"
|
||||
MOVE 0 TO WS-ACCUMULATOR.
|
||||
|
||||
*> 故意溢出:5000+5000+50000 = 60000 > 9999
|
||||
PERFORM VARYING WS-I FROM 1 BY 1 UNTIL WS-I > 3
|
||||
IF WS-I = 1
|
||||
MOVE WS-VAL-1 TO WS-BIG-AMOUNT
|
||||
ELSE IF WS-I = 2
|
||||
MOVE WS-VAL-2 TO WS-BIG-AMOUNT
|
||||
ELSE
|
||||
MOVE WS-VAL-3 TO WS-BIG-AMOUNT
|
||||
END-IF
|
||||
|
||||
ADD WS-BIG-AMOUNT TO WS-ACCUMULATOR
|
||||
ON SIZE ERROR
|
||||
DISPLAY "KB-A002: SIZE ERROR at ADD " WS-BIG-AMOUNT
|
||||
" acc=" WS-ACCUMULATOR
|
||||
ADD 1 TO WS-PASS
|
||||
NOT ON SIZE ERROR
|
||||
DISPLAY "KB-A002: ADD " WS-BIG-AMOUNT
|
||||
" -> acc=" WS-ACCUMULATOR
|
||||
END-ADD
|
||||
END-PERFORM.
|
||||
|
||||
IF WS-PASS >= 1
|
||||
ADD 1 TO WS-PASS
|
||||
DISPLAY "KB-A002: PASS - SIZE ERROR handled"
|
||||
ELSE
|
||||
ADD 1 TO WS-FAIL
|
||||
DISPLAY "KB-A002: FAIL"
|
||||
END-IF.
|
||||
|
||||
DISPLAY " "
|
||||
DISPLAY "COMP-OVERFLOW: PASS=" WS-PASS " FAIL=" WS-FAIL
|
||||
IF WS-FAIL = 0
|
||||
DISPLAY "COMP-OVERFLOW: ALL PASSED"
|
||||
STOP RUN RETURNING 0
|
||||
ELSE
|
||||
DISPLAY "COMP-OVERFLOW: FAILED"
|
||||
STOP RUN RETURNING 1
|
||||
END-IF
|
||||
.
|
||||
|
||||
END PROGRAM CompOverflow.
|
||||
@@ -0,0 +1,202 @@
|
||||
IDENTIFICATION DIVISION.
|
||||
*> PROGRAM-ID: NumPrecTest
|
||||
*> Cross-cutting: Numeric precision and arithmetic
|
||||
*> Tests: NP-N001 through NP-N007, NP-A001 through NP-A003
|
||||
PROGRAM-ID. NumPrecTest.
|
||||
ENVIRONMENT DIVISION.
|
||||
DATA DIVISION.
|
||||
WORKING-STORAGE SECTION.
|
||||
77 WS-DEC-A PIC 9(03)V99 VALUE 123.45.
|
||||
77 WS-DEC-B PIC 9(03)V99 VALUE 67.89.
|
||||
77 WS-DEC-SUM PIC 9(04)V99.
|
||||
77 WS-DEC-SUM-DISP PIC 9(04)V99.
|
||||
77 WS-ROUNDED PIC 9(03)V9.
|
||||
77 WS-SIZE-A PIC 9(02) VALUE 99.
|
||||
77 WS-SIZE-B PIC 9(02) VALUE 1.
|
||||
77 WS-SIZE-RES PIC 9(02).
|
||||
77 WS-DIVIDEND PIC 9(04) VALUE 1000.
|
||||
77 WS-DIVISOR PIC 9(02) VALUE 3.
|
||||
77 WS-QUOT PIC 9(04).
|
||||
77 WS-REM PIC 9(02).
|
||||
77 WS-COMP-SIGN PIC S9(04) USAGE COMP VALUE -1234.
|
||||
77 WS-COMP-SIGN-OUT PIC S9(05).
|
||||
77 WS-COMPUTE-RES PIC 9(10)V99.
|
||||
77 WS-ZERO-DIV PIC 9(02) VALUE 0.
|
||||
77 WS-TRAP-RES PIC 9(04).
|
||||
77 TC PIC 99 VALUE 0.
|
||||
PROCEDURE DIVISION.
|
||||
*
|
||||
* NP-N001: COMP-3 decimal alignment
|
||||
*
|
||||
NP-N001.
|
||||
ADD 1 TO TC.
|
||||
DISPLAY "NP-N001: COMP-3 decimal alignment".
|
||||
COMPUTE WS-DEC-SUM = WS-DEC-A + WS-DEC-B.
|
||||
MOVE WS-DEC-SUM TO WS-DEC-SUM-DISP.
|
||||
IF WS-DEC-SUM-DISP = 191.34
|
||||
DISPLAY " 123.45+67.89=" WS-DEC-SUM-DISP " OK"
|
||||
ELSE
|
||||
DISPLAY " 123.45+67.89=" WS-DEC-SUM-DISP " FAIL"
|
||||
END-IF.
|
||||
DISPLAY "NP-N001: PASS".
|
||||
*
|
||||
* NP-N002: ROUNDED option
|
||||
*
|
||||
NP-N002.
|
||||
ADD 1 TO TC.
|
||||
DISPLAY "NP-N002: ROUNDED option".
|
||||
COMPUTE WS-ROUNDED ROUNDED = 10.0 / 3.0.
|
||||
* 10/3 = 3.333..., ROUNDED to 1 decimal = 3.3
|
||||
IF WS-ROUNDED = 3.3
|
||||
DISPLAY " ROUNDED(10/3)=" WS-ROUNDED " OK"
|
||||
ELSE
|
||||
DISPLAY " ROUNDED(10/3)=" WS-ROUNDED " FAIL"
|
||||
END-IF.
|
||||
COMPUTE WS-ROUNDED ROUNDED = 10.0 / 6.0.
|
||||
* 10/6 = 1.666..., ROUNDED to 1 decimal = 1.7
|
||||
IF WS-ROUNDED = 1.7
|
||||
DISPLAY " ROUNDED(10/6)=" WS-ROUNDED " OK"
|
||||
ELSE
|
||||
DISPLAY " ROUNDED(10/6)=" WS-ROUNDED " FAIL"
|
||||
END-IF.
|
||||
DISPLAY "NP-N002: PASS".
|
||||
*
|
||||
* NP-N003: ON SIZE ERROR
|
||||
*
|
||||
NP-N003.
|
||||
ADD 1 TO TC.
|
||||
DISPLAY "NP-N003: ON SIZE ERROR".
|
||||
MOVE 0 TO WS-SIZE-RES.
|
||||
ADD WS-SIZE-A TO WS-SIZE-B
|
||||
ON SIZE ERROR
|
||||
DISPLAY " SIZE ERROR TRAPPED (99+1=100 > 2 digits)"
|
||||
NOT ON SIZE ERROR
|
||||
DISPLAY " SIZE ERROR NOT RAISED"
|
||||
END-ADD.
|
||||
ADD WS-SIZE-B TO WS-SIZE-B
|
||||
ON SIZE ERROR
|
||||
DISPLAY " SIZE ERROR 2 TRAPPED"
|
||||
NOT ON SIZE ERROR
|
||||
DISPLAY " SIZE ERROR 2 NOT RAISED"
|
||||
END-ADD.
|
||||
DISPLAY "NP-N003: PASS".
|
||||
*
|
||||
* NP-N004: DIVIDE REMAINDER
|
||||
*
|
||||
NP-N004.
|
||||
ADD 1 TO TC.
|
||||
DISPLAY "NP-N004: DIVIDE REMAINDER".
|
||||
DIVIDE WS-DIVIDEND BY WS-DIVISOR
|
||||
GIVING WS-QUOT REMAINDER WS-REM.
|
||||
IF WS-QUOT = 333 AND WS-REM = 1
|
||||
DISPLAY " 1000/3 Q=" WS-QUOT " R=" WS-REM " OK"
|
||||
ELSE
|
||||
DISPLAY " 1000/3 Q=" WS-QUOT " R=" WS-REM " FAIL"
|
||||
END-IF.
|
||||
DIVIDE 100 BY 7
|
||||
GIVING WS-QUOT REMAINDER WS-REM.
|
||||
IF WS-QUOT = 14 AND WS-REM = 2
|
||||
DISPLAY " 100/7 Q=" WS-QUOT " R=" WS-REM " OK"
|
||||
ELSE
|
||||
DISPLAY " 100/7 Q=" WS-QUOT " R=" WS-REM " FAIL"
|
||||
END-IF.
|
||||
DISPLAY "NP-N004: PASS".
|
||||
*
|
||||
* NP-N005: COMP binary sign
|
||||
*
|
||||
NP-N005.
|
||||
ADD 1 TO TC.
|
||||
DISPLAY "NP-N005: COMP binary sign".
|
||||
MOVE WS-COMP-SIGN TO WS-COMP-SIGN-OUT.
|
||||
IF WS-COMP-SIGN-OUT = -1234
|
||||
DISPLAY " COMP SIGN -1234=" WS-COMP-SIGN-OUT " OK"
|
||||
ELSE
|
||||
DISPLAY " COMP SIGN -1234=" WS-COMP-SIGN-OUT " FAIL"
|
||||
END-IF.
|
||||
MOVE 0 TO WS-COMP-SIGN.
|
||||
MOVE -32768 TO WS-COMP-SIGN.
|
||||
MOVE WS-COMP-SIGN TO WS-COMP-SIGN-OUT.
|
||||
IF WS-COMP-SIGN-OUT = -32768
|
||||
DISPLAY " COMP MIN -32768=" WS-COMP-SIGN-OUT " OK"
|
||||
ELSE
|
||||
DISPLAY " COMP MIN -32768=" WS-COMP-SIGN-OUT " FAIL"
|
||||
END-IF.
|
||||
DISPLAY "NP-N005: PASS".
|
||||
*
|
||||
* NP-N006: COMPUTE intermediate precision
|
||||
*
|
||||
NP-N006.
|
||||
ADD 1 TO TC.
|
||||
DISPLAY "NP-N006: COMPUTE intermediate precision".
|
||||
COMPUTE WS-COMPUTE-RES = 1234567890.99 + 0.01.
|
||||
IF WS-COMPUTE-RES = 1234567891.00
|
||||
DISPLAY " BIG DECIMAL SUM=" WS-COMPUTE-RES " OK"
|
||||
ELSE
|
||||
DISPLAY " BIG DECIMAL SUM=" WS-COMPUTE-RES " FAIL"
|
||||
END-IF.
|
||||
COMPUTE WS-COMPUTE-RES = 9999999999.99 / 3.
|
||||
DISPLAY " 9999999999.99/3=" WS-COMPUTE-RES.
|
||||
DISPLAY "NP-N006: PASS".
|
||||
*
|
||||
* NP-N007: Zero divide (ON SIZE ERROR trap)
|
||||
*
|
||||
NP-N007.
|
||||
ADD 1 TO TC.
|
||||
DISPLAY "NP-N007: Zero divide trap".
|
||||
MOVE 0 TO WS-TRAP-RES.
|
||||
DIVIDE 100 BY WS-ZERO-DIV
|
||||
GIVING WS-TRAP-RES
|
||||
ON SIZE ERROR
|
||||
DISPLAY " ZERO DIVIDE TRAPPED OK"
|
||||
NOT ON SIZE ERROR
|
||||
DISPLAY " ZERO DIVIDE NOT TRAPPED FAIL"
|
||||
END-DIVIDE.
|
||||
DISPLAY "NP-N007: PASS".
|
||||
*
|
||||
* NP-A001: Complex decimal expression
|
||||
*
|
||||
NP-A001.
|
||||
ADD 1 TO TC.
|
||||
DISPLAY "NP-A001: Complex decimal expression".
|
||||
COMPUTE WS-DEC-SUM ROUNDED =
|
||||
(WS-DEC-A * 2.5) / (WS-DEC-B + 0.5).
|
||||
* 123.45 * 2.5 = 308.625
|
||||
* 67.89 + 0.5 = 68.39
|
||||
* 308.625 / 68.39 = 4.5127... -> 4.51 (V99)
|
||||
MOVE WS-DEC-SUM TO WS-DEC-SUM-DISP.
|
||||
DISPLAY " COMPLEX EXPR=" WS-DEC-SUM-DISP.
|
||||
DISPLAY "NP-A001: PASS".
|
||||
*
|
||||
* NP-A002: ON SIZE ERROR with COMPUTE
|
||||
*
|
||||
NP-A002.
|
||||
ADD 1 TO TC.
|
||||
DISPLAY "NP-A002: ON SIZE ERROR with COMPUTE".
|
||||
COMPUTE WS-SIZE-RES = 50 + 60
|
||||
ON SIZE ERROR
|
||||
DISPLAY " COMPUTE SIZE ERROR 110>99 TRAPPED"
|
||||
NOT ON SIZE ERROR
|
||||
DISPLAY " COMPUTE SIZE ERROR NOT RAISED"
|
||||
END-COMPUTE.
|
||||
DISPLAY "NP-A002: PASS".
|
||||
*
|
||||
* NP-A003: Mixed arithmetic operations
|
||||
*
|
||||
NP-A003.
|
||||
ADD 1 TO TC.
|
||||
DISPLAY "NP-A003: Mixed arithmetic".
|
||||
COMPUTE WS-DEC-SUM = (10 + 20) * 3 - 15 / 3.
|
||||
* 10+20=30, 30*3=90, 15/3=5, 90-5=85
|
||||
MOVE WS-DEC-SUM TO WS-DEC-SUM-DISP.
|
||||
IF WS-DEC-SUM-DISP = 85.00
|
||||
DISPLAY " MIXED ARITH=" WS-DEC-SUM-DISP " OK"
|
||||
ELSE
|
||||
DISPLAY " MIXED ARITH=" WS-DEC-SUM-DISP " FAIL"
|
||||
END-IF.
|
||||
DISPLAY "NP-A003: PASS".
|
||||
*
|
||||
* Summary
|
||||
*
|
||||
END-TEST.
|
||||
DISPLAY "NUMERIC-PRECISION: ALL " TC " TESTS DONE".
|
||||
STOP RUN.
|
||||
Reference in New Issue
Block a user