| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155 |
- """
- 测试用户提供的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)
|