test: cover between/hostvar/gcov-merge, class conditions, schema drop-tables, gixsql fixes
This commit is contained in:
@@ -0,0 +1,74 @@
|
||||
"""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
|
||||
Reference in New Issue
Block a user