Files
AutoBOM-BOMForge/VBA/Modules/mTestEngine.bas
Misaka_Company f344cbe206 Add VBA source code modules
Added VBA project structure including:
- Class modules for BOM row and condition engine
- Test engine module

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-19 12:28:29 +08:00

130 lines
5.5 KiB
QBasic
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
' ==============================================================================
' 模块名称: mTestEngine
' 模块类别: 标准模块 (Standard Module)
' 模块职责: 专门用于测试 cConditionEngine 类的逻辑准确性 (引入轻量级单元测试框架)
' ==============================================================================
Option Explicit
' 定义模块级变量,用于统计测试结果
Private passCount As Integer
Private failCount As Integer
Public Sub RunBOMForgeTests()
' 初始化计数器
passCount = 0
failCount = 0
' 执行条件引擎测试
Call Test_ConditionEngine
' 执行数据模型测试 (新增)
Call Test_cBOMRow
' ---- 输出测试汇总 ----
Debug.Print "-----------------------------------------------"
Debug.Print "测试汇总: 共 " & (passCount + failCount) & " 个用例"
Debug.Print "通过: " & passCount & " 失败: " & failCount
If failCount = 0 Then
Debug.Print ">>> 状态: 全部通过! (ALL PASS)"
Else
Debug.Print ">>> 状态: 存在失败用例,请检查逻辑!"
End If
Debug.Print "========== BOMForge 测试框架结束 =========="
End Sub
Private Sub Test_ConditionEngine()
Dim conditionEngine As cConditionEngine
Set conditionEngine = New cConditionEngine
Dim originStr As String
Dim expectedStr As String
Dim paramName As String
Dim newValue As String
paramName = "lcfw"
newValue = "M19"
Debug.Print "========== 1. 开始测试: cConditionEngine =========="
' ---- 测试用例 1: 盘止钉 (纯 OR 链,无 AND无括号) ----
originStr = "lcfw=M01 OR lcfw=M02 OR lcfw=M30"
expectedStr = "lcfw=M01 OR lcfw=M02 OR lcfw=M30 OR lcfw=M19"
AssertEqual "场景1_盘止钉", expectedStr, conditionEngine.InjectOr(originStr, paramName, newValue)
' ---- 测试用例 2: 接头 (括号包裹的 OR 链,外面有 AND) ----
originStr = "(azxs=A0 OR azxs=AT OR azxs=AH) AND gclj=Z14 AND (lcfw=M12 OR lcfw=M13 OR lcfw=M14 OR lcfw=M15 OR lcfw=M16)"
expectedStr = "(azxs=A0 OR azxs=AT OR azxs=AH) AND gclj=Z14 AND (lcfw=M12 OR lcfw=M13 OR lcfw=M14 OR lcfw=M15 OR lcfw=M16 OR lcfw=M19)"
AssertEqual "场景2_接头", expectedStr, conditionEngine.InjectOr(originStr, paramName, newValue)
' ---- 测试用例 3: 弹性元件 (孤立的参数,外面有 AND需自动加括号) ----
originStr = "lcfw=M01 AND gclj!=M20"
expectedStr = "(lcfw=M01 OR lcfw=M19) AND gclj!=M20"
AssertEqual "场景3_弹簧管", expectedStr, conditionEngine.InjectOr(originStr, paramName, newValue)
' ---- 测试用例 4: 封口片 (右侧紧跟 AND 的情况) ----
originStr = "(lcfw=M12 OR lcfw=M13 OR lcfw=M14 OR lcfw=M15 OR lcfw=M16)AND gclj!=M20"
expectedStr = "(lcfw=M12 OR lcfw=M13 OR lcfw=M14 OR lcfw=M15 OR lcfw=M16 OR lcfw=M19)AND gclj!=M20"
AssertEqual "场景4_封口片", expectedStr, conditionEngine.InjectOr(originStr, paramName, newValue)
' ---- 测试用例 5: 防御性测试 (本身已经包含了目标条件,看是否会重复添加) ----
originStr = "lcfw=M01 OR lcfw=M19"
expectedStr = "lcfw=M01 OR lcfw=M19"
AssertEqual "场景5_防重复", expectedStr, conditionEngine.InjectOr(originStr, paramName, newValue)
End Sub
' ==============================================================================
' 新增:针对 cBOMRow 对象的单元测试
' ==============================================================================
Private Sub Test_cBOMRow()
Debug.Print ""
Debug.Print "========== 2. 开始测试: cBOMRow 数据模型 =========="
Dim bomRow As cBOMRow
Set bomRow = New cBOMRow
' 测试初始状态:应为 Clean (False)
AssertEqual "初始脏标记测试", "False", CStr(bomRow.IsDirty)
' 模拟从 Excel 中读取数据 (此时要避开 Property Let 的脏标记触发,但既然封装了,我们就测试 Property Let)
' 实际在 Repository 载入时,载入完毕后会调用 ResetDirtyFlag
bomRow.RowNo = 700
bomRow.ModuleType = "接头"
bomRow.Code = "01081014361"
bomRow.ItemName = "径向高压接头"
bomRow.Condition = "(azxs=A0) AND gclj=Z14"
' 赋值后应该是脏的
AssertEqual "赋值后脏标记测试", "True", CStr(bomRow.IsDirty)
' 模拟保存完毕重置标记
bomRow.ResetDirtyFlag
AssertEqual "重置后脏标记测试", "False", CStr(bomRow.IsDirty)
' 模拟未改变内容的重复赋值 (脏标记不应改变)
bomRow.Condition = "(azxs=A0) AND gclj=Z14"
AssertEqual "重复赋值脏标记测试", "False", CStr(bomRow.IsDirty)
' 模拟条件引擎注入新条件 (内容变更,脏标记触发)
bomRow.Condition = "(azxs=A0) AND gclj=Z14 AND (lcfw=M19)"
AssertEqual "状态变更脏标记测试", "True", CStr(bomRow.IsDirty)
AssertEqual "属性读取测试", "(azxs=A0) AND gclj=Z14 AND (lcfw=M19)", bomRow.Condition
End Sub
' ==============================================================================
' 内部辅助方法:断言测试结果
' 将期望值与实际值进行比对,并输出标准化的日志信息
' ==============================================================================
Private Sub AssertEqual(testName As String, expected As String, actual As String)
If expected = actual Then
Debug.Print "[PASS] " & testName
passCount = passCount + 1
Else
Debug.Print "[FAIL] " & testName
Debug.Print " 期望结果: " & expected
Debug.Print " 实际结果: " & actual
failCount = failCount + 1
End If
End Sub