//======================================================================= // PmSysvariableTest: 协议结构体 pack(1) 大小/偏移 + 枚举/宏完整性 // 不改动生产代码;检测二进制协议漂移与枚举值变化。 //======================================================================= #include #include #include #include "pmSysvariable.h" #include "driver.h" #include "udpcomm/ccuUdpMsg.h" // ---------------------------------------------------------------------- // pack(1) 协议结构体大小断言 // ---------------------------------------------------------------------- TEST(PmSysvariableTest, HeaderStructSize) { EXPECT_EQ(sizeof(m_header), 6u); // start1+start2+id+length = 1+1+2+2 EXPECT_EQ(offsetof(m_header, id), 2u); EXPECT_EQ(offsetof(m_header, length), 4u); } TEST(PmSysvariableTest, PackedMessageStructSizes) { // header(6) + flag(1) + failureCode(1) + Checksum(4) EXPECT_EQ(sizeof(msg_CcuSetParmFbMsg), 12u); // header(6) + m_date(8) + ccuColCmd + Checksum(4) EXPECT_EQ(sizeof(msg_CcuColCmdMsg), 6u + sizeof(m_date) + sizeof(ccuColCmd) + 4u); // header(6) + disHighVolBusCmd + cChecksum(1) EXPECT_EQ(sizeof(msg_disHVBCmd), 6u + sizeof(disHighVolBusCmd) + 1u); // header(6) + ccuState + Checksum(4) EXPECT_EQ(sizeof(msg_CcuStateFbMsg), 6u + sizeof(ccuState) + 4u); } TEST(PmSysvariableTest, NoImplicitPadding) { // pack(1):字段偏移必须连续(抽样检查,防意外 padding) EXPECT_EQ(offsetof(ccuColCmd, heartbeat), offsetof(ccuColCmd, powerBatEfficiency) + sizeof(unsigned short)); EXPECT_EQ(offsetof(disHighVolBusCmd, coolingSystem), offsetof(disHighVolBusCmd, dcdc5Module) + 1); } // ---------------------------------------------------------------------- // 宏值 // ---------------------------------------------------------------------- TEST(PmSysvariableTest, MacroConstants) { EXPECT_EQ(BREAK_ON, 0x55); EXPECT_EQ(BREAK_OFF, 0xAA); EXPECT_EQ(BREAK_FALSE, 0x5A); EXPECT_EQ(DIS_BREAKER_ON, 0x55); EXPECT_EQ(DIS_BREAKER_OFF, 0xAA); EXPECT_EQ(DIS_FAULTOFF, 0x5A); EXPECT_EQ(DRIVER_POWER_OFF, 0x00); EXPECT_EQ(DRIVER_FULL_POWER_ON, 0x01); EXPECT_EQ(DRIVER_INSTRUMENT_POWER_ON, 0x02); EXPECT_EQ(DRIVER_MOTIVE_POWER_ON, 0x03); EXPECT_EQ(DRIVER_STANDBY, 0x04); } // ---------------------------------------------------------------------- // 工况枚举 // ---------------------------------------------------------------------- TEST(PmSysvariableTest, WorkConditionEnum) { EXPECT_EQ((int)WorkCondition::CHANING, 0); EXPECT_EQ((int)WorkCondition::STANDBY, 1); EXPECT_EQ((int)WorkCondition::SHORE_BASED_READY, 2); EXPECT_EQ((int)WorkCondition::WATER_BASED_READY, 3); EXPECT_EQ((int)WorkCondition::REMOTE_CONTROL, 4); EXPECT_EQ((int)WorkCondition::CRUISE_MODE, 5); EXPECT_EQ((int)WorkCondition::HIGH_SPEED_MODE, 6); EXPECT_EQ((int)WorkCondition::ASCEND_DESCEND, 7); EXPECT_EQ((int)WorkCondition::BUOYANCY_ADJUST, 8); EXPECT_EQ((int)WorkCondition::UNDERWATER_RECON, 9); EXPECT_EQ((int)WorkCondition::SURFACE_RECON, 10); EXPECT_EQ((int)WorkCondition::DJ_MODE, 11); EXPECT_EQ((int)WorkCondition::LIFT_MODE, 12); } TEST(PmSysvariableTest, TaskTypeEnum) { EXPECT_EQ((int)TaskType::THROW_LOAD, 1); EXPECT_EQ((int)TaskType::FLOAT_UP, 2); EXPECT_EQ((int)TaskType::RECYCLE, 3); EXPECT_EQ((int)TaskType::HOVER, 4); EXPECT_EQ((int)TaskType::SAT_COMM, 5); EXPECT_EQ((int)TaskType::SAT_CALIBRATE, 6); EXPECT_EQ((int)TaskType::TOUR, 7); EXPECT_EQ((int)TaskType::SAIL, 8); EXPECT_EQ((int)TaskType::EMER_SAT_COMM, 9); EXPECT_EQ((int)TaskType::EMER_SAIL, 10); EXPECT_STREQ(TaskType::toString(TaskType::SAIL).c_str(), "sail"); EXPECT_STREQ(TaskType::toString(TaskType::EMER_SAIL).c_str(), "emerSail"); EXPECT_EQ((int)TaskType::fromString("tour"), (int)TaskType::TOUR); } TEST(PmSysvariableTest, ModeEnum) { EXPECT_EQ((int)PMMode::Normal, 0); EXPECT_EQ((int)PMMode::Test, 1); EXPECT_EQ((int)PMMode::Debug, 2); EXPECT_EQ((int)RunMode::Normal, 0); EXPECT_EQ((int)RunMode::Test, 1); EXPECT_EQ((int)RunMode::Debug, 2); } TEST(PmSysvariableTest, EquipmentCommandEnum) { EXPECT_EQ((int)EquipmentCommand::OFF, 0); EXPECT_EQ((int)EquipmentCommand::ON, 1); EXPECT_EQ((int)EquipmentCommand::METER_ON, 2); EXPECT_EQ((int)EquipmentCommand::POWER_ON, 3); EXPECT_EQ((int)EquipmentCommand::METER_OFF, 4); EXPECT_EQ((int)EquipmentCommand::POWER_OFF, 5); } TEST(PmSysvariableTest, DeviceIdSpotCheck) { EXPECT_EQ((int)DeviceId::thruster, 53); EXPECT_EQ((int)DeviceId::sideSonar, 35); EXPECT_EQ((int)DeviceId::bowRudderDeploy, 15); EXPECT_EQ((int)DeviceId::mastLiftingServo, 41); EXPECT_EQ((int)DeviceId::buoyancyAdjust1, 44); EXPECT_EQ((int)DeviceId::sternRudderServo1, 49); EXPECT_EQ((int)DeviceId::commMast, 40); EXPECT_STREQ(DeviceId::toString(DeviceId::thruster).c_str(), "thruster"); } TEST(PmSysvariableTest, DeviceIdSets) { // 水声设备集合与无电设备集合互斥 EXPECT_TRUE(underWterDevices.count(DeviceId::DVL) == 1); EXPECT_TRUE(underWterDevices.count(DeviceId::singleBeamSonar1) == 1); EXPECT_TRUE(noPowerDevices.count(DeviceId::depth1) == 1); EXPECT_TRUE(noPowerDevices.count(DeviceId::ins) == 1); // 无电设备不应出现在水声设备里 EXPECT_TRUE(underWterDevices.count(DeviceId::depth1) == 0); }