75 lines
3.1 KiB
Python
75 lines
3.1 KiB
Python
"""MERGE 管道支持:USING 输入识别 + OUTPUT PROCEDURE 内联 + 合并输入记录注入。
|
|
|
|
对应根因:
|
|
1. MERGE/SORT 的 USING 文件从不 OPEN → scan_open_statements 不识别为输入 → 无输入数据。
|
|
2. MERGE 的 OUTPUT PROCEDURE 段不被内联进分支树 → 其决策点未被采集。
|
|
3. 即使识别输入,也没生成供 MERGE 消费的 SA*/BO* 记录。
|
|
"""
|
|
|
|
import sys, os
|
|
sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), "..", "..")))
|
|
|
|
from cobol_testgen.read import (
|
|
preprocess, resolve_copybooks, extract_procedure_division, extract_data_division,
|
|
parse_data_division, scan_open_statements, scan_sort_merge_directions,
|
|
scan_all_file_directions, parse_file_control, parse_file_section,
|
|
)
|
|
from cobol_testgen.core import build_branch_tree
|
|
from cobol_testgen.coverage import collect_decision_points
|
|
|
|
_SRC = r'C:\Users\marye\Desktop\2026技术大赛\cobol-tna-system\src'
|
|
_CPY = r'C:\Users\marye\Desktop\2026技术大赛\cobol-tna-system\cpy'
|
|
|
|
|
|
def _load(pid):
|
|
with open(os.path.join(_SRC, pid + '.cbl'), encoding='utf-8-sig') as f:
|
|
src = f.read()
|
|
resolved = resolve_copybooks(src, _SRC, extra_search_paths=[_CPY])
|
|
pp = preprocess(resolved)
|
|
return resolved, pp
|
|
|
|
|
|
def test_merge_using_files_recognized_as_input():
|
|
"""MERGE ... USING SALARY-FILE BONUS-FILE → 两者应识别为 INPUT。"""
|
|
_, pp = _load('KYU09MRG')
|
|
dirs = scan_sort_merge_directions(extract_procedure_division(pp))
|
|
assert dirs.get('SALARY-FILE') == 'INPUT'
|
|
assert dirs.get('BONUS-FILE') == 'INPUT'
|
|
# W01/W02 仅 OPEN OUTPUT,不受影响
|
|
assert 'W01OUTFIL' not in dirs
|
|
|
|
|
|
def test_scan_all_file_directions_includes_open_and_using():
|
|
"""combined 函数应同时含 OPEN 与 MERGE USING 方向。"""
|
|
_, pp = _load('KYU09MRG')
|
|
dirs = scan_all_file_directions(extract_procedure_division(pp))
|
|
assert dirs.get('SALARY-FILE') == 'INPUT'
|
|
assert dirs.get('BONUS-FILE') == 'INPUT'
|
|
assert dirs.get('W01OUTFIL') == 'OUTPUT'
|
|
assert dirs.get('W02OUTFIL') == 'OUTPUT'
|
|
|
|
|
|
def test_output_procedure_inlined_into_branch_tree():
|
|
"""2000MRGOUTSOR 的决策点(IF NOT WRK-MERGE-EOF-Y / IF MERGE-REC-TYPE)应被采集。"""
|
|
resolved, pp = _load('KYU09MRG')
|
|
fields = parse_data_division(extract_data_division(pp))
|
|
fields_dict = [f.__dict__ for f in fields]
|
|
proc_div = extract_procedure_division(pp)
|
|
tree, _ = build_branch_tree(proc_div, fields_dict, full_source=pp)
|
|
dps, _ = collect_decision_points(tree, fields_dict)
|
|
labels = [dp.label for dp in dps]
|
|
# 主流程 D01FKICOD
|
|
assert any('D01FKICOD' in l for l in labels), labels
|
|
# OUTPUT PROCEDURE 决策点应出现(此前只有 1 个)
|
|
assert any('WRK-MERGE-EOF-Y' in l for l in labels), labels
|
|
assert any('MERGE-REC-TYPE' in l for l in labels), labels
|
|
assert len(dps) >= 3, [dp.label for dp in dps]
|
|
|
|
|
|
def test_merge_using_files_in_file_section():
|
|
"""SALARY-FILE/BONUS-FILE 应存在于 FILE-SECTION,供输入文件写入。"""
|
|
_, pp = _load('KYU09MRG')
|
|
fs = parse_file_section(pp)
|
|
assert 'SALARY-FILE' in fs
|
|
assert 'BONUS-FILE' in fs
|