Files
2026-06-09 12:42:15 +08:00

79 lines
3.0 KiB
C++

// 本文件测试上位机/主站侧封装。验证 HostClient 是否能构造文档要求的请求,
// 并且只接受从站地址、寄存器数量、地址和 Modbus CRC 都符合预期的响应。
#include "line_laser_modbus/host.hpp"
#include "test_support.hpp"
#include <iostream>
using namespace line_laser_modbus;
namespace {
void test_status_response_parse() {
const HostClient host;
const ByteVector response =
build_read_response(kDefaultSlaveId,
RegisterVector{static_cast<std::uint16_t>(
WorkMode::OnlineTracking),
static_cast<std::uint16_t>(
DeviceState::OnlineTrackingNormal)});
const auto status = host.parse_status_response(response);
test_support::require_true(status.has_value(),
"host must parse valid mode/state response");
test_support::require_true(status->mode == WorkMode::OnlineTracking,
"host must parse work mode");
test_support::require_true(status->state == DeviceState::OnlineTrackingNormal,
"host must parse device state");
}
void test_status_response_rejects_invalid_state() {
const HostClient host;
const ByteVector response = build_read_response(kDefaultSlaveId,
RegisterVector{0U, 99U});
test_support::require_true(!host.parse_status_response(response).has_value(),
"host must reject invalid state value");
}
void test_pose_response_parse() {
const HostClient host;
const Pose6D source{55U, -1.5F, 2.25F, 3.5F, 4.0F, 5.0F, 6.0F};
const ByteVector response =
build_read_response(kDefaultSlaveId, pose_to_register_vector(source));
const auto pose = host.parse_current_pose_response(response);
test_support::require_true(pose.has_value(), "host must parse current pose");
test_support::require_equal(pose->timestamp_ms, 55U,
"host must parse pose timestamp");
test_support::require_float_close(pose->x, -1.5F, "host must parse pose x");
test_support::require_float_close(pose->y, 2.25F, "host must parse pose y");
test_support::require_float_close(pose->z, 3.5F, "host must parse pose z");
}
void test_write_ack_parse() {
const HostClient host;
const ByteVector ack =
build_write_response(kDefaultSlaveId, kTargetPoseAddress, kPoseRegisterCount);
test_support::require_true(
host.parse_write_ack(ack, kTargetPoseAddress, kPoseRegisterCount),
"host must accept matching write ack");
test_support::require_true(
!host.parse_write_ack(ack, kCorrectionAddress, kPoseRegisterCount),
"host must reject ack for unexpected address");
}
} // 匿名命名空间
int main() {
test_status_response_parse();
test_status_response_rejects_invalid_state();
test_pose_response_parse();
test_write_ack_parse();
std::cout << "host_tests passed\n";
return 0;
}