//======================================================================= // UpmsgTest: 上位机/外部通信 JSON 消息解析与序列化往返 // 仅链接现有 upmsg/*.h + upmsg_definitions.cpp。 // 注意:部分 upmsg 头文件未包含 json/loguru/pmSysvariable,需先包含。 //======================================================================= #include #include "json/json.h" #include "logc/loguru.hpp" #include "pmSysvariable.h" #include "upmsg/uPower_sysState.h" #include "upmsg/uExternComm_setOpMode.h" #include "upmsg/uExternComm_setOpCondition.h" #include "upmsg/uExternComm_setPowerSystem.h" #include "upmsg/uExternComm_setDeviceSwitch.h" #include "upmsg/uPlan_taskStart.h" #include "upmsg/uPlan_planStop.h" #include "upmsg/uDetect_xcVoltage_cmd.h" #include "upmsg/uDetect_zdpVoltage_cmd.h" #include "upmsg/uDevice_insData.h" TEST(UpmsgTest, PowerSysStateParse) { uPower_sysStateMsg msg; MSControlCmd cmd; EXPECT_TRUE(msg.parseControlCmdFromJson(cmd, R"({"powerCMD":1,"modCMD":2,"workCMD":5})")); EXPECT_EQ(cmd.powerCMD, 1u); EXPECT_EQ(cmd.modCMD, 2u); EXPECT_EQ(cmd.workCMD, 5u); // 缺字段 → false EXPECT_FALSE(msg.parseControlCmdFromJson(cmd, R"({"powerCMD":1})")); // 非法 JSON → false EXPECT_FALSE(msg.parseControlCmdFromJson(cmd, "{bad json")); } TEST(UpmsgTest, SetOpMode) { uExternComm_setOpModeMsg msg; EXPECT_EQ(msg.getSetOpMode("uExternComm_setOpMode_cmd", R"({"state_uint8":1})"), 1); EXPECT_EQ(msg.getSetOpMode("uExternComm_setOpMode_cmd", R"({})"), -1); EXPECT_EQ(msg.getSetOpMode("wrong_key", R"({"state_uint8":1})"), 0); // key 不匹配 → 0 } TEST(UpmsgTest, SetOpCondition) { uExternComm_setOpConditionMsg msg; EXPECT_EQ(msg.getSetOpCondition("uExternComm_setOpCondition_cmd", R"({"state_uint8":7})"), 7); EXPECT_EQ(msg.getSetOpCondition("uExternComm_setOpCondition_cmd", R"({})"), -1); } TEST(UpmsgTest, SetPowerSystem) { uExternComm_setPowerSystemMsg msg; EXPECT_EQ(msg.getSetPMSys("uExternComm_setPowerSystem_cmd", R"({"powerCmd_uint8":4})"), 4); EXPECT_EQ(msg.getSetPMSys("uExternComm_setPowerSystem_cmd", R"({})"), -1); } TEST(UpmsgTest, SetDeviceSwitch) { uExternComm_setDeviceSwitchMsg msg; DeviceSwitchCmd c = msg.getSetDevSwitch("uExternComm_setDeviceSwitch_cmd", R"({"id_uint8":53,"cmd_uint8":1})"); EXPECT_EQ(c.id, 53); EXPECT_EQ(c.cmd, 1); // 空对象 → id=-1 DeviceSwitchCmd c2 = msg.getSetDevSwitch("uExternComm_setDeviceSwitch_cmd", R"({})"); EXPECT_EQ(c2.id, -1); } TEST(UpmsgTest, TaskStart) { uPlan_taskStartMsg msg; MissionState m = msg.getMission("uPlan_taskStart_st", R"({"taskType_str":"sail","balanceEnabled_bool":true,"bowRudderUnfold_bool":false})"); EXPECT_EQ(m.type, (int)TaskType::SAIL); EXPECT_TRUE(m.enableBuoyancyAdjustment); EXPECT_FALSE(m.enableBowRudder); } TEST(UpmsgTest, TaskStop) { uPlan_planStopMsg msg; EXPECT_TRUE(msg.getTaskStop("uPlan_planStop_st", R"({"op_int32":1})")); EXPECT_FALSE(msg.getTaskStop("uPlan_planStop_st", R"({"op_int32":0})")); EXPECT_FALSE(msg.getTaskStop("uPlan_planStop_st", R"({})")); } TEST(UpmsgTest, XcVoltageRoundTrip) { uDetect_xcVoltage_cmd cmd; cmd.xcLowVoltageAdd_int32 = 1; cmd.xcHighVoltageAdd_int32 = 2; std::string json = cmd.toJsonString(); uDetect_xcVoltage_cmd cmd2; EXPECT_TRUE(cmd2.fromJsonString(json)); EXPECT_EQ(cmd2.xcLowVoltageAdd_int32, 1); EXPECT_EQ(cmd2.xcHighVoltageAdd_int32, 2); EXPECT_FALSE(cmd2.fromJsonString("{bad json")); } TEST(UpmsgTest, ZdpVoltageRoundTrip) { uDetect_zdpVoltage_cmd cmd; cmd.zdpVoltageAdd_int32 = 2; std::string json = cmd.toJsonString(); uDetect_zdpVoltage_cmd cmd2; EXPECT_TRUE(cmd2.fromJsonString(json)); EXPECT_EQ(cmd2.zdpVoltageAdd_int32, 2); } TEST(UpmsgTest, InsDataParse) { uDevice_insDataMsg msg; InsDataState st; EXPECT_EQ(msg.parseMsg("uDevice_insData_st", R"({"headingAngle_int32":1200,"rollAngle_int32":-50,"pitchAngle_int32":30,"depth_int32":1500, "headingAngularVelocity_int32":10,"rollAngularVelocity_int32":-1,"longAngularVelocity_int32":2, "lon_int32":113123,"lat_int32":22123,"northSpeed_int16":12,"eastSpeed_int16":-3,"zSpeed_int16":1})", st), 1); EXPECT_EQ(st.headingAngle_int32, 1200); EXPECT_EQ(st.rollAngle_int32, -50); EXPECT_EQ(st.pitchAngle_int32, 30); EXPECT_EQ(st.depth_int32, 1500); EXPECT_EQ(st.headingAngularVelocity_int32, 10); EXPECT_EQ(st.northSpeed_int16, 12); // key 不匹配 → 0 EXPECT_EQ(msg.parseMsg("wrong_key", R"({"headingAngle_int32":1})", st), 0); // 非法 JSON → -1 EXPECT_EQ(msg.parseMsg("uDevice_insData_st", "{bad json", st), -1); // 缺字段 → 解析成功但保持缺省值 InsDataState st2; EXPECT_EQ(msg.parseMsg("uDevice_insData_st", R"({"headingAngle_int32":99})", st2), 1); EXPECT_EQ(st2.headingAngle_int32, 99); EXPECT_EQ(st2.depth_int32, 0); }