7/tests/basic_test.cpp

148 lines
6.2 KiB
C++
Raw Permalink 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.

#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;
}