From cf7809513013f8c5538873ef03a0ecabdfc337d8 Mon Sep 17 00:00:00 2001 From: squid-protocol Date: Wed, 7 Oct 2026 21:40:20 -0400 Subject: [PATCH 1/3] equivalence: CICS proofs compare DISPLAY output and keep low-values apart from spaces in the COMMAREA (#4635) Co-Authored-By: Claude Opus 5.5 --- .../cobol_mainframe/test_equivalence_cics.py | 47 +++++++++++ tests/equivalence/det_sweep_baseline.json | 18 ++++ tests/tools/equivalence_cics.py | 83 ++++++++++++++++--- 3 files changed, 138 insertions(+), 10 deletions(-) diff --git a/tests/cobol_mainframe/test_equivalence_cics.py b/tests/cobol_mainframe/test_equivalence_cics.py index 7e031834c7..03f0cab3d5 100644 --- a/tests/cobol_mainframe/test_equivalence_cics.py +++ b/tests/cobol_mainframe/test_equivalence_cics.py @@ -486,6 +486,53 @@ def test_events_are_compared_field_by_field(): assert ec.compare_events(cobol, java[:1])["diffs"][-1] == {"event": 2, "cobol": "RETURN", "java": None} +def test_low_values_and_spaces_in_a_commarea_are_different_values(): + """#4635: a field RECEIVE MAP left LOW-VALUES and one the port left spaces are different bytes to the next program + (COSGN00C: the RETURN COMMAREA's CDEMO-USER-ID); trailing spaces alone are still not data.""" + lv, sp = "\x00" * 8, " " + + def ret(v): + return [{"event": "RETURN", "transid": "T1", "commarea": {"CA-USER": v}}] + + assert ec.compare_events(ret(lv), ret(sp))["equal"] == 0 + assert ec.compare_events(ret(lv), ret(""))["equal"] == 0 + assert ec.compare_events(ret(lv), ret(lv))["equal"] == 1 + assert ec.compare_events(ret("AB"), ret("AB "))["equal"] == 1 + assert ec.compare_events(ret(sp), ret(""))["equal"] == 1 + # a screen shows neither: its fields still compare as they did + scr = lambda v: [{"event": "SEND-MAP", "map": "M", "screen": {"F": v}}] # noqa: E731 + assert ec.compare_events(scr(lv), scr(sp))["equal"] == 1 + + +def test_storage_a_task_without_a_commarea_never_set_stays_undefined_text_too(): + """#4635 x X12: a no-COMMAREA task's returned text left all LOW-VALUES is undefined storage, dropped both sides.""" + ev = lambda v: [{"event": "RETURN", "transid": "T", "commarea": {"CA-T": v, "CA-N": "x"}}] # noqa: E731 + cev, jev = ec.mask_absent_commarea({"commarea": None}, ev("\x00" * 4), ev(" "), [0]) + assert ec.compare_events(cev, jev)["equal"] == 1 + cev, jev = ec.mask_absent_commarea({"commarea": {"CA-T": "x"}}, ev("\x00" * 4), ev(" "), [0]) + assert ec.compare_events(cev, jev)["equal"] == 0 # a COMMAREA was given: LOW-VALUES are a value + + +def test_a_returned_commareas_text_keeps_its_low_values(): + fields = [{"name": "CA-USER", "offset": 0, "bytes": 4, "pic": "X(4)", "usage": "DISPLAY"}] + assert ec.decode_record(b"\x00\x00\x00\x00", fields, exact=True) == {"CA-USER": "\x00\x00\x00\x00"} + assert ec.decode_record(b"AB ", fields, exact=True) == {"CA-USER": "AB"} + assert ec.decode_record(b"\x00\x00\x00\x00", fields) == {"CA-USER": ""} # a screen's reading, as before + + +def test_a_tasks_display_output_is_compared_like_a_batch_steps_sysout(tmp_path): + """#4635: ABNDPROC's two branches end in the same RETURN and differ only in what they DISPLAY.""" + cobol = b"*****\n**** Unable to write to the file ABNDFILE !!!\nRESP=00000000 RESP2=00000000\n" + java = tmp_path / "t.sysout" + java.write_text(cobol.decode(), encoding="utf-8") + assert ec.compare_task_sysout(cobol, java, "latin-1")["differing"] == 0 + java.write_text(cobol.decode().replace("write to", "WRITE to"), encoding="utf-8") + d = ec.compare_task_sysout(cobol, java, "latin-1") + assert (d["differing"], d["diffs"][0]["line"]) == (1, 2) + assert ec.compare_task_sysout(cobol, tmp_path / "none", "latin-1")["differing"] == 3 # the port DISPLAYed nothing + assert ec.compare_task_sysout(b"", tmp_path / "none", "latin-1")["differing"] == 0 + + @pytest.mark.skipif(__import__("os").environ.get("EQUIVALENCE_E2E") != "1", reason="needs Docker (GnuCOBOL) and a JDK + Maven") # fmt: skip def test_carddemo_account_view_is_equivalent_end_to_end(tmp_path): diff --git a/tests/equivalence/det_sweep_baseline.json b/tests/equivalence/det_sweep_baseline.json index 89dee37dfb..82d41f7ddf 100644 --- a/tests/equivalence/det_sweep_baseline.json +++ b/tests/equivalence/det_sweep_baseline.json @@ -2,6 +2,10 @@ "format": "det-sweep-baseline/1", "about": "#4463: the det ports `proof_sweep.py --det-only` does not prove, each with the issue that owns it. A two-way ratchet: CI fails on a port not listed here that is not proven, and on a listed port that is now proven. When a fix lands, run `python tests/tools/proof_sweep.py --det-only --skip-db2 --work DIR --update-baseline` and commit the shortened file; a new entry is only ever added by hand, with its true cause.", "det": { + "carddemo-billpay": { + "issue": "#4657", + "why": "the det runtime's STARTBR NOTFND leaves EIBRESP2 0 where the stub gives 3; COBIL00C DISPLAYs it (the proof compares a task's DISPLAY output since #4635)" + }, "carddemo-cardupdate": { "issue": "#4085", "why": "COCRDUPC writes blanks into a PIC 9(3) CVV a typed DTO field cannot hold" @@ -10,9 +14,23 @@ "issue": null, "why": "generated card numbers mix letters and digits: ASCII vs EBCDIC key order picks different duplicates (oracle_assumptions.md D1)" }, + "cbsa-xfrfun": { + "issue": "#4658", + "why": "the det port DISPLAYs SQLCODE -4220 where Db2/GnuCOBOL gives -180 on a null-date update (the proof compares a task's DISPLAY output since #4635)" + }, "mortgage-mpmt": { "issue": "#4271", "why": "IBM DBB EPSMPMT computes its payment through a COMP-1 item in hexadecimal floating point on z/OS, truncated decimal on GnuCOBOL. The det runtime models HFP since #4271 slice 1 (its interest COMPUTE translates), but the payment's (1 + C) ** N, N with decimal places, is a floating-point exponentiation IBM does not document bit for bit: a named hole (oracle_assumptions.md C6; its CBL NUMPROC(MIG) is modelled, C5)" } + }, + "model": { + "carddemo-billpay": { + "issue": "#4657", + "why": "the model port runs on the det runtime: STARTBR NOTFND leaves EIBRESP2 0 where the stub gives 3 (DISPLAYed by COBIL00C)" + }, + "carddemo-signon": { + "issue": "#4659", + "why": "the model port returns spaces in CDEMO-USER-ID where COSGN00C returns LOW-VALUES (a COMMAREA compares them apart since #4635)" + } } } diff --git a/tests/tools/equivalence_cics.py b/tests/tools/equivalence_cics.py index 9e7f8c6b0d..9cd01a30e0 100644 --- a/tests/tools/equivalence_cics.py +++ b/tests/tools/equivalence_cics.py @@ -1193,11 +1193,14 @@ def encode_record( def decode_record(data: bytes, fields: list[dict[str, Any]], enc: str = common.DEFAULT_DATA_ENCODING, - keep_nulls: bool = False) -> dict[str, str]: # fmt: skip + keep_nulls: bool = False, exact: bool = False) -> dict[str, str]: # fmt: skip """{field name: value as text} -- numeric fields as exact decimals, text with trailing spaces and nulls dropped (a screen shows neither). #3815: text and zoned bytes read in `enc`. `keep_nulls`: a text ending in LOW-VALUES kept whole -- a COMMAREA handed to the Java side, whose DTO codec pads - with spaces: COTRTLIC's unfetched rows are LOW-VALUES, and the program protects exactly those.""" + with spaces: COTRTLIC's unfetched rows are LOW-VALUES, and the program protects exactly those. + `exact` (#4635): a text keeps its LOW-VALUES -- only the trailing spaces are dropped -- so a field the task left + LOW-VALUES and one it left spaces are different values, as they are to the next program (`IF X = SPACES OR + LOW-VALUES` exists because they differ). For the COMMAREA a task returns; a screen still shows neither.""" out = {} for f in fields: if f["name"] == "FILLER": # unnamed: no DTO property holds it, and several would share one key @@ -1210,7 +1213,10 @@ def decode_record(data: bytes, fields: list[dict[str, Any]], enc: str = common.D if not isinstance(v, str): out[f["name"]] = str(v) else: - out[f["name"]] = v if keep_nulls and v.rstrip(" ").endswith("\x00") else v.rstrip(" \x00") + if exact: + out[f["name"]] = v.rstrip(" ") + else: + out[f["name"]] = v if keep_nulls and v.rstrip(" ").endswith("\x00") else v.rstrip(" \x00") return out @@ -1460,6 +1466,7 @@ def run_cobol_cics(case: dict[str, Any], corpus: Path, work: Path, files: list[d common.stage_copybooks(case, corpus, src) for p in STUB.iterdir(): shutil.copy(p, src / p.name) + shutil.copy(common.CASES / "faults" / "ggdisplay.c", src / "ggdisplay.c") # #4635: DISPLAY as IBM writes it # #3828: the program's CBL / PROCESS cards and the case's `compiler_options` become cobc flags common.require_ascii_runtime(case) # #3815: an EBCDIC data page cannot run under GnuCOBOL enc = common.data_encoding(case) @@ -1550,7 +1557,12 @@ def run_cobol_cics(case: dict[str, Any], corpus: Path, work: Path, files: list[d ) if db2: compile_task += f" src/ggsql.c {equivalence_db2.COBOL_LINK}" - script = ["set -e", "cd /work", compile_task] + script = [ + "set -e", + "cd /work", + compile_task, + "gcc -shared -fPIC -O2 -o /work/ggdisplay.so src/ggdisplay.c -ldl", + ] # #4635 (as batch, #4056) if db2: script.append(f"gcc -O2 -o ggsqlrun src/ggsqlrun.c {equivalence_db2.COBOL_LINK}") date, _, time = case["clock"].partition(" ") @@ -1630,7 +1642,7 @@ def run_cobol_cics(case: dict[str, Any], corpus: Path, work: Path, files: list[d if db2: # the tables as the seed has them, for this task script.append(f"{sqlenv}./ggsqlrun -f /work/reset.sql") script.append(f"set +e; {cov.trace_env(f'{rel}/{cov.TRACE_NAME}')}GGCICS_DIR={rel} GGCICS_OUT={rel}/out EIBIN={rel}/eib.in " - f"GGCICS_TASKN={task_number(case, sc)} " + f"GGCICS_TASKN={task_number(case, sc)} LD_PRELOAD=/work/ggdisplay.so " + (f"GGCICS_STARTCODE={task_facts(case, sc)[0]} " if task_facts(case, sc)[0] else "") + f"{sqlenv}COB_CURRENT_DATE='{case['clock']}' ./task > {rel}/stdout.txt 2>&1; " f"echo $? > {rel}/rc; set -e") # fmt: skip @@ -1875,6 +1887,8 @@ def outputs(out: Path, case: dict[str, Any], corpus: Path, ca_fields: list[dict[ res["db2"] = {p.name: p.read_bytes() for p in sorted(db2.iterdir()) if p.is_file()} if db2.is_dir() else {} sqlout = out.parent / "sqlout.txt" # #4507: what Db2 answered each statement the task ran res["sql"] = sqlout.read_text(encoding="latin-1") if sqlout.is_file() else "" + said = out.parent / "stdout.txt" # #4635: what the task DISPLAYed (the job log), as IBM writes it + res["sysout"] = said.read_bytes() if said.is_file() else b"" log = out / "events.txt" for line in log.read_text(encoding="latin-1").splitlines() if log.is_file() else []: seq, _, rest = line.partition(" ") @@ -1900,7 +1914,7 @@ def outputs(out: Path, case: dict[str, Any], corpus: Path, ca_fields: list[dict[ if data and not ca_fields: # #4270: nothing to read it by -- refused, never compared as empty raise Unsupported(f"{verb} with a COMMAREA, in a case that describes none (\"commarea\": null)", ["COMMAREA"]) # fmt: skip - ca = decode_record(data, ca_fields, enc) if data else None + ca = decode_record(data, ca_fields, enc, exact=True) if data else None res[verb.lower()] = {key: kv.get(key, ""), "commarea": ca} elif verb == "ABEND": res["abend"] = args @@ -1914,7 +1928,7 @@ def outputs(out: Path, case: dict[str, Any], corpus: Path, ca_fields: list[dict[ res["containers"] = task_containers(out / "containers.out") # #4270 (X24): the current channel's, at task end left = out / "commarea.out" # a LINKed program's result: the COMMAREA it left (ggcics GGCAOUT) res["linked_commarea"] = ( - decode_record(left.read_bytes(), ca_fields, enc) if left.is_file() and left.stat().st_size else None + decode_record(left.read_bytes(), ca_fields, enc, exact=True) if left.is_file() and left.stat().st_size else None ) return res @@ -2574,6 +2588,10 @@ class EquivalenceRunTest {{ Map received = new LinkedHashMap<>(); JsonNode r = sc.get("receive"); {chr(10).join(recv)} + // #4635: what the port DISPLAYs (the generated Sysout appends to this task's own file), compared to the stub's + Path sysout = out.resolve(sc.get("name").asText() + ".sysout"); + Files.deleteIfExists(sysout); + System.setProperty("gitgalaxy.sysout", sysout.toString()); CicsTask task = new CicsTask("{case["transid"]}", sc.get("aid").asText(), commarea, calen, received) .withClock(java.time.LocalDateTime.parse("{ej._clock(case)}")) // EIBTIME / ASKTIME: the case's clock .withRegion({region_java}) // ASSIGN APPLID / SYSID @@ -2956,7 +2974,10 @@ def mask_absent_commarea(sc: dict[str, Any], cev: list[dict[str, Any]], jev: lis for e in cev: ca = e.get("commarea") if isinstance(ca, dict): - undefined |= {k for k, v in ca.items() if isinstance(v, str) and re.fullmatch(r"", v)} + # (#4635: a text field the harness left all LOW-VALUES, now that a COMMAREA keeps its LOW-VALUES apart + # from spaces, is the same undefined storage) + undefined |= {k for k, v in ca.items() + if isinstance(v, str) and re.fullmatch(r"|\x00+", v)} # fmt: skip if not undefined: return cev, jev @@ -3109,6 +3130,25 @@ def _same(a: Any, b: Any) -> bool: return str(a).rstrip(" \x00") == str(b).rstrip(" \x00") +def _same_commarea(a: Any, b: Any) -> bool: + """#4635: a COMMAREA field as the next program reads it -- like `_same`, except that LOW-VALUES are not blanks: + only trailing spaces are dropped, so X'00' bytes and spaces differ.""" + if a is None or b is None or isinstance(a, (int, float)) or isinstance(b, (int, float)): + return _same(a, b) + try: + return Decimal(str(a)) == Decimal(str(b)) + except ArithmeticError: + return str(a).rstrip(" ") == str(b).rstrip(" ") + + +def compare_task_sysout(cobol: bytes, java_file: Path, enc: str) -> dict[str, Any]: + """#4635: what the task DISPLAYed on each side, line by line (equivalence.compare_sysout, as a batch step's + SYSOUT is, #4056). The Java side wrote nothing when the port never DISPLAYs: an empty log.""" + import equivalence as eq + + return eq.compare_sysout(cobol, java_file.read_bytes() if java_file.is_file() else b"", enc) + + def compare_events(cobol: list[dict[str, Any]], java: list[dict[str, Any]]) -> dict[str, Any]: """Events paired in order; per pair, every differing field. {events, equal, diffs}.""" diffs, equal = [], 0 @@ -3131,8 +3171,9 @@ def compare_events(cobol: list[dict[str, Any]], java: list[dict[str, Any]]) -> d bad.append({"field": f"containers.{name}", "cobol": cc.get(name), "java": jc.get(name)}) for part in ("screen", "commarea"): cv, jv = c.get(part) or {}, j.get(part) or {} + same = _same_commarea if part == "commarea" else _same for name in cv: - if not _same(cv[name], jv.get(name)): + if not same(cv[name], jv.get(name)): bad.append({"field": f"{part}.{name}", "cobol": cv[name], "java": jv.get(name)}) if c["event"] == "SEND-MAP" and "subfields" in c: # #4053: attributes, colour, highlight, cursor, options cs, js = c["subfields"], java_subfields(j.get("subfields")) @@ -3204,6 +3245,11 @@ def report_markdown(case: dict[str, Any], report: dict[str, Any]) -> str: lines.append(f"| {x['event']} | (event) | `{x['cobol']}` | `{x['java']}` |") for fd in x.get("fields", []): lines.append(f"| {x['event']} ({x['kind']}) | {fd['field']} | `{fd['cobol']}` | `{fd['java']}` |") + for name, d in report["outputs"].items(): + so = d.get("sysout") or {} + if so.get("diffs"): # #4635: the task's DISPLAY output + lines += ["", f"## {name}: DISPLAY output differs", "", "| line | COBOL | Java |", "|---|---|---|"] + lines += [f"| {x['line']} | `{x['cobol']}` | `{x['java']}` |" for x in so["diffs"]] return "\n".join(lines) + "\n" @@ -3218,7 +3264,9 @@ def feedback_md(case: dict[str, Any], report: dict[str, Any], limit: int = 6) -> files = {n: f for n, f in (o or {}).get("files", {}).items() if f["equal"] != f["records"]} sql = (o or {}).get("sql") or {} sql_bad = sql.get("equal") != sql.get("statements") - if o is None or (o["equal"] == o["records"] and not bad_fired and not files and not sql_bad): + sysout_bad = bool((o or {}).get("sysout", {}).get("differing")) # #4635 + if o is None or (o["equal"] == o["records"] and not bad_fired and not files and not sql_bad + and not sysout_bad): # fmt: skip continue out += [f"### Scenario {sc['name']}: {o['equal']}/{o['records']} events equal", "", f"Key {sc.get('aid', 'DFHENTER')}; COMMAREA {json.dumps(sc.get('commarea'))}; " @@ -3251,6 +3299,11 @@ def feedback_md(case: dict[str, Any], report: dict[str, Any], limit: int = 6) -> out.append( f"- event {x['event']} ({x.get('kind')}) {fd['field']}: COBOL `{fd['cobol']}`, Java `{fd['java']}`" ) + if sysout_bad: # #4635: what the task DISPLAYed + out.append(f"- DISPLAY output: {o['sysout']['differing']} line(s) differ") + out += [ + f" - line {x['line']}: COBOL `{x['cobol']}`, Java `{x['java']}`" for x in o["sysout"]["diffs"][:limit] + ] out.append("") fc = report.get("facade") or {} if fc.get("error"): # #4449: the java-facade side @@ -3494,6 +3547,16 @@ def run_case(case: dict[str, Any], corpus: Path, work: Path, port: bool = True, report["outputs"][name] = {"equal": d["equal"], "records": d["events"], "diffs": d["diffs"], "cobol": cev, "java": jev} # fmt: skip ok &= d["equal"] == d["events"] + if case.get("sysout", True) and not (sc.get("prefix_link") or x6 or sc.get("prefix_x6")): + # #4635: the task's DISPLAY output, as batch proofs compare SYSOUT (#4056); a task judged up to a point + # it did not reach (a LINK not run, a refused WRITEQ) is not: its log stops where the oracle's does not + s = compare_task_sysout( + res.get("sysout", b""), work / "java" / "out" / f"{name}.sysout", common.data_encoding(case) + ) + report["outputs"][name]["sysout"] = s + if s["compared"] and s["differing"]: + ok = False + print(f"{case['program']} {name}: DISPLAY output differs on {s['differing']} line(s): {s['diffs'][:3]}") if sc.get("derived"): report["outputs"][name]["sql_faults"] = sc["sql_plan"] if x6: From fcf2c9b15f784cf9abf5ef7a88eff301d0822d76 Mon Sep 17 00:00:00 2001 From: squid-protocol Date: Wed, 7 Oct 2026 22:52:58 -0400 Subject: [PATCH 2/3] evidence: refresh committed reports (#4635) Co-Authored-By: Claude Opus 5.5 --- .../language_status/evidence_report/README.md | 4 +- .../report.json | 3586 +++++++++-------- .../report.md | 69 +- .../report.json | 14 +- .../report.md | 8 +- 5 files changed, 1842 insertions(+), 1839 deletions(-) diff --git a/docs/language_status/evidence_report/README.md b/docs/language_status/evidence_report/README.md index 1c50c3094a..8bc6080ee1 100644 --- a/docs/language_status/evidence_report/README.md +++ b/docs/language_status/evidence_report/README.md @@ -8,12 +8,12 @@ Per estate, a level per program (see any report's "How to read this report"). On | estate | programs | L0 | L1 | L2 | L3 | L4 | L5 | |---|---|---|---|---|---|---|---| -| [aws-mainframe-modernization-carddemo](aws-mainframe-modernization-carddemo/report.md) | 44 | 14 | 5 | 25 | 0 | 0 | 0 | +| [aws-mainframe-modernization-carddemo](aws-mainframe-modernization-carddemo/report.md) | 44 | 14 | 6 | 24 | 0 | 0 | 0 | | [cics-banking-sample-application-cbsa](cics-banking-sample-application-cbsa/report.md) | 31 | 14 | 15 | 2 | 0 | 0 | 0 | | [cics-genapp](cics-genapp/report.md) | 31 | 6 | 20 | 5 | 0 | 0 | 0 | | [dbb-mortgage-application](dbb-mortgage-application/report.md) | 6 | 3 | 1 | 2 | 0 | 0 | 0 | | [zecs](zecs/report.md) | 5 | 5 | 0 | 0 | 0 | 0 | 0 | -| total | 117 | 42 | 41 | 34 | 0 | 0 | 0 | +| total | 117 | 42 | 42 | 33 | 0 | 0 | 0 | ## Non-burned estates diff --git a/docs/language_status/evidence_report/aws-mainframe-modernization-carddemo/report.json b/docs/language_status/evidence_report/aws-mainframe-modernization-carddemo/report.json index f032b9df05..884e6504be 100644 --- a/docs/language_status/evidence_report/aws-mainframe-modernization-carddemo/report.json +++ b/docs/language_status/evidence_report/aws-mainframe-modernization-carddemo/report.json @@ -3937,15 +3937,9 @@ "named_by_commands": [ { "area": "CICS", - "entry": "READ ... INTO LENGTH: in-out, truncation and LENGERR; a VSAM file's LENGTH need not equal its record length; LENGERR on READ UPDATE refused", - "id": "X14", - "status": "ASSUMED (REFUSED where IBM is silent)" - }, - { - "area": "CICS", - "entry": "READ GTEQ / GENERIC on a KSDS: the first record whose key (or its first KEYLENGTH bytes) equals RIDFLD's or, with GTEQ, is greater, in the browse's key order (D1); NOTFND RESP2 80; READ UPDATE holds the record found; RIDFLD not updated; a GENERIC KEYLENGTH not shorter than the key or not above zero, a non-constant KEYLENGTH and a RIDFLD shorter than the key searched refused", - "id": "X22", - "status": "ASSUMED (REFUSED where IBM is silent or the layout decides)" + "entry": "SEND TEXT on the det port and the stub: TERMINAL accepted as the default output disposition (the principal facility; the event is that of SEND TEXT without it); ACCUM, PAGING, SET, REQID, HEADER, TRAILER, JUSTIFY / JUSFIRST / JUSLAST, the printer, partition and LDC options, MSR, FMHPARM, DEFAULT / ALTERNATE refused", + "id": "X20", + "status": "MATCHED (REFUSED where the region cannot decide)" } ], "reach": "not measured", @@ -3961,21 +3955,21 @@ "infeasible_stated": [ { "family": "G", - "key": "RETURN-TO-PREV-SCREEN:275:true", + "key": "1250-SETUP-ARRAY-ATTRIBS:757:true", "kind": "IF", - "line": 275, + "line": 757, "outcome": "true", - "reason": "`IF CDEMO-TO-PROGRAM = LOW-VALUES OR SPACES` in RETURN-TO-PREV-SCREEN: the paragraph is only PERFORMed, and every PERFORM of it comes right after a MOVE of a non-blank program name into CDEMO-TO-PROGRAM (line 108 moves 'COSGN00C', line 130 'COMEN01C', and line 133 moves CDEMO-FROM-PROGRAM only after line 129 tested it is neither SPACES nor LOW-VALUES; both fields PIC X(08), COCOM01Y). COBIL00C never moves SPACES or LOW-VALUES into it in between.", - "unit": "RETURN-TO-PREV-SCREEN" + "reason": "`IF WS-EDIT-SELECT(1) = SPACE OR LOW-VALUES` is only reached when WS-ROW-CRDSELECT-ERROR(1) = '1' (line 755). That flag is INITIALIZEd to spaces with WS-MISC-STORAGE (line 300) and set to '1' only in 2250-EDIT-ARRAY: at line 1104 when SELECT-OK(1) ('S' or 'U'), at line 1110 in WHEN OTHER after SELECT-BLANK(1) (' ' or LOW-VALUES, lines 80-82) failed, and by the INSPECT at lines 1090-1093, which turns only 'S' / 'U' into '1'. WS-EDIT-SELECT(1) is written only at line 972 (2100-RECEIVE-SCREEN, performed before 2200-EDIT-INPUTS at lines 952-956), so it is never blank when its error flag is '1'.", + "unit": "1250-SETUP-ARRAY-ATTRIBS" }, { - "family": "R", - "key": "UPDATE-ACCTDAT-FILE:387:WHEN@390", + "family": "G", + "key": "1400-SETUP-MESSAGE:897:OTHER", "kind": "EVALUATE", - "line": 387, - "outcome": "WHEN@390", - "reason": "`WHEN DFHRESP(NOTFND)` after `EXEC CICS REWRITE DATASET(WS-ACCTDAT-FILE)` (line 379): REWRITE updates the record the READ ... UPDATE at line 345 holds; IBM's REWRITE conditions do not include NOTFND (https://www.ibm.com/docs/en/cics-ts/6.x?topic=summary-rewrite; our spec, gitgalaxy/standards/cics/commands/files.py, lists NORMAL and INVREQ).", - "unit": "UPDATE-ACCTDAT-FILE" + "line": 897, + "outcome": "OTHER", + "reason": "1400-SETUP-MESSAGE is only PERFORMed by 1000-SEND-MAP (line 633), right after 1100-SCREEN-INIT (line 625), which ends with `SET WS-NO-INFO-MESSAGE TO TRUE` (line 669); nothing in 1200 / 1250 / 1300 writes WS-INFO-MSG. So when no earlier WHEN matches, `WHEN WS-NO-INFO-MESSAGE` (line 917) always does, and WHEN OTHER (line 920) cannot be taken.", + "unit": "1400-SETUP-MESSAGE" } ], "paragraph_pct": null, @@ -3987,8 +3981,8 @@ "equivalence": { "cases": [ { - "case": "carddemo-billpay", - "case_scenarios": 25, + "case": "carddemo-cardlist", + "case_scenarios": 45, "db2": false, "det": { "source": "CI det-sweep ratchet on main", @@ -3997,32 +3991,33 @@ "record": { "coverage": { "branches": { - "covered": 46, - "total": 48 + "covered": 146, + "total": 149 }, "paragraphs": { - "covered": 16, - "live": 16 + "covered": 36, + "live": 36 }, "uncovered_branches": [ - "line 275 IF true (RETURN-TO-PREV-SCREEN)", - "line 387 EVALUATE WHEN@390 (UPDATE-ACCTDAT-FILE)" + "line 757 IF true (1250-SETUP-ARRAY-ATTRIBS)", + "line 897 EVALUATE OTHER (1400-SETUP-MESSAGE)", + "line 1218 IF false (9000-READ-FORWARD)" ] }, "db2": false, "facade": { - "passed": 25, - "runs": 25 + "passed": 45, + "runs": 45 }, - "fault_runs": 10, + "fault_runs": 5, "java_failed": false, "oracle_image": "sha256:d7e387df360c519ce8945a1f6d748c8dafab06f50551b23ddf85d6373a4dcd6e", "oracle_matches_pin": true, - "records_compared": 85, - "records_equal": 85, - "runs": 25, - "scenarios": 25, - "scenarios_equal": 25, + "records_compared": 124, + "records_equal": 124, + "runs": 45, + "scenarios": 45, + "scenarios_equal": 45, "stale_inputs": [ "harness", "oracle", @@ -4035,8 +4030,8 @@ } ], "chosen": { - "case": "carddemo-billpay", - "case_scenarios": 25, + "case": "carddemo-cardlist", + "case_scenarios": 45, "db2": false, "det": { "source": "CI det-sweep ratchet on main", @@ -4045,32 +4040,33 @@ "record": { "coverage": { "branches": { - "covered": 46, - "total": 48 + "covered": 146, + "total": 149 }, "paragraphs": { - "covered": 16, - "live": 16 + "covered": 36, + "live": 36 }, "uncovered_branches": [ - "line 275 IF true (RETURN-TO-PREV-SCREEN)", - "line 387 EVALUATE WHEN@390 (UPDATE-ACCTDAT-FILE)" + "line 757 IF true (1250-SETUP-ARRAY-ATTRIBS)", + "line 897 EVALUATE OTHER (1400-SETUP-MESSAGE)", + "line 1218 IF false (9000-READ-FORWARD)" ] }, "db2": false, "facade": { - "passed": 25, - "runs": 25 + "passed": 45, + "runs": 45 }, - "fault_runs": 10, + "fault_runs": 5, "java_failed": false, "oracle_image": "sha256:d7e387df360c519ce8945a1f6d748c8dafab06f50551b23ddf85d6373a4dcd6e", "oracle_matches_pin": true, - "records_compared": 85, - "records_equal": 85, - "runs": 25, - "scenarios": 25, - "scenarios_equal": 25, + "records_compared": 124, + "records_equal": 124, + "runs": 45, + "scenarios": 45, + "scenarios_equal": 45, "stale_inputs": [ "harness", "oracle", @@ -4090,14 +4086,6 @@ "paragraph coverage >= 100.0 (coverage not measured: no fresh det-sweep ledger entry and no local sweep)" ], "oracle_backing": [ - { - "backed": false, - "command": "ASKTIME", - "crucible_cases": [], - "facts_stated": [], - "registers": [], - "spec_entry": "full" - }, { "backed": false, "command": "ENDBR", @@ -4108,23 +4096,12 @@ }, { "backed": false, - "command": "FORMATTIME", + "command": "READNEXT", "crucible_cases": [], "facts_stated": [], "registers": [], "spec_entry": "full" }, - { - "backed": false, - "command": "READ", - "crucible_cases": [], - "facts_stated": [], - "registers": [ - "X14", - "X22" - ], - "spec_entry": "full" - }, { "backed": false, "command": "READPREV", @@ -4261,14 +4238,6 @@ "registers": [], "spec_entry": "full" }, - { - "backed": false, - "command": "REWRITE", - "crucible_cases": [], - "facts_stated": [], - "registers": [], - "spec_entry": "full" - }, { "backed": true, "command": "SEND MAP", @@ -4299,16 +4268,94 @@ "spec_entry": "full" }, { - "backed": false, - "command": "STARTBR", - "crucible_cases": [], + "backed": true, + "command": "SEND TEXT", + "crucible_cases": [ + { + "case": "ca-link-lengths", + "java_agrees": true, + "stub_agrees": true + }, + { + "case": "ca-xctl-versions", + "java_agrees": true, + "stub_agrees": true + }, + { + "case": "gt-assign-startcode", + "java_agrees": false, + "stub_agrees": true + }, + { + "case": "gt-start-options", + "java_agrees": false, + "stub_agrees": true + }, + { + "case": "gt-start-retrieve", + "java_agrees": true, + "stub_agrees": true + }, + { + "case": "gt-terminal-coalesce", + "java_agrees": true, + "stub_agrees": true + }, + { + "case": "hc-abend-link", + "java_agrees": true, + "stub_agrees": true + }, + { + "case": "hc-eoc-error", + "java_agrees": false, + "stub_agrees": true + }, + { + "case": "hc-handle-aid", + "java_agrees": false, + "stub_agrees": true + }, + { + "case": "hc-ignore-error", + "java_agrees": false, + "stub_agrees": true + }, + { + "case": "hc-perform-range", + "java_agrees": true, + "stub_agrees": true + }, + { + "case": "hc-terminal-eoc", + "java_agrees": false, + "stub_agrees": true + }, + { + "case": "hc-terminal-receive", + "java_agrees": false, + "stub_agrees": true + }, + { + "case": "pc-aid-menu", + "java_agrees": true, + "stub_agrees": true + }, + { + "case": "pc-wizard", + "java_agrees": true, + "stub_agrees": true + } + ], "facts_stated": [], - "registers": [], + "registers": [ + "X20" + ], "spec_entry": "full" }, { "backed": false, - "command": "WRITE", + "command": "STARTBR", "crucible_cases": [], "facts_stated": [], "registers": [], @@ -4344,24 +4391,17 @@ "spec_entry": "full" } ], - "program": "app/cbl/COBIL00C.cbl", + "program": "app/cbl/COCRDLIC.cbl", "residual": { - "assumed_or_differs_named": [ - "X14", - "X22" - ], + "assumed_or_differs_named": [], "branch_outcomes_unrun": null, - "commands": 12, - "commands_backed": 4, + "commands": 9, + "commands_backed": 5, "commands_not_backed": [ - "ASKTIME", "ENDBR", - "FORMATTIME", - "READ", + "READNEXT", "READPREV", - "REWRITE", - "STARTBR", - "WRITE" + "STARTBR" ], "facts_unstated": 0, "holes": 0, @@ -4374,8 +4414,8 @@ "holes": [], "refused": null, "source_defects": [], - "statements": 190, - "translated": 190, + "statements": 500, + "translated": 500, "whole": true } }, @@ -4384,11 +4424,23 @@ "facts_stated": [], "facts_unstated": [], "named_by_commands": [ + { + "area": "CICS", + "entry": "READ ... INTO LENGTH: in-out, truncation and LENGERR; a VSAM file's LENGTH need not equal its record length; LENGERR on READ UPDATE refused", + "id": "X14", + "status": "ASSUMED (REFUSED where IBM is silent)" + }, { "area": "CICS", "entry": "SEND TEXT on the det port and the stub: TERMINAL accepted as the default output disposition (the principal facility; the event is that of SEND TEXT without it); ACCUM, PAGING, SET, REQID, HEADER, TRAILER, JUSTIFY / JUSFIRST / JUSLAST, the printer, partition and LDC options, MSR, FMHPARM, DEFAULT / ALTERNATE refused", "id": "X20", "status": "MATCHED (REFUSED where the region cannot decide)" + }, + { + "area": "CICS", + "entry": "READ GTEQ / GENERIC on a KSDS: the first record whose key (or its first KEYLENGTH bytes) equals RIDFLD's or, with GTEQ, is greater, in the browse's key order (D1); NOTFND RESP2 80; READ UPDATE holds the record found; RIDFLD not updated; a GENERIC KEYLENGTH not shorter than the key or not above zero, a non-constant KEYLENGTH and a RIDFLD shorter than the key searched refused", + "id": "X22", + "status": "ASSUMED (REFUSED where IBM is silent or the layout decides)" } ], "reach": "not measured", @@ -4404,21 +4456,57 @@ "infeasible_stated": [ { "family": "G", - "key": "1250-SETUP-ARRAY-ATTRIBS:757:true", + "key": "1300-SETUP-SCREEN-ATTRS:553:true", "kind": "IF", - "line": 757, + "line": 553, "outcome": "true", - "reason": "`IF WS-EDIT-SELECT(1) = SPACE OR LOW-VALUES` is only reached when WS-ROW-CRDSELECT-ERROR(1) = '1' (line 755). That flag is INITIALIZEd to spaces with WS-MISC-STORAGE (line 300) and set to '1' only in 2250-EDIT-ARRAY: at line 1104 when SELECT-OK(1) ('S' or 'U'), at line 1110 in WHEN OTHER after SELECT-BLANK(1) (' ' or LOW-VALUES, lines 80-82) failed, and by the INSPECT at lines 1090-1093, which turns only 'S' / 'U' into '1'. WS-EDIT-SELECT(1) is written only at line 972 (2100-RECEIVE-SCREEN, performed before 2200-EDIT-INPUTS at lines 952-956), so it is never blank when its error flag is '1'.", - "unit": "1250-SETUP-ARRAY-ATTRIBS" + "reason": "1300-SETUP-SCREEN-ATTRS is only PERFORMed by 1000-SEND-MAP (line 417), right after 1200-SETUP-SCREEN-VARS (line 415), which ends with `IF WS-NO-INFO-MESSAGE SET WS-PROMPT-FOR-INPUT TO TRUE` (lines 490-492): WS-INFO-MSG leaves 1200 non-blank, and nothing at lines 494-552 writes it, so `IF WS-NO-INFO-MESSAGE` at line 553 is never true.", + "unit": "1300-SETUP-SCREEN-ATTRS" }, { "family": "G", - "key": "1400-SETUP-MESSAGE:897:OTHER", - "kind": "EVALUATE", - "line": 897, - "outcome": "OTHER", - "reason": "1400-SETUP-MESSAGE is only PERFORMed by 1000-SEND-MAP (line 633), right after 1100-SCREEN-INIT (line 625), which ends with `SET WS-NO-INFO-MESSAGE TO TRUE` (line 669); nothing in 1200 / 1250 / 1300 writes WS-INFO-MSG. So when no earlier WHEN matches, `WHEN WS-NO-INFO-MESSAGE` (line 917) always does, and WHEN OTHER (line 920) cannot be taken.", - "unit": "1400-SETUP-MESSAGE" + "key": "2210-EDIT-ACCOUNT:656:false", + "kind": "IF", + "line": 656, + "outcome": "false", + "reason": "`IF WS-RETURN-MSG-OFF`: WS-RETURN-MSG is set to SPACES at line 264 and 2210-EDIT-ACCOUNT is the first edit (only PERFORMed at line 630, in 2200-EDIT-MAP-INPUTS after 2100-RECEIVE-MAP, neither of which writes it before), so the message is always still off here.", + "unit": "2210-EDIT-ACCOUNT" + }, + { + "family": "G", + "key": "2210-EDIT-ACCOUNT:668:false", + "kind": "IF", + "line": 668, + "outcome": "false", + "reason": "`IF WS-RETURN-MSG-OFF` at line 668 is reached only when the blank test at line 651 failed (it GOes TO the exit at line 660), so no message was set in this paragraph either; as for line 656, WS-RETURN-MSG is still the SPACES set at line 264.", + "unit": "2210-EDIT-ACCOUNT" + }, + { + "family": "G", + "key": "9100-GETCARD-BYACCTCARD:759:false", + "kind": "IF", + "line": 759, + "outcome": "false", + "reason": "9100 runs only through 9000-READ-DATA, PERFORMed at line 344 (entry from the card list: nothing sets WS-RETURN-MSG after line 264) and at line 365 (the ELSE of IF INPUT-ERROR at line 360). Every message 2200-EDIT-MAP-INPUTS sets (lines 657, 671, 697, 711, 639) comes with SET INPUT-ERROR, so at line 365 the message is still off: `IF WS-RETURN-MSG-OFF` (NOTFND) is always true.", + "unit": "9100-GETCARD-BYACCTCARD" + }, + { + "family": "G", + "key": "9100-GETCARD-BYACCTCARD:764:false", + "kind": "IF", + "line": 764, + "outcome": "false", + "reason": "Same as line 759: in WHEN OTHER of the READ at line 742, WS-RETURN-MSG is still the SPACES set at line 264 on both paths into 9100 (lines 344 and 365), so `IF WS-RETURN-MSG-OFF` is always true.", + "unit": "9100-GETCARD-BYACCTCARD" + }, + { + "family": "C", + "key": "ABEND-ROUTINE:859:true", + "kind": "IF", + "line": 859, + "outcome": "true", + "reason": "`IF ABEND-MSG EQUAL LOW-VALUES`: ABEND-MSG is `PIC X(72) VALUE SPACES` (CSMSG02Y, lines 28-29), outside the items INITIALIZEd at lines 254-256, and the program writes it only at line 860 (a non-blank literal). It is never LOW-VALUES.", + "unit": "ABEND-ROUTINE" } ], "paragraph_pct": null, @@ -4430,8 +4518,8 @@ "equivalence": { "cases": [ { - "case": "carddemo-cardlist", - "case_scenarios": 45, + "case": "carddemo-cardview", + "case_scenarios": 23, "db2": false, "det": { "source": "CI det-sweep ratchet on main", @@ -4440,33 +4528,36 @@ "record": { "coverage": { "branches": { - "covered": 146, - "total": 149 + "covered": 69, + "total": 75 }, "paragraphs": { - "covered": 36, - "live": 36 + "covered": 30, + "live": 30 }, "uncovered_branches": [ - "line 757 IF true (1250-SETUP-ARRAY-ATTRIBS)", - "line 897 EVALUATE OTHER (1400-SETUP-MESSAGE)", - "line 1218 IF false (9000-READ-FORWARD)" + "line 553 IF true (1300-SETUP-SCREEN-ATTRS)", + "line 656 IF false (2210-EDIT-ACCOUNT)", + "line 668 IF false (2210-EDIT-ACCOUNT)", + "line 759 IF false (9100-GETCARD-BYACCTCARD)", + "line 764 IF false (9100-GETCARD-BYACCTCARD)", + "line 859 IF true (ABEND-ROUTINE)" ] }, "db2": false, "facade": { - "passed": 45, - "runs": 45 + "passed": 23, + "runs": 23 }, - "fault_runs": 5, + "fault_runs": 3, "java_failed": false, "oracle_image": "sha256:d7e387df360c519ce8945a1f6d748c8dafab06f50551b23ddf85d6373a4dcd6e", "oracle_matches_pin": true, - "records_compared": 124, - "records_equal": 124, - "runs": 45, - "scenarios": 45, - "scenarios_equal": 45, + "records_compared": 60, + "records_equal": 60, + "runs": 23, + "scenarios": 23, + "scenarios_equal": 23, "stale_inputs": [ "harness", "oracle", @@ -4479,8 +4570,8 @@ } ], "chosen": { - "case": "carddemo-cardlist", - "case_scenarios": 45, + "case": "carddemo-cardview", + "case_scenarios": 23, "db2": false, "det": { "source": "CI det-sweep ratchet on main", @@ -4489,33 +4580,36 @@ "record": { "coverage": { "branches": { - "covered": 146, - "total": 149 + "covered": 69, + "total": 75 }, "paragraphs": { - "covered": 36, - "live": 36 + "covered": 30, + "live": 30 }, "uncovered_branches": [ - "line 757 IF true (1250-SETUP-ARRAY-ATTRIBS)", - "line 897 EVALUATE OTHER (1400-SETUP-MESSAGE)", - "line 1218 IF false (9000-READ-FORWARD)" + "line 553 IF true (1300-SETUP-SCREEN-ATTRS)", + "line 656 IF false (2210-EDIT-ACCOUNT)", + "line 668 IF false (2210-EDIT-ACCOUNT)", + "line 759 IF false (9100-GETCARD-BYACCTCARD)", + "line 764 IF false (9100-GETCARD-BYACCTCARD)", + "line 859 IF true (ABEND-ROUTINE)" ] }, "db2": false, "facade": { - "passed": 45, - "runs": 45 + "passed": 23, + "runs": 23 }, - "fault_runs": 5, + "fault_runs": 3, "java_failed": false, "oracle_image": "sha256:d7e387df360c519ce8945a1f6d748c8dafab06f50551b23ddf85d6373a4dcd6e", "oracle_matches_pin": true, - "records_compared": 124, - "records_equal": 124, - "runs": 45, - "scenarios": 45, - "scenarios_equal": 45, + "records_compared": 60, + "records_equal": 60, + "runs": 23, + "scenarios": 23, + "scenarios_equal": 23, "stale_inputs": [ "harness", "oracle", @@ -4536,27 +4630,47 @@ ], "oracle_backing": [ { - "backed": false, - "command": "ENDBR", - "crucible_cases": [], + "backed": true, + "command": "ABEND", + "crucible_cases": [ + { + "case": "gt-start-retrieve", + "java_agrees": true, + "stub_agrees": true + }, + { + "case": "hc-abend-link", + "java_agrees": true, + "stub_agrees": true + } + ], "facts_stated": [], "registers": [], "spec_entry": "full" }, { - "backed": false, - "command": "READNEXT", - "crucible_cases": [], + "backed": true, + "command": "HANDLE ABEND", + "crucible_cases": [ + { + "case": "hc-abend-link", + "java_agrees": true, + "stub_agrees": true + } + ], "facts_stated": [], "registers": [], "spec_entry": "full" }, { "backed": false, - "command": "READPREV", + "command": "READ", "crucible_cases": [], "facts_stated": [], - "registers": [], + "registers": [ + "X14", + "X22" + ], "spec_entry": "full" }, { @@ -4802,14 +4916,6 @@ ], "spec_entry": "full" }, - { - "backed": false, - "command": "STARTBR", - "crucible_cases": [], - "facts_stated": [], - "registers": [], - "spec_entry": "full" - }, { "backed": true, "command": "XCTL", @@ -4840,17 +4946,17 @@ "spec_entry": "full" } ], - "program": "app/cbl/COCRDLIC.cbl", + "program": "app/cbl/COCRDSLC.cbl", "residual": { - "assumed_or_differs_named": [], + "assumed_or_differs_named": [ + "X14", + "X22" + ], "branch_outcomes_unrun": null, - "commands": 9, - "commands_backed": 5, + "commands": 8, + "commands_backed": 7, "commands_not_backed": [ - "ENDBR", - "READNEXT", - "READPREV", - "STARTBR" + "READ" ], "facts_unstated": 0, "holes": 0, @@ -4863,8 +4969,8 @@ "holes": [], "refused": null, "source_defects": [], - "statements": 500, - "translated": 500, + "statements": 263, + "translated": 263, "whole": true } }, @@ -4872,26 +4978,7 @@ "assumptions": { "facts_stated": [], "facts_unstated": [], - "named_by_commands": [ - { - "area": "CICS", - "entry": "READ ... INTO LENGTH: in-out, truncation and LENGERR; a VSAM file's LENGTH need not equal its record length; LENGERR on READ UPDATE refused", - "id": "X14", - "status": "ASSUMED (REFUSED where IBM is silent)" - }, - { - "area": "CICS", - "entry": "SEND TEXT on the det port and the stub: TERMINAL accepted as the default output disposition (the principal facility; the event is that of SEND TEXT without it); ACCUM, PAGING, SET, REQID, HEADER, TRAILER, JUSTIFY / JUSFIRST / JUSLAST, the printer, partition and LDC options, MSR, FMHPARM, DEFAULT / ALTERNATE refused", - "id": "X20", - "status": "MATCHED (REFUSED where the region cannot decide)" - }, - { - "area": "CICS", - "entry": "READ GTEQ / GENERIC on a KSDS: the first record whose key (or its first KEYLENGTH bytes) equals RIDFLD's or, with GTEQ, is greater, in the browse's key order (D1); NOTFND RESP2 80; READ UPDATE holds the record found; RIDFLD not updated; a GENERIC KEYLENGTH not shorter than the key or not above zero, a non-constant KEYLENGTH and a RIDFLD shorter than the key searched refused", - "id": "X22", - "status": "ASSUMED (REFUSED where IBM is silent or the layout decides)" - } - ], + "named_by_commands": [], "reach": "not measured", "source_read": true }, @@ -4904,58 +4991,31 @@ "infeasible_refuted": [], "infeasible_stated": [ { - "family": "G", - "key": "1300-SETUP-SCREEN-ATTRS:553:true", - "kind": "IF", - "line": 553, - "outcome": "true", - "reason": "1300-SETUP-SCREEN-ATTRS is only PERFORMed by 1000-SEND-MAP (line 417), right after 1200-SETUP-SCREEN-VARS (line 415), which ends with `IF WS-NO-INFO-MESSAGE SET WS-PROMPT-FOR-INPUT TO TRUE` (lines 490-492): WS-INFO-MSG leaves 1200 non-blank, and nothing at lines 494-552 writes it, so `IF WS-NO-INFO-MESSAGE` at line 553 is never true.", - "unit": "1300-SETUP-SCREEN-ATTRS" - }, - { - "family": "G", - "key": "2210-EDIT-ACCOUNT:656:false", - "kind": "IF", - "line": 656, - "outcome": "false", - "reason": "`IF WS-RETURN-MSG-OFF`: WS-RETURN-MSG is set to SPACES at line 264 and 2210-EDIT-ACCOUNT is the first edit (only PERFORMed at line 630, in 2200-EDIT-MAP-INPUTS after 2100-RECEIVE-MAP, neither of which writes it before), so the message is always still off here.", - "unit": "2210-EDIT-ACCOUNT" - }, - { - "family": "G", - "key": "2210-EDIT-ACCOUNT:668:false", - "kind": "IF", - "line": 668, - "outcome": "false", - "reason": "`IF WS-RETURN-MSG-OFF` at line 668 is reached only when the blank test at line 651 failed (it GOes TO the exit at line 660), so no message was set in this paragraph either; as for line 656, WS-RETURN-MSG is still the SPACES set at line 264.", - "unit": "2210-EDIT-ACCOUNT" + "family": "C", + "key": "PROCESS-ENTER-KEY:146:WHEN@169", + "kind": "EVALUATE", + "line": 146, + "outcome": "WHEN@169", + "reason": "`WHEN CDEMO-MENU-OPT-PGMNAME(WS-OPTION)(1:5) = 'DUMMY'` runs only under `IF NOT ERR-FLG-ON` (145), i.e. after the test at 127-129 let WS-OPTION through as numeric, not zero and not > CDEMO-MENU-OPT-COUNT (11, COMEN02Y line 21 `05 CDEMO-MENU-OPT-COUNT PIC 9(02) VALUE 11`); the program names of options 1-11 are the copybook VALUEs COACTVWC, COACTUPC, COCRDLIC, COCRDSLC, COCRDUPC, COTRN00C, COTRN01C, COTRN02C, CORPT00C, COBIL00C, COPAUS0C (COMEN02Y lines 28-89) and COMEN01C never writes the table, so none starts with 'DUMMY'.", + "unit": "PROCESS-ENTER-KEY" }, { - "family": "G", - "key": "9100-GETCARD-BYACCTCARD:759:false", - "kind": "IF", - "line": 759, - "outcome": "false", - "reason": "9100 runs only through 9000-READ-DATA, PERFORMed at line 344 (entry from the card list: nothing sets WS-RETURN-MSG after line 264) and at line 365 (the ELSE of IF INPUT-ERROR at line 360). Every message 2200-EDIT-MAP-INPUTS sets (lines 657, 671, 697, 711, 639) comes with SET INPUT-ERROR, so at line 365 the message is still off: `IF WS-RETURN-MSG-OFF` (NOTFND) is always true.", - "unit": "9100-GETCARD-BYACCTCARD" - }, - { - "family": "G", - "key": "9100-GETCARD-BYACCTCARD:764:false", - "kind": "IF", - "line": 764, - "outcome": "false", - "reason": "Same as line 759: in WHEN OTHER of the READ at line 742, WS-RETURN-MSG is still the SPACES set at line 264 on both paths into 9100 (lines 344 and 365), so `IF WS-RETURN-MSG-OFF` is always true.", - "unit": "9100-GETCARD-BYACCTCARD" + "family": "C", + "key": "BUILD-MENU-OPTIONS:274:OTHER", + "kind": "EVALUATE", + "line": 274, + "outcome": "OTHER", + "reason": "`EVALUATE WS-IDX` `WHEN OTHER` inside `PERFORM VARYING WS-IDX FROM 1 BY 1 UNTIL WS-IDX > CDEMO-MENU-OPT-COUNT` (264-265): the count is the constant 11 (COMEN02Y line 21 `05 CDEMO-MENU-OPT-COUNT PIC 9(02) VALUE 11`), never written by COMEN01C, and the loop body does not change WS-IDX, so WS-IDX is always 1-11, each matched by WHEN 1-11.", + "unit": "BUILD-MENU-OPTIONS" }, { "family": "C", - "key": "ABEND-ROUTINE:859:true", - "kind": "IF", - "line": 859, - "outcome": "true", - "reason": "`IF ABEND-MSG EQUAL LOW-VALUES`: ABEND-MSG is `PIC X(72) VALUE SPACES` (CSMSG02Y, lines 28-29), outside the items INITIALIZEd at lines 254-256, and the program writes it only at line 860 (a non-blank literal). It is never LOW-VALUES.", - "unit": "ABEND-ROUTINE" + "key": "BUILD-MENU-OPTIONS:274:WHEN@297", + "kind": "EVALUATE", + "line": 274, + "outcome": "WHEN@297", + "reason": "`EVALUATE WS-IDX` `WHEN 12` inside `PERFORM VARYING WS-IDX FROM 1 BY 1 UNTIL WS-IDX > CDEMO-MENU-OPT-COUNT` (264-265): the count is the constant 11 (COMEN02Y line 21 `05 CDEMO-MENU-OPT-COUNT PIC 9(02) VALUE 11`), never written by COMEN01C, and the loop body does not change WS-IDX, so WS-IDX takes only 1-11.", + "unit": "BUILD-MENU-OPTIONS" } ], "paragraph_pct": null, @@ -4967,8 +5027,8 @@ "equivalence": { "cases": [ { - "case": "carddemo-cardview", - "case_scenarios": 23, + "case": "carddemo-menu", + "case_scenarios": 16, "db2": false, "det": { "source": "CI det-sweep ratchet on main", @@ -4977,36 +5037,35 @@ "record": { "coverage": { "branches": { - "covered": 69, - "total": 75 + "covered": 28, + "total": 33 }, "paragraphs": { - "covered": 30, - "live": 30 + "covered": 7, + "live": 7 }, "uncovered_branches": [ - "line 553 IF true (1300-SETUP-SCREEN-ATTRS)", - "line 656 IF false (2210-EDIT-ACCOUNT)", - "line 668 IF false (2210-EDIT-ACCOUNT)", - "line 759 IF false (9100-GETCARD-BYACCTCARD)", - "line 764 IF false (9100-GETCARD-BYACCTCARD)", - "line 859 IF true (ABEND-ROUTINE)" + "line 136 IF true (PROCESS-ENTER-KEY)", + "line 146 EVALUATE WHEN@147 (PROCESS-ENTER-KEY)", + "line 146 EVALUATE WHEN@169 (PROCESS-ENTER-KEY)", + "line 274 EVALUATE WHEN@297 (BUILD-MENU-OPTIONS)", + "line 274 EVALUATE OTHER (BUILD-MENU-OPTIONS)" ] }, "db2": false, "facade": { - "passed": 23, - "runs": 23 + "passed": 16, + "runs": 16 }, - "fault_runs": 3, + "fault_runs": 2, "java_failed": false, - "oracle_image": "sha256:d7e387df360c519ce8945a1f6d748c8dafab06f50551b23ddf85d6373a4dcd6e", + "oracle_image": "sha256:ec3ecd98686860217630b1fce29265628e980a353ddd3d2d96d16332e8800c64", "oracle_matches_pin": true, - "records_compared": 60, - "records_equal": 60, - "runs": 23, - "scenarios": 23, - "scenarios_equal": 23, + "records_compared": 38, + "records_equal": 38, + "runs": 16, + "scenarios": 16, + "scenarios_equal": 16, "stale_inputs": [ "harness", "oracle", @@ -5019,8 +5078,8 @@ } ], "chosen": { - "case": "carddemo-cardview", - "case_scenarios": 23, + "case": "carddemo-menu", + "case_scenarios": 16, "db2": false, "det": { "source": "CI det-sweep ratchet on main", @@ -5029,36 +5088,35 @@ "record": { "coverage": { "branches": { - "covered": 69, - "total": 75 + "covered": 28, + "total": 33 }, "paragraphs": { - "covered": 30, - "live": 30 + "covered": 7, + "live": 7 }, "uncovered_branches": [ - "line 553 IF true (1300-SETUP-SCREEN-ATTRS)", - "line 656 IF false (2210-EDIT-ACCOUNT)", - "line 668 IF false (2210-EDIT-ACCOUNT)", - "line 759 IF false (9100-GETCARD-BYACCTCARD)", - "line 764 IF false (9100-GETCARD-BYACCTCARD)", - "line 859 IF true (ABEND-ROUTINE)" + "line 136 IF true (PROCESS-ENTER-KEY)", + "line 146 EVALUATE WHEN@147 (PROCESS-ENTER-KEY)", + "line 146 EVALUATE WHEN@169 (PROCESS-ENTER-KEY)", + "line 274 EVALUATE WHEN@297 (BUILD-MENU-OPTIONS)", + "line 274 EVALUATE OTHER (BUILD-MENU-OPTIONS)" ] }, "db2": false, "facade": { - "passed": 23, - "runs": 23 + "passed": 16, + "runs": 16 }, - "fault_runs": 3, + "fault_runs": 2, "java_failed": false, - "oracle_image": "sha256:d7e387df360c519ce8945a1f6d748c8dafab06f50551b23ddf85d6373a4dcd6e", + "oracle_image": "sha256:ec3ecd98686860217630b1fce29265628e980a353ddd3d2d96d16332e8800c64", "oracle_matches_pin": true, - "records_compared": 60, - "records_equal": 60, - "runs": 23, - "scenarios": 23, - "scenarios_equal": 23, + "records_compared": 38, + "records_equal": 38, + "runs": 16, + "scenarios": 16, + "scenarios_equal": 16, "stale_inputs": [ "harness", "oracle", @@ -5078,48 +5136,12 @@ "paragraph coverage >= 100.0 (coverage not measured: no fresh det-sweep ledger entry and no local sweep)" ], "oracle_backing": [ - { - "backed": true, - "command": "ABEND", - "crucible_cases": [ - { - "case": "gt-start-retrieve", - "java_agrees": true, - "stub_agrees": true - }, - { - "case": "hc-abend-link", - "java_agrees": true, - "stub_agrees": true - } - ], - "facts_stated": [], - "registers": [], - "spec_entry": "full" - }, - { - "backed": true, - "command": "HANDLE ABEND", - "crucible_cases": [ - { - "case": "hc-abend-link", - "java_agrees": true, - "stub_agrees": true - } - ], - "facts_stated": [], - "registers": [], - "spec_entry": "full" - }, { "backed": false, - "command": "READ", + "command": "INQUIRE PROGRAM", "crucible_cases": [], "facts_stated": [], - "registers": [ - "X14", - "X22" - ], + "registers": [], "spec_entry": "full" }, { @@ -5279,92 +5301,6 @@ "registers": [], "spec_entry": "full" }, - { - "backed": true, - "command": "SEND TEXT", - "crucible_cases": [ - { - "case": "ca-link-lengths", - "java_agrees": true, - "stub_agrees": true - }, - { - "case": "ca-xctl-versions", - "java_agrees": true, - "stub_agrees": true - }, - { - "case": "gt-assign-startcode", - "java_agrees": false, - "stub_agrees": true - }, - { - "case": "gt-start-options", - "java_agrees": false, - "stub_agrees": true - }, - { - "case": "gt-start-retrieve", - "java_agrees": true, - "stub_agrees": true - }, - { - "case": "gt-terminal-coalesce", - "java_agrees": true, - "stub_agrees": true - }, - { - "case": "hc-abend-link", - "java_agrees": true, - "stub_agrees": true - }, - { - "case": "hc-eoc-error", - "java_agrees": false, - "stub_agrees": true - }, - { - "case": "hc-handle-aid", - "java_agrees": false, - "stub_agrees": true - }, - { - "case": "hc-ignore-error", - "java_agrees": false, - "stub_agrees": true - }, - { - "case": "hc-perform-range", - "java_agrees": true, - "stub_agrees": true - }, - { - "case": "hc-terminal-eoc", - "java_agrees": false, - "stub_agrees": true - }, - { - "case": "hc-terminal-receive", - "java_agrees": false, - "stub_agrees": true - }, - { - "case": "pc-aid-menu", - "java_agrees": true, - "stub_agrees": true - }, - { - "case": "pc-wizard", - "java_agrees": true, - "stub_agrees": true - } - ], - "facts_stated": [], - "registers": [ - "X20" - ], - "spec_entry": "full" - }, { "backed": true, "command": "XCTL", @@ -5395,17 +5331,14 @@ "spec_entry": "full" } ], - "program": "app/cbl/COCRDSLC.cbl", + "program": "app/cbl/COMEN01C.cbl", "residual": { - "assumed_or_differs_named": [ - "X14", - "X22" - ], + "assumed_or_differs_named": [], "branch_outcomes_unrun": null, - "commands": 8, - "commands_backed": 7, + "commands": 5, + "commands_backed": 4, "commands_not_backed": [ - "READ" + "INQUIRE PROGRAM" ], "facts_unstated": 0, "holes": 0, @@ -5418,8 +5351,8 @@ "holes": [], "refused": null, "source_defects": [], - "statements": 263, - "translated": 263, + "statements": 91, + "translated": 91, "whole": true } }, @@ -5440,31 +5373,67 @@ "infeasible_refuted": [], "infeasible_stated": [ { - "family": "C", - "key": "PROCESS-ENTER-KEY:146:WHEN@169", - "kind": "EVALUATE", - "line": 146, - "outcome": "WHEN@169", - "reason": "`WHEN CDEMO-MENU-OPT-PGMNAME(WS-OPTION)(1:5) = 'DUMMY'` runs only under `IF NOT ERR-FLG-ON` (145), i.e. after the test at 127-129 let WS-OPTION through as numeric, not zero and not > CDEMO-MENU-OPT-COUNT (11, COMEN02Y line 21 `05 CDEMO-MENU-OPT-COUNT PIC 9(02) VALUE 11`); the program names of options 1-11 are the copybook VALUEs COACTVWC, COACTUPC, COCRDLIC, COCRDSLC, COCRDUPC, COTRN00C, COTRN01C, COTRN02C, CORPT00C, COBIL00C, COPAUS0C (COMEN02Y lines 28-89) and COMEN01C never writes the table, so none starts with 'DUMMY'.", - "unit": "PROCESS-ENTER-KEY" - }, - { - "family": "C", - "key": "BUILD-MENU-OPTIONS:274:OTHER", - "kind": "EVALUATE", - "line": 274, - "outcome": "OTHER", - "reason": "`EVALUATE WS-IDX` `WHEN OTHER` inside `PERFORM VARYING WS-IDX FROM 1 BY 1 UNTIL WS-IDX > CDEMO-MENU-OPT-COUNT` (264-265): the count is the constant 11 (COMEN02Y line 21 `05 CDEMO-MENU-OPT-COUNT PIC 9(02) VALUE 11`), never written by COMEN01C, and the loop body does not change WS-IDX, so WS-IDX is always 1-11, each matched by WHEN 1-11.", - "unit": "BUILD-MENU-OPTIONS" + "family": "G", + "key": "PROCESS-ENTER-KEY:347:true", + "kind": "IF", + "line": 347, + "outcome": "true", + "reason": "`IF SDTYYYYI IS NOT NUMERIC`: lines 313-315 have just moved WS-NUM-9999 (PIC 9999, line 75: unsigned display digits) into SDTYYYYI (PIC X(4), CORPT00.CPY), so it always holds four digits", + "unit": "PROCESS-ENTER-KEY" + }, + { + "family": "G", + "key": "PROCESS-ENTER-KEY:373:true", + "kind": "IF", + "line": 373, + "outcome": "true", + "reason": "`IF EDTYYYYI IS NOT NUMERIC`: lines 325-327 have just moved WS-NUM-9999 (PIC 9999, line 75: unsigned display digits) into EDTYYYYI (PIC X(4), CORPT00.CPY), so it always holds four digits", + "unit": "PROCESS-ENTER-KEY" + }, + { + "family": "G", + "key": "PROCESS-ENTER-KEY:434:false", + "kind": "IF", + "line": 434, + "outcome": "false", + "reason": "`IF NOT ERR-FLG-ON` can only be false after an error was flagged, but every MOVE 'Y' TO WS-ERR-FLG (lines 191, 263-298, 333-376, 402, 422, 440, 471, 482, 491, 530) is followed by PERFORM SEND-TRNRPT-SCREEN, which never returns: it ends in GO TO RETURN-TO-CICS (line 580), whose EXEC CICS RETURN (line 587, no RESP / NOHANDLE) ends the task; WS-ERR-FLG starts 'N' (SET ERR-FLG-OFF, line 165)", + "unit": "PROCESS-ENTER-KEY" + }, + { + "family": "G", + "key": "PROCESS-ENTER-KEY:445:false", + "kind": "IF", + "line": 445, + "outcome": "false", + "reason": "`IF NOT ERR-FLG-ON` after the report EVALUATE: every MOVE 'Y' TO WS-ERR-FLG (lines 191, 263-298, 333-376, 402, 422, 440, 471, 482, 491, 530) is followed by PERFORM SEND-TRNRPT-SCREEN, which never returns: it ends in GO TO RETURN-TO-CICS (line 580), whose EXEC CICS RETURN (line 587, no RESP / NOHANDLE) ends the task; WS-ERR-FLG starts 'N' (SET ERR-FLG-OFF, line 165)", + "unit": "PROCESS-ENTER-KEY" + }, + { + "family": "G", + "key": "SUBMIT-JOB-TO-INTRDR:476:false", + "kind": "IF", + "line": 476, + "outcome": "false", + "reason": "`IF NOT ERR-FLG-ON`: the only flag set before it in this task is line 471, followed by PERFORM SEND-TRNRPT-SCREEN, which never returns; every MOVE 'Y' TO WS-ERR-FLG (lines 191, 263-298, 333-376, 402, 422, 440, 471, 482, 491, 530) is followed by PERFORM SEND-TRNRPT-SCREEN, which never returns: it ends in GO TO RETURN-TO-CICS (line 580), whose EXEC CICS RETURN (line 587, no RESP / NOHANDLE) ends the task; WS-ERR-FLG starts 'N' (SET ERR-FLG-OFF, line 165)", + "unit": "SUBMIT-JOB-TO-INTRDR" + }, + { + "family": "G", + "key": "RETURN-TO-PREV-SCREEN:542:true", + "kind": "IF", + "line": 542, + "outcome": "true", + "reason": "`IF CDEMO-TO-PROGRAM = LOW-VALUES OR SPACES` in RETURN-TO-PREV-SCREEN: the paragraph is only PERFORMed, and every PERFORM of it comes right after a MOVE of a non-blank program name into CDEMO-TO-PROGRAM (line 173 moves 'COSGN00C' and line 188 'COMEN01C'; both fields PIC X(08), COCOM01Y). CORPT00C never moves SPACES or LOW-VALUES into it in between.", + "unit": "RETURN-TO-PREV-SCREEN" }, { "family": "C", - "key": "BUILD-MENU-OPTIONS:274:WHEN@297", - "kind": "EVALUATE", - "line": 274, - "outcome": "WHEN@297", - "reason": "`EVALUATE WS-IDX` `WHEN 12` inside `PERFORM VARYING WS-IDX FROM 1 BY 1 UNTIL WS-IDX > CDEMO-MENU-OPT-COUNT` (264-265): the count is the constant 11 (COMEN02Y line 21 `05 CDEMO-MENU-OPT-COUNT PIC 9(02) VALUE 11`), never written by COMEN01C, and the loop body does not change WS-IDX, so WS-IDX takes only 1-11.", - "unit": "BUILD-MENU-OPTIONS" + "key": "SEND-TRNRPT-SCREEN:562:false", + "kind": "IF", + "line": 562, + "outcome": "false", + "reason": "`IF SEND-ERASE-YES`: WS-SEND-ERASE-FLG has VALUE 'Y' (line 47) and the only statement that writes it is SET SEND-ERASE-YES TO TRUE (line 167); SEND-ERASE-NO is never set", + "unit": "SEND-TRNRPT-SCREEN" } ], "paragraph_pct": null, @@ -5476,8 +5445,8 @@ "equivalence": { "cases": [ { - "case": "carddemo-menu", - "case_scenarios": 16, + "case": "carddemo-report", + "case_scenarios": 25, "db2": false, "det": { "source": "CI det-sweep ratchet on main", @@ -5486,35 +5455,38 @@ "record": { "coverage": { "branches": { - "covered": 28, - "total": 33 + "covered": 51, + "total": 59 }, "paragraphs": { - "covered": 7, - "live": 7 + "covered": 10, + "live": 10 }, "uncovered_branches": [ - "line 136 IF true (PROCESS-ENTER-KEY)", - "line 146 EVALUATE WHEN@147 (PROCESS-ENTER-KEY)", - "line 146 EVALUATE WHEN@169 (PROCESS-ENTER-KEY)", - "line 274 EVALUATE WHEN@297 (BUILD-MENU-OPTIONS)", - "line 274 EVALUATE OTHER (BUILD-MENU-OPTIONS)" + "line 225 IF true (PROCESS-ENTER-KEY)", + "line 347 IF true (PROCESS-ENTER-KEY)", + "line 373 IF true (PROCESS-ENTER-KEY)", + "line 434 IF false (PROCESS-ENTER-KEY)", + "line 445 IF false (PROCESS-ENTER-KEY)", + "line 476 IF false (SUBMIT-JOB-TO-INTRDR)", + "line 542 IF true (RETURN-TO-PREV-SCREEN)", + "line 562 IF false (SEND-TRNRPT-SCREEN)" ] }, "db2": false, "facade": { - "passed": 16, - "runs": 16 + "passed": 25, + "runs": 25 }, - "fault_runs": 2, + "fault_runs": 1, "java_failed": false, - "oracle_image": "sha256:ec3ecd98686860217630b1fce29265628e980a353ddd3d2d96d16332e8800c64", + "oracle_image": "sha256:d7e387df360c519ce8945a1f6d748c8dafab06f50551b23ddf85d6373a4dcd6e", "oracle_matches_pin": true, - "records_compared": 38, - "records_equal": 38, - "runs": 16, - "scenarios": 16, - "scenarios_equal": 16, + "records_compared": 142, + "records_equal": 142, + "runs": 25, + "scenarios": 25, + "scenarios_equal": 25, "stale_inputs": [ "harness", "oracle", @@ -5527,8 +5499,8 @@ } ], "chosen": { - "case": "carddemo-menu", - "case_scenarios": 16, + "case": "carddemo-report", + "case_scenarios": 25, "db2": false, "det": { "source": "CI det-sweep ratchet on main", @@ -5537,35 +5509,38 @@ "record": { "coverage": { "branches": { - "covered": 28, - "total": 33 + "covered": 51, + "total": 59 }, "paragraphs": { - "covered": 7, - "live": 7 + "covered": 10, + "live": 10 }, "uncovered_branches": [ - "line 136 IF true (PROCESS-ENTER-KEY)", - "line 146 EVALUATE WHEN@147 (PROCESS-ENTER-KEY)", - "line 146 EVALUATE WHEN@169 (PROCESS-ENTER-KEY)", - "line 274 EVALUATE WHEN@297 (BUILD-MENU-OPTIONS)", - "line 274 EVALUATE OTHER (BUILD-MENU-OPTIONS)" + "line 225 IF true (PROCESS-ENTER-KEY)", + "line 347 IF true (PROCESS-ENTER-KEY)", + "line 373 IF true (PROCESS-ENTER-KEY)", + "line 434 IF false (PROCESS-ENTER-KEY)", + "line 445 IF false (PROCESS-ENTER-KEY)", + "line 476 IF false (SUBMIT-JOB-TO-INTRDR)", + "line 542 IF true (RETURN-TO-PREV-SCREEN)", + "line 562 IF false (SEND-TRNRPT-SCREEN)" ] }, "db2": false, "facade": { - "passed": 16, - "runs": 16 + "passed": 25, + "runs": 25 }, - "fault_runs": 2, + "fault_runs": 1, "java_failed": false, - "oracle_image": "sha256:ec3ecd98686860217630b1fce29265628e980a353ddd3d2d96d16332e8800c64", + "oracle_image": "sha256:d7e387df360c519ce8945a1f6d748c8dafab06f50551b23ddf85d6373a4dcd6e", "oracle_matches_pin": true, - "records_compared": 38, - "records_equal": 38, - "runs": 16, - "scenarios": 16, - "scenarios_equal": 16, + "records_compared": 142, + "records_equal": 142, + "runs": 25, + "scenarios": 25, + "scenarios_equal": 25, "stale_inputs": [ "harness", "oracle", @@ -5585,14 +5560,6 @@ "paragraph coverage >= 100.0 (coverage not measured: no fresh det-sweep ledger entry and no local sweep)" ], "oracle_backing": [ - { - "backed": false, - "command": "INQUIRE PROGRAM", - "crucible_cases": [], - "facts_stated": [], - "registers": [], - "spec_entry": "full" - }, { "backed": true, "command": "RECEIVE MAP", @@ -5750,6 +5717,14 @@ "registers": [], "spec_entry": "full" }, + { + "backed": false, + "command": "WRITEQ TD", + "crucible_cases": [], + "facts_stated": [], + "registers": [], + "spec_entry": "full" + }, { "backed": true, "command": "XCTL", @@ -5780,14 +5755,14 @@ "spec_entry": "full" } ], - "program": "app/cbl/COMEN01C.cbl", + "program": "app/cbl/CORPT00C.cbl", "residual": { "assumed_or_differs_named": [], "branch_outcomes_unrun": null, "commands": 5, "commands_backed": 4, "commands_not_backed": [ - "INQUIRE PROGRAM" + "WRITEQ TD" ], "facts_unstated": 0, "holes": 0, @@ -5800,16 +5775,46 @@ "holes": [], "refused": null, "source_defects": [], - "statements": 91, - "translated": 91, + "statements": 220, + "translated": 220, "whole": true } }, { "assumptions": { - "facts_stated": [], + "facts_stated": [ + "facility", + "screen", + "startcode", + "userid" + ], "facts_unstated": [], - "named_by_commands": [], + "named_by_commands": [ + { + "area": "CICS", + "entry": "READ ... INTO LENGTH: in-out, truncation and LENGERR; a VSAM file's LENGTH need not equal its record length; LENGERR on READ UPDATE refused", + "id": "X14", + "status": "ASSUMED (REFUSED where IBM is silent)" + }, + { + "area": "CICS", + "entry": "ASSIGN on the det port: STARTCODE (TD / S / SD), USERID (the default user), FACILITY / SCRNHT / SCRNWD (INVREQ RESP2 5 without a terminal) from facts the harness states; no data area written when ASSIGN raises INVREQ; OPID, NETNAME, TERMCODE, FCI, the other screen sizes, work-area lengths and the rest refused", + "id": "X19", + "status": "ASSUMED (REFUSED where the harness cannot decide)" + }, + { + "area": "CICS", + "entry": "SEND TEXT on the det port and the stub: TERMINAL accepted as the default output disposition (the principal facility; the event is that of SEND TEXT without it); ACCUM, PAGING, SET, REQID, HEADER, TRAILER, JUSTIFY / JUSFIRST / JUSLAST, the printer, partition and LDC options, MSR, FMHPARM, DEFAULT / ALTERNATE refused", + "id": "X20", + "status": "MATCHED (REFUSED where the region cannot decide)" + }, + { + "area": "CICS", + "entry": "READ GTEQ / GENERIC on a KSDS: the first record whose key (or its first KEYLENGTH bytes) equals RIDFLD's or, with GTEQ, is greater, in the browse's key order (D1); NOTFND RESP2 80; READ UPDATE holds the record found; RIDFLD not updated; a GENERIC KEYLENGTH not shorter than the key or not above zero, a non-constant KEYLENGTH and a RIDFLD shorter than the key searched refused", + "id": "X22", + "status": "ASSUMED (REFUSED where IBM is silent or the layout decides)" + } + ], "reach": "not measured", "source_read": true }, @@ -5820,82 +5825,18 @@ "branches_net": null, "infeasible_netted": [], "infeasible_refuted": [], - "infeasible_stated": [ - { - "family": "G", - "key": "PROCESS-ENTER-KEY:347:true", - "kind": "IF", - "line": 347, - "outcome": "true", - "reason": "`IF SDTYYYYI IS NOT NUMERIC`: lines 313-315 have just moved WS-NUM-9999 (PIC 9999, line 75: unsigned display digits) into SDTYYYYI (PIC X(4), CORPT00.CPY), so it always holds four digits", - "unit": "PROCESS-ENTER-KEY" - }, - { - "family": "G", - "key": "PROCESS-ENTER-KEY:373:true", - "kind": "IF", - "line": 373, - "outcome": "true", - "reason": "`IF EDTYYYYI IS NOT NUMERIC`: lines 325-327 have just moved WS-NUM-9999 (PIC 9999, line 75: unsigned display digits) into EDTYYYYI (PIC X(4), CORPT00.CPY), so it always holds four digits", - "unit": "PROCESS-ENTER-KEY" - }, - { - "family": "G", - "key": "PROCESS-ENTER-KEY:434:false", - "kind": "IF", - "line": 434, - "outcome": "false", - "reason": "`IF NOT ERR-FLG-ON` can only be false after an error was flagged, but every MOVE 'Y' TO WS-ERR-FLG (lines 191, 263-298, 333-376, 402, 422, 440, 471, 482, 491, 530) is followed by PERFORM SEND-TRNRPT-SCREEN, which never returns: it ends in GO TO RETURN-TO-CICS (line 580), whose EXEC CICS RETURN (line 587, no RESP / NOHANDLE) ends the task; WS-ERR-FLG starts 'N' (SET ERR-FLG-OFF, line 165)", - "unit": "PROCESS-ENTER-KEY" - }, + "infeasible_stated": [], + "paragraph_pct": null, + "paragraphs": null, + "source": null, + "uncovered_branches": [], + "uncovered_paragraphs": "not recorded" + }, + "equivalence": { + "cases": [ { - "family": "G", - "key": "PROCESS-ENTER-KEY:445:false", - "kind": "IF", - "line": 445, - "outcome": "false", - "reason": "`IF NOT ERR-FLG-ON` after the report EVALUATE: every MOVE 'Y' TO WS-ERR-FLG (lines 191, 263-298, 333-376, 402, 422, 440, 471, 482, 491, 530) is followed by PERFORM SEND-TRNRPT-SCREEN, which never returns: it ends in GO TO RETURN-TO-CICS (line 580), whose EXEC CICS RETURN (line 587, no RESP / NOHANDLE) ends the task; WS-ERR-FLG starts 'N' (SET ERR-FLG-OFF, line 165)", - "unit": "PROCESS-ENTER-KEY" - }, - { - "family": "G", - "key": "SUBMIT-JOB-TO-INTRDR:476:false", - "kind": "IF", - "line": 476, - "outcome": "false", - "reason": "`IF NOT ERR-FLG-ON`: the only flag set before it in this task is line 471, followed by PERFORM SEND-TRNRPT-SCREEN, which never returns; every MOVE 'Y' TO WS-ERR-FLG (lines 191, 263-298, 333-376, 402, 422, 440, 471, 482, 491, 530) is followed by PERFORM SEND-TRNRPT-SCREEN, which never returns: it ends in GO TO RETURN-TO-CICS (line 580), whose EXEC CICS RETURN (line 587, no RESP / NOHANDLE) ends the task; WS-ERR-FLG starts 'N' (SET ERR-FLG-OFF, line 165)", - "unit": "SUBMIT-JOB-TO-INTRDR" - }, - { - "family": "G", - "key": "RETURN-TO-PREV-SCREEN:542:true", - "kind": "IF", - "line": 542, - "outcome": "true", - "reason": "`IF CDEMO-TO-PROGRAM = LOW-VALUES OR SPACES` in RETURN-TO-PREV-SCREEN: the paragraph is only PERFORMed, and every PERFORM of it comes right after a MOVE of a non-blank program name into CDEMO-TO-PROGRAM (line 173 moves 'COSGN00C' and line 188 'COMEN01C'; both fields PIC X(08), COCOM01Y). CORPT00C never moves SPACES or LOW-VALUES into it in between.", - "unit": "RETURN-TO-PREV-SCREEN" - }, - { - "family": "C", - "key": "SEND-TRNRPT-SCREEN:562:false", - "kind": "IF", - "line": 562, - "outcome": "false", - "reason": "`IF SEND-ERASE-YES`: WS-SEND-ERASE-FLG has VALUE 'Y' (line 47) and the only statement that writes it is SET SEND-ERASE-YES TO TRUE (line 167); SEND-ERASE-NO is never set", - "unit": "SEND-TRNRPT-SCREEN" - } - ], - "paragraph_pct": null, - "paragraphs": null, - "source": null, - "uncovered_branches": [], - "uncovered_paragraphs": "not recorded" - }, - "equivalence": { - "cases": [ - { - "case": "carddemo-report", - "case_scenarios": 25, + "case": "carddemo-signon", + "case_scenarios": 12, "db2": false, "det": { "source": "CI det-sweep ratchet on main", @@ -5904,38 +5845,29 @@ "record": { "coverage": { "branches": { - "covered": 51, - "total": 59 + "covered": 17, + "total": 17 }, "paragraphs": { - "covered": 10, - "live": 10 + "covered": 6, + "live": 6 }, - "uncovered_branches": [ - "line 225 IF true (PROCESS-ENTER-KEY)", - "line 347 IF true (PROCESS-ENTER-KEY)", - "line 373 IF true (PROCESS-ENTER-KEY)", - "line 434 IF false (PROCESS-ENTER-KEY)", - "line 445 IF false (PROCESS-ENTER-KEY)", - "line 476 IF false (SUBMIT-JOB-TO-INTRDR)", - "line 542 IF true (RETURN-TO-PREV-SCREEN)", - "line 562 IF false (SEND-TRNRPT-SCREEN)" - ] + "uncovered_branches": [] }, "db2": false, "facade": { - "passed": 25, - "runs": 25 + "passed": 12, + "runs": 12 }, "fault_runs": 1, "java_failed": false, - "oracle_image": "sha256:d7e387df360c519ce8945a1f6d748c8dafab06f50551b23ddf85d6373a4dcd6e", + "oracle_image": "sha256:ec3ecd98686860217630b1fce29265628e980a353ddd3d2d96d16332e8800c64", "oracle_matches_pin": true, - "records_compared": 142, - "records_equal": 142, - "runs": 25, - "scenarios": 25, - "scenarios_equal": 25, + "records_compared": 30, + "records_equal": 30, + "runs": 12, + "scenarios": 12, + "scenarios_equal": 12, "stale_inputs": [ "harness", "oracle", @@ -5948,8 +5880,8 @@ } ], "chosen": { - "case": "carddemo-report", - "case_scenarios": 25, + "case": "carddemo-signon", + "case_scenarios": 12, "db2": false, "det": { "source": "CI det-sweep ratchet on main", @@ -5958,38 +5890,29 @@ "record": { "coverage": { "branches": { - "covered": 51, - "total": 59 + "covered": 17, + "total": 17 }, "paragraphs": { - "covered": 10, - "live": 10 + "covered": 6, + "live": 6 }, - "uncovered_branches": [ - "line 225 IF true (PROCESS-ENTER-KEY)", - "line 347 IF true (PROCESS-ENTER-KEY)", - "line 373 IF true (PROCESS-ENTER-KEY)", - "line 434 IF false (PROCESS-ENTER-KEY)", - "line 445 IF false (PROCESS-ENTER-KEY)", - "line 476 IF false (SUBMIT-JOB-TO-INTRDR)", - "line 542 IF true (RETURN-TO-PREV-SCREEN)", - "line 562 IF false (SEND-TRNRPT-SCREEN)" - ] + "uncovered_branches": [] }, "db2": false, "facade": { - "passed": 25, - "runs": 25 + "passed": 12, + "runs": 12 }, "fault_runs": 1, "java_failed": false, - "oracle_image": "sha256:d7e387df360c519ce8945a1f6d748c8dafab06f50551b23ddf85d6373a4dcd6e", + "oracle_image": "sha256:ec3ecd98686860217630b1fce29265628e980a353ddd3d2d96d16332e8800c64", "oracle_matches_pin": true, - "records_compared": 142, - "records_equal": 142, - "runs": 25, - "scenarios": 25, - "scenarios_equal": 25, + "records_compared": 30, + "records_equal": 30, + "runs": 12, + "scenarios": 12, + "scenarios_equal": 12, "stale_inputs": [ "harness", "oracle", @@ -6009,6 +5932,48 @@ "paragraph coverage >= 100.0 (coverage not measured: no fresh det-sweep ledger entry and no local sweep)" ], "oracle_backing": [ + { + "backed": true, + "command": "ASSIGN", + "crucible_cases": [ + { + "case": "ca-channel-containers", + "java_agrees": false, + "stub_agrees": true + }, + { + "case": "gt-assign-startcode", + "java_agrees": false, + "stub_agrees": true + }, + { + "case": "hc-abend-link", + "java_agrees": true, + "stub_agrees": true + } + ], + "facts_stated": [ + "startcode", + "userid", + "facility", + "screen" + ], + "registers": [ + "X19" + ], + "spec_entry": "full" + }, + { + "backed": false, + "command": "READ", + "crucible_cases": [], + "facts_stated": [], + "registers": [ + "X14", + "X22" + ], + "spec_entry": "full" + }, { "backed": true, "command": "RECEIVE MAP", @@ -6167,11 +6132,89 @@ "spec_entry": "full" }, { - "backed": false, - "command": "WRITEQ TD", - "crucible_cases": [], + "backed": true, + "command": "SEND TEXT", + "crucible_cases": [ + { + "case": "ca-link-lengths", + "java_agrees": true, + "stub_agrees": true + }, + { + "case": "ca-xctl-versions", + "java_agrees": true, + "stub_agrees": true + }, + { + "case": "gt-assign-startcode", + "java_agrees": false, + "stub_agrees": true + }, + { + "case": "gt-start-options", + "java_agrees": false, + "stub_agrees": true + }, + { + "case": "gt-start-retrieve", + "java_agrees": true, + "stub_agrees": true + }, + { + "case": "gt-terminal-coalesce", + "java_agrees": true, + "stub_agrees": true + }, + { + "case": "hc-abend-link", + "java_agrees": true, + "stub_agrees": true + }, + { + "case": "hc-eoc-error", + "java_agrees": false, + "stub_agrees": true + }, + { + "case": "hc-handle-aid", + "java_agrees": false, + "stub_agrees": true + }, + { + "case": "hc-ignore-error", + "java_agrees": false, + "stub_agrees": true + }, + { + "case": "hc-perform-range", + "java_agrees": true, + "stub_agrees": true + }, + { + "case": "hc-terminal-eoc", + "java_agrees": false, + "stub_agrees": true + }, + { + "case": "hc-terminal-receive", + "java_agrees": false, + "stub_agrees": true + }, + { + "case": "pc-aid-menu", + "java_agrees": true, + "stub_agrees": true + }, + { + "case": "pc-wizard", + "java_agrees": true, + "stub_agrees": true + } + ], "facts_stated": [], - "registers": [], + "registers": [ + "X20" + ], "spec_entry": "full" }, { @@ -6204,14 +6247,18 @@ "spec_entry": "full" } ], - "program": "app/cbl/CORPT00C.cbl", + "program": "app/cbl/COSGN00C.cbl", "residual": { - "assumed_or_differs_named": [], + "assumed_or_differs_named": [ + "X14", + "X19", + "X22" + ], "branch_outcomes_unrun": null, - "commands": 5, - "commands_backed": 4, - "commands_not_backed": [ - "WRITEQ TD" + "commands": 7, + "commands_backed": 6, + "commands_not_backed": [ + "READ" ], "facts_unstated": 0, "holes": 0, @@ -6224,46 +6271,16 @@ "holes": [], "refused": null, "source_defects": [], - "statements": 220, - "translated": 220, + "statements": 71, + "translated": 71, "whole": true } }, { "assumptions": { - "facts_stated": [ - "facility", - "screen", - "startcode", - "userid" - ], + "facts_stated": [], "facts_unstated": [], - "named_by_commands": [ - { - "area": "CICS", - "entry": "READ ... INTO LENGTH: in-out, truncation and LENGERR; a VSAM file's LENGTH need not equal its record length; LENGERR on READ UPDATE refused", - "id": "X14", - "status": "ASSUMED (REFUSED where IBM is silent)" - }, - { - "area": "CICS", - "entry": "ASSIGN on the det port: STARTCODE (TD / S / SD), USERID (the default user), FACILITY / SCRNHT / SCRNWD (INVREQ RESP2 5 without a terminal) from facts the harness states; no data area written when ASSIGN raises INVREQ; OPID, NETNAME, TERMCODE, FCI, the other screen sizes, work-area lengths and the rest refused", - "id": "X19", - "status": "ASSUMED (REFUSED where the harness cannot decide)" - }, - { - "area": "CICS", - "entry": "SEND TEXT on the det port and the stub: TERMINAL accepted as the default output disposition (the principal facility; the event is that of SEND TEXT without it); ACCUM, PAGING, SET, REQID, HEADER, TRAILER, JUSTIFY / JUSFIRST / JUSLAST, the printer, partition and LDC options, MSR, FMHPARM, DEFAULT / ALTERNATE refused", - "id": "X20", - "status": "MATCHED (REFUSED where the region cannot decide)" - }, - { - "area": "CICS", - "entry": "READ GTEQ / GENERIC on a KSDS: the first record whose key (or its first KEYLENGTH bytes) equals RIDFLD's or, with GTEQ, is greater, in the browse's key order (D1); NOTFND RESP2 80; READ UPDATE holds the record found; RIDFLD not updated; a GENERIC KEYLENGTH not shorter than the key or not above zero, a non-constant KEYLENGTH and a RIDFLD shorter than the key searched refused", - "id": "X22", - "status": "ASSUMED (REFUSED where IBM is silent or the layout decides)" - } - ], + "named_by_commands": [], "reach": "not measured", "source_read": true }, @@ -6274,7 +6291,53 @@ "branches_net": null, "infeasible_netted": [], "infeasible_refuted": [], - "infeasible_stated": [], + "infeasible_stated": [ + { + "family": "G", + "key": "PROCESS-PAGE-BACKWARD:339:false", + "kind": "IF", + "line": 339, + "outcome": "false", + "reason": "`IF EIBAID NOT = DFHENTER AND DFHPF8`: PROCESS-PAGE-BACKWARD is PERFORMed only from PROCESS-PF7-KEY (line 246), which MAIN-PARA PERFORMs only under `WHEN DFHPF7` of `EVALUATE EIBAID`; COTRN00C never changes EIBAID, so EIBAID = DFHPF7 here and the condition is always true.", + "unit": "PROCESS-PAGE-BACKWARD" + }, + { + "family": "G", + "key": "PROCESS-PAGE-BACKWARD:361:false", + "kind": "IF", + "line": 361, + "outcome": "false", + "reason": "`IF NEXT-PAGE-YES`: PROCESS-PF7-KEY does `SET NEXT-PAGE-YES TO TRUE` (line 242) just before PERFORM PROCESS-PAGE-BACKWARD, and nothing on the way (STARTBR / READPREV / POPULATE / INITIALIZE / SEND paragraphs) sets NEXT-PAGE-NO -- only PROCESS-PAGE-FORWARD does, which PF7 never runs. The flag is always 'Y' here.", + "unit": "PROCESS-PAGE-BACKWARD" + }, + { + "family": "C", + "key": "POPULATE-TRAN-DATA:390:OTHER", + "kind": "EVALUATE", + "line": 390, + "outcome": "OTHER", + "reason": "`EVALUATE WS-IDX` WHEN 1 .. WHEN 10: POPULATE-TRAN-DATA is PERFORMed only at line 300, inside `PERFORM UNTIL WS-IDX >= 11 ...` (line 297; WS-IDX moved 1 at line 295, +1 per row at line 301), and at line 354, inside `PERFORM UNTIL WS-IDX <= 0 ...` (line 351; WS-IDX moved 10 at line 349, -1 per row at line 355). The loop test runs before each pass, so WS-IDX is in 1..10 every time.", + "unit": "POPULATE-TRAN-DATA" + }, + { + "family": "C", + "key": "INITIALIZE-TRAN-DATA:452:OTHER", + "kind": "EVALUATE", + "line": 452, + "outcome": "OTHER", + "reason": "`EVALUATE WS-IDX` WHEN 1 .. WHEN 10: INITIALIZE-TRAN-DATA is PERFORMed only by `PERFORM VARYING WS-IDX FROM 1 BY 1 UNTIL WS-IDX > 10` (lines 290 and 344), so WS-IDX is in 1..10 every time.", + "unit": "INITIALIZE-TRAN-DATA" + }, + { + "family": "G", + "key": "RETURN-TO-PREV-SCREEN:512:true", + "kind": "IF", + "line": 512, + "outcome": "true", + "reason": "`IF CDEMO-TO-PROGRAM = LOW-VALUES OR SPACES` in RETURN-TO-PREV-SCREEN: the paragraph is only PERFORMed, and every PERFORM of it comes right after a MOVE of a non-blank program name into CDEMO-TO-PROGRAM (line 108 moves 'COSGN00C' and line 123 'COMEN01C'; both fields PIC X(08), COCOM01Y). COTRN00C never moves SPACES or LOW-VALUES into it in between.", + "unit": "RETURN-TO-PREV-SCREEN" + } + ], "paragraph_pct": null, "paragraphs": null, "source": null, @@ -6284,8 +6347,8 @@ "equivalence": { "cases": [ { - "case": "carddemo-signon", - "case_scenarios": 12, + "case": "carddemo-tranlist", + "case_scenarios": 32, "db2": false, "det": { "source": "CI det-sweep ratchet on main", @@ -6294,29 +6357,35 @@ "record": { "coverage": { "branches": { - "covered": 17, - "total": 17 + "covered": 96, + "total": 101 }, "paragraphs": { - "covered": 6, - "live": 6 + "covered": 16, + "live": 16 }, - "uncovered_branches": [] + "uncovered_branches": [ + "line 339 IF false (PROCESS-PAGE-BACKWARD)", + "line 361 IF false (PROCESS-PAGE-BACKWARD)", + "line 390 EVALUATE OTHER (POPULATE-TRAN-DATA)", + "line 452 EVALUATE OTHER (INITIALIZE-TRAN-DATA)", + "line 512 IF true (RETURN-TO-PREV-SCREEN)" + ] }, "db2": false, "facade": { - "passed": 12, - "runs": 12 + "passed": 32, + "runs": 32 }, - "fault_runs": 1, + "fault_runs": 4, "java_failed": false, - "oracle_image": "sha256:ec3ecd98686860217630b1fce29265628e980a353ddd3d2d96d16332e8800c64", + "oracle_image": "sha256:d7e387df360c519ce8945a1f6d748c8dafab06f50551b23ddf85d6373a4dcd6e", "oracle_matches_pin": true, - "records_compared": 30, - "records_equal": 30, - "runs": 12, - "scenarios": 12, - "scenarios_equal": 12, + "records_compared": 91, + "records_equal": 91, + "runs": 32, + "scenarios": 32, + "scenarios_equal": 32, "stale_inputs": [ "harness", "oracle", @@ -6329,8 +6398,8 @@ } ], "chosen": { - "case": "carddemo-signon", - "case_scenarios": 12, + "case": "carddemo-tranlist", + "case_scenarios": 32, "db2": false, "det": { "source": "CI det-sweep ratchet on main", @@ -6339,29 +6408,35 @@ "record": { "coverage": { "branches": { - "covered": 17, - "total": 17 + "covered": 96, + "total": 101 }, "paragraphs": { - "covered": 6, - "live": 6 + "covered": 16, + "live": 16 }, - "uncovered_branches": [] + "uncovered_branches": [ + "line 339 IF false (PROCESS-PAGE-BACKWARD)", + "line 361 IF false (PROCESS-PAGE-BACKWARD)", + "line 390 EVALUATE OTHER (POPULATE-TRAN-DATA)", + "line 452 EVALUATE OTHER (INITIALIZE-TRAN-DATA)", + "line 512 IF true (RETURN-TO-PREV-SCREEN)" + ] }, "db2": false, "facade": { - "passed": 12, - "runs": 12 + "passed": 32, + "runs": 32 }, - "fault_runs": 1, + "fault_runs": 4, "java_failed": false, - "oracle_image": "sha256:ec3ecd98686860217630b1fce29265628e980a353ddd3d2d96d16332e8800c64", + "oracle_image": "sha256:d7e387df360c519ce8945a1f6d748c8dafab06f50551b23ddf85d6373a4dcd6e", "oracle_matches_pin": true, - "records_compared": 30, - "records_equal": 30, - "runs": 12, - "scenarios": 12, - "scenarios_equal": 12, + "records_compared": 91, + "records_equal": 91, + "runs": 32, + "scenarios": 32, + "scenarios_equal": 32, "stale_inputs": [ "harness", "oracle", @@ -6382,45 +6457,27 @@ ], "oracle_backing": [ { - "backed": true, - "command": "ASSIGN", - "crucible_cases": [ - { - "case": "ca-channel-containers", - "java_agrees": false, - "stub_agrees": true - }, - { - "case": "gt-assign-startcode", - "java_agrees": false, - "stub_agrees": true - }, - { - "case": "hc-abend-link", - "java_agrees": true, - "stub_agrees": true - } - ], - "facts_stated": [ - "startcode", - "userid", - "facility", - "screen" - ], - "registers": [ - "X19" - ], + "backed": false, + "command": "ENDBR", + "crucible_cases": [], + "facts_stated": [], + "registers": [], "spec_entry": "full" }, { "backed": false, - "command": "READ", + "command": "READNEXT", "crucible_cases": [], "facts_stated": [], - "registers": [ - "X14", - "X22" - ], + "registers": [], + "spec_entry": "full" + }, + { + "backed": false, + "command": "READPREV", + "crucible_cases": [], + "facts_stated": [], + "registers": [], "spec_entry": "full" }, { @@ -6580,113 +6637,35 @@ "registers": [], "spec_entry": "full" }, + { + "backed": false, + "command": "STARTBR", + "crucible_cases": [], + "facts_stated": [], + "registers": [], + "spec_entry": "full" + }, { "backed": true, - "command": "SEND TEXT", + "command": "XCTL", "crucible_cases": [ { - "case": "ca-link-lengths", - "java_agrees": true, - "stub_agrees": true - }, - { - "case": "ca-xctl-versions", - "java_agrees": true, - "stub_agrees": true - }, - { - "case": "gt-assign-startcode", - "java_agrees": false, - "stub_agrees": true - }, - { - "case": "gt-start-options", + "case": "ca-channel-containers", "java_agrees": false, "stub_agrees": true }, { - "case": "gt-start-retrieve", + "case": "ca-xctl-versions", "java_agrees": true, "stub_agrees": true }, { - "case": "gt-terminal-coalesce", + "case": "pc-aid-menu", "java_agrees": true, "stub_agrees": true }, { - "case": "hc-abend-link", - "java_agrees": true, - "stub_agrees": true - }, - { - "case": "hc-eoc-error", - "java_agrees": false, - "stub_agrees": true - }, - { - "case": "hc-handle-aid", - "java_agrees": false, - "stub_agrees": true - }, - { - "case": "hc-ignore-error", - "java_agrees": false, - "stub_agrees": true - }, - { - "case": "hc-perform-range", - "java_agrees": true, - "stub_agrees": true - }, - { - "case": "hc-terminal-eoc", - "java_agrees": false, - "stub_agrees": true - }, - { - "case": "hc-terminal-receive", - "java_agrees": false, - "stub_agrees": true - }, - { - "case": "pc-aid-menu", - "java_agrees": true, - "stub_agrees": true - }, - { - "case": "pc-wizard", - "java_agrees": true, - "stub_agrees": true - } - ], - "facts_stated": [], - "registers": [ - "X20" - ], - "spec_entry": "full" - }, - { - "backed": true, - "command": "XCTL", - "crucible_cases": [ - { - "case": "ca-channel-containers", - "java_agrees": false, - "stub_agrees": true - }, - { - "case": "ca-xctl-versions", - "java_agrees": true, - "stub_agrees": true - }, - { - "case": "pc-aid-menu", - "java_agrees": true, - "stub_agrees": true - }, - { - "case": "pc-wizard", + "case": "pc-wizard", "java_agrees": true, "stub_agrees": true } @@ -6696,18 +6675,17 @@ "spec_entry": "full" } ], - "program": "app/cbl/COSGN00C.cbl", + "program": "app/cbl/COTRN00C.cbl", "residual": { - "assumed_or_differs_named": [ - "X14", - "X19", - "X22" - ], + "assumed_or_differs_named": [], "branch_outcomes_unrun": null, - "commands": 7, - "commands_backed": 6, + "commands": 8, + "commands_backed": 4, "commands_not_backed": [ - "READ" + "ENDBR", + "READNEXT", + "READPREV", + "STARTBR" ], "facts_unstated": 0, "holes": 0, @@ -6720,8 +6698,8 @@ "holes": [], "refused": null, "source_defects": [], - "statements": 71, - "translated": 71, + "statements": 294, + "translated": 294, "whole": true } }, @@ -6729,7 +6707,20 @@ "assumptions": { "facts_stated": [], "facts_unstated": [], - "named_by_commands": [], + "named_by_commands": [ + { + "area": "CICS", + "entry": "READ ... INTO LENGTH: in-out, truncation and LENGERR; a VSAM file's LENGTH need not equal its record length; LENGERR on READ UPDATE refused", + "id": "X14", + "status": "ASSUMED (REFUSED where IBM is silent)" + }, + { + "area": "CICS", + "entry": "READ GTEQ / GENERIC on a KSDS: the first record whose key (or its first KEYLENGTH bytes) equals RIDFLD's or, with GTEQ, is greater, in the browse's key order (D1); NOTFND RESP2 80; READ UPDATE holds the record found; RIDFLD not updated; a GENERIC KEYLENGTH not shorter than the key or not above zero, a non-constant KEYLENGTH and a RIDFLD shorter than the key searched refused", + "id": "X22", + "status": "ASSUMED (REFUSED where IBM is silent or the layout decides)" + } + ], "reach": "not measured", "source_read": true }, @@ -6743,47 +6734,11 @@ "infeasible_stated": [ { "family": "G", - "key": "PROCESS-PAGE-BACKWARD:339:false", - "kind": "IF", - "line": 339, - "outcome": "false", - "reason": "`IF EIBAID NOT = DFHENTER AND DFHPF8`: PROCESS-PAGE-BACKWARD is PERFORMed only from PROCESS-PF7-KEY (line 246), which MAIN-PARA PERFORMs only under `WHEN DFHPF7` of `EVALUATE EIBAID`; COTRN00C never changes EIBAID, so EIBAID = DFHPF7 here and the condition is always true.", - "unit": "PROCESS-PAGE-BACKWARD" - }, - { - "family": "G", - "key": "PROCESS-PAGE-BACKWARD:361:false", - "kind": "IF", - "line": 361, - "outcome": "false", - "reason": "`IF NEXT-PAGE-YES`: PROCESS-PF7-KEY does `SET NEXT-PAGE-YES TO TRUE` (line 242) just before PERFORM PROCESS-PAGE-BACKWARD, and nothing on the way (STARTBR / READPREV / POPULATE / INITIALIZE / SEND paragraphs) sets NEXT-PAGE-NO -- only PROCESS-PAGE-FORWARD does, which PF7 never runs. The flag is always 'Y' here.", - "unit": "PROCESS-PAGE-BACKWARD" - }, - { - "family": "C", - "key": "POPULATE-TRAN-DATA:390:OTHER", - "kind": "EVALUATE", - "line": 390, - "outcome": "OTHER", - "reason": "`EVALUATE WS-IDX` WHEN 1 .. WHEN 10: POPULATE-TRAN-DATA is PERFORMed only at line 300, inside `PERFORM UNTIL WS-IDX >= 11 ...` (line 297; WS-IDX moved 1 at line 295, +1 per row at line 301), and at line 354, inside `PERFORM UNTIL WS-IDX <= 0 ...` (line 351; WS-IDX moved 10 at line 349, -1 per row at line 355). The loop test runs before each pass, so WS-IDX is in 1..10 every time.", - "unit": "POPULATE-TRAN-DATA" - }, - { - "family": "C", - "key": "INITIALIZE-TRAN-DATA:452:OTHER", - "kind": "EVALUATE", - "line": 452, - "outcome": "OTHER", - "reason": "`EVALUATE WS-IDX` WHEN 1 .. WHEN 10: INITIALIZE-TRAN-DATA is PERFORMed only by `PERFORM VARYING WS-IDX FROM 1 BY 1 UNTIL WS-IDX > 10` (lines 290 and 344), so WS-IDX is in 1..10 every time.", - "unit": "INITIALIZE-TRAN-DATA" - }, - { - "family": "G", - "key": "RETURN-TO-PREV-SCREEN:512:true", + "key": "RETURN-TO-PREV-SCREEN:199:true", "kind": "IF", - "line": 512, + "line": 199, "outcome": "true", - "reason": "`IF CDEMO-TO-PROGRAM = LOW-VALUES OR SPACES` in RETURN-TO-PREV-SCREEN: the paragraph is only PERFORMed, and every PERFORM of it comes right after a MOVE of a non-blank program name into CDEMO-TO-PROGRAM (line 108 moves 'COSGN00C' and line 123 'COMEN01C'; both fields PIC X(08), COCOM01Y). COTRN00C never moves SPACES or LOW-VALUES into it in between.", + "reason": "`IF CDEMO-TO-PROGRAM = LOW-VALUES OR SPACES` in RETURN-TO-PREV-SCREEN: the paragraph is only PERFORMed, and every PERFORM of it comes right after a MOVE of a non-blank program name into CDEMO-TO-PROGRAM (lines 95 and 126 move 'COSGN00C' / 'COTRN00C', line 117 'COMEN01C', and line 120 moves CDEMO-FROM-PROGRAM only after line 116 tested it is neither SPACES nor LOW-VALUES; both fields PIC X(08), COCOM01Y). COTRN01C never moves SPACES or LOW-VALUES into it in between.", "unit": "RETURN-TO-PREV-SCREEN" } ], @@ -6796,8 +6751,8 @@ "equivalence": { "cases": [ { - "case": "carddemo-tranlist", - "case_scenarios": 32, + "case": "carddemo-tranview", + "case_scenarios": 15, "db2": false, "det": { "source": "CI det-sweep ratchet on main", @@ -6806,35 +6761,31 @@ "record": { "coverage": { "branches": { - "covered": 96, - "total": 101 + "covered": 23, + "total": 24 }, "paragraphs": { - "covered": 16, - "live": 16 + "covered": 9, + "live": 9 }, "uncovered_branches": [ - "line 339 IF false (PROCESS-PAGE-BACKWARD)", - "line 361 IF false (PROCESS-PAGE-BACKWARD)", - "line 390 EVALUATE OTHER (POPULATE-TRAN-DATA)", - "line 452 EVALUATE OTHER (INITIALIZE-TRAN-DATA)", - "line 512 IF true (RETURN-TO-PREV-SCREEN)" + "line 199 IF true (RETURN-TO-PREV-SCREEN)" ] }, "db2": false, "facade": { - "passed": 32, - "runs": 32 + "passed": 15, + "runs": 15 }, - "fault_runs": 4, + "fault_runs": 1, "java_failed": false, - "oracle_image": "sha256:d7e387df360c519ce8945a1f6d748c8dafab06f50551b23ddf85d6373a4dcd6e", + "oracle_image": "sha256:ec3ecd98686860217630b1fce29265628e980a353ddd3d2d96d16332e8800c64", "oracle_matches_pin": true, - "records_compared": 91, - "records_equal": 91, - "runs": 32, - "scenarios": 32, - "scenarios_equal": 32, + "records_compared": 39, + "records_equal": 39, + "runs": 15, + "scenarios": 15, + "scenarios_equal": 15, "stale_inputs": [ "harness", "oracle", @@ -6847,8 +6798,8 @@ } ], "chosen": { - "case": "carddemo-tranlist", - "case_scenarios": 32, + "case": "carddemo-tranview", + "case_scenarios": 15, "db2": false, "det": { "source": "CI det-sweep ratchet on main", @@ -6857,35 +6808,31 @@ "record": { "coverage": { "branches": { - "covered": 96, - "total": 101 + "covered": 23, + "total": 24 }, "paragraphs": { - "covered": 16, - "live": 16 + "covered": 9, + "live": 9 }, "uncovered_branches": [ - "line 339 IF false (PROCESS-PAGE-BACKWARD)", - "line 361 IF false (PROCESS-PAGE-BACKWARD)", - "line 390 EVALUATE OTHER (POPULATE-TRAN-DATA)", - "line 452 EVALUATE OTHER (INITIALIZE-TRAN-DATA)", - "line 512 IF true (RETURN-TO-PREV-SCREEN)" + "line 199 IF true (RETURN-TO-PREV-SCREEN)" ] }, "db2": false, "facade": { - "passed": 32, - "runs": 32 + "passed": 15, + "runs": 15 }, - "fault_runs": 4, + "fault_runs": 1, "java_failed": false, - "oracle_image": "sha256:d7e387df360c519ce8945a1f6d748c8dafab06f50551b23ddf85d6373a4dcd6e", + "oracle_image": "sha256:ec3ecd98686860217630b1fce29265628e980a353ddd3d2d96d16332e8800c64", "oracle_matches_pin": true, - "records_compared": 91, - "records_equal": 91, - "runs": 32, - "scenarios": 32, - "scenarios_equal": 32, + "records_compared": 39, + "records_equal": 39, + "runs": 15, + "scenarios": 15, + "scenarios_equal": 15, "stale_inputs": [ "harness", "oracle", @@ -6907,26 +6854,13 @@ "oracle_backing": [ { "backed": false, - "command": "ENDBR", - "crucible_cases": [], - "facts_stated": [], - "registers": [], - "spec_entry": "full" - }, - { - "backed": false, - "command": "READNEXT", - "crucible_cases": [], - "facts_stated": [], - "registers": [], - "spec_entry": "full" - }, - { - "backed": false, - "command": "READPREV", + "command": "READ", "crucible_cases": [], "facts_stated": [], - "registers": [], + "registers": [ + "X14", + "X22" + ], "spec_entry": "full" }, { @@ -7086,14 +7020,6 @@ "registers": [], "spec_entry": "full" }, - { - "backed": false, - "command": "STARTBR", - "crucible_cases": [], - "facts_stated": [], - "registers": [], - "spec_entry": "full" - }, { "backed": true, "command": "XCTL", @@ -7124,17 +7050,17 @@ "spec_entry": "full" } ], - "program": "app/cbl/COTRN00C.cbl", + "program": "app/cbl/COTRN01C.cbl", "residual": { - "assumed_or_differs_named": [], + "assumed_or_differs_named": [ + "X14", + "X22" + ], "branch_outcomes_unrun": null, - "commands": 8, + "commands": 5, "commands_backed": 4, "commands_not_backed": [ - "ENDBR", - "READNEXT", - "READPREV", - "STARTBR" + "READ" ], "facts_unstated": 0, "holes": 0, @@ -7147,8 +7073,8 @@ "holes": [], "refused": null, "source_defects": [], - "statements": 294, - "translated": 294, + "statements": 95, + "translated": 95, "whole": true } }, @@ -7183,11 +7109,29 @@ "infeasible_stated": [ { "family": "G", - "key": "RETURN-TO-PREV-SCREEN:199:true", + "key": "VALIDATE-INPUT-DATA-FIELDS:237:true", "kind": "IF", - "line": 199, + "line": 237, "outcome": "true", - "reason": "`IF CDEMO-TO-PROGRAM = LOW-VALUES OR SPACES` in RETURN-TO-PREV-SCREEN: the paragraph is only PERFORMed, and every PERFORM of it comes right after a MOVE of a non-blank program name into CDEMO-TO-PROGRAM (lines 95 and 126 move 'COSGN00C' / 'COTRN00C', line 117 'COMEN01C', and line 120 moves CDEMO-FROM-PROGRAM only after line 116 tested it is neither SPACES nor LOW-VALUES; both fields PIC X(08), COCOM01Y). COTRN01C never moves SPACES or LOW-VALUES into it in between.", + "reason": "`IF ERR-FLG-ON` at the head of VALIDATE-INPUT-DATA-FIELDS: MAIN-PARA sets ERR-FLG-OFF (line 109) and every MOVE 'Y' TO WS-ERR-FLG that can run before it (lines 149, 198, 212, 225 and the xref READs at 592 / 599 / 625 / 632) is followed by PERFORM SEND-TRNADD-SCREEN, which ends in EXEC CICS RETURN (line 530, no RESP, no HANDLE in COTRN02C) and never comes back. So the flag is always 'N' when this IF runs.", + "unit": "VALIDATE-INPUT-DATA-FIELDS" + }, + { + "family": "G", + "key": "COPY-LAST-TRAN-DATA:480:false", + "kind": "IF", + "line": 480, + "outcome": "false", + "reason": "`IF NOT ERR-FLG-ON` after VALIDATE-INPUT-KEY-FIELDS and the STARTBR / READPREV / ENDBR of COPY-LAST-TRAN-DATA: each of them that sets WS-ERR-FLG to 'Y' (lines 198, 212, 225, 592, 599, 625, 632, 656, 663, 692) then PERFORMs SEND-TRNADD-SCREEN, which ends in EXEC CICS RETURN (line 530, no RESP, no HANDLE) and never comes back; READPREV ENDFILE (line 688) only zeroes TRAN-ID. So the flag is still the 'N' MAIN-PARA set (line 109).", + "unit": "COPY-LAST-TRAN-DATA" + }, + { + "family": "G", + "key": "RETURN-TO-PREV-SCREEN:502:true", + "kind": "IF", + "line": 502, + "outcome": "true", + "reason": "`IF CDEMO-TO-PROGRAM = LOW-VALUES OR SPACES` in RETURN-TO-PREV-SCREEN: the paragraph is only PERFORMed, and every PERFORM of it comes right after a MOVE of a non-blank program name into CDEMO-TO-PROGRAM (line 116 moves 'COSGN00C', line 138 'COMEN01C', and line 141 moves CDEMO-FROM-PROGRAM only after testing it is neither SPACES nor LOW-VALUES; both fields PIC X(08), COCOM01Y). COTRN02C never moves SPACES or LOW-VALUES into it in between.", "unit": "RETURN-TO-PREV-SCREEN" } ], @@ -7200,8 +7144,8 @@ "equivalence": { "cases": [ { - "case": "carddemo-tranview", - "case_scenarios": 15, + "case": "carddemo-tranadd", + "case_scenarios": 46, "db2": false, "det": { "source": "CI det-sweep ratchet on main", @@ -7210,31 +7154,33 @@ "record": { "coverage": { "branches": { - "covered": 23, - "total": 24 + "covered": 72, + "total": 75 }, "paragraphs": { - "covered": 9, - "live": 9 + "covered": 18, + "live": 18 }, "uncovered_branches": [ - "line 199 IF true (RETURN-TO-PREV-SCREEN)" + "line 237 IF true (VALIDATE-INPUT-DATA-FIELDS)", + "line 480 IF false (COPY-LAST-TRAN-DATA)", + "line 502 IF true (RETURN-TO-PREV-SCREEN)" ] }, "db2": false, "facade": { - "passed": 15, - "runs": 15 + "passed": 46, + "runs": 46 }, - "fault_runs": 1, + "fault_runs": 8, "java_failed": false, - "oracle_image": "sha256:ec3ecd98686860217630b1fce29265628e980a353ddd3d2d96d16332e8800c64", + "oracle_image": "sha256:d7e387df360c519ce8945a1f6d748c8dafab06f50551b23ddf85d6373a4dcd6e", "oracle_matches_pin": true, - "records_compared": 39, - "records_equal": 39, - "runs": 15, - "scenarios": 15, - "scenarios_equal": 15, + "records_compared": 132, + "records_equal": 132, + "runs": 46, + "scenarios": 46, + "scenarios_equal": 46, "stale_inputs": [ "harness", "oracle", @@ -7247,8 +7193,8 @@ } ], "chosen": { - "case": "carddemo-tranview", - "case_scenarios": 15, + "case": "carddemo-tranadd", + "case_scenarios": 46, "db2": false, "det": { "source": "CI det-sweep ratchet on main", @@ -7257,31 +7203,33 @@ "record": { "coverage": { "branches": { - "covered": 23, - "total": 24 + "covered": 72, + "total": 75 }, "paragraphs": { - "covered": 9, - "live": 9 + "covered": 18, + "live": 18 }, "uncovered_branches": [ - "line 199 IF true (RETURN-TO-PREV-SCREEN)" + "line 237 IF true (VALIDATE-INPUT-DATA-FIELDS)", + "line 480 IF false (COPY-LAST-TRAN-DATA)", + "line 502 IF true (RETURN-TO-PREV-SCREEN)" ] }, "db2": false, "facade": { - "passed": 15, - "runs": 15 + "passed": 46, + "runs": 46 }, - "fault_runs": 1, + "fault_runs": 8, "java_failed": false, - "oracle_image": "sha256:ec3ecd98686860217630b1fce29265628e980a353ddd3d2d96d16332e8800c64", + "oracle_image": "sha256:d7e387df360c519ce8945a1f6d748c8dafab06f50551b23ddf85d6373a4dcd6e", "oracle_matches_pin": true, - "records_compared": 39, - "records_equal": 39, - "runs": 15, - "scenarios": 15, - "scenarios_equal": 15, + "records_compared": 132, + "records_equal": 132, + "runs": 46, + "scenarios": 46, + "scenarios_equal": 46, "stale_inputs": [ "harness", "oracle", @@ -7301,6 +7249,14 @@ "paragraph coverage >= 100.0 (coverage not measured: no fresh det-sweep ledger entry and no local sweep)" ], "oracle_backing": [ + { + "backed": false, + "command": "ENDBR", + "crucible_cases": [], + "facts_stated": [], + "registers": [], + "spec_entry": "full" + }, { "backed": false, "command": "READ", @@ -7312,6 +7268,14 @@ ], "spec_entry": "full" }, + { + "backed": false, + "command": "READPREV", + "crucible_cases": [], + "facts_stated": [], + "registers": [], + "spec_entry": "full" + }, { "backed": true, "command": "RECEIVE MAP", @@ -7469,6 +7433,22 @@ "registers": [], "spec_entry": "full" }, + { + "backed": false, + "command": "STARTBR", + "crucible_cases": [], + "facts_stated": [], + "registers": [], + "spec_entry": "full" + }, + { + "backed": false, + "command": "WRITE", + "crucible_cases": [], + "facts_stated": [], + "registers": [], + "spec_entry": "full" + }, { "backed": true, "command": "XCTL", @@ -7499,17 +7479,21 @@ "spec_entry": "full" } ], - "program": "app/cbl/COTRN01C.cbl", + "program": "app/cbl/COTRN02C.cbl", "residual": { "assumed_or_differs_named": [ "X14", "X22" ], "branch_outcomes_unrun": null, - "commands": 5, + "commands": 9, "commands_backed": 4, "commands_not_backed": [ - "READ" + "ENDBR", + "READ", + "READPREV", + "STARTBR", + "WRITE" ], "facts_unstated": 0, "holes": 0, @@ -7522,8 +7506,8 @@ "holes": [], "refused": null, "source_defects": [], - "statements": 95, - "translated": 95, + "statements": 300, + "translated": 300, "whole": true } }, @@ -7531,20 +7515,7 @@ "assumptions": { "facts_stated": [], "facts_unstated": [], - "named_by_commands": [ - { - "area": "CICS", - "entry": "READ ... INTO LENGTH: in-out, truncation and LENGERR; a VSAM file's LENGTH need not equal its record length; LENGERR on READ UPDATE refused", - "id": "X14", - "status": "ASSUMED (REFUSED where IBM is silent)" - }, - { - "area": "CICS", - "entry": "READ GTEQ / GENERIC on a KSDS: the first record whose key (or its first KEYLENGTH bytes) equals RIDFLD's or, with GTEQ, is greater, in the browse's key order (D1); NOTFND RESP2 80; READ UPDATE holds the record found; RIDFLD not updated; a GENERIC KEYLENGTH not shorter than the key or not above zero, a non-constant KEYLENGTH and a RIDFLD shorter than the key searched refused", - "id": "X22", - "status": "ASSUMED (REFUSED where IBM is silent or the layout decides)" - } - ], + "named_by_commands": [], "reach": "not measured", "source_read": true }, @@ -7558,29 +7529,47 @@ "infeasible_stated": [ { "family": "G", - "key": "VALIDATE-INPUT-DATA-FIELDS:237:true", + "key": "PROCESS-PAGE-BACKWARD:342:false", "kind": "IF", - "line": 237, - "outcome": "true", - "reason": "`IF ERR-FLG-ON` at the head of VALIDATE-INPUT-DATA-FIELDS: MAIN-PARA sets ERR-FLG-OFF (line 109) and every MOVE 'Y' TO WS-ERR-FLG that can run before it (lines 149, 198, 212, 225 and the xref READs at 592 / 599 / 625 / 632) is followed by PERFORM SEND-TRNADD-SCREEN, which ends in EXEC CICS RETURN (line 530, no RESP, no HANDLE in COTRN02C) and never comes back. So the flag is always 'N' when this IF runs.", - "unit": "VALIDATE-INPUT-DATA-FIELDS" + "line": 342, + "outcome": "false", + "reason": "`IF EIBAID NOT = DFHENTER AND DFHPF8`: PROCESS-PAGE-BACKWARD is PERFORMed only from PROCESS-PF7-KEY (line 249), which MAIN-PARA PERFORMs only under `WHEN DFHPF7` of `EVALUATE EIBAID`; COUSR00C never changes EIBAID, so EIBAID = DFHPF7 here and the condition is always true.", + "unit": "PROCESS-PAGE-BACKWARD" }, { "family": "G", - "key": "COPY-LAST-TRAN-DATA:480:false", + "key": "PROCESS-PAGE-BACKWARD:364:false", "kind": "IF", - "line": 480, + "line": 364, "outcome": "false", - "reason": "`IF NOT ERR-FLG-ON` after VALIDATE-INPUT-KEY-FIELDS and the STARTBR / READPREV / ENDBR of COPY-LAST-TRAN-DATA: each of them that sets WS-ERR-FLG to 'Y' (lines 198, 212, 225, 592, 599, 625, 632, 656, 663, 692) then PERFORMs SEND-TRNADD-SCREEN, which ends in EXEC CICS RETURN (line 530, no RESP, no HANDLE) and never comes back; READPREV ENDFILE (line 688) only zeroes TRAN-ID. So the flag is still the 'N' MAIN-PARA set (line 109).", - "unit": "COPY-LAST-TRAN-DATA" + "reason": "`IF NEXT-PAGE-YES`: PROCESS-PF7-KEY does `SET NEXT-PAGE-YES TO TRUE` (line 245) just before PERFORM PROCESS-PAGE-BACKWARD, and nothing on the way (STARTBR / READPREV / POPULATE / INITIALIZE / SEND paragraphs) sets NEXT-PAGE-NO -- only PROCESS-PAGE-FORWARD does, which PF7 never runs. The flag is always 'Y' here.", + "unit": "PROCESS-PAGE-BACKWARD" + }, + { + "family": "C", + "key": "POPULATE-USER-DATA:386:OTHER", + "kind": "EVALUATE", + "line": 386, + "outcome": "OTHER", + "reason": "`EVALUATE WS-IDX` WHEN 1 .. WHEN 10: POPULATE-USER-DATA is PERFORMed only at line 303, inside `PERFORM UNTIL WS-IDX >= 11 ...` (line 300; WS-IDX moved 1 at line 298, +1 per row at line 304), and at line 357, inside `PERFORM UNTIL WS-IDX <= 0 ...` (line 354; WS-IDX moved 10 at line 352, -1 per row at line 358). The loop test runs before each pass, so WS-IDX is in 1..10 every time.", + "unit": "POPULATE-USER-DATA" + }, + { + "family": "C", + "key": "INITIALIZE-USER-DATA:448:OTHER", + "kind": "EVALUATE", + "line": 448, + "outcome": "OTHER", + "reason": "`EVALUATE WS-IDX` WHEN 1 .. WHEN 10: INITIALIZE-USER-DATA is PERFORMed only by `PERFORM VARYING WS-IDX FROM 1 BY 1 UNTIL WS-IDX > 10` (lines 293 and 347), so WS-IDX is in 1..10 every time.", + "unit": "INITIALIZE-USER-DATA" }, { "family": "G", - "key": "RETURN-TO-PREV-SCREEN:502:true", + "key": "RETURN-TO-PREV-SCREEN:508:true", "kind": "IF", - "line": 502, + "line": 508, "outcome": "true", - "reason": "`IF CDEMO-TO-PROGRAM = LOW-VALUES OR SPACES` in RETURN-TO-PREV-SCREEN: the paragraph is only PERFORMed, and every PERFORM of it comes right after a MOVE of a non-blank program name into CDEMO-TO-PROGRAM (line 116 moves 'COSGN00C', line 138 'COMEN01C', and line 141 moves CDEMO-FROM-PROGRAM only after testing it is neither SPACES nor LOW-VALUES; both fields PIC X(08), COCOM01Y). COTRN02C never moves SPACES or LOW-VALUES into it in between.", + "reason": "`IF CDEMO-TO-PROGRAM = LOW-VALUES OR SPACES` in RETURN-TO-PREV-SCREEN: the paragraph is only PERFORMed, and every PERFORM of it comes right after a MOVE of a non-blank program name into CDEMO-TO-PROGRAM (line 111 moves 'COSGN00C' and line 126 'COADM01C'; both fields PIC X(08), COCOM01Y). COUSR00C never moves SPACES or LOW-VALUES into it in between.", "unit": "RETURN-TO-PREV-SCREEN" } ], @@ -7593,8 +7582,8 @@ "equivalence": { "cases": [ { - "case": "carddemo-tranadd", - "case_scenarios": 46, + "case": "carddemo-userlist", + "case_scenarios": 32, "db2": false, "det": { "source": "CI det-sweep ratchet on main", @@ -7603,33 +7592,35 @@ "record": { "coverage": { "branches": { - "covered": 72, - "total": 75 + "covered": 95, + "total": 100 }, "paragraphs": { - "covered": 18, - "live": 18 + "covered": 16, + "live": 16 }, "uncovered_branches": [ - "line 237 IF true (VALIDATE-INPUT-DATA-FIELDS)", - "line 480 IF false (COPY-LAST-TRAN-DATA)", - "line 502 IF true (RETURN-TO-PREV-SCREEN)" + "line 342 IF false (PROCESS-PAGE-BACKWARD)", + "line 364 IF false (PROCESS-PAGE-BACKWARD)", + "line 386 EVALUATE OTHER (POPULATE-USER-DATA)", + "line 448 EVALUATE OTHER (INITIALIZE-USER-DATA)", + "line 508 IF true (RETURN-TO-PREV-SCREEN)" ] }, "db2": false, "facade": { - "passed": 46, - "runs": 46 + "passed": 32, + "runs": 32 }, - "fault_runs": 8, + "fault_runs": 4, "java_failed": false, "oracle_image": "sha256:d7e387df360c519ce8945a1f6d748c8dafab06f50551b23ddf85d6373a4dcd6e", "oracle_matches_pin": true, - "records_compared": 132, - "records_equal": 132, - "runs": 46, - "scenarios": 46, - "scenarios_equal": 46, + "records_compared": 92, + "records_equal": 92, + "runs": 32, + "scenarios": 32, + "scenarios_equal": 32, "stale_inputs": [ "harness", "oracle", @@ -7642,8 +7633,8 @@ } ], "chosen": { - "case": "carddemo-tranadd", - "case_scenarios": 46, + "case": "carddemo-userlist", + "case_scenarios": 32, "db2": false, "det": { "source": "CI det-sweep ratchet on main", @@ -7652,33 +7643,35 @@ "record": { "coverage": { "branches": { - "covered": 72, - "total": 75 + "covered": 95, + "total": 100 }, "paragraphs": { - "covered": 18, - "live": 18 + "covered": 16, + "live": 16 }, "uncovered_branches": [ - "line 237 IF true (VALIDATE-INPUT-DATA-FIELDS)", - "line 480 IF false (COPY-LAST-TRAN-DATA)", - "line 502 IF true (RETURN-TO-PREV-SCREEN)" - ] - }, - "db2": false, - "facade": { - "passed": 46, - "runs": 46 + "line 342 IF false (PROCESS-PAGE-BACKWARD)", + "line 364 IF false (PROCESS-PAGE-BACKWARD)", + "line 386 EVALUATE OTHER (POPULATE-USER-DATA)", + "line 448 EVALUATE OTHER (INITIALIZE-USER-DATA)", + "line 508 IF true (RETURN-TO-PREV-SCREEN)" + ] }, - "fault_runs": 8, + "db2": false, + "facade": { + "passed": 32, + "runs": 32 + }, + "fault_runs": 4, "java_failed": false, "oracle_image": "sha256:d7e387df360c519ce8945a1f6d748c8dafab06f50551b23ddf85d6373a4dcd6e", "oracle_matches_pin": true, - "records_compared": 132, - "records_equal": 132, - "runs": 46, - "scenarios": 46, - "scenarios_equal": 46, + "records_compared": 92, + "records_equal": 92, + "runs": 32, + "scenarios": 32, + "scenarios_equal": 32, "stale_inputs": [ "harness", "oracle", @@ -7708,13 +7701,10 @@ }, { "backed": false, - "command": "READ", + "command": "READNEXT", "crucible_cases": [], "facts_stated": [], - "registers": [ - "X14", - "X22" - ], + "registers": [], "spec_entry": "full" }, { @@ -7890,14 +7880,6 @@ "registers": [], "spec_entry": "full" }, - { - "backed": false, - "command": "WRITE", - "crucible_cases": [], - "facts_stated": [], - "registers": [], - "spec_entry": "full" - }, { "backed": true, "command": "XCTL", @@ -7928,21 +7910,17 @@ "spec_entry": "full" } ], - "program": "app/cbl/COTRN02C.cbl", + "program": "app/cbl/COUSR00C.cbl", "residual": { - "assumed_or_differs_named": [ - "X14", - "X22" - ], + "assumed_or_differs_named": [], "branch_outcomes_unrun": null, - "commands": 9, + "commands": 8, "commands_backed": 4, "commands_not_backed": [ "ENDBR", - "READ", + "READNEXT", "READPREV", - "STARTBR", - "WRITE" + "STARTBR" ], "facts_unstated": 0, "holes": 0, @@ -7955,8 +7933,8 @@ "holes": [], "refused": null, "source_defects": [], - "statements": 300, - "translated": 300, + "statements": 288, + "translated": 288, "whole": true } }, @@ -7978,47 +7956,11 @@ "infeasible_stated": [ { "family": "G", - "key": "PROCESS-PAGE-BACKWARD:342:false", - "kind": "IF", - "line": 342, - "outcome": "false", - "reason": "`IF EIBAID NOT = DFHENTER AND DFHPF8`: PROCESS-PAGE-BACKWARD is PERFORMed only from PROCESS-PF7-KEY (line 249), which MAIN-PARA PERFORMs only under `WHEN DFHPF7` of `EVALUATE EIBAID`; COUSR00C never changes EIBAID, so EIBAID = DFHPF7 here and the condition is always true.", - "unit": "PROCESS-PAGE-BACKWARD" - }, - { - "family": "G", - "key": "PROCESS-PAGE-BACKWARD:364:false", - "kind": "IF", - "line": 364, - "outcome": "false", - "reason": "`IF NEXT-PAGE-YES`: PROCESS-PF7-KEY does `SET NEXT-PAGE-YES TO TRUE` (line 245) just before PERFORM PROCESS-PAGE-BACKWARD, and nothing on the way (STARTBR / READPREV / POPULATE / INITIALIZE / SEND paragraphs) sets NEXT-PAGE-NO -- only PROCESS-PAGE-FORWARD does, which PF7 never runs. The flag is always 'Y' here.", - "unit": "PROCESS-PAGE-BACKWARD" - }, - { - "family": "C", - "key": "POPULATE-USER-DATA:386:OTHER", - "kind": "EVALUATE", - "line": 386, - "outcome": "OTHER", - "reason": "`EVALUATE WS-IDX` WHEN 1 .. WHEN 10: POPULATE-USER-DATA is PERFORMed only at line 303, inside `PERFORM UNTIL WS-IDX >= 11 ...` (line 300; WS-IDX moved 1 at line 298, +1 per row at line 304), and at line 357, inside `PERFORM UNTIL WS-IDX <= 0 ...` (line 354; WS-IDX moved 10 at line 352, -1 per row at line 358). The loop test runs before each pass, so WS-IDX is in 1..10 every time.", - "unit": "POPULATE-USER-DATA" - }, - { - "family": "C", - "key": "INITIALIZE-USER-DATA:448:OTHER", - "kind": "EVALUATE", - "line": 448, - "outcome": "OTHER", - "reason": "`EVALUATE WS-IDX` WHEN 1 .. WHEN 10: INITIALIZE-USER-DATA is PERFORMed only by `PERFORM VARYING WS-IDX FROM 1 BY 1 UNTIL WS-IDX > 10` (lines 293 and 347), so WS-IDX is in 1..10 every time.", - "unit": "INITIALIZE-USER-DATA" - }, - { - "family": "G", - "key": "RETURN-TO-PREV-SCREEN:508:true", + "key": "RETURN-TO-PREV-SCREEN:167:true", "kind": "IF", - "line": 508, + "line": 167, "outcome": "true", - "reason": "`IF CDEMO-TO-PROGRAM = LOW-VALUES OR SPACES` in RETURN-TO-PREV-SCREEN: the paragraph is only PERFORMed, and every PERFORM of it comes right after a MOVE of a non-blank program name into CDEMO-TO-PROGRAM (line 111 moves 'COSGN00C' and line 126 'COADM01C'; both fields PIC X(08), COCOM01Y). COUSR00C never moves SPACES or LOW-VALUES into it in between.", + "reason": "`IF CDEMO-TO-PROGRAM = LOW-VALUES OR SPACES` in RETURN-TO-PREV-SCREEN: the paragraph is only PERFORMed, and every PERFORM of it comes right after a MOVE of a non-blank program name into CDEMO-TO-PROGRAM (line 79 moves 'COSGN00C' and line 94 'COADM01C'; both fields PIC X(08), COCOM01Y). COUSR01C never moves SPACES or LOW-VALUES into it in between.", "unit": "RETURN-TO-PREV-SCREEN" } ], @@ -8031,8 +7973,8 @@ "equivalence": { "cases": [ { - "case": "carddemo-userlist", - "case_scenarios": 32, + "case": "carddemo-useradd", + "case_scenarios": 13, "db2": false, "det": { "source": "CI det-sweep ratchet on main", @@ -8041,35 +7983,31 @@ "record": { "coverage": { "branches": { - "covered": 95, - "total": 100 + "covered": 20, + "total": 21 }, "paragraphs": { - "covered": 16, - "live": 16 + "covered": 9, + "live": 9 }, "uncovered_branches": [ - "line 342 IF false (PROCESS-PAGE-BACKWARD)", - "line 364 IF false (PROCESS-PAGE-BACKWARD)", - "line 386 EVALUATE OTHER (POPULATE-USER-DATA)", - "line 448 EVALUATE OTHER (INITIALIZE-USER-DATA)", - "line 508 IF true (RETURN-TO-PREV-SCREEN)" + "line 167 IF true (RETURN-TO-PREV-SCREEN)" ] }, "db2": false, "facade": { - "passed": 32, - "runs": 32 + "passed": 13, + "runs": 13 }, - "fault_runs": 4, + "fault_runs": 1, "java_failed": false, - "oracle_image": "sha256:d7e387df360c519ce8945a1f6d748c8dafab06f50551b23ddf85d6373a4dcd6e", + "oracle_image": "sha256:ec3ecd98686860217630b1fce29265628e980a353ddd3d2d96d16332e8800c64", "oracle_matches_pin": true, - "records_compared": 92, - "records_equal": 92, - "runs": 32, - "scenarios": 32, - "scenarios_equal": 32, + "records_compared": 35, + "records_equal": 35, + "runs": 13, + "scenarios": 13, + "scenarios_equal": 13, "stale_inputs": [ "harness", "oracle", @@ -8082,8 +8020,8 @@ } ], "chosen": { - "case": "carddemo-userlist", - "case_scenarios": 32, + "case": "carddemo-useradd", + "case_scenarios": 13, "db2": false, "det": { "source": "CI det-sweep ratchet on main", @@ -8092,35 +8030,31 @@ "record": { "coverage": { "branches": { - "covered": 95, - "total": 100 + "covered": 20, + "total": 21 }, "paragraphs": { - "covered": 16, - "live": 16 + "covered": 9, + "live": 9 }, "uncovered_branches": [ - "line 342 IF false (PROCESS-PAGE-BACKWARD)", - "line 364 IF false (PROCESS-PAGE-BACKWARD)", - "line 386 EVALUATE OTHER (POPULATE-USER-DATA)", - "line 448 EVALUATE OTHER (INITIALIZE-USER-DATA)", - "line 508 IF true (RETURN-TO-PREV-SCREEN)" + "line 167 IF true (RETURN-TO-PREV-SCREEN)" ] }, "db2": false, "facade": { - "passed": 32, - "runs": 32 + "passed": 13, + "runs": 13 }, - "fault_runs": 4, + "fault_runs": 1, "java_failed": false, - "oracle_image": "sha256:d7e387df360c519ce8945a1f6d748c8dafab06f50551b23ddf85d6373a4dcd6e", + "oracle_image": "sha256:ec3ecd98686860217630b1fce29265628e980a353ddd3d2d96d16332e8800c64", "oracle_matches_pin": true, - "records_compared": 92, - "records_equal": 92, - "runs": 32, - "scenarios": 32, - "scenarios_equal": 32, + "records_compared": 35, + "records_equal": 35, + "runs": 13, + "scenarios": 13, + "scenarios_equal": 13, "stale_inputs": [ "harness", "oracle", @@ -8140,30 +8074,6 @@ "paragraph coverage >= 100.0 (coverage not measured: no fresh det-sweep ledger entry and no local sweep)" ], "oracle_backing": [ - { - "backed": false, - "command": "ENDBR", - "crucible_cases": [], - "facts_stated": [], - "registers": [], - "spec_entry": "full" - }, - { - "backed": false, - "command": "READNEXT", - "crucible_cases": [], - "facts_stated": [], - "registers": [], - "spec_entry": "full" - }, - { - "backed": false, - "command": "READPREV", - "crucible_cases": [], - "facts_stated": [], - "registers": [], - "spec_entry": "full" - }, { "backed": true, "command": "RECEIVE MAP", @@ -8323,7 +8233,7 @@ }, { "backed": false, - "command": "STARTBR", + "command": "WRITE", "crucible_cases": [], "facts_stated": [], "registers": [], @@ -8359,17 +8269,14 @@ "spec_entry": "full" } ], - "program": "app/cbl/COUSR00C.cbl", + "program": "app/cbl/COUSR01C.cbl", "residual": { "assumed_or_differs_named": [], "branch_outcomes_unrun": null, - "commands": 8, + "commands": 5, "commands_backed": 4, "commands_not_backed": [ - "ENDBR", - "READNEXT", - "READPREV", - "STARTBR" + "WRITE" ], "facts_unstated": 0, "holes": 0, @@ -8382,8 +8289,8 @@ "holes": [], "refused": null, "source_defects": [], - "statements": 288, - "translated": 288, + "statements": 94, + "translated": 94, "whole": true } }, @@ -8391,7 +8298,20 @@ "assumptions": { "facts_stated": [], "facts_unstated": [], - "named_by_commands": [], + "named_by_commands": [ + { + "area": "CICS", + "entry": "READ ... INTO LENGTH: in-out, truncation and LENGERR; a VSAM file's LENGTH need not equal its record length; LENGERR on READ UPDATE refused", + "id": "X14", + "status": "ASSUMED (REFUSED where IBM is silent)" + }, + { + "area": "CICS", + "entry": "READ GTEQ / GENERIC on a KSDS: the first record whose key (or its first KEYLENGTH bytes) equals RIDFLD's or, with GTEQ, is greater, in the browse's key order (D1); NOTFND RESP2 80; READ UPDATE holds the record found; RIDFLD not updated; a GENERIC KEYLENGTH not shorter than the key or not above zero, a non-constant KEYLENGTH and a RIDFLD shorter than the key searched refused", + "id": "X22", + "status": "ASSUMED (REFUSED where IBM is silent or the layout decides)" + } + ], "reach": "not measured", "source_read": true }, @@ -8405,12 +8325,21 @@ "infeasible_stated": [ { "family": "G", - "key": "RETURN-TO-PREV-SCREEN:167:true", + "key": "RETURN-TO-PREV-SCREEN:252:true", "kind": "IF", - "line": 167, + "line": 252, "outcome": "true", - "reason": "`IF CDEMO-TO-PROGRAM = LOW-VALUES OR SPACES` in RETURN-TO-PREV-SCREEN: the paragraph is only PERFORMed, and every PERFORM of it comes right after a MOVE of a non-blank program name into CDEMO-TO-PROGRAM (line 79 moves 'COSGN00C' and line 94 'COADM01C'; both fields PIC X(08), COCOM01Y). COUSR01C never moves SPACES or LOW-VALUES into it in between.", + "reason": "`IF CDEMO-TO-PROGRAM = LOW-VALUES OR SPACES` in RETURN-TO-PREV-SCREEN: the paragraph is only PERFORMed, and every PERFORM of it comes right after a MOVE of a non-blank program name into CDEMO-TO-PROGRAM (lines 91, 114 and 125 move 'COSGN00C' / 'COADM01C', and line 117 moves CDEMO-FROM-PROGRAM only after testing it is neither SPACES nor LOW-VALUES; both fields PIC X(08), COCOM01Y). COUSR02C never moves SPACES or LOW-VALUES into it in between.", "unit": "RETURN-TO-PREV-SCREEN" + }, + { + "family": "R", + "key": "UPDATE-USER-SEC-FILE:368:WHEN@377", + "kind": "EVALUATE", + "line": 368, + "outcome": "WHEN@377", + "reason": "`WHEN DFHRESP(NOTFND)` after `EXEC CICS REWRITE DATASET(WS-USRSEC-FILE)` (line 360): REWRITE has no RIDFLD and updates the record the READ ... UPDATE at line 322 holds; IBM's REWRITE conditions do not include NOTFND (https://www.ibm.com/docs/en/cics-ts/6.x?topic=summary-rewrite; our spec, gitgalaxy/standards/cics/commands/files.py, lists NORMAL and INVREQ).", + "unit": "UPDATE-USER-SEC-FILE" } ], "paragraph_pct": null, @@ -8422,8 +8351,8 @@ "equivalence": { "cases": [ { - "case": "carddemo-useradd", - "case_scenarios": 13, + "case": "carddemo-userupd", + "case_scenarios": 23, "db2": false, "det": { "source": "CI det-sweep ratchet on main", @@ -8432,31 +8361,32 @@ "record": { "coverage": { "branches": { - "covered": 20, - "total": 21 + "covered": 44, + "total": 46 }, "paragraphs": { - "covered": 9, - "live": 9 + "covered": 11, + "live": 11 }, "uncovered_branches": [ - "line 167 IF true (RETURN-TO-PREV-SCREEN)" + "line 252 IF true (RETURN-TO-PREV-SCREEN)", + "line 368 EVALUATE WHEN@377 (UPDATE-USER-SEC-FILE)" ] }, "db2": false, "facade": { - "passed": 13, - "runs": 13 + "passed": 23, + "runs": 23 }, - "fault_runs": 1, + "fault_runs": 2, "java_failed": false, - "oracle_image": "sha256:ec3ecd98686860217630b1fce29265628e980a353ddd3d2d96d16332e8800c64", + "oracle_image": "sha256:d7e387df360c519ce8945a1f6d748c8dafab06f50551b23ddf85d6373a4dcd6e", "oracle_matches_pin": true, - "records_compared": 35, - "records_equal": 35, - "runs": 13, - "scenarios": 13, - "scenarios_equal": 13, + "records_compared": 74, + "records_equal": 74, + "runs": 23, + "scenarios": 23, + "scenarios_equal": 23, "stale_inputs": [ "harness", "oracle", @@ -8469,8 +8399,8 @@ } ], "chosen": { - "case": "carddemo-useradd", - "case_scenarios": 13, + "case": "carddemo-userupd", + "case_scenarios": 23, "db2": false, "det": { "source": "CI det-sweep ratchet on main", @@ -8479,31 +8409,32 @@ "record": { "coverage": { "branches": { - "covered": 20, - "total": 21 + "covered": 44, + "total": 46 }, "paragraphs": { - "covered": 9, - "live": 9 + "covered": 11, + "live": 11 }, "uncovered_branches": [ - "line 167 IF true (RETURN-TO-PREV-SCREEN)" + "line 252 IF true (RETURN-TO-PREV-SCREEN)", + "line 368 EVALUATE WHEN@377 (UPDATE-USER-SEC-FILE)" ] }, "db2": false, "facade": { - "passed": 13, - "runs": 13 + "passed": 23, + "runs": 23 }, - "fault_runs": 1, + "fault_runs": 2, "java_failed": false, - "oracle_image": "sha256:ec3ecd98686860217630b1fce29265628e980a353ddd3d2d96d16332e8800c64", + "oracle_image": "sha256:d7e387df360c519ce8945a1f6d748c8dafab06f50551b23ddf85d6373a4dcd6e", "oracle_matches_pin": true, - "records_compared": 35, - "records_equal": 35, - "runs": 13, - "scenarios": 13, - "scenarios_equal": 13, + "records_compared": 74, + "records_equal": 74, + "runs": 23, + "scenarios": 23, + "scenarios_equal": 23, "stale_inputs": [ "harness", "oracle", @@ -8523,6 +8454,17 @@ "paragraph coverage >= 100.0 (coverage not measured: no fresh det-sweep ledger entry and no local sweep)" ], "oracle_backing": [ + { + "backed": false, + "command": "READ", + "crucible_cases": [], + "facts_stated": [], + "registers": [ + "X14", + "X22" + ], + "spec_entry": "full" + }, { "backed": true, "command": "RECEIVE MAP", @@ -8651,6 +8593,14 @@ "registers": [], "spec_entry": "full" }, + { + "backed": false, + "command": "REWRITE", + "crucible_cases": [], + "facts_stated": [], + "registers": [], + "spec_entry": "full" + }, { "backed": true, "command": "SEND MAP", @@ -8680,14 +8630,6 @@ "registers": [], "spec_entry": "full" }, - { - "backed": false, - "command": "WRITE", - "crucible_cases": [], - "facts_stated": [], - "registers": [], - "spec_entry": "full" - }, { "backed": true, "command": "XCTL", @@ -8718,14 +8660,18 @@ "spec_entry": "full" } ], - "program": "app/cbl/COUSR01C.cbl", + "program": "app/cbl/COUSR02C.cbl", "residual": { - "assumed_or_differs_named": [], + "assumed_or_differs_named": [ + "X14", + "X22" + ], "branch_outcomes_unrun": null, - "commands": 5, + "commands": 6, "commands_backed": 4, "commands_not_backed": [ - "WRITE" + "READ", + "REWRITE" ], "facts_unstated": 0, "holes": 0, @@ -8738,8 +8684,8 @@ "holes": [], "refused": null, "source_defects": [], - "statements": 94, - "translated": 94, + "statements": 148, + "translated": 148, "whole": true } }, @@ -8774,21 +8720,21 @@ "infeasible_stated": [ { "family": "G", - "key": "RETURN-TO-PREV-SCREEN:252:true", + "key": "RETURN-TO-PREV-SCREEN:199:true", "kind": "IF", - "line": 252, + "line": 199, "outcome": "true", - "reason": "`IF CDEMO-TO-PROGRAM = LOW-VALUES OR SPACES` in RETURN-TO-PREV-SCREEN: the paragraph is only PERFORMed, and every PERFORM of it comes right after a MOVE of a non-blank program name into CDEMO-TO-PROGRAM (lines 91, 114 and 125 move 'COSGN00C' / 'COADM01C', and line 117 moves CDEMO-FROM-PROGRAM only after testing it is neither SPACES nor LOW-VALUES; both fields PIC X(08), COCOM01Y). COUSR02C never moves SPACES or LOW-VALUES into it in between.", + "reason": "`IF CDEMO-TO-PROGRAM = LOW-VALUES OR SPACES` in RETURN-TO-PREV-SCREEN: the paragraph is only PERFORMed, and every PERFORM of it comes right after a MOVE of a non-blank program name into CDEMO-TO-PROGRAM (lines 91, 113 and 124 move 'COSGN00C' / 'COADM01C', and line 116 moves CDEMO-FROM-PROGRAM only after testing it is neither SPACES nor LOW-VALUES; both fields PIC X(08), COCOM01Y). COUSR03C never moves SPACES or LOW-VALUES into it in between.", "unit": "RETURN-TO-PREV-SCREEN" }, { "family": "R", - "key": "UPDATE-USER-SEC-FILE:368:WHEN@377", + "key": "DELETE-USER-SEC-FILE:313:WHEN@323", "kind": "EVALUATE", - "line": 368, - "outcome": "WHEN@377", - "reason": "`WHEN DFHRESP(NOTFND)` after `EXEC CICS REWRITE DATASET(WS-USRSEC-FILE)` (line 360): REWRITE has no RIDFLD and updates the record the READ ... UPDATE at line 322 holds; IBM's REWRITE conditions do not include NOTFND (https://www.ibm.com/docs/en/cics-ts/6.x?topic=summary-rewrite; our spec, gitgalaxy/standards/cics/commands/files.py, lists NORMAL and INVREQ).", - "unit": "UPDATE-USER-SEC-FILE" + "line": 313, + "outcome": "WHEN@323", + "reason": "`WHEN DFHRESP(NOTFND)` after `EXEC CICS DELETE DATASET(WS-USRSEC-FILE)` (line 307) with no RIDFLD: it deletes the record READ-USER-SEC-FILE's READ ... UPDATE (line 269) holds, PERFORMed just before it (lines 190-191). IBM's DELETE raises NOTFND only when the RIDFLD search argument is not found (https://www.ibm.com/docs/en/cics-ts/6.x?topic=summary-delete); with no RIDFLD the failure is INVREQ.", + "unit": "DELETE-USER-SEC-FILE" } ], "paragraph_pct": null, @@ -8800,8 +8746,8 @@ "equivalence": { "cases": [ { - "case": "carddemo-userupd", - "case_scenarios": 23, + "case": "carddemo-userdel", + "case_scenarios": 18, "db2": false, "det": { "source": "CI det-sweep ratchet on main", @@ -8810,32 +8756,32 @@ "record": { "coverage": { "branches": { - "covered": 44, - "total": 46 + "covered": 30, + "total": 32 }, "paragraphs": { "covered": 11, "live": 11 }, "uncovered_branches": [ - "line 252 IF true (RETURN-TO-PREV-SCREEN)", - "line 368 EVALUATE WHEN@377 (UPDATE-USER-SEC-FILE)" + "line 199 IF true (RETURN-TO-PREV-SCREEN)", + "line 313 EVALUATE WHEN@323 (DELETE-USER-SEC-FILE)" ] }, "db2": false, "facade": { - "passed": 23, - "runs": 23 + "passed": 18, + "runs": 18 }, "fault_runs": 2, "java_failed": false, "oracle_image": "sha256:d7e387df360c519ce8945a1f6d748c8dafab06f50551b23ddf85d6373a4dcd6e", "oracle_matches_pin": true, - "records_compared": 74, - "records_equal": 74, - "runs": 23, - "scenarios": 23, - "scenarios_equal": 23, + "records_compared": 54, + "records_equal": 54, + "runs": 18, + "scenarios": 18, + "scenarios_equal": 18, "stale_inputs": [ "harness", "oracle", @@ -8848,8 +8794,8 @@ } ], "chosen": { - "case": "carddemo-userupd", - "case_scenarios": 23, + "case": "carddemo-userdel", + "case_scenarios": 18, "db2": false, "det": { "source": "CI det-sweep ratchet on main", @@ -8858,32 +8804,32 @@ "record": { "coverage": { "branches": { - "covered": 44, - "total": 46 + "covered": 30, + "total": 32 }, "paragraphs": { "covered": 11, "live": 11 }, "uncovered_branches": [ - "line 252 IF true (RETURN-TO-PREV-SCREEN)", - "line 368 EVALUATE WHEN@377 (UPDATE-USER-SEC-FILE)" + "line 199 IF true (RETURN-TO-PREV-SCREEN)", + "line 313 EVALUATE WHEN@323 (DELETE-USER-SEC-FILE)" ] }, "db2": false, "facade": { - "passed": 23, - "runs": 23 + "passed": 18, + "runs": 18 }, "fault_runs": 2, "java_failed": false, "oracle_image": "sha256:d7e387df360c519ce8945a1f6d748c8dafab06f50551b23ddf85d6373a4dcd6e", "oracle_matches_pin": true, - "records_compared": 74, - "records_equal": 74, - "runs": 23, - "scenarios": 23, - "scenarios_equal": 23, + "records_compared": 54, + "records_equal": 54, + "runs": 18, + "scenarios": 18, + "scenarios_equal": 18, "stale_inputs": [ "harness", "oracle", @@ -8903,6 +8849,14 @@ "paragraph coverage >= 100.0 (coverage not measured: no fresh det-sweep ledger entry and no local sweep)" ], "oracle_backing": [ + { + "backed": false, + "command": "DELETE", + "crucible_cases": [], + "facts_stated": [], + "registers": [], + "spec_entry": "full" + }, { "backed": false, "command": "READ", @@ -9042,14 +8996,6 @@ "registers": [], "spec_entry": "full" }, - { - "backed": false, - "command": "REWRITE", - "crucible_cases": [], - "facts_stated": [], - "registers": [], - "spec_entry": "full" - }, { "backed": true, "command": "SEND MAP", @@ -9109,7 +9055,7 @@ "spec_entry": "full" } ], - "program": "app/cbl/COUSR02C.cbl", + "program": "app/cbl/COUSR03C.cbl", "residual": { "assumed_or_differs_named": [ "X14", @@ -9119,8 +9065,8 @@ "commands": 6, "commands_backed": 4, "commands_not_backed": [ - "READ", - "REWRITE" + "DELETE", + "READ" ], "facts_unstated": 0, "holes": 0, @@ -9133,8 +9079,8 @@ "holes": [], "refused": null, "source_defects": [], - "statements": 148, - "translated": 148, + "statements": 115, + "translated": 115, "whole": true } }, @@ -9142,20 +9088,7 @@ "assumptions": { "facts_stated": [], "facts_unstated": [], - "named_by_commands": [ - { - "area": "CICS", - "entry": "READ ... INTO LENGTH: in-out, truncation and LENGERR; a VSAM file's LENGTH need not equal its record length; LENGERR on READ UPDATE refused", - "id": "X14", - "status": "ASSUMED (REFUSED where IBM is silent)" - }, - { - "area": "CICS", - "entry": "READ GTEQ / GENERIC on a KSDS: the first record whose key (or its first KEYLENGTH bytes) equals RIDFLD's or, with GTEQ, is greater, in the browse's key order (D1); NOTFND RESP2 80; READ UPDATE holds the record found; RIDFLD not updated; a GENERIC KEYLENGTH not shorter than the key or not above zero, a non-constant KEYLENGTH and a RIDFLD shorter than the key searched refused", - "id": "X22", - "status": "ASSUMED (REFUSED where IBM is silent or the layout decides)" - } - ], + "named_by_commands": [], "reach": "not measured", "source_read": true }, @@ -9166,26 +9099,7 @@ "branches_net": null, "infeasible_netted": [], "infeasible_refuted": [], - "infeasible_stated": [ - { - "family": "G", - "key": "RETURN-TO-PREV-SCREEN:199:true", - "kind": "IF", - "line": 199, - "outcome": "true", - "reason": "`IF CDEMO-TO-PROGRAM = LOW-VALUES OR SPACES` in RETURN-TO-PREV-SCREEN: the paragraph is only PERFORMed, and every PERFORM of it comes right after a MOVE of a non-blank program name into CDEMO-TO-PROGRAM (lines 91, 113 and 124 move 'COSGN00C' / 'COADM01C', and line 116 moves CDEMO-FROM-PROGRAM only after testing it is neither SPACES nor LOW-VALUES; both fields PIC X(08), COCOM01Y). COUSR03C never moves SPACES or LOW-VALUES into it in between.", - "unit": "RETURN-TO-PREV-SCREEN" - }, - { - "family": "R", - "key": "DELETE-USER-SEC-FILE:313:WHEN@323", - "kind": "EVALUATE", - "line": 313, - "outcome": "WHEN@323", - "reason": "`WHEN DFHRESP(NOTFND)` after `EXEC CICS DELETE DATASET(WS-USRSEC-FILE)` (line 307) with no RIDFLD: it deletes the record READ-USER-SEC-FILE's READ ... UPDATE (line 269) holds, PERFORMed just before it (lines 190-191). IBM's DELETE raises NOTFND only when the RIDFLD search argument is not found (https://www.ibm.com/docs/en/cics-ts/6.x?topic=summary-delete); with no RIDFLD the failure is INVREQ.", - "unit": "DELETE-USER-SEC-FILE" - } - ], + "infeasible_stated": [], "paragraph_pct": null, "paragraphs": null, "source": null, @@ -9195,8 +9109,8 @@ "equivalence": { "cases": [ { - "case": "carddemo-userdel", - "case_scenarios": 18, + "case": "carddemo-dateutil", + "case_scenarios": null, "db2": false, "det": { "source": "CI det-sweep ratchet on main", @@ -9205,32 +9119,33 @@ "record": { "coverage": { "branches": { - "covered": 30, - "total": 32 + "covered": 4, + "total": 10 }, "paragraphs": { - "covered": 11, - "live": 11 + "covered": 2, + "live": 2 }, "uncovered_branches": [ - "line 199 IF true (RETURN-TO-PREV-SCREEN)", - "line 313 EVALUATE WHEN@323 (DELETE-USER-SEC-FILE)" + "line 128 EVALUATE WHEN@131 (A000-MAIN)", + "line 128 EVALUATE WHEN@135 (A000-MAIN)", + "line 128 EVALUATE WHEN@139 (A000-MAIN)", + "line 128 EVALUATE WHEN@141 (A000-MAIN)", + "line 128 EVALUATE WHEN@145 (A000-MAIN)", + "line 128 EVALUATE OTHER (A000-MAIN)" ] }, "db2": false, - "facade": { - "passed": 18, - "runs": 18 - }, - "fault_runs": 2, + "facade": null, + "fault_runs": 0, "java_failed": false, - "oracle_image": "sha256:d7e387df360c519ce8945a1f6d748c8dafab06f50551b23ddf85d6373a4dcd6e", + "oracle_image": "sha256:ec3ecd98686860217630b1fce29265628e980a353ddd3d2d96d16332e8800c64", "oracle_matches_pin": true, - "records_compared": 54, - "records_equal": 54, - "runs": 18, - "scenarios": 18, - "scenarios_equal": 18, + "records_compared": 17, + "records_equal": 17, + "runs": 1, + "scenarios": 1, + "scenarios_equal": 1, "stale_inputs": [ "harness", "oracle", @@ -9243,8 +9158,8 @@ } ], "chosen": { - "case": "carddemo-userdel", - "case_scenarios": 18, + "case": "carddemo-dateutil", + "case_scenarios": null, "db2": false, "det": { "source": "CI det-sweep ratchet on main", @@ -9253,32 +9168,33 @@ "record": { "coverage": { "branches": { - "covered": 30, - "total": 32 + "covered": 4, + "total": 10 }, "paragraphs": { - "covered": 11, - "live": 11 + "covered": 2, + "live": 2 }, "uncovered_branches": [ - "line 199 IF true (RETURN-TO-PREV-SCREEN)", - "line 313 EVALUATE WHEN@323 (DELETE-USER-SEC-FILE)" + "line 128 EVALUATE WHEN@131 (A000-MAIN)", + "line 128 EVALUATE WHEN@135 (A000-MAIN)", + "line 128 EVALUATE WHEN@139 (A000-MAIN)", + "line 128 EVALUATE WHEN@141 (A000-MAIN)", + "line 128 EVALUATE WHEN@145 (A000-MAIN)", + "line 128 EVALUATE OTHER (A000-MAIN)" ] }, "db2": false, - "facade": { - "passed": 18, - "runs": 18 - }, - "fault_runs": 2, + "facade": null, + "fault_runs": 0, "java_failed": false, - "oracle_image": "sha256:d7e387df360c519ce8945a1f6d748c8dafab06f50551b23ddf85d6373a4dcd6e", + "oracle_image": "sha256:ec3ecd98686860217630b1fce29265628e980a353ddd3d2d96d16332e8800c64", "oracle_matches_pin": true, - "records_compared": 54, - "records_equal": 54, - "runs": 18, - "scenarios": 18, - "scenarios_equal": 18, + "records_compared": 17, + "records_equal": 17, + "runs": 1, + "scenarios": 1, + "scenarios_equal": 1, "stale_inputs": [ "harness", "oracle", @@ -9297,24 +9213,217 @@ "next": [ "paragraph coverage >= 100.0 (coverage not measured: no fresh det-sweep ledger entry and no local sweep)" ], + "oracle_backing": [], + "program": "app/cbl/CSUTLDTC.cbl", + "residual": { + "assumed_or_differs_named": [], + "branch_outcomes_unrun": null, + "commands": 0, + "commands_backed": 0, + "commands_not_backed": [], + "facts_unstated": 0, + "holes": 0, + "paragraphs_unrun": null, + "refused": null + }, + "translation": { + "gap_classes": [], + "hole_count": 0, + "holes": [], + "refused": null, + "source_defects": [], + "statements": 27, + "translated": 27, + "whole": true + } + }, + { + "assumptions": { + "facts_stated": [], + "facts_unstated": [], + "named_by_commands": [], + "reach": "not measured", + "source_read": true + }, + "coverage": { + "branch_net_pct": null, + "branch_pct": null, + "branches": null, + "branches_net": null, + "infeasible_netted": [], + "infeasible_refuted": [], + "infeasible_stated": [], + "paragraph_pct": null, + "paragraphs": null, + "source": null, + "uncovered_branches": [], + "uncovered_paragraphs": "not recorded" + }, + "equivalence": { + "cases": [ + { + "case": "carddemo-cobtupdt", + "case_scenarios": null, + "db2": true, + "det": { + "state": "not run", + "why": [ + "a Db2 case: CI's det-sweep skips Db2 cases and no local sweep was given" + ] + }, + "record": null, + "role": "program" + } + ], + "chosen": { + "case": "carddemo-cobtupdt", + "case_scenarios": null, + "db2": true, + "det": { + "state": "not run", + "why": [ + "a Db2 case: CI's det-sweep skips Db2 cases and no local sweep was given" + ] + }, + "record": null, + "role": "program" + } + }, + "level": "L1", + "mutation": { + "det_port": "not yet measured (#4628)" + }, + "next": [ + "its det port equal on every scenario of carddemo-cobtupdt: a Db2 case: CI's det-sweep skips Db2 cases and no local sweep was given" + ], + "oracle_backing": [], + "program": "app/app-transaction-type-db2/cbl/COBTUPDT.cbl", + "residual": { + "assumed_or_differs_named": [], + "branch_outcomes_unrun": null, + "commands": 0, + "commands_backed": 0, + "commands_not_backed": [], + "facts_unstated": 0, + "holes": 0, + "paragraphs_unrun": null, + "refused": null + }, + "translation": { + "gap_classes": [], + "hole_count": 0, + "holes": [], + "refused": null, + "source_defects": [], + "statements": 58, + "translated": 58, + "whole": true + } + }, + { + "assumptions": { + "facts_stated": [], + "facts_unstated": [], + "named_by_commands": [ + { + "area": "CICS", + "entry": "Backout: recoverable files and Db2 undone, RECOVERY(NONE) files kept", + "id": "X3", + "status": "MATCHED" + }, + { + "area": "CICS", + "entry": "SEND TEXT on the det port and the stub: TERMINAL accepted as the default output disposition (the principal facility; the event is that of SEND TEXT without it); ACCUM, PAGING, SET, REQID, HEADER, TRAILER, JUSTIFY / JUSFIRST / JUSLAST, the printer, partition and LDC options, MSR, FMHPARM, DEFAULT / ALTERNATE refused", + "id": "X20", + "status": "MATCHED (REFUSED where the region cannot decide)" + } + ], + "reach": "not measured", + "source_read": true + }, + "coverage": { + "branch_net_pct": null, + "branch_pct": null, + "branches": null, + "branches_net": null, + "infeasible_netted": [], + "infeasible_refuted": [], + "infeasible_stated": [], + "paragraph_pct": null, + "paragraphs": null, + "source": null, + "uncovered_branches": [], + "uncovered_paragraphs": "not recorded" + }, + "equivalence": { + "cases": [ + { + "case": "carddemo-cotrtupc", + "case_scenarios": 34, + "db2": true, + "det": { + "state": "not run", + "why": [ + "a Db2 case: CI's det-sweep skips Db2 cases and no local sweep was given" + ] + }, + "record": null, + "role": "program" + } + ], + "chosen": { + "case": "carddemo-cotrtupc", + "case_scenarios": 34, + "db2": true, + "det": { + "state": "not run", + "why": [ + "a Db2 case: CI's det-sweep skips Db2 cases and no local sweep was given" + ] + }, + "record": null, + "role": "program" + } + }, + "level": "L1", + "mutation": { + "det_port": "not yet measured (#4628)" + }, + "next": [ + "its det port equal on every scenario of carddemo-cotrtupc: a Db2 case: CI's det-sweep skips Db2 cases and no local sweep was given" + ], "oracle_backing": [ { - "backed": false, - "command": "DELETE", - "crucible_cases": [], + "backed": true, + "command": "ABEND", + "crucible_cases": [ + { + "case": "gt-start-retrieve", + "java_agrees": true, + "stub_agrees": true + }, + { + "case": "hc-abend-link", + "java_agrees": true, + "stub_agrees": true + } + ], "facts_stated": [], "registers": [], "spec_entry": "full" }, { - "backed": false, - "command": "READ", - "crucible_cases": [], - "facts_stated": [], - "registers": [ - "X14", - "X22" + "backed": true, + "command": "HANDLE ABEND", + "crucible_cases": [ + { + "case": "hc-abend-link", + "java_agrees": true, + "stub_agrees": true + } ], + "facts_stated": [], + "registers": [], "spec_entry": "full" }, { @@ -9474,6 +9583,102 @@ "registers": [], "spec_entry": "full" }, + { + "backed": true, + "command": "SEND TEXT", + "crucible_cases": [ + { + "case": "ca-link-lengths", + "java_agrees": true, + "stub_agrees": true + }, + { + "case": "ca-xctl-versions", + "java_agrees": true, + "stub_agrees": true + }, + { + "case": "gt-assign-startcode", + "java_agrees": false, + "stub_agrees": true + }, + { + "case": "gt-start-options", + "java_agrees": false, + "stub_agrees": true + }, + { + "case": "gt-start-retrieve", + "java_agrees": true, + "stub_agrees": true + }, + { + "case": "gt-terminal-coalesce", + "java_agrees": true, + "stub_agrees": true + }, + { + "case": "hc-abend-link", + "java_agrees": true, + "stub_agrees": true + }, + { + "case": "hc-eoc-error", + "java_agrees": false, + "stub_agrees": true + }, + { + "case": "hc-handle-aid", + "java_agrees": false, + "stub_agrees": true + }, + { + "case": "hc-ignore-error", + "java_agrees": false, + "stub_agrees": true + }, + { + "case": "hc-perform-range", + "java_agrees": true, + "stub_agrees": true + }, + { + "case": "hc-terminal-eoc", + "java_agrees": false, + "stub_agrees": true + }, + { + "case": "hc-terminal-receive", + "java_agrees": false, + "stub_agrees": true + }, + { + "case": "pc-aid-menu", + "java_agrees": true, + "stub_agrees": true + }, + { + "case": "pc-wizard", + "java_agrees": true, + "stub_agrees": true + } + ], + "facts_stated": [], + "registers": [ + "X20" + ], + "spec_entry": "full" + }, + { + "backed": false, + "command": "SYNCPOINT", + "crucible_cases": [], + "facts_stated": [], + "registers": [ + "X3" + ], + "spec_entry": "full" + }, { "backed": true, "command": "XCTL", @@ -9504,166 +9709,66 @@ "spec_entry": "full" } ], - "program": "app/cbl/COUSR03C.cbl", + "program": "app/app-transaction-type-db2/cbl/COTRTUPC.cbl", "residual": { - "assumed_or_differs_named": [ - "X14", - "X22" - ], + "assumed_or_differs_named": [], "branch_outcomes_unrun": null, - "commands": 6, - "commands_backed": 4, + "commands": 8, + "commands_backed": 7, "commands_not_backed": [ - "DELETE", - "READ" + "SYNCPOINT" ], "facts_unstated": 0, - "holes": 0, - "paragraphs_unrun": null, - "refused": null - }, - "translation": { - "gap_classes": [], - "hole_count": 0, - "holes": [], - "refused": null, - "source_defects": [], - "statements": 115, - "translated": 115, - "whole": true - } - }, - { - "assumptions": { - "facts_stated": [], - "facts_unstated": [], - "named_by_commands": [], - "reach": "not measured", - "source_read": true - }, - "coverage": { - "branch_net_pct": null, - "branch_pct": null, - "branches": null, - "branches_net": null, - "infeasible_netted": [], - "infeasible_refuted": [], - "infeasible_stated": [], - "paragraph_pct": null, - "paragraphs": null, - "source": null, - "uncovered_branches": [], - "uncovered_paragraphs": "not recorded" - }, - "equivalence": { - "cases": [ - { - "case": "carddemo-dateutil", - "case_scenarios": null, - "db2": false, - "det": { - "source": "CI det-sweep ratchet on main", - "state": "equal" - }, - "record": { - "coverage": { - "branches": { - "covered": 4, - "total": 10 - }, - "paragraphs": { - "covered": 2, - "live": 2 - }, - "uncovered_branches": [ - "line 128 EVALUATE WHEN@131 (A000-MAIN)", - "line 128 EVALUATE WHEN@135 (A000-MAIN)", - "line 128 EVALUATE WHEN@139 (A000-MAIN)", - "line 128 EVALUATE WHEN@141 (A000-MAIN)", - "line 128 EVALUATE WHEN@145 (A000-MAIN)", - "line 128 EVALUATE OTHER (A000-MAIN)" - ] - }, - "db2": false, - "facade": null, - "fault_runs": 0, - "java_failed": false, - "oracle_image": "sha256:ec3ecd98686860217630b1fce29265628e980a353ddd3d2d96d16332e8800c64", - "oracle_matches_pin": true, - "records_compared": 17, - "records_equal": 17, - "runs": 1, - "scenarios": 1, - "scenarios_equal": 1, - "stale_inputs": [ - "harness", - "oracle", - "generator" - ], - "status_at_build": "stale", - "verdict": "all equal" - }, - "role": "program" - } - ], - "chosen": { - "case": "carddemo-dateutil", - "case_scenarios": null, - "db2": false, - "det": { - "source": "CI det-sweep ratchet on main", - "state": "equal" - }, - "record": { - "coverage": { - "branches": { - "covered": 4, - "total": 10 - }, - "paragraphs": { - "covered": 2, - "live": 2 - }, - "uncovered_branches": [ - "line 128 EVALUATE WHEN@131 (A000-MAIN)", - "line 128 EVALUATE WHEN@135 (A000-MAIN)", - "line 128 EVALUATE WHEN@139 (A000-MAIN)", - "line 128 EVALUATE WHEN@141 (A000-MAIN)", - "line 128 EVALUATE WHEN@145 (A000-MAIN)", - "line 128 EVALUATE OTHER (A000-MAIN)" - ] - }, - "db2": false, - "facade": null, - "fault_runs": 0, - "java_failed": false, - "oracle_image": "sha256:ec3ecd98686860217630b1fce29265628e980a353ddd3d2d96d16332e8800c64", - "oracle_matches_pin": true, - "records_compared": 17, - "records_equal": 17, - "runs": 1, - "scenarios": 1, - "scenarios_equal": 1, - "stale_inputs": [ - "harness", - "oracle", - "generator" - ], - "status_at_build": "stale", - "verdict": "all equal" - }, - "role": "program" - } + "holes": 0, + "paragraphs_unrun": null, + "refused": null }, - "level": "L2", + "translation": { + "gap_classes": [], + "hole_count": 0, + "holes": [], + "refused": null, + "source_defects": [], + "statements": 436, + "translated": 436, + "whole": true + } + }, + { + "assumptions": { + "facts_stated": [], + "facts_unstated": [], + "named_by_commands": [], + "reach": "not measured", + "source_read": true + }, + "coverage": { + "branch_net_pct": null, + "branch_pct": null, + "branches": null, + "branches_net": null, + "infeasible_netted": [], + "infeasible_refuted": [], + "infeasible_stated": [], + "paragraph_pct": null, + "paragraphs": null, + "source": null, + "uncovered_branches": [], + "uncovered_paragraphs": "not recorded" + }, + "equivalence": { + "cases": [], + "chosen": null + }, + "level": "L1", "mutation": { "det_port": "not yet measured (#4628)" }, "next": [ - "paragraph coverage >= 100.0 (coverage not measured: no fresh det-sweep ledger entry and no local sweep)" + "an equivalence case that runs it" ], "oracle_backing": [], - "program": "app/cbl/CSUTLDTC.cbl", + "program": "app/cbl/CBEXPORT.cbl", "residual": { "assumed_or_differs_named": [], "branch_outcomes_unrun": null, @@ -9681,8 +9786,8 @@ "holes": [], "refused": null, "source_defects": [], - "statements": 27, - "translated": 27, + "statements": 224, + "translated": 224, "whole": true } }, @@ -9709,44 +9814,18 @@ "uncovered_paragraphs": "not recorded" }, "equivalence": { - "cases": [ - { - "case": "carddemo-cobtupdt", - "case_scenarios": null, - "db2": true, - "det": { - "state": "not run", - "why": [ - "a Db2 case: CI's det-sweep skips Db2 cases and no local sweep was given" - ] - }, - "record": null, - "role": "program" - } - ], - "chosen": { - "case": "carddemo-cobtupdt", - "case_scenarios": null, - "db2": true, - "det": { - "state": "not run", - "why": [ - "a Db2 case: CI's det-sweep skips Db2 cases and no local sweep was given" - ] - }, - "record": null, - "role": "program" - } + "cases": [], + "chosen": null }, "level": "L1", "mutation": { "det_port": "not yet measured (#4628)" }, "next": [ - "its det port equal on every scenario of carddemo-cobtupdt: a Db2 case: CI's det-sweep skips Db2 cases and no local sweep was given" + "an equivalence case that runs it" ], "oracle_backing": [], - "program": "app/app-transaction-type-db2/cbl/COBTUPDT.cbl", + "program": "app/cbl/CBIMPORT.cbl", "residual": { "assumed_or_differs_named": [], "branch_outcomes_unrun": null, @@ -9764,8 +9843,8 @@ "holes": [], "refused": null, "source_defects": [], - "statements": 58, - "translated": 58, + "statements": 175, + "translated": 175, "whole": true } }, @@ -9776,15 +9855,15 @@ "named_by_commands": [ { "area": "CICS", - "entry": "Backout: recoverable files and Db2 undone, RECOVERY(NONE) files kept", - "id": "X3", - "status": "MATCHED" + "entry": "READ ... INTO LENGTH: in-out, truncation and LENGERR; a VSAM file's LENGTH need not equal its record length; LENGERR on READ UPDATE refused", + "id": "X14", + "status": "ASSUMED (REFUSED where IBM is silent)" }, { "area": "CICS", - "entry": "SEND TEXT on the det port and the stub: TERMINAL accepted as the default output disposition (the principal facility; the event is that of SEND TEXT without it); ACCUM, PAGING, SET, REQID, HEADER, TRAILER, JUSTIFY / JUSFIRST / JUSLAST, the printer, partition and LDC options, MSR, FMHPARM, DEFAULT / ALTERNATE refused", - "id": "X20", - "status": "MATCHED (REFUSED where the region cannot decide)" + "entry": "READ GTEQ / GENERIC on a KSDS: the first record whose key (or its first KEYLENGTH bytes) equals RIDFLD's or, with GTEQ, is greater, in the browse's key order (D1); NOTFND RESP2 80; READ UPDATE holds the record found; RIDFLD not updated; a GENERIC KEYLENGTH not shorter than the key or not above zero, a non-constant KEYLENGTH and a RIDFLD shorter than the key searched refused", + "id": "X22", + "status": "ASSUMED (REFUSED where IBM is silent or the layout decides)" } ], "reach": "not measured", @@ -9797,7 +9876,26 @@ "branches_net": null, "infeasible_netted": [], "infeasible_refuted": [], - "infeasible_stated": [], + "infeasible_stated": [ + { + "family": "G", + "key": "RETURN-TO-PREV-SCREEN:275:true", + "kind": "IF", + "line": 275, + "outcome": "true", + "reason": "`IF CDEMO-TO-PROGRAM = LOW-VALUES OR SPACES` in RETURN-TO-PREV-SCREEN: the paragraph is only PERFORMed, and every PERFORM of it comes right after a MOVE of a non-blank program name into CDEMO-TO-PROGRAM (line 108 moves 'COSGN00C', line 130 'COMEN01C', and line 133 moves CDEMO-FROM-PROGRAM only after line 129 tested it is neither SPACES nor LOW-VALUES; both fields PIC X(08), COCOM01Y). COBIL00C never moves SPACES or LOW-VALUES into it in between.", + "unit": "RETURN-TO-PREV-SCREEN" + }, + { + "family": "R", + "key": "UPDATE-ACCTDAT-FILE:387:WHEN@390", + "kind": "EVALUATE", + "line": 387, + "outcome": "WHEN@390", + "reason": "`WHEN DFHRESP(NOTFND)` after `EXEC CICS REWRITE DATASET(WS-ACCTDAT-FILE)` (line 379): REWRITE updates the record the READ ... UPDATE at line 345 holds; IBM's REWRITE conditions do not include NOTFND (https://www.ibm.com/docs/en/cics-ts/6.x?topic=summary-rewrite; our spec, gitgalaxy/standards/cics/commands/files.py, lists NORMAL and INVREQ).", + "unit": "UPDATE-ACCTDAT-FILE" + } + ], "paragraph_pct": null, "paragraphs": null, "source": null, @@ -9807,30 +9905,102 @@ "equivalence": { "cases": [ { - "case": "carddemo-cotrtupc", - "case_scenarios": 34, - "db2": true, + "case": "carddemo-billpay", + "case_scenarios": 25, + "db2": false, "det": { - "state": "not run", + "state": "not equal", "why": [ - "a Db2 case: CI's det-sweep skips Db2 cases and no local sweep was given" + "ledgered as differing in det_sweep_baseline.json (#4657): the det runtime's STARTBR NOTFND leaves EIBRESP2 0 where the stub gives 3; COBIL00C DISPLAYs it (the proof compares a task's DISPLAY output since #4635)" ] }, - "record": null, + "record": { + "coverage": { + "branches": { + "covered": 46, + "total": 48 + }, + "paragraphs": { + "covered": 16, + "live": 16 + }, + "uncovered_branches": [ + "line 275 IF true (RETURN-TO-PREV-SCREEN)", + "line 387 EVALUATE WHEN@390 (UPDATE-ACCTDAT-FILE)" + ] + }, + "db2": false, + "facade": { + "passed": 25, + "runs": 25 + }, + "fault_runs": 10, + "java_failed": false, + "oracle_image": "sha256:d7e387df360c519ce8945a1f6d748c8dafab06f50551b23ddf85d6373a4dcd6e", + "oracle_matches_pin": true, + "records_compared": 85, + "records_equal": 85, + "runs": 25, + "scenarios": 25, + "scenarios_equal": 25, + "stale_inputs": [ + "harness", + "oracle", + "generator" + ], + "status_at_build": "stale", + "verdict": "all equal" + }, "role": "program" } ], "chosen": { - "case": "carddemo-cotrtupc", - "case_scenarios": 34, - "db2": true, + "case": "carddemo-billpay", + "case_scenarios": 25, + "db2": false, "det": { - "state": "not run", + "state": "not equal", "why": [ - "a Db2 case: CI's det-sweep skips Db2 cases and no local sweep was given" + "ledgered as differing in det_sweep_baseline.json (#4657): the det runtime's STARTBR NOTFND leaves EIBRESP2 0 where the stub gives 3; COBIL00C DISPLAYs it (the proof compares a task's DISPLAY output since #4635)" ] }, - "record": null, + "record": { + "coverage": { + "branches": { + "covered": 46, + "total": 48 + }, + "paragraphs": { + "covered": 16, + "live": 16 + }, + "uncovered_branches": [ + "line 275 IF true (RETURN-TO-PREV-SCREEN)", + "line 387 EVALUATE WHEN@390 (UPDATE-ACCTDAT-FILE)" + ] + }, + "db2": false, + "facade": { + "passed": 25, + "runs": 25 + }, + "fault_runs": 10, + "java_failed": false, + "oracle_image": "sha256:d7e387df360c519ce8945a1f6d748c8dafab06f50551b23ddf85d6373a4dcd6e", + "oracle_matches_pin": true, + "records_compared": 85, + "records_equal": 85, + "runs": 25, + "scenarios": 25, + "scenarios_equal": 25, + "stale_inputs": [ + "harness", + "oracle", + "generator" + ], + "status_at_build": "stale", + "verdict": "all equal" + }, "role": "program" } }, @@ -9839,38 +10009,48 @@ "det_port": "not yet measured (#4628)" }, "next": [ - "its det port equal on every scenario of carddemo-cotrtupc: a Db2 case: CI's det-sweep skips Db2 cases and no local sweep was given" + "its det port equal on every scenario of carddemo-billpay: ledgered as differing in det_sweep_baseline.json (#4657): the det runtime's STARTBR NOTFND leaves EIBRESP2 0 where the stub gives 3; COBIL00C DISPLAYs it (the proof compares a task's DISPLAY output since #4635)" ], "oracle_backing": [ { - "backed": true, - "command": "ABEND", - "crucible_cases": [ - { - "case": "gt-start-retrieve", - "java_agrees": true, - "stub_agrees": true - }, - { - "case": "hc-abend-link", - "java_agrees": true, - "stub_agrees": true - } - ], + "backed": false, + "command": "ASKTIME", + "crucible_cases": [], + "facts_stated": [], + "registers": [], + "spec_entry": "full" + }, + { + "backed": false, + "command": "ENDBR", + "crucible_cases": [], + "facts_stated": [], + "registers": [], + "spec_entry": "full" + }, + { + "backed": false, + "command": "FORMATTIME", + "crucible_cases": [], + "facts_stated": [], + "registers": [], + "spec_entry": "full" + }, + { + "backed": false, + "command": "READ", + "crucible_cases": [], "facts_stated": [], - "registers": [], + "registers": [ + "X14", + "X22" + ], "spec_entry": "full" }, { - "backed": true, - "command": "HANDLE ABEND", - "crucible_cases": [ - { - "case": "hc-abend-link", - "java_agrees": true, - "stub_agrees": true - } - ], + "backed": false, + "command": "READPREV", + "crucible_cases": [], "facts_stated": [], "registers": [], "spec_entry": "full" @@ -10003,6 +10183,14 @@ "registers": [], "spec_entry": "full" }, + { + "backed": false, + "command": "REWRITE", + "crucible_cases": [], + "facts_stated": [], + "registers": [], + "spec_entry": "full" + }, { "backed": true, "command": "SEND MAP", @@ -10033,99 +10221,19 @@ "spec_entry": "full" }, { - "backed": true, - "command": "SEND TEXT", - "crucible_cases": [ - { - "case": "ca-link-lengths", - "java_agrees": true, - "stub_agrees": true - }, - { - "case": "ca-xctl-versions", - "java_agrees": true, - "stub_agrees": true - }, - { - "case": "gt-assign-startcode", - "java_agrees": false, - "stub_agrees": true - }, - { - "case": "gt-start-options", - "java_agrees": false, - "stub_agrees": true - }, - { - "case": "gt-start-retrieve", - "java_agrees": true, - "stub_agrees": true - }, - { - "case": "gt-terminal-coalesce", - "java_agrees": true, - "stub_agrees": true - }, - { - "case": "hc-abend-link", - "java_agrees": true, - "stub_agrees": true - }, - { - "case": "hc-eoc-error", - "java_agrees": false, - "stub_agrees": true - }, - { - "case": "hc-handle-aid", - "java_agrees": false, - "stub_agrees": true - }, - { - "case": "hc-ignore-error", - "java_agrees": false, - "stub_agrees": true - }, - { - "case": "hc-perform-range", - "java_agrees": true, - "stub_agrees": true - }, - { - "case": "hc-terminal-eoc", - "java_agrees": false, - "stub_agrees": true - }, - { - "case": "hc-terminal-receive", - "java_agrees": false, - "stub_agrees": true - }, - { - "case": "pc-aid-menu", - "java_agrees": true, - "stub_agrees": true - }, - { - "case": "pc-wizard", - "java_agrees": true, - "stub_agrees": true - } - ], + "backed": false, + "command": "STARTBR", + "crucible_cases": [], "facts_stated": [], - "registers": [ - "X20" - ], + "registers": [], "spec_entry": "full" }, { "backed": false, - "command": "SYNCPOINT", + "command": "WRITE", "crucible_cases": [], "facts_stated": [], - "registers": [ - "X3" - ], + "registers": [], "spec_entry": "full" }, { @@ -10158,14 +10266,24 @@ "spec_entry": "full" } ], - "program": "app/app-transaction-type-db2/cbl/COTRTUPC.cbl", + "program": "app/cbl/COBIL00C.cbl", "residual": { - "assumed_or_differs_named": [], + "assumed_or_differs_named": [ + "X14", + "X22" + ], "branch_outcomes_unrun": null, - "commands": 8, - "commands_backed": 7, + "commands": 12, + "commands_backed": 4, "commands_not_backed": [ - "SYNCPOINT" + "ASKTIME", + "ENDBR", + "FORMATTIME", + "READ", + "READPREV", + "REWRITE", + "STARTBR", + "WRITE" ], "facts_unstated": 0, "holes": 0, @@ -10178,122 +10296,8 @@ "holes": [], "refused": null, "source_defects": [], - "statements": 436, - "translated": 436, - "whole": true - } - }, - { - "assumptions": { - "facts_stated": [], - "facts_unstated": [], - "named_by_commands": [], - "reach": "not measured", - "source_read": true - }, - "coverage": { - "branch_net_pct": null, - "branch_pct": null, - "branches": null, - "branches_net": null, - "infeasible_netted": [], - "infeasible_refuted": [], - "infeasible_stated": [], - "paragraph_pct": null, - "paragraphs": null, - "source": null, - "uncovered_branches": [], - "uncovered_paragraphs": "not recorded" - }, - "equivalence": { - "cases": [], - "chosen": null - }, - "level": "L1", - "mutation": { - "det_port": "not yet measured (#4628)" - }, - "next": [ - "an equivalence case that runs it" - ], - "oracle_backing": [], - "program": "app/cbl/CBEXPORT.cbl", - "residual": { - "assumed_or_differs_named": [], - "branch_outcomes_unrun": null, - "commands": 0, - "commands_backed": 0, - "commands_not_backed": [], - "facts_unstated": 0, - "holes": 0, - "paragraphs_unrun": null, - "refused": null - }, - "translation": { - "gap_classes": [], - "hole_count": 0, - "holes": [], - "refused": null, - "source_defects": [], - "statements": 224, - "translated": 224, - "whole": true - } - }, - { - "assumptions": { - "facts_stated": [], - "facts_unstated": [], - "named_by_commands": [], - "reach": "not measured", - "source_read": true - }, - "coverage": { - "branch_net_pct": null, - "branch_pct": null, - "branches": null, - "branches_net": null, - "infeasible_netted": [], - "infeasible_refuted": [], - "infeasible_stated": [], - "paragraph_pct": null, - "paragraphs": null, - "source": null, - "uncovered_branches": [], - "uncovered_paragraphs": "not recorded" - }, - "equivalence": { - "cases": [], - "chosen": null - }, - "level": "L1", - "mutation": { - "det_port": "not yet measured (#4628)" - }, - "next": [ - "an equivalence case that runs it" - ], - "oracle_backing": [], - "program": "app/cbl/CBIMPORT.cbl", - "residual": { - "assumed_or_differs_named": [], - "branch_outcomes_unrun": null, - "commands": 0, - "commands_backed": 0, - "commands_not_backed": [], - "facts_unstated": 0, - "holes": 0, - "paragraphs_unrun": null, - "refused": null - }, - "translation": { - "gap_classes": [], - "hole_count": 0, - "holes": [], - "refused": null, - "source_defects": [], - "statements": 175, - "translated": 175, + "statements": 190, + "translated": 190, "whole": true } }, @@ -13128,11 +13132,11 @@ }, "summary": { "cics_programs": 25, - "det_equal": 25, + "det_equal": 24, "histogram": { "L0": 14, - "L1": 5, - "L2": 25, + "L1": 6, + "L2": 24, "L3": 0, "L4": 0, "L5": 0 diff --git a/docs/language_status/evidence_report/aws-mainframe-modernization-carddemo/report.md b/docs/language_status/evidence_report/aws-mainframe-modernization-carddemo/report.md index a049b61702..e8f1562a43 100644 --- a/docs/language_status/evidence_report/aws-mainframe-modernization-carddemo/report.md +++ b/docs/language_status/evidence_report/aws-mainframe-modernization-carddemo/report.md @@ -35,15 +35,15 @@ Translation measured by `cics_census.py survey` at translator commit `3bcbb8c623 | level | programs | |---|---| | L0 | 14 | -| L1 | 5 | -| L2 | 25 | +| L1 | 6 | +| L2 | 24 | | L3 | 0 | | L4 | 0 | | L5 | 0 | - programs: 44 (with an EXEC CICS command: 25; source not read: 0) - translated whole: 30; refused whole: 3; holes left: 68 -- with an equivalence case: 29; det port equal on its case: 25; with an evidence record: 23; record current at build: 0 +- with an equivalence case: 29; det port equal on its case: 24; with an evidence record: 23; record current at build: 0 ## Programs @@ -60,7 +60,6 @@ Translation measured by `cics_census.py survey` at translator commit `3bcbb8c623 | app/cbl/COACTUPC.cbl | L2 | 1415/1415 | 0 | carddemo-acctupdate | equal | 137 | none | not measured | not measured | not measured | not yet measured (#4628) | 7/11 | | app/cbl/COACTVWC.cbl | L2 | 275/275 | 0 | carddemo-acctview | equal | 20 | stale | not measured | not measured | not measured | not yet measured (#4628) | 7/8 | | app/cbl/COADM01C.cbl | L2 | 80/80 | 0 | carddemo-adminmenu | equal | 16 | stale | not measured | not measured | not measured | not yet measured (#4628) | 5/5 | -| app/cbl/COBIL00C.cbl | L2 | 190/190 | 0 | carddemo-billpay | equal | 25 | stale | not measured | not measured | not measured | not yet measured (#4628) | 4/12 | | app/cbl/COCRDLIC.cbl | L2 | 500/500 | 0 | carddemo-cardlist | equal | 45 | stale | not measured | not measured | not measured | not yet measured (#4628) | 5/9 | | app/cbl/COCRDSLC.cbl | L2 | 263/263 | 0 | carddemo-cardview | equal | 23 | stale | not measured | not measured | not measured | not yet measured (#4628) | 7/8 | | app/cbl/COMEN01C.cbl | L2 | 91/91 | 0 | carddemo-menu | equal | 16 | stale | not measured | not measured | not measured | not yet measured (#4628) | 4/5 | @@ -78,6 +77,7 @@ Translation measured by `cics_census.py survey` at translator commit `3bcbb8c623 | app/app-transaction-type-db2/cbl/COTRTUPC.cbl | L1 | 436/436 | 0 | carddemo-cotrtupc | not run | 34 | none | not measured | not measured | not measured | not yet measured (#4628) | 7/8 | | app/cbl/CBEXPORT.cbl | L1 | 224/224 | 0 | — | — | — | — | not measured | not measured | not measured | not yet measured (#4628) | — | | app/cbl/CBIMPORT.cbl | L1 | 175/175 | 0 | — | — | — | — | not measured | not measured | not measured | not yet measured (#4628) | — | +| app/cbl/COBIL00C.cbl | L1 | 190/190 | 0 | carddemo-billpay | not equal | 25 | stale | not measured | not measured | not measured | not yet measured (#4628) | 4/12 | | app/cbl/COCRDUPC.cbl | L1 | 488/488 | 0 | carddemo-cardupdate | not equal | 33 | none | not measured | not measured | not measured | not yet measured (#4628) | 7/10 | | app/app-authorization-ims-db2-mq/cbl/CBPAUP0C.cbl | L0 | 70/81 | 11 | — | — | — | — | not measured | not measured | not measured | not yet measured (#4628) | — | | app/app-authorization-ims-db2-mq/cbl/COPAUA0C.cbl | L0 | refused | 0 | — | — | — | — | not measured | not measured | not measured | not yet measured (#4628) | 2/7 | @@ -287,37 +287,6 @@ Translation measured by `cics_census.py survey` at translator commit `3bcbb8c623 - **Det-port mutation:** not yet measured (#4628) - **Residual risk:** coverage not measured; assumption reach and the migration dimensions above: not measured -### app/cbl/COBIL00C.cbl -- L2 - -- **Executed equivalent** on the 25 scenarios of carddemo-billpay against GnuCOBOL + the gitgalaxy CICS stub (det port: CI det-sweep ratchet on main), given the assumptions below -- **Next level needs:** paragraph coverage >= 100.0 (coverage not measured: no fresh det-sweep ledger entry and no local sweep) -- **Translation:** 190/190 statements, 0 holes; whole: yes -- **Executed equivalence** (carddemo-billpay, program, the case this report judges): det port equal (CI det-sweep ratchet on main) - - evidence record (the case's committed port): stale (stale on harness, oracle, generator); its proof: all equal, 25/25 scenarios equal, 85/85 records equal, 25 runs (10 fault runs); through its deployed entry points 25/25 -- **Coverage:** not measured -- **Oracle backing** (a column, not a level; per CICS command; DIFFERS assumptions reached: not measured): - - | command | spec entry | hand-traced crucible cases (stub / Java runtime agree) | backed | - |---|---|---|---| - | ASKTIME | full | none | no | - | ENDBR | full | none | no | - | FORMATTIME | full | none | no | - | READ | full | none | no | - | READPREV | full | none | no | - | RECEIVE MAP | full | hx-attr-bytes (yes / yes), hx-extended-cursor (yes / yes), pc-aid-menu (yes / yes), pc-wizard (yes / yes) | yes | - | RETURN | full | ca-channel-containers (yes / no), ca-link-lengths (yes / yes), ca-xctl-versions (yes / yes), gt-assign-startcode (yes / no), gt-start-options (yes / no), gt-start-retrieve (yes / yes), gt-terminal-coalesce (yes / yes), hc-abend-link (yes / yes), hc-eoc-error (yes / no), hc-handle-aid (yes / no), hc-ignore-error (yes / no), hc-perform-range (yes / yes), hc-terminal-eoc (yes / no), hc-terminal-receive (yes / no), hx-attr-bytes (yes / yes), hx-extended-cursor (yes / yes), pc-aid-menu (yes / yes), pc-wizard (yes / yes) | yes | - | REWRITE | full | none | no | - | SEND MAP | full | hx-attr-bytes (yes / yes), hx-extended-cursor (yes / yes), pc-aid-menu (yes / yes), pc-wizard (yes / yes) | yes | - | STARTBR | full | none | no | - | WRITE | full | none | no | - | XCTL | full | ca-channel-containers (yes / no), ca-xctl-versions (yes / yes), pc-aid-menu (yes / yes), pc-wizard (yes / yes) | yes | - -- **Assumptions relied on:** named by its commands' spec entries: X14 (ASSUMED (REFUSED where IBM is silent)), X22 (ASSUMED (REFUSED where IBM is silent or the layout decides)); reach: not measured - - stated infeasible branch outcome (reviewed claim, family G): RETURN-TO-PREV-SCREEN:275:true (IF) -- `IF CDEMO-TO-PROGRAM = LOW-VALUES OR SPACES` in RETURN-TO-PREV-SCREEN: the paragraph is only PERFORMed, and every PERFORM of it comes right after a MOVE of a non-blank program name into CDEMO-TO-PROGRAM (line 108 moves 'COSGN00C', line 130 'COMEN01C', and line 133 moves CDEMO-FROM-PROGRAM only after line 129 tested it is neither SPACES nor LOW-VALUES; both fields PIC X(08), COCOM01Y). COBIL00C never moves SPACES or LOW-VALUES into it in between. - - stated infeasible branch outcome (reviewed claim, family R): UPDATE-ACCTDAT-FILE:387:WHEN@390 (EVALUATE) -- `WHEN DFHRESP(NOTFND)` after `EXEC CICS REWRITE DATASET(WS-ACCTDAT-FILE)` (line 379): REWRITE updates the record the READ ... UPDATE at line 345 holds; IBM's REWRITE conditions do not include NOTFND (https://www.ibm.com/docs/en/cics-ts/6.x?topic=summary-rewrite; our spec, gitgalaxy/standards/cics/commands/files.py, lists NORMAL and INVREQ). -- **Det-port mutation:** not yet measured (#4628) -- **Residual risk:** coverage not measured; ASSUMED / DIFFERS entries named: X14, X22; commands without oracle backing: ASKTIME, ENDBR, FORMATTIME, READ, READPREV, REWRITE, STARTBR, WRITE; assumption reach and the migration dimensions above: not measured - ### app/cbl/COCRDLIC.cbl -- L2 - **Executed equivalent** on the 45 scenarios of carddemo-cardlist against GnuCOBOL + the gitgalaxy CICS stub (det port: CI det-sweep ratchet on main), given the assumptions below @@ -712,6 +681,36 @@ Translation measured by `cics_census.py survey` at translator commit `3bcbb8c623 - **Det-port mutation:** not yet measured (#4628) - **Residual risk:** coverage not measured; assumption reach and the migration dimensions above: not measured +### app/cbl/COBIL00C.cbl -- L1 + +- **Next level needs:** its det port equal on every scenario of carddemo-billpay: ledgered as differing in det_sweep_baseline.json (#4657): the det runtime's STARTBR NOTFND leaves EIBRESP2 0 where the stub gives 3; COBIL00C DISPLAYs it (the proof compares a task's DISPLAY output since #4635) +- **Translation:** 190/190 statements, 0 holes; whole: yes +- **Executed equivalence** (carddemo-billpay, program, the case this report judges): det port not equal (ledgered as differing in det_sweep_baseline.json (#4657): the det runtime's STARTBR NOTFND leaves EIBRESP2 0 where the stub gives 3; COBIL00C DISPLAYs it (the proof compares a task's DISPLAY output since #4635)) + - evidence record (the case's committed port): stale (stale on harness, oracle, generator); its proof: all equal, 25/25 scenarios equal, 85/85 records equal, 25 runs (10 fault runs); through its deployed entry points 25/25 +- **Coverage:** not measured +- **Oracle backing** (a column, not a level; per CICS command; DIFFERS assumptions reached: not measured): + + | command | spec entry | hand-traced crucible cases (stub / Java runtime agree) | backed | + |---|---|---|---| + | ASKTIME | full | none | no | + | ENDBR | full | none | no | + | FORMATTIME | full | none | no | + | READ | full | none | no | + | READPREV | full | none | no | + | RECEIVE MAP | full | hx-attr-bytes (yes / yes), hx-extended-cursor (yes / yes), pc-aid-menu (yes / yes), pc-wizard (yes / yes) | yes | + | RETURN | full | ca-channel-containers (yes / no), ca-link-lengths (yes / yes), ca-xctl-versions (yes / yes), gt-assign-startcode (yes / no), gt-start-options (yes / no), gt-start-retrieve (yes / yes), gt-terminal-coalesce (yes / yes), hc-abend-link (yes / yes), hc-eoc-error (yes / no), hc-handle-aid (yes / no), hc-ignore-error (yes / no), hc-perform-range (yes / yes), hc-terminal-eoc (yes / no), hc-terminal-receive (yes / no), hx-attr-bytes (yes / yes), hx-extended-cursor (yes / yes), pc-aid-menu (yes / yes), pc-wizard (yes / yes) | yes | + | REWRITE | full | none | no | + | SEND MAP | full | hx-attr-bytes (yes / yes), hx-extended-cursor (yes / yes), pc-aid-menu (yes / yes), pc-wizard (yes / yes) | yes | + | STARTBR | full | none | no | + | WRITE | full | none | no | + | XCTL | full | ca-channel-containers (yes / no), ca-xctl-versions (yes / yes), pc-aid-menu (yes / yes), pc-wizard (yes / yes) | yes | + +- **Assumptions relied on:** named by its commands' spec entries: X14 (ASSUMED (REFUSED where IBM is silent)), X22 (ASSUMED (REFUSED where IBM is silent or the layout decides)); reach: not measured + - stated infeasible branch outcome (reviewed claim, family G): RETURN-TO-PREV-SCREEN:275:true (IF) -- `IF CDEMO-TO-PROGRAM = LOW-VALUES OR SPACES` in RETURN-TO-PREV-SCREEN: the paragraph is only PERFORMed, and every PERFORM of it comes right after a MOVE of a non-blank program name into CDEMO-TO-PROGRAM (line 108 moves 'COSGN00C', line 130 'COMEN01C', and line 133 moves CDEMO-FROM-PROGRAM only after line 129 tested it is neither SPACES nor LOW-VALUES; both fields PIC X(08), COCOM01Y). COBIL00C never moves SPACES or LOW-VALUES into it in between. + - stated infeasible branch outcome (reviewed claim, family R): UPDATE-ACCTDAT-FILE:387:WHEN@390 (EVALUATE) -- `WHEN DFHRESP(NOTFND)` after `EXEC CICS REWRITE DATASET(WS-ACCTDAT-FILE)` (line 379): REWRITE updates the record the READ ... UPDATE at line 345 holds; IBM's REWRITE conditions do not include NOTFND (https://www.ibm.com/docs/en/cics-ts/6.x?topic=summary-rewrite; our spec, gitgalaxy/standards/cics/commands/files.py, lists NORMAL and INVREQ). +- **Det-port mutation:** not yet measured (#4628) +- **Residual risk:** coverage not measured; ASSUMED / DIFFERS entries named: X14, X22; commands without oracle backing: ASKTIME, ENDBR, FORMATTIME, READ, READPREV, REWRITE, STARTBR, WRITE; assumption reach and the migration dimensions above: not measured + ### app/cbl/COCRDUPC.cbl -- L1 - **Next level needs:** its det port equal on every scenario of carddemo-cardupdate: ledgered as differing in det_sweep_baseline.json (#4085): COCRDUPC writes blanks into a PIC 9(3) CVV a typed DTO field cannot hold diff --git a/docs/language_status/evidence_report/cics-banking-sample-application-cbsa/report.json b/docs/language_status/evidence_report/cics-banking-sample-application-cbsa/report.json index 1ed6007d48..414ec983cb 100644 --- a/docs/language_status/evidence_report/cics-banking-sample-application-cbsa/report.json +++ b/docs/language_status/evidence_report/cics-banking-sample-application-cbsa/report.json @@ -1485,9 +1485,9 @@ "case_scenarios": 22, "db2": true, "det": { - "state": "not run", + "state": "not equal", "why": [ - "a Db2 case: CI's det-sweep skips Db2 cases and no local sweep was given" + "ledgered as differing in det_sweep_baseline.json (#4658): the det port DISPLAYs SQLCODE -4220 where Db2/GnuCOBOL gives -180 on a null-date update (the proof compares a task's DISPLAY output since #4635)" ] }, "record": null, @@ -5944,9 +5944,9 @@ "case_scenarios": 22, "db2": true, "det": { - "state": "not run", + "state": "not equal", "why": [ - "a Db2 case: CI's det-sweep skips Db2 cases and no local sweep was given" + "ledgered as differing in det_sweep_baseline.json (#4658): the det port DISPLAYs SQLCODE -4220 where Db2/GnuCOBOL gives -180 on a null-date update (the proof compares a task's DISPLAY output since #4635)" ] }, "record": null, @@ -5958,9 +5958,9 @@ "case_scenarios": 22, "db2": true, "det": { - "state": "not run", + "state": "not equal", "why": [ - "a Db2 case: CI's det-sweep skips Db2 cases and no local sweep was given" + "ledgered as differing in det_sweep_baseline.json (#4658): the det port DISPLAYs SQLCODE -4220 where Db2/GnuCOBOL gives -180 on a null-date update (the proof compares a task's DISPLAY output since #4635)" ] }, "record": null, @@ -5972,7 +5972,7 @@ "det_port": "not yet measured (#4628)" }, "next": [ - "its det port equal on every scenario of cbsa-xfrfun: a Db2 case: CI's det-sweep skips Db2 cases and no local sweep was given" + "its det port equal on every scenario of cbsa-xfrfun: ledgered as differing in det_sweep_baseline.json (#4658): the det port DISPLAYs SQLCODE -4220 where Db2/GnuCOBOL gives -180 on a null-date update (the proof compares a task's DISPLAY output since #4635)" ], "oracle_backing": [ { diff --git a/docs/language_status/evidence_report/cics-banking-sample-application-cbsa/report.md b/docs/language_status/evidence_report/cics-banking-sample-application-cbsa/report.md index f84359afaf..b50fbc9933 100644 --- a/docs/language_status/evidence_report/cics-banking-sample-application-cbsa/report.md +++ b/docs/language_status/evidence_report/cics-banking-sample-application-cbsa/report.md @@ -65,7 +65,7 @@ Translation measured by `cics_census.py survey` at translator commit `3bcbb8c623 | src/base/cobol_src/INQACCCU.cbl | L1 | 186/186 | 0 | — | — | — | — | not measured | not measured | not measured | not yet measured (#4628) | 5/8 | | src/base/cobol_src/INQCUST.cbl | L1 | 162/162 | 0 | — | — | — | — | not measured | not measured | not measured | not yet measured (#4628) | 5/13 | | src/base/cobol_src/UPDACC.cbl | L1 | 58/58 | 0 | cbsa-updacc | not run | 10 | stale | not measured | not measured | not measured | not yet measured (#4628) | 1/3 | -| src/base/cobol_src/XFRFUN.cbl | L1 | 426/426 | 0 | cbsa-xfrfun | not run | 22 | none | not measured | not measured | not measured | not yet measured (#4628) | 5/9 | +| src/base/cobol_src/XFRFUN.cbl | L1 | 426/426 | 0 | cbsa-xfrfun | not equal | 22 | none | not measured | not measured | not measured | not yet measured (#4628) | 5/9 | | src/base/cobol_src/ACCTCTRL.cbl | L0 | 15/18 | 3 | — | — | — | — | not measured | not measured | not measured | not yet measured (#4628) | 1/3 | | src/base/cobol_src/BANKDATA.cbl | L0 | 458/464 | 6 | — | — | — | — | not measured | not measured | not measured | not yet measured (#4628) | — | | src/base/cobol_src/BNK1CAC.cbl | L0 | 383/389 | 6 | — | — | — | — | not measured | not measured | not measured | not yet measured (#4628) | 7/11 | @@ -92,7 +92,7 @@ Translation measured by `cics_census.py survey` at translator commit `3bcbb8c623 - evidence record: none (8 scenarios in case.json) - **Executed equivalence** (cbsa-inqacc, linked, Db2): det port not run (a Db2 case: CI's det-sweep skips Db2 cases and no local sweep was given) - evidence record (the case's committed port): stale (stale on harness, oracle, generator); its proof: all equal, 14/14 scenarios equal, 29/29 records equal, 14 runs (0 fault runs); through its deployed entry points 14/14 -- **Executed equivalence** (cbsa-xfrfun, linked, Db2): det port not run (a Db2 case: CI's det-sweep skips Db2 cases and no local sweep was given) +- **Executed equivalence** (cbsa-xfrfun, linked, Db2): det port not equal (ledgered as differing in det_sweep_baseline.json (#4658): the det port DISPLAYs SQLCODE -4220 where Db2/GnuCOBOL gives -180 on a null-date update (the proof compares a task's DISPLAY output since #4635)) - evidence record: none (22 scenarios in case.json) - **Coverage:** not measured - **Oracle backing** (a column, not a level; per CICS command; DIFFERS assumptions reached: not measured): @@ -472,9 +472,9 @@ Translation measured by `cics_census.py survey` at translator commit `3bcbb8c623 ### src/base/cobol_src/XFRFUN.cbl -- L1 -- **Next level needs:** its det port equal on every scenario of cbsa-xfrfun: a Db2 case: CI's det-sweep skips Db2 cases and no local sweep was given +- **Next level needs:** its det port equal on every scenario of cbsa-xfrfun: ledgered as differing in det_sweep_baseline.json (#4658): the det port DISPLAYs SQLCODE -4220 where Db2/GnuCOBOL gives -180 on a null-date update (the proof compares a task's DISPLAY output since #4635) - **Translation:** 426/426 statements, 0 holes; whole: yes -- **Executed equivalence** (cbsa-xfrfun, program, Db2, the case this report judges): det port not run (a Db2 case: CI's det-sweep skips Db2 cases and no local sweep was given) +- **Executed equivalence** (cbsa-xfrfun, program, Db2, the case this report judges): det port not equal (ledgered as differing in det_sweep_baseline.json (#4658): the det port DISPLAYs SQLCODE -4220 where Db2/GnuCOBOL gives -180 on a null-date update (the proof compares a task's DISPLAY output since #4635)) - evidence record: none (22 scenarios in case.json) - **Coverage:** not measured - **Oracle backing** (a column, not a level; per CICS command; DIFFERS assumptions reached: not measured): From 3a451dd40da2e7bbb7f6b385a12ab1fe759c649b Mon Sep 17 00:00:00 2001 From: squid-protocol Date: Wed, 7 Oct 2026 23:22:00 -0400 Subject: [PATCH 3/3] det: map the JDBC driver's client-side -4220 to Db2's -180/22007 (#4658) Co-Authored-By: Claude Opus 5.5 --- .../report.json | 14 +++++++------- .../cics-banking-sample-application-cbsa/report.md | 8 ++++---- docs/language_status/oracle_assumptions.md | 8 ++++++++ .../cobol_to_java/det/cobolrt/sql/DetSql.java | 10 ++++++++++ tests/cobol_mainframe/test_sql_faults.py | 9 ++++++++- tests/equivalence/det_sweep_baseline.json | 4 ---- 6 files changed, 37 insertions(+), 16 deletions(-) diff --git a/docs/language_status/evidence_report/cics-banking-sample-application-cbsa/report.json b/docs/language_status/evidence_report/cics-banking-sample-application-cbsa/report.json index 414ec983cb..1ed6007d48 100644 --- a/docs/language_status/evidence_report/cics-banking-sample-application-cbsa/report.json +++ b/docs/language_status/evidence_report/cics-banking-sample-application-cbsa/report.json @@ -1485,9 +1485,9 @@ "case_scenarios": 22, "db2": true, "det": { - "state": "not equal", + "state": "not run", "why": [ - "ledgered as differing in det_sweep_baseline.json (#4658): the det port DISPLAYs SQLCODE -4220 where Db2/GnuCOBOL gives -180 on a null-date update (the proof compares a task's DISPLAY output since #4635)" + "a Db2 case: CI's det-sweep skips Db2 cases and no local sweep was given" ] }, "record": null, @@ -5944,9 +5944,9 @@ "case_scenarios": 22, "db2": true, "det": { - "state": "not equal", + "state": "not run", "why": [ - "ledgered as differing in det_sweep_baseline.json (#4658): the det port DISPLAYs SQLCODE -4220 where Db2/GnuCOBOL gives -180 on a null-date update (the proof compares a task's DISPLAY output since #4635)" + "a Db2 case: CI's det-sweep skips Db2 cases and no local sweep was given" ] }, "record": null, @@ -5958,9 +5958,9 @@ "case_scenarios": 22, "db2": true, "det": { - "state": "not equal", + "state": "not run", "why": [ - "ledgered as differing in det_sweep_baseline.json (#4658): the det port DISPLAYs SQLCODE -4220 where Db2/GnuCOBOL gives -180 on a null-date update (the proof compares a task's DISPLAY output since #4635)" + "a Db2 case: CI's det-sweep skips Db2 cases and no local sweep was given" ] }, "record": null, @@ -5972,7 +5972,7 @@ "det_port": "not yet measured (#4628)" }, "next": [ - "its det port equal on every scenario of cbsa-xfrfun: ledgered as differing in det_sweep_baseline.json (#4658): the det port DISPLAYs SQLCODE -4220 where Db2/GnuCOBOL gives -180 on a null-date update (the proof compares a task's DISPLAY output since #4635)" + "its det port equal on every scenario of cbsa-xfrfun: a Db2 case: CI's det-sweep skips Db2 cases and no local sweep was given" ], "oracle_backing": [ { diff --git a/docs/language_status/evidence_report/cics-banking-sample-application-cbsa/report.md b/docs/language_status/evidence_report/cics-banking-sample-application-cbsa/report.md index b50fbc9933..f84359afaf 100644 --- a/docs/language_status/evidence_report/cics-banking-sample-application-cbsa/report.md +++ b/docs/language_status/evidence_report/cics-banking-sample-application-cbsa/report.md @@ -65,7 +65,7 @@ Translation measured by `cics_census.py survey` at translator commit `3bcbb8c623 | src/base/cobol_src/INQACCCU.cbl | L1 | 186/186 | 0 | — | — | — | — | not measured | not measured | not measured | not yet measured (#4628) | 5/8 | | src/base/cobol_src/INQCUST.cbl | L1 | 162/162 | 0 | — | — | — | — | not measured | not measured | not measured | not yet measured (#4628) | 5/13 | | src/base/cobol_src/UPDACC.cbl | L1 | 58/58 | 0 | cbsa-updacc | not run | 10 | stale | not measured | not measured | not measured | not yet measured (#4628) | 1/3 | -| src/base/cobol_src/XFRFUN.cbl | L1 | 426/426 | 0 | cbsa-xfrfun | not equal | 22 | none | not measured | not measured | not measured | not yet measured (#4628) | 5/9 | +| src/base/cobol_src/XFRFUN.cbl | L1 | 426/426 | 0 | cbsa-xfrfun | not run | 22 | none | not measured | not measured | not measured | not yet measured (#4628) | 5/9 | | src/base/cobol_src/ACCTCTRL.cbl | L0 | 15/18 | 3 | — | — | — | — | not measured | not measured | not measured | not yet measured (#4628) | 1/3 | | src/base/cobol_src/BANKDATA.cbl | L0 | 458/464 | 6 | — | — | — | — | not measured | not measured | not measured | not yet measured (#4628) | — | | src/base/cobol_src/BNK1CAC.cbl | L0 | 383/389 | 6 | — | — | — | — | not measured | not measured | not measured | not yet measured (#4628) | 7/11 | @@ -92,7 +92,7 @@ Translation measured by `cics_census.py survey` at translator commit `3bcbb8c623 - evidence record: none (8 scenarios in case.json) - **Executed equivalence** (cbsa-inqacc, linked, Db2): det port not run (a Db2 case: CI's det-sweep skips Db2 cases and no local sweep was given) - evidence record (the case's committed port): stale (stale on harness, oracle, generator); its proof: all equal, 14/14 scenarios equal, 29/29 records equal, 14 runs (0 fault runs); through its deployed entry points 14/14 -- **Executed equivalence** (cbsa-xfrfun, linked, Db2): det port not equal (ledgered as differing in det_sweep_baseline.json (#4658): the det port DISPLAYs SQLCODE -4220 where Db2/GnuCOBOL gives -180 on a null-date update (the proof compares a task's DISPLAY output since #4635)) +- **Executed equivalence** (cbsa-xfrfun, linked, Db2): det port not run (a Db2 case: CI's det-sweep skips Db2 cases and no local sweep was given) - evidence record: none (22 scenarios in case.json) - **Coverage:** not measured - **Oracle backing** (a column, not a level; per CICS command; DIFFERS assumptions reached: not measured): @@ -472,9 +472,9 @@ Translation measured by `cics_census.py survey` at translator commit `3bcbb8c623 ### src/base/cobol_src/XFRFUN.cbl -- L1 -- **Next level needs:** its det port equal on every scenario of cbsa-xfrfun: ledgered as differing in det_sweep_baseline.json (#4658): the det port DISPLAYs SQLCODE -4220 where Db2/GnuCOBOL gives -180 on a null-date update (the proof compares a task's DISPLAY output since #4635) +- **Next level needs:** its det port equal on every scenario of cbsa-xfrfun: a Db2 case: CI's det-sweep skips Db2 cases and no local sweep was given - **Translation:** 426/426 statements, 0 holes; whole: yes -- **Executed equivalence** (cbsa-xfrfun, program, Db2, the case this report judges): det port not equal (ledgered as differing in det_sweep_baseline.json (#4658): the det port DISPLAYs SQLCODE -4220 where Db2/GnuCOBOL gives -180 on a null-date update (the proof compares a task's DISPLAY output since #4635)) +- **Executed equivalence** (cbsa-xfrfun, program, Db2, the case this report judges): det port not run (a Db2 case: CI's det-sweep skips Db2 cases and no local sweep was given) - evidence record: none (22 scenarios in case.json) - **Coverage:** not measured - **Oracle backing** (a column, not a level; per CICS command; DIFFERS assumptions reached: not measured): diff --git a/docs/language_status/oracle_assumptions.md b/docs/language_status/oracle_assumptions.md index eefb96b737..320e604fd7 100644 --- a/docs/language_status/oracle_assumptions.md +++ b/docs/language_status/oracle_assumptions.md @@ -1012,6 +1012,14 @@ The length READQ TS returns on ITEMERR or QIDERR is not documented, so it is not - **Not compared to z/OS.** SQLSTATE subclasses, SQLERRD values beyond the row count, SQLERRP, and the dialect differences of other statements. +### Q1b. A datetime host variable Db2 rejects: -180 / 22007 on both sides — MATCHED (#4658) +- **What.** An UPDATE binding an unset (non-date) PIC X host variable to a DATE column gets SQLCODE -180, SQLSTATE 22007 + ("the string representation of a datetime value is not valid") from Db2 for LUW, and the same on z/OS Db2 (-180 is the + documented SQLCODE for this, SQLSTATE 22007). IBM's JDBC driver refuses some such values on the client with its own + -4220 (conversion error) before Db2 sees them; that code is never a Db2 SQLCODE an embedded-SQL program meets, so + DetSql maps it to -180 / 22007. Other driver errors pass through unchanged. SQLERRMC/SQLERRD of the mapped error stay + empty (the DISPLAYed SQLERRD(3) is 0 on both sides). + ### Q1a. A binary host variable takes what its bytes hold — MATCHED (#4579) - **What.** SELECT INTO / FETCH INTO a COMP / COMP-4 / BINARY / COMP-5 host variable gives SQLCODE -304 only for a value outside its halfword / fullword / doubleword (Db2 types the host variable by its data type: S9(9) COMP is INTEGER), not diff --git a/gitgalaxy/tools/cobol_to_java/det/cobolrt/sql/DetSql.java b/gitgalaxy/tools/cobol_to_java/det/cobolrt/sql/DetSql.java index e74367ee15..a78519c9c9 100644 --- a/gitgalaxy/tools/cobol_to_java/det/cobolrt/sql/DetSql.java +++ b/gitgalaxy/tools/cobol_to_java/det/cobolrt/sql/DetSql.java @@ -131,6 +131,9 @@ public static void reset(Field ca, Charset cs) { put(ca, SQLSTATE, 5, "00000", cs); } + /** IBM JCC's client-side "invalid conversion" error code, which Db2 itself never returns to a program. */ + private static final int JCC_BAD_CONVERSION = -4220; + private static void code(Field ca, int sqlcode, String state, Charset cs) { putInt(ca, SQLCODE, 4, sqlcode); put(ca, SQLSTATE, 5, state, cs); @@ -147,6 +150,13 @@ private static void warn(Field ca, int which, Charset cs) { private static void failed(Field ca, RuntimeException e, Charset cs) { for (Throwable t = e; t != null; t = t.getCause()) { if (t instanceof SQLException s && s.getErrorCode() != 0) { + if (s.getErrorCode() == JCC_BAD_CONVERSION) { + // #4658: the JDBC driver refused the host variable's bytes on the client (a date column bound to + // an unset, non-date PIC X) before Db2 saw them; the embedded-SQL program, on z/OS as on Db2 LUW, + // gets the server's verdict: -180, SQLSTATE 22007 (the string is not a valid datetime value). + code(ca, -180, "22007", cs); + return; + } code(ca, s.getErrorCode(), s.getSQLState() == null ? " " : s.getSQLState(), cs); db2Sqlca(ca, s, cs); return; diff --git a/tests/cobol_mainframe/test_sql_faults.py b/tests/cobol_mainframe/test_sql_faults.py index 5f3a341204..459e1f6bfa 100644 --- a/tests/cobol_mainframe/test_sql_faults.py +++ b/tests/cobol_mainframe/test_sql_faults.py @@ -132,6 +132,13 @@ def _jdk() -> Path | None: } DetSql.update(ca, "PROG:13", () -> 1, false, StandardCharsets.ISO_8859_1); // another statement: no fault System.out.println("other sqlcode " + sqlcode(ca)); + // #4658: the JDBC driver's client-side -4220 is the -180 / 22007 Db2 gives an embedded-SQL program + DetSql.update(ca, "PROG:14", () -> { throw new RuntimeException(new java.sql.SQLException("bad", (String) null, -4220)); }, + false, StandardCharsets.ISO_8859_1); + System.out.println("jcc sqlcode " + sqlcode(ca) + " state " + new String(ca.storage().bytes, 131, 5, StandardCharsets.ISO_8859_1)); + DetSql.update(ca, "PROG:15", () -> { throw new RuntimeException(new java.sql.SQLException("dup", "23505", -803)); }, + false, StandardCharsets.ISO_8859_1); + System.out.println("other error sqlcode " + sqlcode(ca)); // #4181: a 71-byte record LINKed as a 99-byte DTO: its own bytes, LOW-VALUES past it, and back up to its end Storage rec = new Storage(71); java.util.Arrays.fill(rec.bytes, (byte) 'E'); @@ -166,7 +173,7 @@ def test_detsql_injects_a_planned_fault_and_a_link_window_stops_at_the_record(tm out = subprocess.run([str(jdk / "java"), "-cp", str(tmp_path / "classes"), "ggtest.Main", str(log)], # noqa: S603 capture_output=True, text=True, check=True).stdout.splitlines() # fmt: skip assert out == ["run 1 sqlcode 0 ran 1", "run 2 sqlcode -803 ran 1", "run 3 sqlcode 0 ran 2", - "other sqlcode 0", "window EE 0 0", "back X 71"] # fmt: skip + "other sqlcode 0", "jcc sqlcode -180 state 22007", "other error sqlcode -803", "window EE 0 0", "back X 71"] # fmt: skip assert log.read_text(encoding="ascii").split() == ["SQL", "PROG", "12", "2", "-803"] diff --git a/tests/equivalence/det_sweep_baseline.json b/tests/equivalence/det_sweep_baseline.json index 82d41f7ddf..4a2dc86973 100644 --- a/tests/equivalence/det_sweep_baseline.json +++ b/tests/equivalence/det_sweep_baseline.json @@ -14,10 +14,6 @@ "issue": null, "why": "generated card numbers mix letters and digits: ASCII vs EBCDIC key order picks different duplicates (oracle_assumptions.md D1)" }, - "cbsa-xfrfun": { - "issue": "#4658", - "why": "the det port DISPLAYs SQLCODE -4220 where Db2/GnuCOBOL gives -180 on a null-date update (the proof compares a task's DISPLAY output since #4635)" - }, "mortgage-mpmt": { "issue": "#4271", "why": "IBM DBB EPSMPMT computes its payment through a COMP-1 item in hexadecimal floating point on z/OS, truncated decimal on GnuCOBOL. The det runtime models HFP since #4271 slice 1 (its interest COMPUTE translates), but the payment's (1 + C) ** N, N with decimal places, is a floating-point exponentiation IBM does not document bit for bit: a named hole (oracle_assumptions.md C6; its CBL NUMPROC(MIG) is modelled, C5)"