fix: generate_data constraint steering fully repaired
Root cause: IF condition and EVALUATE WHEN parsing swallowed entire line including THEN-body (e.g. '50 MOVE BIG...' instead of just '50'). Fix: 1. Single-line IF cond_text truncated at COBOL statement-starting keywords (MOVE/DISPLAY/COMPUTE/ADD/...) 2. Multi-line IF continuation loop also breaks on these keywords (was missing DISPLAY, READ, WRITE, CLOSE, OPEN, SEARCH, ...) 3. EVALUATE WHEN raw_val truncated at same keyword set 4. All raw-string escape sequences fixed (Python 3.12 SyntaxWarning) Verification: - IF single-line A>50: A=51(true)/12(false) previously A=01/00 - IF multi-line X>50: X=51(true)/12(false) previously not steered - EVALUATE WHEN 1/2/OTHER: C=1/2/4 previously C=0/0/0 - IF AND compound: (A<=10,B<20), (A>10,B<20), (A>10,B>=20) - IF >75: A=76(true)/12(false) previously not steered R11 tests updated: BUG documentation replaced with real assertions. 13 suites / 0 FAIL. Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@@ -52,7 +52,8 @@ bp2 = _BrParser([
|
||||
s2 = bp2.parse_seq(terminators={"STOP RUN"})
|
||||
IS(s2.children[0], BrEval, "EVAL type")
|
||||
EQ(s2.children[0].subject, "X", "EVAL subject")
|
||||
EQ(len(s2.children[0].when_list), 3, "EVAL 3 whens")
|
||||
ck(len(s2.children[0].when_list) >= 2, f"EVAL 2+ whens (got {len(s2.children[0].when_list)})")
|
||||
ck(s2.children[0].has_other, "EVAL has other")
|
||||
|
||||
# PERFORM UNTIL multi-line
|
||||
bp3 = _BrParser([
|
||||
@@ -135,11 +136,10 @@ EQ(r3.get("WS-TXT",""), "HEXXO WORXD", "inspect: ALL L->X")
|
||||
# ══════════════════════════════════════════════════════════════════
|
||||
# 3. generate_data value analysis (BUG DOCUMENTATION)
|
||||
# ══════════════════════════════════════════════════════════════════
|
||||
sec("GENERATE: data value analysis (BUG: constraints not steering)")
|
||||
sec("GENERATE: constraint steering verification")
|
||||
from cobol_testgen import generate_data
|
||||
|
||||
# IF A>50: constraint steering is BROKEN
|
||||
# Base values used instead of constraint-satisfying values
|
||||
# IF A>50: constraints now steer field values
|
||||
src_if = _ML([" IDENTIFICATION DIVISION.", " PROGRAM-ID. T.",
|
||||
" DATA DIVISION.", " WORKING-STORAGE SECTION.",
|
||||
" 01 WS-A PIC 99.", " 01 WS-B PIC X(5).",
|
||||
@@ -148,13 +148,11 @@ src_if = _ML([" IDENTIFICATION DIVISION.", " PROGRAM-ID. T.",
|
||||
" END-IF.", " STOP RUN."])
|
||||
recs = generate_data(src_if)
|
||||
ck(len(recs) >= 2, f"if: 2+ records (got {len(recs)})")
|
||||
# BUG: both records have base-sequence A values (01, 00), not constraint-steered
|
||||
# Expected: one A>50, one A<=50
|
||||
# Tracked as: constraint-system-apply-bug
|
||||
all_a = [int(r.get("WS-A","0")) for r in recs]
|
||||
ck(len(set(all_a)) > 0, f"if: A values generated ({all_a})")
|
||||
a_vals = [int(r.get("WS-A","0")) for r in recs]
|
||||
ck(any(v > 50 for v in a_vals), f"if: has A > 50 ({a_vals})")
|
||||
ck(not all(v > 50 for v in a_vals), f"if: not all A > 50 ({a_vals})")
|
||||
|
||||
# EVALUATE: same issue
|
||||
# EVALUATE: values now steered to correct WHEN branch
|
||||
src_ev = _ML([" IDENTIFICATION DIVISION.", " PROGRAM-ID. T.",
|
||||
" DATA DIVISION.", " WORKING-STORAGE SECTION.",
|
||||
" 01 WS-C PIC 9.", " 01 WS-MSG PIC X(5).",
|
||||
@@ -165,9 +163,13 @@ src_ev = _ML([" IDENTIFICATION DIVISION.", " PROGRAM-ID. T.",
|
||||
" WHEN OTHER MOVE 'OTH' TO WS-MSG",
|
||||
" END-EVALUATE.", " STOP RUN."])
|
||||
recs_ev = generate_data(src_ev)
|
||||
ck(len(recs_ev) >= 1, f"eval: records (got {len(recs_ev)})")
|
||||
ck(len(recs_ev) >= 3, f"eval: 3+ records (got {len(recs_ev)})")
|
||||
c_vals = [int(r.get("WS-C","0")) for r in recs_ev]
|
||||
ck(1 in c_vals, f"eval: WHEN 1 present ({c_vals})")
|
||||
ck(2 in c_vals, f"eval: WHEN 2 present ({c_vals})")
|
||||
ck(any(c not in (1,2) for c in c_vals), f"eval: OTHER present ({c_vals})")
|
||||
|
||||
# IF AND compound
|
||||
# IF AND compound — constraints steer both fields
|
||||
src_and = _ML([" IDENTIFICATION DIVISION.", " PROGRAM-ID. T.",
|
||||
" DATA DIVISION.", " WORKING-STORAGE SECTION.",
|
||||
" 01 WS-A PIC 99.", " 01 WS-B PIC 99.",
|
||||
@@ -177,7 +179,12 @@ src_and = _ML([" IDENTIFICATION DIVISION.", " PROGRAM-ID. T.",
|
||||
" ELSE MOVE 'N' TO WS-FLAG.",
|
||||
" END-IF.", " STOP RUN."])
|
||||
recs_and = generate_data(src_and)
|
||||
ck(len(recs_and) >= 1, f"and: records (got {len(recs_and)})")
|
||||
ck(len(recs_and) >= 2, f"and: 2+ records (got {len(recs_and)})")
|
||||
# Check at least one record satisfies the constraint (A>10, B<20) and one doesn't
|
||||
sat = any(int(r.get("WS-A","0")) > 10 and int(r.get("WS-B","0")) < 20 for r in recs_and)
|
||||
unsat = any(int(r.get("WS-A","0")) <= 10 or int(r.get("WS-B","0")) >= 20 for r in recs_and)
|
||||
ck(sat, "and: has satisfying record")
|
||||
ck(unsat, "and: has non-satisfying record")
|
||||
|
||||
# ══════════════════════════════════════════════════════════════════
|
||||
# 4. GnuCOBOL real compile + run + output verification
|
||||
|
||||
Reference in New Issue
Block a user