#include "odf_unit.hpp" #include "adapter_interface.hpp" #include "naming_helper.hpp" #include "config_template.hpp" #include "project_milestone.hpp" #include "app.hpp" #include #include #include /** * @brief ODF 管理核心模块单元测试 * * 使用标准库 assert 验证各数据结构和功能的正确性。 * 不依赖 GoogleTest 等外部测试框架。 */ int main() { std::cout << "===== ODF 管理模块单元测试 =====\n\n"; // ---- ODF Unit 测试 ---- std::cout << "[TEST] OdfUnit 构造与摘要 ... "; OdfUnit unit("DC01-F03-TX-ODP-LC24-001-A", OdfUnitType::Patching, 48, 44, 482, 300, MountType::Rack19Inch); assert(unit.id == "DC01-F03-TX-ODP-LC24-001-A"); assert(unit.maxPorts == 48); assert(unit.heightMm == 44); assert(unit.widthMm == 482); assert(unit.depthMm == 300); assert(unit.type == OdfUnitType::Patching); assert(unit.mountType == MountType::Rack19Inch); assert(unit.typeString() == "配线型(Patching)"); assert(unit.mountString() == "19英寸机架式"); assert(!unit.summary().empty()); std::cout << "通过\n"; // ---- AdapterInterface 测试 ---- std::cout << "[TEST] AdapterInterface 构造与兼容性 ... "; AdapterInterface lcSm(ConnectorType::LC, FiberMode::SingleMode, PolishType::APC, 500, 24); AdapterInterface scMm(ConnectorType::SC, FiberMode::MultiMode, PolishType::UPC, 500, 12); AdapterInterface mpoSm(ConnectorType::MPO, FiberMode::SingleMode, PolishType::APC, 500, 48); AdapterInterface mpoMm(ConnectorType::MPO, FiberMode::MultiMode, PolishType::UPC, 500, 48); assert(lcSm.connectorString() == "LC"); assert(scMm.fiberModeString() == "多模(MM)"); assert(lcSm.polishString() == "APC"); assert(lcSm.checkCompatibility() == true); assert(scMm.checkCompatibility() == true); assert(mpoSm.checkCompatibility() == false); // MPO+单模视作不兼容 assert(mpoMm.checkCompatibility() == true); assert(!lcSm.summary().empty()); std::cout << "通过\n"; // ---- NamingHelper 测试 ---- std::cout << "[TEST] NamingHelper 校验与生成 ... "; std::string validCode = "DC01-F03-TX-ODP-LC24-001-A"; std::string invalidCode = "invalid-code-123"; auto validResult = NamingHelper::validateFormat(validCode); auto invalidResult = NamingHelper::validateFormat(invalidCode); assert(validResult.has_value()); assert(!invalidResult.has_value()); std::string generated = NamingHelper::generate("DC01", "F03", "TX", "ODP", "LC24", "001", "A"); assert(generated == "DC01-F03-TX-ODP-LC24-001-A"); std::string generatedNoExt = NamingHelper::generate("RM01", "B1", "NR", "ODS", "SC12", "005"); assert(generatedNoExt == "RM01-B1-NR-ODS-SC12-005"); auto checkNoExt = NamingHelper::validateFormat(generatedNoExt); assert(checkNoExt.has_value()); std::cout << "通过\n"; // ---- ConfigTemplate 测试 ---- std::cout << "[TEST] ConfigTemplate 模板与 BOM 生成 ... "; auto templates = ConfigTemplate::builtInTemplates(); assert(templates.size() >= 3); assert(templates[0].scenarioName == "数据中心LC单模预端接"); assert(templates[0].portsPerCabinet == 48); assert(templates[0].spareRatio > 0.0); // BOM 边界测试:0 机柜 std::string bom0 = templates[0].generateBomSummary(0); assert(bom0.find("基础端口量: 0") != std::string::npos); // BOM 正常测试 std::string bom3 = templates[0].generateBomSummary(3); assert(bom3.find("基础端口量: 144") != std::string::npos); assert(bom3.find("含余量总端口数: 166") != std::string::npos || bom3.find("含余量总端口数: 165") != std::string::npos); std::cout << "通过\n"; // ---- ProjectMilestone 测试 ---- std::cout << "[TEST] ProjectMilestone 时间约束 ... "; ProjectMilestone protoOk(MilestoneStage::Prototype, 4, 6, "王五", false); ProjectMilestone deliveryOk(MilestoneStage::Delivery, 10, 12, "张三", false); ProjectMilestone protoBad(MilestoneStage::Prototype, 4, 8, "王五", false); ProjectMilestone deliveryBad(MilestoneStage::Delivery, 10, 14, "张三", false); assert(protoOk.checkTimeConstraint() == true); assert(deliveryOk.checkTimeConstraint() == true); assert(protoBad.checkTimeConstraint() == false); assert(deliveryBad.checkTimeConstraint() == false); assert(protoOk.stageString() == "样机测试"); assert(deliveryOk.stageString() == "批量交付"); std::cout << "通过\n"; // ---- calculatePortDensity 测试 ---- std::cout << "[TEST] calculatePortDensity ... "; assert(App::calculatePortDensity(2, 48) == 24); // 48/2=24 assert(App::calculatePortDensity(1, 48) == 48); // 48/1=48 assert(App::calculatePortDensity(3, 72) == 24); // 72/3=24 assert(App::calculatePortDensity(0, 48) == 0); // 除零保护 assert(App::calculatePortDensity(5, 12) == 2); // 12/5=2(向下取整) std::cout << "通过\n"; // ---- App 综合链路测试 ---- std::cout << "[TEST] App 综合: 命名->单元->BOM 链路 ... "; App app; // 按命名规则生成 ID 并创建单元 std::string id = NamingHelper::generate("SH01", "A2", "DC", "ODP", "LC48", "010", "B"); auto idCheck = NamingHelper::validateFormat(id); assert(idCheck.has_value()); app.addOdfUnit(OdfUnit(id, OdfUnitType::Hybrid, 96, 88, 482, 300, MountType::Rack19Inch)); std::string unitList = app.listOdfUnits(); assert(unitList.find("SH01-A2-DC-ODP-LC48-010-B") != std::string::npos); // 使用模板生成 BOM std::string bom = app.generateBom(2, 5); // MPO 高密度 assert(bom.find("MPO高密度预端接") != std::string::npos); assert(bom.find("基础端口量: 480") != std::string::npos); // 里程碑约束检查 app.addMilestone(ProjectMilestone(MilestoneStage::Prototype, 4, 6, "王五", false)); app.addMilestone(ProjectMilestone(MilestoneStage::Delivery, 10, 12, "张三", false)); std::string constraintResult = app.checkMilestonesConstraint(); assert(constraintResult.find("所有里程碑时间约束均满足") != std::string::npos); std::cout << "通过\n"; std::cout << "\n===== 全部测试通过! =====\n"; return 0; }