""" 测试用户提供的4个标准规范 验证归一化匹配逻辑是否有效 直接使用生产代码 core.construction_review.component.standard_matching 模块 """ import asyncio import sys import os current_dir = os.path.dirname(os.path.abspath(__file__)) project_root = os.path.dirname(os.path.dirname(current_dir)) if project_root not in sys.path: from conftest import ( StandardRepository, StandardMatcher, MatchResultCode, ) # Mock 数据 MOCK_DATA = [ {"id": 1, "standard_name": "铁路桥涵设计规范", "standard_number": "TB 10002-2017", "validity": "XH"}, {"id": 2, "standard_name": "铁路工程抗震设计规范", "standard_number": "GB 50111-2006", "validity": "XH"}, {"id": 3, "standard_name": "铁路混凝土工程施工质量验收标准", "standard_number": "TB 10424-2018", "validity": "XH"}, {"id": 4, "standard_name": "公路水运危险性较大工程专项施工方案编制审查规程", "standard_number": "JT/T 1495-2024", "validity": "XH"}, ] def create_matcher(): """创建加载了 Mock 数据的匹配器""" repo = StandardRepository() repo.load_data(MOCK_DATA) return StandardMatcher(repo) def check_standards(matcher, standards): """批量检查(模拟 StandardMatchingService.check_standards)""" results = [] for idx, std in enumerate(standards, start=1): result = matcher.match( seq_no=idx, input_name=std.get("standard_name", ""), input_number=std.get("standard_number", "") ) if result is not None: results.append(result) return results async def test_user_standards(): """测试用户提供的4个标准""" matcher = create_matcher() # 用户提供的4个标准 test_standards = [ {"standard_name": "铁路桥涵设计规范", "standard_number": "TB 10002-2017"}, {"standard_name": "铁路工程抗震设计规范", "standard_number": "GB 50111-2006"}, {"standard_name": "铁路混凝土工程施工质量验收标准", "standard_number": "TB 10424-2018"}, {"standard_name": "公路水运危险性较大工程专项施工方案编制审查规程", "standard_number": "JT/T 1495-2023"}, ] print("=" * 80) print("测试用户提供的4个标准(使用生产代码归一化匹配)") print("=" * 80) results = check_standards(matcher, test_standards) all_passed = True for i, result in enumerate(results, 1): print(f"\n【{i}】{result.raw_name}") print(f" 标准号: {result.raw_number}") print(f" 状态码: {result.status_code}") print(f" 处理结果: {result.process_result}") print(f" 最终结果: {result.final_result}") # 验证预期结果 if i <= 3: # 前3个应该是 OK if result.status_code != MatchResultCode.OK.value: print(f" [失败] 期望 OK,实际 {result.status_code}") all_passed = False else: print(f" [通过]") else: # 第4个应该是 MISMATCH(因为Mock数据中是2024版) if result.status_code != MatchResultCode.MISMATCH.value: print(f" [失败] 期望 MISMATCH,实际 {result.status_code}") all_passed = False else: print(f" [通过]") print("\n" + "=" * 80) if all_passed: print("[成功] 所有测试通过!") else: print("[失败] 部分测试失败!") print("=" * 80) return all_passed def test_with_bookname_variations(): """测试书名号变体(归一化匹配)""" print("\n" + "=" * 80) print("测试书名号变体匹配(生产代码归一化)") print("=" * 80) repo = StandardRepository() mock_data = [ {"id": 1, "standard_name": "铁路桥涵设计规范", "standard_number": "TB 10002-2017", "validity": "XH"}, ] repo.load_data(mock_data) matcher = StandardMatcher(repo) # 测试各种名称变体 test_cases = [ ("铁路桥涵设计规范", "TB 10002-2017", "无书名号"), ("《铁路桥涵设计规范》", "TB 10002-2017", "带书名号"), ("铁路桥涵 设计规范", "TB 10002-2017", "带空格(归一化去除后匹配)"), ("《铁路桥涵 设计规范》", "TB 10002-2017", "带书名号和空格(归一化去除后匹配)"), ] all_passed = True for name, number, desc in test_cases: result = matcher.match(1, name, number) # 归一化会去除所有空白,所以带空格的变体也应匹配成功 if result is not None and result.status_code == MatchResultCode.OK.value: status = "[OK]" else: status = "[FAIL]" all_passed = False print(f"\n{status} {desc}") print(f" 输入名称: {name}") if result: print(f" 结果: {result.status_code}") else: print(f" 结果: None(跳过审查)") return all_passed if __name__ == "__main__": # 运行异步测试 result1 = asyncio.run(test_user_standards()) # 运行书名号变体测试 result2 = test_with_bookname_variations() print("\n" + "=" * 80) if result1 and result2: print("[成功] 所有测试通过!") sys.exit(0) else: print("[警告] 部分测试失败!") sys.exit(1)