From 28192db0f8fa0648e1a6441604f6abdf88da3be4 Mon Sep 17 00:00:00 2001 From: zhang_taoming <854317252@qq.com> Date: Sun, 13 Sep 2026 15:11:11 +0800 Subject: [PATCH] fix(cli): consume nonexistent --black-box dir; keep white report on empty black-box --- cobol_testgen/__init__.py | 22 +++++++++++++++++----- tests/cobol_testgen/test_cli_blackbox.py | 16 ++++++++++++++++ 2 files changed, 33 insertions(+), 5 deletions(-) diff --git a/cobol_testgen/__init__.py b/cobol_testgen/__init__.py index 9772a9a..6aa5f6b 100644 --- a/cobol_testgen/__init__.py +++ b/cobol_testgen/__init__.py @@ -1394,8 +1394,10 @@ def _inject_c01_coverage_records(records, fields, base_assignments): def _extract_black_box_args(args: list) -> tuple[bool, str | None]: """就地解析 --black-box / --no-black-box,返回 (do_black_box, black_box_arg)。 - `--black-box `:仅当后一个 token 是「已存在的目录」且非 COBOL 源码后缀时 - 才消费为目录;否则视为裸 `--black-box`(自动探测 //black_box)。 + `--black-box `:后一个 token 非 `--` 开头且不是 COBOL 源码后缀(.cbl/.cob/.cpy) + 时消费为目录;否则视为裸 `--black-box`(自动探测 //black_box)。 + 这样既支持 `--black-box ` 的自动探测形式,也不会把 + 尚不存在(或拼写错误)的目录 token 漏给位置参数分类逻辑而误判为 outdir。 """ do_black_box = False black_box_arg = None @@ -1404,6 +1406,7 @@ def _extract_black_box_args(args: list) -> tuple[bool, str | None]: a = args[i] if a == '--no-black-box': do_black_box = False + black_box_arg = None args.pop(i) continue if a == '--black-box': @@ -1411,7 +1414,6 @@ def _extract_black_box_args(args: list) -> tuple[bool, str | None]: if i + 1 < len(args): nxt = args[i + 1] if (not nxt.startswith('--') - and Path(nxt).is_dir() and Path(nxt).suffix.upper() not in ('.CBL', '.COB', '.CPY')): black_box_arg = nxt args.pop(i + 1) @@ -1927,6 +1929,13 @@ def main(): bb_groups = load_black_box_groups(bb_dir, fd_fields, select_info, fields_dict) if not bb_groups: logger.warning(f" --black-box: 未在 {bb_dir} 找到可用黑盒数据,跳过") + if white_java_reports: + try: + _write_java_test_report(str(prog_outdir), filepath.stem, + list(group_results), + list(white_java_reports)) + except Exception as e: # noqa: BLE001 + logger.warning(f" 测试报告生成失败: {e}") else: _bb_temp = temp_dir or str(prog_outdir / '.gcov_cache') bb_results, bb_java_reports = run_external_groups( @@ -1940,8 +1949,11 @@ def main(): all_results = list(group_results) + list(bb_results) all_reports = list(white_java_reports) + list(bb_java_reports) if all_reports: - _write_java_test_report(str(prog_outdir), filepath.stem, - all_results, all_reports) + try: + _write_java_test_report(str(prog_outdir), filepath.stem, + all_results, all_reports) + except Exception as e: # noqa: BLE001 + logger.warning(f" 测试报告生成失败: {e}") if do_run and proc_div and _HAVE_RUNNER: run_and_compare( diff --git a/tests/cobol_testgen/test_cli_blackbox.py b/tests/cobol_testgen/test_cli_blackbox.py index 1ce7e80..70dfee8 100644 --- a/tests/cobol_testgen/test_cli_blackbox.py +++ b/tests/cobol_testgen/test_cli_blackbox.py @@ -48,3 +48,19 @@ def test_no_flags_leaves_args_untouched(): assert do is False assert arg is None assert args == ["src.cbl", "out"] + + +def test_black_box_nonexistent_dir_consumed(): + args = ["--black-box", "no/such/dir", "src.cbl", "out"] + do, arg = _extract_black_box_args(args) + assert do is True + assert arg == "no/such/dir" + assert args == ["src.cbl", "out"] + + +def test_no_black_box_resets_arg(): + args = ["--black-box", "bbdir", "--no-black-box", "src.cbl"] + do, arg = _extract_black_box_args(args) + assert do is False + assert arg is None + assert args == ["src.cbl"]