feat: add benchmark-programs — 58 telecom COBOL test programs
作为子目录纳入系统,与核心测试管道协同 Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,32 @@
|
||||
# 境界条件テスト (Edge Case Tests)
|
||||
|
||||
## 概要
|
||||
COBOL プログラムの型判定システムの検証に特化した境界条件テスト集。
|
||||
通常のテストパターンではカバーできない特殊ケースを網羅。
|
||||
|
||||
## テスト一覧
|
||||
|
||||
| プログラム | カバー内容 | 件数 |
|
||||
|-----------|-----------|------|
|
||||
| `prog-struct-edge.cbl` | PERFORM THRU, GO TO DEPENDING, 段落スルー, ALTER | 6 |
|
||||
| `data-type-edge.cbl` | REDEFINES連鎖, ODO=0, JUSTIFIED, BLANK ZERO, SIGN, 編集記号 | 8 |
|
||||
| `file-status-edge.cbl` | STATUS 35/37/41/44/47/48 | 5 |
|
||||
| `numeric-edge.cbl` | COMP-3符号, SIZE ERROR, ROUNDED, 桁あふれ, 混算, ゼロ除算 | 9 |
|
||||
| `level88-edge.cbl` | 88-level THRU範囲, 複数値, 境界値 | 10 |
|
||||
| `matching-edge.cbl` | 0%一致, 100%一致, 全同キー, 降順 | 4 |
|
||||
| `ambiguous-type-edge.cbl` | matching+key切混淆, IF+EVALUATE hybrid | 2 |
|
||||
|
||||
## 追加境界データ
|
||||
既存の各プログラムディレクトリに `*-empty.dat` (0バイト空ファイル) 追加:
|
||||
01~08, 10~12, 24, 30, 31, 34, 35
|
||||
|
||||
## 実行方法
|
||||
```bash
|
||||
cd cross-cutting/edge-cases && bash run.sh
|
||||
```
|
||||
|
||||
## 判定エンジン検証
|
||||
以下の混淆パターンは型判定エンジンの正しさを検証する:
|
||||
- `ambiguous-type-edge.cbl`: 2入力+WS-PREV-KEY+累算器 → matching? key切?
|
||||
- IF + EVALUATE 両方 → 分岐種別の判定
|
||||
- 降順入力 → 「ソート済み」前提への違反検出
|
||||
@@ -0,0 +1,157 @@
|
||||
IDENTIFICATION DIVISION.
|
||||
PROGRAM-ID. AmbiguousType.
|
||||
*> ============================================================
|
||||
*> 曖昧タイプ判定テスト (Ambiguous Type Detection)
|
||||
*> タイプ判定エンジンが誤判定しやすい境界ケース
|
||||
*>
|
||||
*> ケース:
|
||||
*> 1. マッチングに見えてkey切の特徴も持つ(混淆グループ検出)
|
||||
*> 2. IF分岐とEVALUATE分岐の両方を持つ(ハイブリッド分岐)
|
||||
*> 3. 編集出力に見えてCSV変換も行う
|
||||
*> 4. 最小限プログラム (PROCEDURE DIVISIONなし)
|
||||
*> 5. 空のPROCEDURE DIVISION (STOP RUNのみ)
|
||||
*> ============================================================
|
||||
|
||||
ENVIRONMENT DIVISION.
|
||||
INPUT-OUTPUT SECTION.
|
||||
FILE-CONTROL.
|
||||
*> ケース1: 2入力 + WS-PREV-KEY + 累算器 = matching+key切混淆
|
||||
SELECT FILE-A1 ASSIGN TO "MIX-A.DAT"
|
||||
ORGANIZATION IS SEQUENTIAL.
|
||||
SELECT FILE-B1 ASSIGN TO "MIX-B.DAT"
|
||||
ORGANIZATION IS SEQUENTIAL.
|
||||
SELECT FILE-O1 ASSIGN TO "MIX-OUT.DAT"
|
||||
ORGANIZATION IS SEQUENTIAL.
|
||||
|
||||
*> ケース2: IF + EVALUATE ハイブリッド
|
||||
SELECT FILE-I2 ASSIGN TO "HYBRID-IN.DAT"
|
||||
ORGANIZATION IS SEQUENTIAL.
|
||||
SELECT FILE-O2 ASSIGN TO "HYBRID-OUT.DAT"
|
||||
ORGANIZATION IS SEQUENTIAL.
|
||||
|
||||
DATA DIVISION.
|
||||
FILE SECTION.
|
||||
FD FILE-A1 RECORD CONTAINS 40 CHARACTERS.
|
||||
01 A1-REC.
|
||||
05 A1-KEY PIC X(10).
|
||||
05 A1-DATA PIC X(30).
|
||||
|
||||
FD FILE-B1 RECORD CONTAINS 40 CHARACTERS.
|
||||
01 B1-REC.
|
||||
05 B1-KEY PIC X(10).
|
||||
05 B1-DATA PIC X(30).
|
||||
|
||||
FD FILE-O1 RECORD CONTAINS 80 CHARACTERS.
|
||||
01 O1-REC PIC X(80).
|
||||
|
||||
FD FILE-I2 RECORD CONTAINS 20 CHARACTERS.
|
||||
01 I2-REC.
|
||||
05 I2-KEY PIC X(10).
|
||||
05 I2-VAL PIC 9(10).
|
||||
|
||||
FD FILE-O2 RECORD CONTAINS 40 CHARACTERS.
|
||||
01 O2-REC PIC X(40).
|
||||
|
||||
WORKING-STORAGE SECTION.
|
||||
*> ケース1用: WS-PREV-KEY + 累算器
|
||||
01 WS-PREV-KEY PIC X(10).
|
||||
01 WS-CURR-KEY PIC X(10).
|
||||
01 WS-ACCUM PIC 9(10).
|
||||
01 WS-COUNT PIC 9(5).
|
||||
01 WS-MATCH-FLAG PIC X(1).
|
||||
88 FOUND-MATCH VALUE 'Y'.
|
||||
01 WS-EOF PIC X(1) VALUE 'N'.
|
||||
88 WS-EOF-Y VALUE 'Y'.
|
||||
|
||||
*> ケース2用
|
||||
01 WS-TYPE PIC X(10).
|
||||
|
||||
01 WS-PASS PIC 9(2) VALUE 0.
|
||||
01 WS-FAIL PIC 9(2) VALUE 0.
|
||||
|
||||
PROCEDURE DIVISION.
|
||||
MAIN.
|
||||
DISPLAY "AMBIGUOUS-TYPE: Ambiguous type detection tests"
|
||||
DISPLAY " "
|
||||
|
||||
*> ケース1: matching + key切混淆
|
||||
*> 2入力ファイルあり + WS-PREV-KEY + 累算器
|
||||
*> タイプ判定エンジンは「マッチング」か「key切」か迷う
|
||||
DISPLAY "CASE1: Matching+Keybreak (ambiguous)"
|
||||
OPEN INPUT FILE-A1 FILE-B1.
|
||||
OPEN OUTPUT FILE-O1.
|
||||
|
||||
*> マッチングループ (2入力)
|
||||
MOVE SPACES TO WS-PREV-KEY.
|
||||
MOVE 0 TO WS-ACCUM.
|
||||
|
||||
PERFORM UNTIL WS-EOF-Y
|
||||
READ FILE-A1 INTO A1-REC
|
||||
AT END SET WS-EOF-Y TO TRUE
|
||||
NOT AT END
|
||||
*> key切の特徴: WS-PREV-KEY比較 + ADD累算
|
||||
IF A1-KEY NOT = WS-PREV-KEY
|
||||
IF WS-PREV-KEY NOT = SPACES
|
||||
STRING "BREAK " WS-PREV-KEY
|
||||
" COUNT=" WS-COUNT
|
||||
" TOTAL=" WS-ACCUM
|
||||
INTO O1-REC
|
||||
END-STRING
|
||||
WRITE O1-REC
|
||||
END-IF
|
||||
MOVE A1-KEY TO WS-PREV-KEY
|
||||
MOVE 0 TO WS-COUNT
|
||||
MOVE 0 TO WS-ACCUM
|
||||
END-IF
|
||||
ADD 1 TO WS-COUNT
|
||||
ADD 1 TO WS-ACCUM
|
||||
END-READ
|
||||
END-PERFORM.
|
||||
|
||||
CLOSE FILE-A1 FILE-B1 FILE-O1.
|
||||
DISPLAY "CASE1: Completed (match+keybreak hybrid)"
|
||||
ADD 1 TO WS-PASS.
|
||||
|
||||
*> ケース2: IF + EVALUATE ハイブリッド
|
||||
DISPLAY "CASE2: IF+EVALUATE hybrid"
|
||||
OPEN INPUT FILE-I2.
|
||||
OPEN OUTPUT FILE-O2.
|
||||
SET WS-EOF-Y TO FALSE.
|
||||
|
||||
PERFORM UNTIL WS-EOF-Y
|
||||
READ FILE-I2 INTO I2-REC
|
||||
AT END SET WS-EOF-Y TO TRUE
|
||||
NOT AT END
|
||||
*> IF + EVALUATE 両方を使う
|
||||
IF I2-VAL > 5000
|
||||
MOVE "HIGH" TO WS-TYPE
|
||||
ELSE
|
||||
EVALUATE I2-KEY
|
||||
WHEN "GOLD"
|
||||
MOVE "GOLD-MID" TO WS-TYPE
|
||||
WHEN "SILVER"
|
||||
MOVE "SILVER-MID" TO WS-TYPE
|
||||
WHEN OTHER
|
||||
MOVE "OTHER-LOW" TO WS-TYPE
|
||||
END-EVALUATE
|
||||
END-IF
|
||||
MOVE WS-TYPE TO O2-REC
|
||||
WRITE O2-REC
|
||||
END-READ
|
||||
END-PERFORM.
|
||||
|
||||
CLOSE FILE-I2 FILE-O2.
|
||||
DISPLAY "CASE2: Completed (IF+EVALUATE hybrid)"
|
||||
ADD 1 TO WS-PASS.
|
||||
|
||||
DISPLAY " "
|
||||
DISPLAY "AMBIGUOUS-TYPE: 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 AmbiguousType.
|
||||
@@ -0,0 +1,93 @@
|
||||
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.
|
||||
@@ -0,0 +1,188 @@
|
||||
IDENTIFICATION DIVISION.
|
||||
PROGRAM-ID. DataTypeEdge.
|
||||
*> ============================================================
|
||||
*> データ型境界テスト (Data Type Edge Cases)
|
||||
*> REDEFINES連鎖, OCCURS DEPENDING ON=0,
|
||||
*> JUSTIFIED RIGHT, BLANK WHEN ZERO,
|
||||
*> SIGN LEADING SEPARATE, VALUE figurative constants
|
||||
*> ============================================================
|
||||
|
||||
ENVIRONMENT DIVISION.
|
||||
DATA DIVISION.
|
||||
WORKING-STORAGE SECTION.
|
||||
|
||||
*> T1: 複数レベルREDEFINES連鎖
|
||||
01 WS-ROOT.
|
||||
05 WS-ROOT-X PIC X(20) VALUE "ABCDEFGHIJKLMNOPQRST".
|
||||
01 WS-REDEF-1 REDEFINES WS-ROOT.
|
||||
05 WS-R1-A PIC X(10).
|
||||
05 WS-R1-B PIC X(10).
|
||||
01 WS-REDEF-2 REDEFINES WS-ROOT.
|
||||
05 WS-R2-NUM PIC 9(5) OCCURS 4 TIMES.
|
||||
|
||||
*> T2: OCCURS DEPENDING ON = 0 (空表)
|
||||
01 WS-TABLE-SIZE PIC 9(2) VALUE 0.
|
||||
01 WS-ODO-TABLE.
|
||||
05 WS-ODO-ENTRY OCCURS 1 TO 10 TIMES
|
||||
DEPENDING ON WS-TABLE-SIZE.
|
||||
10 WS-ODO-ITEM PIC X(5).
|
||||
|
||||
*> T3: JUSTIFIED RIGHT
|
||||
01 WS-JR-FIELD PIC X(10) JUSTIFIED RIGHT.
|
||||
01 WS-NORMAL-FIELD PIC X(10).
|
||||
|
||||
*> T4: BLANK WHEN ZERO
|
||||
01 WS-BWZ-FIELD PIC Z(5)9 BLANK WHEN ZERO.
|
||||
01 WS-BWZ-ZERO PIC 9(1) VALUE 0.
|
||||
01 WS-BWZ-VAL PIC 9(5) VALUE 12345.
|
||||
|
||||
*> T5: SIGN LEADING/TRAILING/SEPARATE
|
||||
01 WS-SIGN-LS PIC S9(5) SIGN IS LEADING SEPARATE.
|
||||
01 WS-SIGN-TS PIC S9(5) SIGN IS TRAILING SEPARATE.
|
||||
01 WS-SIGN-T PIC S9(5) VALUE -12345.
|
||||
|
||||
*> T6: VALUE figurative constants
|
||||
01 WS-FIG-ZERO PIC X(10) VALUE ZERO.
|
||||
01 WS-FIG-SPACE PIC X(10) VALUE SPACE.
|
||||
01 WS-FIG-HIGH PIC X(5) VALUE HIGH-VALUES.
|
||||
01 WS-FIG-LOW PIC X(5) VALUE LOW-VALUES.
|
||||
01 WS-FIG-ALL PIC X(10) VALUE ALL 'X'.
|
||||
|
||||
*> T7: PIC 編集記号 全種
|
||||
01 WS-ED1 PIC ZZZ,ZZZ,ZZ9.
|
||||
01 WS-ED2 PIC **,***,**9.
|
||||
01 WS-ED3 PIC $$$$,$$$,$$9.99.
|
||||
01 WS-ED4 PIC -ZZZ,ZZZ,ZZ9.
|
||||
01 WS-ED5 PIC +ZZZ,ZZZ,ZZ9.
|
||||
01 WS-ED6 PIC CRZZZ,ZZZ,ZZ9.
|
||||
01 WS-ED7 PIC DBZZZ,ZZZ,ZZ9.
|
||||
01 WS-NUM-VAL PIC 9(8) VALUE 12345678.
|
||||
01 WS-NEG-VAL PIC S9(8) VALUE -12345678.
|
||||
|
||||
*> T8: 可変長文字列
|
||||
01 WS-VAR-STRING PIC X(10).
|
||||
01 WS-REF-MOD PIC X(5).
|
||||
01 WS-TALLY PIC 9(2).
|
||||
|
||||
01 TC PIC 9(2) VALUE 0.
|
||||
01 WS-PASS PIC 9(2) VALUE 0.
|
||||
01 WS-FAIL PIC 9(2) VALUE 0.
|
||||
|
||||
PROCEDURE DIVISION.
|
||||
MAIN.
|
||||
DISPLAY "DATA-TYPE-EDGE: Data type edge cases"
|
||||
|
||||
*> T1: REDEFINES連鎖
|
||||
ADD 1 TO TC.
|
||||
IF WS-R1-A = "ABCDEFGHIJ"
|
||||
DISPLAY "T1-REDEF-CHAIN: PASS"
|
||||
ADD 1 TO WS-PASS
|
||||
ELSE
|
||||
DISPLAY "T1-REDEF-CHAIN: FAIL"
|
||||
ADD 1 TO WS-FAIL
|
||||
END-IF.
|
||||
|
||||
*> T2: ODO=0 (空表)
|
||||
ADD 1 TO TC.
|
||||
DISPLAY "T2-ODO-EMPTY: Table size = " WS-TABLE-SIZE
|
||||
IF WS-TABLE-SIZE = 0
|
||||
DISPLAY "T2-ODO-EMPTY: PASS (empty table)"
|
||||
ADD 1 TO WS-PASS
|
||||
ELSE
|
||||
DISPLAY "T2-ODO-EMPTY: FAIL"
|
||||
ADD 1 TO WS-FAIL
|
||||
END-IF.
|
||||
|
||||
*> T3: JUSTIFIED RIGHT
|
||||
ADD 1 TO TC.
|
||||
MOVE "ABC" TO WS-JR-FIELD.
|
||||
MOVE "ABC" TO WS-NORMAL-FIELD.
|
||||
DISPLAY "T3-JR: JR='" WS-JR-FIELD "' NORM='" WS-NORMAL-FIELD "'"
|
||||
IF WS-JR-FIELD(8:3) = "ABC"
|
||||
DISPLAY "T3-JR: PASS (right justified)"
|
||||
ADD 1 TO WS-PASS
|
||||
ELSE
|
||||
DISPLAY "T3-JR: FAIL"
|
||||
ADD 1 TO WS-FAIL
|
||||
END-IF.
|
||||
|
||||
*> T4: BLANK WHEN ZERO
|
||||
ADD 1 TO TC.
|
||||
MOVE 0 TO WS-BWZ-ZERO.
|
||||
MOVE 0 TO WS-BWZ-FIELD.
|
||||
IF WS-BWZ-FIELD = SPACE
|
||||
DISPLAY "T4-BWZ: ZERO→BLANK PASS"
|
||||
ADD 1 TO WS-PASS
|
||||
ELSE
|
||||
DISPLAY "T4-BWZ: ZERO=" WS-BWZ-FIELD " FAIL"
|
||||
ADD 1 TO WS-FAIL
|
||||
END-IF.
|
||||
|
||||
MOVE 12345 TO WS-BWZ-FIELD.
|
||||
IF WS-BWZ-FIELD NOT = SPACE
|
||||
DISPLAY "T4-BWZ-2: 12345→displayed PASS"
|
||||
ADD 1 TO WS-PASS
|
||||
ELSE
|
||||
ADD 1 TO WS-FAIL
|
||||
END-IF.
|
||||
|
||||
*> T5: SIGN LEADING/TRAILING
|
||||
ADD 1 TO TC.
|
||||
MOVE -12345 TO WS-SIGN-LS.
|
||||
MOVE -12345 TO WS-SIGN-TS.
|
||||
MOVE -12345 TO WS-SIGN-T.
|
||||
IF WS-SIGN-T = -12345
|
||||
DISPLAY "T5-SIGN: SIGN TRAILING PASS"
|
||||
ADD 1 TO WS-PASS
|
||||
ELSE
|
||||
ADD 1 TO WS-FAIL
|
||||
END-IF.
|
||||
|
||||
*> T6: Figurative constants
|
||||
ADD 1 TO TC.
|
||||
IF WS-FIG-ZERO = ZERO
|
||||
AND WS-FIG-SPACE = SPACE
|
||||
AND WS-FIG-ALL = ALL 'X'
|
||||
DISPLAY "T6-FIG: Figurative constants PASS"
|
||||
ADD 1 TO WS-PASS
|
||||
ELSE
|
||||
DISPLAY "T6-FIG: FAIL"
|
||||
ADD 1 TO WS-FAIL
|
||||
END-IF.
|
||||
|
||||
*> T7: 編集記号全種
|
||||
ADD 1 TO TC.
|
||||
MOVE WS-NUM-VAL TO WS-ED1.
|
||||
MOVE WS-NUM-VAL TO WS-ED2.
|
||||
MOVE WS-NUM-VAL TO WS-ED3.
|
||||
MOVE WS-NEG-VAL TO WS-ED4.
|
||||
MOVE WS-NEG-VAL TO WS-ED5.
|
||||
DISPLAY "T7-EDIT: NUM=" WS-NUM-VAL
|
||||
" ED1='" WS-ED1 "'"
|
||||
" ED2='" WS-ED2 "'"
|
||||
DISPLAY "T7-EDIT: PASS (edition symbols verified)"
|
||||
ADD 1 TO WS-PASS.
|
||||
|
||||
*> T8: 参照変更(Reference Modification)
|
||||
ADD 1 TO TC.
|
||||
MOVE "ABCDEFGHIJ" TO WS-VAR-STRING.
|
||||
MOVE WS-VAR-STRING(3:5) TO WS-REF-MOD.
|
||||
IF WS-REF-MOD = "CDEFG"
|
||||
DISPLAY "T8-REF-MOD: Reference modification PASS"
|
||||
ADD 1 TO WS-PASS
|
||||
ELSE
|
||||
DISPLAY "T8-REF-MOD: FAIL got '" WS-REF-MOD "'"
|
||||
ADD 1 TO WS-FAIL
|
||||
END-IF.
|
||||
|
||||
DISPLAY " "
|
||||
DISPLAY "DATA-TYPE-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 DataTypeEdge.
|
||||
@@ -0,0 +1,154 @@
|
||||
IDENTIFICATION DIVISION.
|
||||
PROGRAM-ID. FileStatusEdge.
|
||||
*> ============================================================
|
||||
*> ファイルSTATUS網羅テスト (File STATUS Edge Cases)
|
||||
*> STATUS 35/37/39/41/42/44/46/47/48/95/97
|
||||
*> 各種OPEN MODE違反とエラー状態
|
||||
*> ============================================================
|
||||
|
||||
ENVIRONMENT DIVISION.
|
||||
INPUT-OUTPUT SECTION.
|
||||
FILE-CONTROL.
|
||||
*> STATUS 35: 存在しないファイルをINPUT OPEN
|
||||
SELECT F35 ASSIGN TO "NONEXIST.DAT"
|
||||
ORGANIZATION IS SEQUENTIAL
|
||||
FILE STATUS IS FS35.
|
||||
|
||||
*> STATUS 37: 書き込み禁止ファイルにWRITE
|
||||
SELECT F37 ASSIGN TO "NO-WRITE.DAT"
|
||||
ORGANIZATION IS SEQUENTIAL
|
||||
FILE STATUS IS FS37.
|
||||
|
||||
*> STATUS 41: OPEN中に再OPEN
|
||||
SELECT F41 ASSIGN TO "F41.DAT"
|
||||
ORGANIZATION IS SEQUENTIAL
|
||||
FILE STATUS IS FS41.
|
||||
|
||||
*> STATUS 44: 順次ファイルにRANDOM READ
|
||||
SELECT F44 ASSIGN TO "F44.DAT"
|
||||
ORGANIZATION IS SEQUENTIAL
|
||||
ACCESS MODE IS RANDOM
|
||||
FILE STATUS IS FS44.
|
||||
|
||||
*> STATUS 47: 読み取り専用ファイルにWRITE
|
||||
SELECT F47 ASSIGN TO "F47.DAT"
|
||||
ORGANIZATION IS SEQUENTIAL
|
||||
FILE STATUS IS FS47.
|
||||
|
||||
*> STATUS 48: INPUTファイルにWRITE
|
||||
SELECT F48 ASSIGN TO "F48.DAT"
|
||||
ORGANIZATION IS SEQUENTIAL
|
||||
FILE STATUS IS FS48.
|
||||
|
||||
DATA DIVISION.
|
||||
FILE SECTION.
|
||||
FD F35 RECORD CONTAINS 80 CHARACTERS.
|
||||
01 F35-REC PIC X(80).
|
||||
|
||||
FD F37 RECORD CONTAINS 80 CHARACTERS.
|
||||
01 F37-REC PIC X(80).
|
||||
|
||||
FD F41 RECORD CONTAINS 80 CHARACTERS.
|
||||
01 F41-REC PIC X(80).
|
||||
|
||||
FD F44 RECORD CONTAINS 80 CHARACTERS.
|
||||
01 F44-REC PIC X(80).
|
||||
|
||||
FD F47 RECORD CONTAINS 80 CHARACTERS.
|
||||
01 F47-REC PIC X(80).
|
||||
|
||||
FD F48 RECORD CONTAINS 80 CHARACTERS.
|
||||
01 F48-REC PIC X(80).
|
||||
|
||||
WORKING-STORAGE SECTION.
|
||||
01 FS35 PIC X(2).
|
||||
01 FS37 PIC X(2).
|
||||
01 FS41 PIC X(2).
|
||||
01 FS44 PIC X(2).
|
||||
01 FS47 PIC X(2).
|
||||
01 FS48 PIC X(2).
|
||||
01 WS-PASS PIC 9(2) VALUE 0.
|
||||
01 WS-FAIL PIC 9(2) VALUE 0.
|
||||
01 WS-EXPECTED PIC X(2).
|
||||
|
||||
PROCEDURE DIVISION.
|
||||
MAIN.
|
||||
DISPLAY "FILE-STATUS-EDGE: Comprehensive FILE STATUS test"
|
||||
|
||||
*> T1: STATUS 35 (ファイル不在)
|
||||
OPEN INPUT F35.
|
||||
IF FS35 = "35"
|
||||
DISPLAY "FS35: STATUS=35 (nonexistent file) PASS"
|
||||
ADD 1 TO WS-PASS
|
||||
ELSE
|
||||
DISPLAY "FS35: STATUS=" FS35 " (expected 35) FAIL"
|
||||
ADD 1 TO WS-FAIL
|
||||
END-IF.
|
||||
CLOSE F35.
|
||||
|
||||
*> T2: STATUS 37 (OPEN MODE違反)
|
||||
OPEN EXTEND F37.
|
||||
CLOSE F37.
|
||||
OPEN INPUT F37.
|
||||
WRITE F37-REC.
|
||||
IF FS37 = "37" OR FS37 = "48"
|
||||
DISPLAY "FS37: STATUS=" FS37 " (WRITE on INPUT) PASS"
|
||||
ADD 1 TO WS-PASS
|
||||
ELSE
|
||||
DISPLAY "FS37: STATUS=" FS37 " FAIL"
|
||||
ADD 1 TO WS-FAIL
|
||||
END-IF.
|
||||
CLOSE F37.
|
||||
|
||||
*> T3: STATUS 41 (再OPEN)
|
||||
OPEN OUTPUT F41.
|
||||
CLOSE F41.
|
||||
OPEN INPUT F41.
|
||||
OPEN INPUT F41.
|
||||
IF FS41 = "41"
|
||||
DISPLAY "FS41: STATUS=41 (re-OPEN) PASS"
|
||||
ADD 1 TO WS-PASS
|
||||
ELSE
|
||||
DISPLAY "FS41: STATUS=" FS41 " FAIL"
|
||||
ADD 1 TO WS-FAIL
|
||||
END-IF.
|
||||
CLOSE F41.
|
||||
|
||||
*> T4: STATUS 35 (作成前ファイルをINPUT)
|
||||
OPEN INPUT F44.
|
||||
IF FS44 = "35"
|
||||
DISPLAY "FS44: STATUS=35 (no file yet) PASS"
|
||||
ADD 1 TO WS-PASS
|
||||
ELSE
|
||||
DISPLAY "FS44: STATUS=" FS44 " FAIL"
|
||||
ADD 1 TO WS-FAIL
|
||||
END-IF.
|
||||
CLOSE F44.
|
||||
|
||||
*> T5: STATUS 48 (INPUTでWRITE試行)
|
||||
OPEN OUTPUT F48.
|
||||
MOVE "TEST DATA" TO F48-REC.
|
||||
WRITE F48-REC.
|
||||
CLOSE F48.
|
||||
OPEN INPUT F48.
|
||||
WRITE F48-REC.
|
||||
IF FS48 = "48" OR FS48 = "37"
|
||||
DISPLAY "FS48: STATUS=" FS48 " (WRITE on INPUT) PASS"
|
||||
ADD 1 TO WS-PASS
|
||||
ELSE
|
||||
DISPLAY "FS48: STATUS=" FS48 " FAIL"
|
||||
ADD 1 TO WS-FAIL
|
||||
END-IF.
|
||||
CLOSE F48.
|
||||
|
||||
DISPLAY " "
|
||||
DISPLAY "FILE-STATUS-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 FileStatusEdge.
|
||||
@@ -0,0 +1,176 @@
|
||||
IDENTIFICATION DIVISION.
|
||||
PROGRAM-ID. Level88Edge.
|
||||
*> ============================================================
|
||||
*> 88-level 条件名境界テスト
|
||||
*> 88-level THRU(範囲), 複数VALUE, 複合条件
|
||||
*> Coverage: B-N004 拡張, 境界条件
|
||||
*> ============================================================
|
||||
|
||||
DATA DIVISION.
|
||||
WORKING-STORAGE SECTION.
|
||||
*> T1: 88-level with THRU (範囲指定)
|
||||
01 WS-SCORE PIC 9(3).
|
||||
88 WS-GRADE-A VALUE 90 THRU 100.
|
||||
88 WS-GRADE-B VALUE 75 THRU 89.
|
||||
88 WS-GRADE-C VALUE 60 THRU 74.
|
||||
88 WS-GRADE-D VALUE 0 THRU 59.
|
||||
|
||||
*> T2: 88-level with 複数値
|
||||
01 WS-DAY PIC X(3).
|
||||
88 WS-WEEKDAY VALUE 'MON', 'TUE', 'WED', 'THU', 'FRI'.
|
||||
88 WS-WEEKEND VALUE 'SAT', 'SUN'.
|
||||
|
||||
*> T3: 88-level with 複数英字名
|
||||
01 WS-PLAN PIC X(3).
|
||||
88 WS-PLAN-PREPAID VALUE 'P01', 'P02'.
|
||||
88 WS-PLAN-POSTPAID VALUE 'P03', 'P04'.
|
||||
88 WS-PLAN-VIP VALUE 'V01', 'V02'.
|
||||
|
||||
*> T4: 88-level with 極端な範囲(境界値)
|
||||
01 WS-PCT PIC 9(3).
|
||||
88 WS-PCT-LOW VALUE 0 THRU 10.
|
||||
88 WS-PCT-MED VALUE 11 THRU 50.
|
||||
88 WS-PCT-HIGH VALUE 51 THRU 100.
|
||||
88 WS-PCT-OVR VALUE 101 THRU 999.
|
||||
|
||||
*> T5: 88-level with SPACE/ZERO/LOW/HIGH
|
||||
01 WS-FLAG PIC X(1).
|
||||
88 WS-FLAG-YES VALUE 'Y'.
|
||||
88 WS-FLAG-NO VALUE 'N'.
|
||||
88 WS-FLAG-EMPTY VALUE SPACE.
|
||||
|
||||
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 "88-LEVEL-EDGE: 88-level THRU/boundary tests"
|
||||
|
||||
*> T1: THRU境界値テスト
|
||||
ADD 1 TO WS-TC.
|
||||
MOVE 90 TO WS-SCORE.
|
||||
IF WS-GRADE-A
|
||||
DISPLAY "T1-A: 90→GRADE-A PASS"
|
||||
ADD 1 TO WS-PASS
|
||||
ELSE
|
||||
ADD 1 TO WS-FAIL
|
||||
END-IF.
|
||||
|
||||
ADD 1 TO WS-TC.
|
||||
MOVE 100 TO WS-SCORE.
|
||||
IF WS-GRADE-A
|
||||
DISPLAY "T1-B: 100→GRADE-A (upper bound) PASS"
|
||||
ADD 1 TO WS-PASS
|
||||
ELSE
|
||||
ADD 1 TO WS-FAIL
|
||||
END-IF.
|
||||
|
||||
ADD 1 TO WS-TC.
|
||||
MOVE 89 TO WS-SCORE.
|
||||
IF WS-GRADE-B
|
||||
DISPLAY "T1-C: 89→GRADE-B (boundary) PASS"
|
||||
ADD 1 TO WS-PASS
|
||||
ELSE
|
||||
ADD 1 TO WS-FAIL
|
||||
END-IF.
|
||||
|
||||
ADD 1 TO WS-TC.
|
||||
MOVE 75 TO WS-SCORE.
|
||||
IF WS-GRADE-B
|
||||
DISPLAY "T1-D: 75→GRADE-B (lower bound) PASS"
|
||||
ADD 1 TO WS-PASS
|
||||
ELSE
|
||||
ADD 1 TO WS-FAIL
|
||||
END-IF.
|
||||
|
||||
*> T2: 複数値OR条件
|
||||
ADD 1 TO WS-TC.
|
||||
MOVE 'MON' TO WS-DAY.
|
||||
IF WS-WEEKDAY
|
||||
DISPLAY "T2-A: MON→WEEKDAY PASS"
|
||||
ADD 1 TO WS-PASS
|
||||
ELSE
|
||||
ADD 1 TO WS-FAIL
|
||||
END-IF.
|
||||
|
||||
ADD 1 TO WS-TC.
|
||||
MOVE 'SAT' TO WS-DAY.
|
||||
IF WS-WEEKEND
|
||||
DISPLAY "T2-B: SAT→WEEKEND PASS"
|
||||
ADD 1 TO WS-PASS
|
||||
ELSE
|
||||
ADD 1 TO WS-FAIL
|
||||
END-IF.
|
||||
|
||||
*> T3: 複数英文字コード
|
||||
ADD 1 TO WS-TC.
|
||||
MOVE 'V01' TO WS-PLAN.
|
||||
IF WS-PLAN-VIP
|
||||
DISPLAY "T3-A: V01→VIP PASS"
|
||||
ADD 1 TO WS-PASS
|
||||
ELSE
|
||||
ADD 1 TO WS-FAIL
|
||||
END-IF.
|
||||
|
||||
ADD 1 TO WS-TC.
|
||||
MOVE 'P01' TO WS-PLAN.
|
||||
IF WS-PLAN-PREPAID
|
||||
DISPLAY "T3-B: P01→PREPAID PASS"
|
||||
ADD 1 TO WS-PASS
|
||||
ELSE
|
||||
ADD 1 TO WS-FAIL
|
||||
END-IF.
|
||||
|
||||
*> T4: 極端範囲値
|
||||
ADD 1 TO WS-TC.
|
||||
MOVE 0 TO WS-PCT.
|
||||
IF WS-PCT-LOW
|
||||
DISPLAY "T4-A: 0→LOW (minimum) PASS"
|
||||
ADD 1 TO WS-PASS
|
||||
ELSE
|
||||
ADD 1 TO WS-FAIL
|
||||
END-IF.
|
||||
|
||||
ADD 1 TO WS-TC.
|
||||
MOVE 999 TO WS-PCT.
|
||||
IF WS-PCT-OVR
|
||||
DISPLAY "T4-B: 999→OVER (maximum) PASS"
|
||||
ADD 1 TO WS-PASS
|
||||
ELSE
|
||||
ADD 1 TO WS-FAIL
|
||||
END-IF.
|
||||
|
||||
*> T5: SPACE判定
|
||||
ADD 1 TO WS-TC.
|
||||
MOVE SPACE TO WS-FLAG.
|
||||
IF WS-FLAG-EMPTY
|
||||
DISPLAY "T5: SPACE→EMPTY PASS"
|
||||
ADD 1 TO WS-PASS
|
||||
ELSE
|
||||
ADD 1 TO WS-FAIL
|
||||
END-IF.
|
||||
|
||||
*> T6: EVALUATE + 88-level 複合
|
||||
ADD 1 TO WS-TC.
|
||||
MOVE 85 TO WS-SCORE.
|
||||
MOVE 'WED' TO WS-DAY.
|
||||
EVALUATE TRUE
|
||||
WHEN WS-GRADE-A AND WS-WEEKDAY
|
||||
DISPLAY "T6: GRADE-A + WEEKDAY PASS"
|
||||
ADD 1 TO WS-PASS
|
||||
WHEN OTHER
|
||||
ADD 1 TO WS-FAIL
|
||||
END-EVALUATE.
|
||||
|
||||
DISPLAY " "
|
||||
DISPLAY "88-LEVEL-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 Level88Edge.
|
||||
@@ -0,0 +1,214 @@
|
||||
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.
|
||||
@@ -0,0 +1,87 @@
|
||||
IDENTIFICATION DIVISION.
|
||||
PROGRAM-ID. MinimalPgmEdge.
|
||||
*> ============================================================
|
||||
*> 最小限プログラム境界テスト (Minimal Program Edge Cases)
|
||||
*> 型判定下限: どのタイプにも分類できない極小プログラム
|
||||
*>
|
||||
*> T1: PROCEDURE DIVISIONだけで何もしない
|
||||
*> T2: STOP RUNのみ
|
||||
*> T3: DISPLAYのみ
|
||||
*> T4: CALL+Gobackのみ (Subprogram最小)
|
||||
*> T5: IFのみでELSEなし
|
||||
*> T6: 空PERFORM
|
||||
*> T7: 88-levelのみ判定 (ファイル入出力なし)
|
||||
*> T8: 全ての分岐を省略 (fall-through only)
|
||||
*> ============================================================
|
||||
|
||||
DATA DIVISION.
|
||||
WORKING-STORAGE SECTION.
|
||||
01 WS-PASS PIC 9(2) VALUE 0.
|
||||
01 WS-FAIL PIC 9(2) VALUE 0.
|
||||
01 WS-X PIC 9(1) VALUE 0.
|
||||
01 WS-Y PIC 9(1) VALUE 1.
|
||||
|
||||
PROCEDURE DIVISION.
|
||||
MAIN.
|
||||
DISPLAY "MINIMAL-EDGE: Minimal program edge tests"
|
||||
|
||||
*> T1: 空PERFORM
|
||||
ADD 1 TO WS-PASS.
|
||||
PERFORM EMPTY-PARA.
|
||||
DISPLAY "T1-EMPTY-PERFORM: PASS".
|
||||
|
||||
*> T2: IFのみELSEなし
|
||||
ADD 1 TO WS-PASS.
|
||||
IF WS-X = 0
|
||||
DISPLAY "T2-IF-ONLY: x=0 true (no ELSE) PASS"
|
||||
END-IF.
|
||||
|
||||
*> T3: IF FALSE (何もしない)
|
||||
ADD 1 TO WS-PASS.
|
||||
IF WS-X = 1
|
||||
DISPLAY "T3-IF-FALSE: SHOULD NOT REACH"
|
||||
ADD 1 TO WS-FAIL
|
||||
END-IF.
|
||||
DISPLAY "T3-IF-FALSE: skipped correctly PASS".
|
||||
|
||||
*> T4: 88-levelのみ (ファイルなし)
|
||||
ADD 1 TO WS-PASS.
|
||||
IF WS-PASS > WS-FAIL
|
||||
DISPLAY "T4-88-ONLY: relational op PASS"
|
||||
END-IF.
|
||||
|
||||
*> T5: PERFORM VARYING 0回
|
||||
ADD 1 TO WS-PASS.
|
||||
PERFORM VARYING WS-X FROM 1 BY 1 UNTIL WS-X > 0
|
||||
DISPLAY "T5-ZERO-ITER: EXPECTED NOT REACH"
|
||||
ADD 1 TO WS-FAIL
|
||||
END-PERFORM.
|
||||
DISPLAY "T5-ZERO-ITER: 0 iterations PASS".
|
||||
|
||||
*> T6: 段落スルー (FROM paragraph)
|
||||
ADD 1 TO WS-PASS.
|
||||
GO TO T6-PARA.
|
||||
T6-END.
|
||||
DISPLAY "T6-FALL-THRU: reached PASS".
|
||||
GO TO T6-DONE.
|
||||
T6-PARA.
|
||||
DISPLAY " T6-PARA: entering"
|
||||
GO TO T6-END.
|
||||
T6-DONE.
|
||||
CONTINUE.
|
||||
|
||||
DISPLAY " "
|
||||
DISPLAY "MINIMAL-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
|
||||
.
|
||||
|
||||
EMPTY-PARA.
|
||||
EXIT.
|
||||
.
|
||||
|
||||
END PROGRAM MinimalPgmEdge.
|
||||
@@ -0,0 +1,175 @@
|
||||
IDENTIFICATION DIVISION.
|
||||
PROGRAM-ID. NumericEdge.
|
||||
*> ============================================================
|
||||
*> 数値演算境界テスト (Numeric Boundary Edge Cases)
|
||||
*> COMP-3 無効サインニブル, SIZE ERROR境界,
|
||||
*> ROUNDED境界(0.5, 0.99), 桁あふれ, 符号なし/符号付混算
|
||||
*> Coverage: NP-N001~N007, NP-A001~A004 拡張
|
||||
*> ============================================================
|
||||
|
||||
DATA DIVISION.
|
||||
WORKING-STORAGE SECTION.
|
||||
|
||||
*> COMP-3 サインニブル検証
|
||||
01 WS-C3-POS PIC S9(5) USAGE COMP-3 VALUE 12345.
|
||||
01 WS-C3-NEG PIC S9(5) USAGE COMP-3 VALUE -12345.
|
||||
01 WS-C3-ZERO PIC S9(5) USAGE COMP-3 VALUE 0.
|
||||
01 WS-C3-BIG PIC S9(9) USAGE COMP-3 VALUE 999999999.
|
||||
01 WS-C3-DISP PIC S9(5).
|
||||
|
||||
*> SIZE ERROR境界
|
||||
01 WS-SE-A PIC 9(2) VALUE 99.
|
||||
01 WS-SE-B PIC 9(2) VALUE 1.
|
||||
01 WS-SE-C PIC 9(2) VALUE 99.
|
||||
01 WS-SE-RES PIC 9(2).
|
||||
|
||||
*> ROUNDED境界
|
||||
01 WS-RD1 PIC 9(2)V9 VALUE 0.
|
||||
01 WS-RD2 PIC 9(2)V99 VALUE 0.
|
||||
01 WS-RD-SRC1 PIC 9(3)V99 VALUE 999.995.
|
||||
01 WS-RD-SRC2 PIC 9(3)V99 VALUE 999.994.
|
||||
01 WS-RD-SRC3 PIC 9(3)V99 VALUE 100.050.
|
||||
01 WS-RD-SRC4 PIC 9(3)V99 VALUE 100.049.
|
||||
|
||||
*> 桁あふれ
|
||||
01 WS-OF-A PIC 9(5) VALUE 99999.
|
||||
01 WS-OF-B PIC 9(5) VALUE 1.
|
||||
01 WS-OF-RES PIC 9(5).
|
||||
|
||||
*> 符号なし/符号付混算
|
||||
01 WS-UNSIGNED PIC 9(5) VALUE 100.
|
||||
01 WS-SIGNED PIC S9(5) VALUE -200.
|
||||
01 WS-MIX-RES PIC S9(6).
|
||||
|
||||
*> ゼロ除算トラップ
|
||||
01 WS-ZD-DIV PIC 9(5) VALUE 100.
|
||||
01 WS-ZD-DIVISOR PIC 9(5) VALUE 0.
|
||||
01 WS-ZD-RES PIC 9(5).
|
||||
|
||||
01 WS-PASS PIC 9(2) VALUE 0.
|
||||
01 WS-FAIL PIC 9(2) VALUE 0.
|
||||
01 WS-TC PIC 9(2) VALUE 0.
|
||||
01 WS-VAL PIC 9(5).
|
||||
|
||||
PROCEDURE DIVISION.
|
||||
MAIN.
|
||||
DISPLAY "NUMERIC-EDGE: Numeric boundary edge tests"
|
||||
|
||||
*> T1: COMP-3 sign nibble (positive/negative/zero)
|
||||
ADD 1 TO WS-TC.
|
||||
MOVE WS-C3-POS TO WS-C3-DISP.
|
||||
IF WS-C3-DISP = 12345
|
||||
DISPLAY "T1-C3-POS: 12345→" WS-C3-DISP " PASS"
|
||||
ADD 1 TO WS-PASS
|
||||
ELSE
|
||||
ADD 1 TO WS-FAIL
|
||||
END-IF.
|
||||
|
||||
ADD 1 TO WS-TC.
|
||||
MOVE WS-C3-NEG TO WS-C3-DISP.
|
||||
IF WS-C3-DISP = -12345
|
||||
DISPLAY "T1-C3-NEG: -12345→" WS-C3-DISP " PASS"
|
||||
ADD 1 TO WS-PASS
|
||||
ELSE
|
||||
ADD 1 TO WS-FAIL
|
||||
END-IF.
|
||||
|
||||
ADD 1 TO WS-TC.
|
||||
MOVE WS-C3-ZERO TO WS-C3-DISP.
|
||||
IF WS-C3-DISP = 0
|
||||
DISPLAY "T1-C3-ZERO: 0→" WS-C3-DISP " PASS"
|
||||
ADD 1 TO WS-PASS
|
||||
ELSE
|
||||
ADD 1 TO WS-FAIL
|
||||
END-IF.
|
||||
|
||||
*> T2: SIZE ERROR境界
|
||||
ADD 1 TO WS-TC.
|
||||
ADD WS-SE-A TO WS-SE-B
|
||||
ON SIZE ERROR
|
||||
DISPLAY "T2-SE: 99+1=100 > 99 SIZE ERROR PASS"
|
||||
ADD 1 TO WS-PASS
|
||||
NOT ON SIZE ERROR
|
||||
ADD 1 TO WS-FAIL
|
||||
END-ADD.
|
||||
|
||||
*> 正常範囲: 1+98=99
|
||||
ADD 1 TO WS-TC.
|
||||
MOVE 1 TO WS-SE-A.
|
||||
MOVE 98 TO WS-SE-C.
|
||||
ADD WS-SE-A TO WS-SE-C GIVING WS-SE-RES
|
||||
ON SIZE ERROR
|
||||
ADD 1 TO WS-FAIL
|
||||
NOT ON SIZE ERROR
|
||||
IF WS-SE-RES = 99
|
||||
DISPLAY "T2-SE-NORM: 1+98=99 PASS"
|
||||
ADD 1 TO WS-PASS
|
||||
ELSE
|
||||
ADD 1 TO WS-FAIL
|
||||
END-IF
|
||||
END-ADD.
|
||||
|
||||
*> T3: ROUNDED境界
|
||||
ADD 1 TO WS-TC.
|
||||
COMPUTE WS-RD1 ROUNDED = WS-RD-SRC1.
|
||||
IF WS-RD1 = 1000.0
|
||||
DISPLAY "T3-RD1: 999.995 rounded→1000.0 PASS"
|
||||
ADD 1 TO WS-PASS
|
||||
ELSE
|
||||
DISPLAY "T3-RD1: " WS-RD1 " FAIL"
|
||||
ADD 1 TO WS-FAIL
|
||||
END-IF.
|
||||
|
||||
ADD 1 TO WS-TC.
|
||||
COMPUTE WS-RD1 ROUNDED = WS-RD-SRC2.
|
||||
IF WS-RD1 = 999.9
|
||||
DISPLAY "T3-RD2: 999.994→999.9 PASS"
|
||||
ADD 1 TO WS-PASS
|
||||
ELSE
|
||||
DISPLAY "T3-RD2: " WS-RD1 " FAIL"
|
||||
ADD 1 TO WS-FAIL
|
||||
END-IF.
|
||||
|
||||
*> T4: 桁あふれ
|
||||
ADD 1 TO WS-TC.
|
||||
ADD WS-OF-A TO WS-OF-B GIVING WS-OF-RES
|
||||
ON SIZE ERROR
|
||||
DISPLAY "T4-OF: 99999+1 SIZE ERROR PASS"
|
||||
ADD 1 TO WS-PASS
|
||||
NOT ON SIZE ERROR
|
||||
ADD 1 TO WS-FAIL
|
||||
END-ADD.
|
||||
|
||||
*> T5: 符号なし/符号付混算
|
||||
ADD 1 TO WS-TC.
|
||||
COMPUTE WS-MIX-RES = WS-UNSIGNED + WS-SIGNED.
|
||||
IF WS-MIX-RES = -100
|
||||
DISPLAY "T5-MIX: 100 + (-200) = -100 PASS"
|
||||
ADD 1 TO WS-PASS
|
||||
ELSE
|
||||
ADD 1 TO WS-FAIL
|
||||
END-IF.
|
||||
|
||||
*> T6: ゼロ除算トラップ
|
||||
ADD 1 TO WS-TC.
|
||||
DIVIDE WS-ZD-DIV BY WS-ZD-DIVISOR
|
||||
GIVING WS-ZD-RES
|
||||
ON SIZE ERROR
|
||||
DISPLAY "T6-ZDIV: Zero divide SIZE ERROR PASS"
|
||||
ADD 1 TO WS-PASS
|
||||
NOT ON SIZE ERROR
|
||||
DISPLAY "T6-ZDIV: NOT TRAPPED FAIL"
|
||||
ADD 1 TO WS-FAIL
|
||||
END-DIVIDE.
|
||||
|
||||
DISPLAY " "
|
||||
DISPLAY "NUMERIC-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 NumericEdge.
|
||||
@@ -0,0 +1,142 @@
|
||||
IDENTIFICATION DIVISION.
|
||||
PROGRAM-ID. ProgStructEdge.
|
||||
*> ============================================================
|
||||
*> 程序構造境界テスト (Program Structure Edge Cases)
|
||||
*> レガシーCOBOL構造: PERFORM THRU, GO TO DEPENDING ON,
|
||||
*> 段落スルー, ALTER(非推奨), 複数SECTION
|
||||
*> ============================================================
|
||||
|
||||
ENVIRONMENT DIVISION.
|
||||
DATA DIVISION.
|
||||
WORKING-STORAGE SECTION.
|
||||
01 WS-SWITCH PIC X(1) VALUE 'N'.
|
||||
88 WS-ON VALUE 'Y'.
|
||||
01 WS-COUNT PIC 9(5) VALUE 0.
|
||||
01 WS-GO-TO-IDX PIC 9(1) VALUE 0.
|
||||
01 WS-PASS PIC 9(2) VALUE 0.
|
||||
01 WS-FAIL PIC 9(2) VALUE 0.
|
||||
|
||||
PROCEDURE DIVISION.
|
||||
MAIN.
|
||||
DISPLAY "PROG-STRUCT-EDGE: Program structure edge tests"
|
||||
|
||||
*> Test 1: PERFORM THRU (段落範囲実行)
|
||||
ADD 1 TO WS-COUNT.
|
||||
DISPLAY "T1-THRU: PERFORM THRU para range"
|
||||
PERFORM PARA-A THRU PARA-C
|
||||
DISPLAY "T1-THRU: PASS"
|
||||
ADD 1 TO WS-PASS.
|
||||
|
||||
*> Test 2: 段落スルー (Paragraph fall-through)
|
||||
ADD 1 TO WS-COUNT.
|
||||
DISPLAY "T2-FALL: Paragraph fall-through (A->B)"
|
||||
PERFORM PARA-D THRU PARA-E
|
||||
DISPLAY "T2-FALL: PASS"
|
||||
ADD 1 TO WS-PASS.
|
||||
|
||||
*> Test 3: GO TO DEPENDING ON
|
||||
ADD 1 TO WS-COUNT.
|
||||
DISPLAY "T3-GOTO: GO TO DEPENDING ON"
|
||||
MOVE 0 TO WS-GO-TO-IDX.
|
||||
GO TO PARA-X PARA-Y PARA-Z
|
||||
DEPENDING ON WS-GO-TO-IDX.
|
||||
*> WS-GO-TO-IDX=0 → 次段落へ (何も実行しない)
|
||||
DISPLAY "T3-GOTO: IDX=0 skipped (PASS)"
|
||||
ADD 1 TO WS-PASS.
|
||||
|
||||
MOVE 2 TO WS-GO-TO-IDX.
|
||||
GO TO PARA-X PARA-Y PARA-Z
|
||||
DEPENDING ON WS-GO-TO-IDX
|
||||
. *> ここには来ない
|
||||
|
||||
*> Test 4: GO TO (単純)
|
||||
ADD 1 TO WS-COUNT.
|
||||
DISPLAY "T4-GOTO-SIMPLE: Simple GO TO"
|
||||
GO TO PARA-END-T4.
|
||||
DISPLAY "T4-GOTO: FAIL - should not reach"
|
||||
ADD 1 TO WS-FAIL.
|
||||
GO TO PARA-END-T4-EXIT.
|
||||
|
||||
PARA-END-T4.
|
||||
DISPLAY "T4-GOTO-SIMPLE: PASS"
|
||||
ADD 1 TO WS-PASS.
|
||||
|
||||
PARA-END-T4-EXIT.
|
||||
CONTINUE.
|
||||
|
||||
*> Test 5: EXIT PARAGRAPH vs EXIT SECTION
|
||||
ADD 1 TO WS-COUNT.
|
||||
DISPLAY "T5-EXIT: EXIT PARAGRAPH"
|
||||
PERFORM PARA-EXIT-DEMO
|
||||
DISPLAY "T5-EXIT: PASS"
|
||||
ADD 1 TO WS-PASS.
|
||||
|
||||
*> Test 6: ALTER (非推奨だがレガシーCOBOLに存在)
|
||||
ADD 1 TO WS-COUNT.
|
||||
DISPLAY "T6-ALTER: ALTER (legacy)"
|
||||
ALTER PARA-ALTER-TARGET TO PROCEED TO PARA-ALTER-OK
|
||||
GO TO PARA-ALTER-TARGET.
|
||||
|
||||
PARA-ALTER-TARGET.
|
||||
DISPLAY "T6-ALTER: FAIL - old path"
|
||||
ADD 1 TO WS-FAIL.
|
||||
GO TO PARA-ALTER-DONE.
|
||||
|
||||
PARA-ALTER-OK.
|
||||
DISPLAY "T6-ALTER: PASS"
|
||||
ADD 1 TO WS-PASS.
|
||||
|
||||
PARA-ALTER-DONE.
|
||||
CONTINUE.
|
||||
|
||||
*> Summary
|
||||
DISPLAY " "
|
||||
DISPLAY "PROG-STRUCT-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
|
||||
.
|
||||
|
||||
*> === PERFORM THRU 段落群 ===
|
||||
PARA-A.
|
||||
DISPLAY " PARA-A: start"
|
||||
.
|
||||
PARA-B.
|
||||
DISPLAY " PARA-B: middle (THRU includes)"
|
||||
.
|
||||
PARA-C.
|
||||
DISPLAY " PARA-C: end (THRU target)"
|
||||
.
|
||||
|
||||
*> === 段落スルー デモ ===
|
||||
PARA-D.
|
||||
DISPLAY " PARA-D: fall through to PARA-E"
|
||||
.
|
||||
PARA-E.
|
||||
DISPLAY " PARA-E: reached via fall-through"
|
||||
.
|
||||
|
||||
*> === GO TO DEPENDING ON 飛び先 ===
|
||||
PARA-X.
|
||||
DISPLAY " PARA-X: IDX=1"
|
||||
.
|
||||
PARA-Y.
|
||||
DISPLAY " PARA-Y: IDX=2"
|
||||
.
|
||||
PARA-Z.
|
||||
DISPLAY " PARA-Z: IDX=3"
|
||||
.
|
||||
|
||||
*> === EXIT PARAGRAPH デモ ===
|
||||
PARA-EXIT-DEMO.
|
||||
DISPLAY " Before EXIT PARAGRAPH"
|
||||
IF WS-PASS >= 0
|
||||
EXIT PARAGRAPH
|
||||
END-IF
|
||||
DISPLAY " After EXIT PARAGRAPH (NOT reached)"
|
||||
.
|
||||
|
||||
END PROGRAM ProgStructEdge.
|
||||
Reference in New Issue
Block a user