148 lines
6.2 KiB
C++
148 lines
6.2 KiB
C++
|
|
#include "odf_unit.hpp"
|
|||
|
|
#include "adapter_interface.hpp"
|
|||
|
|
#include "naming_helper.hpp"
|
|||
|
|
#include "config_template.hpp"
|
|||
|
|
#include "project_milestone.hpp"
|
|||
|
|
#include "app.hpp"
|
|||
|
|
|
|||
|
|
#include <cassert>
|
|||
|
|
#include <iostream>
|
|||
|
|
#include <string>
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* @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;
|
|||
|
|
}
|