#![cfg(all(feature = "derive", not(feature = "rcl")))]
#![allow(non_camel_case_types)]
use ros2_types::{Ros2Msg, TypeDescription};
#[derive(Debug, Ros2Msg, TypeDescription, serde::Serialize, serde::Deserialize)]
#[ros2(package = "builtin_interfaces", interface_type = "msg")]
#[repr(C)]
pub struct Time {
pub sec: i32,
pub nanosec: u32,
}
#[test]
fn test_time_default() {
let time = Time::default();
assert_eq!(time.sec, 0);
assert_eq!(time.nanosec, 0);
}
#[test]
fn test_time_clone() {
let time = Time {
sec: 123,
nanosec: 456,
};
let cloned = time.clone();
assert_eq!(cloned.sec, 123);
assert_eq!(cloned.nanosec, 456);
}
#[test]
fn test_time_eq() {
let t1 = Time { sec: 1, nanosec: 2 };
let t2 = Time { sec: 1, nanosec: 2 };
let t3 = Time { sec: 1, nanosec: 3 };
assert_eq!(t1, t2);
assert_ne!(t1, t3);
}
#[test]
fn test_time_type_description() {
let desc = Time::type_description();
assert!(
desc.type_description
.type_name
.contains("builtin_interfaces")
);
assert!(desc.type_description.type_name.contains("Time"));
}
#[derive(Debug, Ros2Msg, TypeDescription, serde::Serialize, serde::Deserialize)]
#[ros2(package = "geometry_msgs", interface_type = "msg")]
#[repr(C)]
pub struct Point {
pub x: f64,
pub y: f64,
pub z: f64,
}
#[derive(Debug, Ros2Msg, TypeDescription, serde::Serialize, serde::Deserialize)]
#[ros2(package = "geometry_msgs", interface_type = "msg")]
#[repr(C)]
pub struct Pose {
pub position: Point,
pub orientation_x: f64,
pub orientation_y: f64,
pub orientation_z: f64,
pub orientation_w: f64,
}
#[test]
fn test_nested_message() {
let pose = Pose::default();
assert_eq!(pose.position.x, 0.0);
assert_eq!(pose.orientation_w, 0.0);
}
#[test]
fn test_nested_type_description() {
let desc = Pose::type_description();
assert!(
!desc.referenced_type_descriptions.is_empty() || !desc.type_description.fields.is_empty()
);
}
#[derive(Debug, Ros2Msg, TypeDescription, serde::Serialize, serde::Deserialize)]
#[ros2(
package = "example_interfaces",
interface_type = "srv",
skip_wrapper = true
)]
#[repr(C)]
pub struct AddTwoInts_Request {
pub a: i64,
pub b: i64,
}
#[derive(Debug, Ros2Msg, TypeDescription, serde::Serialize, serde::Deserialize)]
#[ros2(package = "example_interfaces", interface_type = "srv")]
#[repr(C)]
pub struct AddTwoInts_Response {
pub sum: i64,
}
ros2_types::ros2_service!(example_interfaces, AddTwoInts);
#[test]
fn test_service_request_response() {
let req = AddTwoInts_Request::default();
assert_eq!(req.a, 0);
assert_eq!(req.b, 0);
let resp = AddTwoInts_Response::default();
assert_eq!(resp.sum, 0);
}
#[test]
fn test_service_type_description() {
let req_desc = AddTwoInts_Request::type_description();
assert!(
req_desc
.type_description
.type_name
.contains("AddTwoInts_Request")
);
let resp_desc = AddTwoInts_Response::type_description();
assert!(
resp_desc
.type_description
.type_name
.contains("AddTwoInts_Response")
);
}
#[derive(Debug, Ros2Msg, TypeDescription, serde::Serialize, serde::Deserialize)]
#[ros2(
package = "example_interfaces",
interface_type = "action",
skip_wrapper = true
)]
#[repr(C)]
pub struct Fibonacci_Goal {
pub order: i32,
}
#[derive(Debug, Ros2Msg, TypeDescription, serde::Serialize, serde::Deserialize)]
#[ros2(package = "example_interfaces", interface_type = "action")]
#[repr(C)]
pub struct Fibonacci_Result {
pub final_value: i64,
}
#[derive(Debug, Ros2Msg, TypeDescription, serde::Serialize, serde::Deserialize)]
#[ros2(package = "example_interfaces", interface_type = "action")]
#[repr(C)]
pub struct Fibonacci_Feedback {
pub current_value: i64,
}
#[test]
fn test_action_goal_result_feedback() {
let goal = Fibonacci_Goal::default();
assert_eq!(goal.order, 0);
let result = Fibonacci_Result::default();
assert_eq!(result.final_value, 0);
let feedback = Fibonacci_Feedback::default();
assert_eq!(feedback.current_value, 0);
}
#[test]
fn test_action_type_descriptions() {
let goal_desc = Fibonacci_Goal::type_description();
assert!(
goal_desc
.type_description
.type_name
.contains("Fibonacci_Goal")
);
let result_desc = Fibonacci_Result::type_description();
assert!(
result_desc
.type_description
.type_name
.contains("Fibonacci_Result")
);
let feedback_desc = Fibonacci_Feedback::type_description();
assert!(
feedback_desc
.type_description
.type_name
.contains("Fibonacci_Feedback")
);
}
#[derive(Debug, Ros2Msg, TypeDescription, serde::Serialize, serde::Deserialize)]
#[ros2(package = "std_srvs", interface_type = "srv")]
#[repr(C)]
pub struct Trigger_Request {
}
#[derive(Debug, Ros2Msg, TypeDescription, serde::Serialize, serde::Deserialize)]
#[ros2(package = "std_srvs", interface_type = "srv")]
#[repr(C)]
pub struct Trigger_Response {
pub success: bool,
}
#[test]
fn test_empty_struct() {
let req = Trigger_Request::default();
let _ = req;
}
#[test]
fn test_empty_struct_type_description() {
let desc = Trigger_Request::type_description();
assert!(!desc.type_description.fields.is_empty());
}
#[derive(Debug, Ros2Msg, TypeDescription, serde::Serialize, serde::Deserialize)]
#[ros2(package = "test_msgs", interface_type = "msg")]
#[repr(C)]
pub struct AllPrimitives {
pub bool_val: bool,
pub i8_val: i8,
pub u8_val: u8,
pub i16_val: i16,
pub u16_val: u16,
pub i32_val: i32,
pub u32_val: u32,
pub i64_val: i64,
pub u64_val: u64,
pub f32_val: f32,
pub f64_val: f64,
}
#[test]
fn test_all_primitives() {
let msg = AllPrimitives::default();
assert!(!msg.bool_val);
assert_eq!(msg.i32_val, 0);
assert_eq!(msg.f64_val, 0.0);
}
#[test]
fn test_all_primitives_type_description() {
let desc = AllPrimitives::type_description();
assert_eq!(desc.type_description.fields.len(), 11);
}
#[derive(Debug, Ros2Msg, TypeDescription, serde::Serialize, serde::Deserialize)]
#[ros2(package = "test_msgs", interface_type = "msg")]
#[repr(C)]
pub struct PointT {
pub x: f64,
pub y: f64,
pub z: f64,
}
#[derive(Debug, Ros2Msg, TypeDescription, serde::Serialize, serde::Deserialize)]
#[ros2(package = "test_msgs", interface_type = "msg")]
#[repr(C)]
pub struct PointCollT {
#[serde(with = "ros2_types::BigArray")]
pub points: [PointT; 64],
}
#[test]
fn test_large_array_default() {
let msg = PointCollT::default();
for point in &msg.points {
assert_eq!(point.x, 0.0);
assert_eq!(point.y, 0.0);
assert_eq!(point.z, 0.0);
}
}
#[test]
fn test_large_array_clone() {
let mut msg = PointCollT::default();
msg.points[0].x = 1.0;
msg.points[63].z = 99.0;
let cloned = msg.clone();
assert_eq!(cloned.points[0].x, 1.0);
assert_eq!(cloned.points[63].z, 99.0);
assert_eq!(cloned.points[1].x, 0.0);
}
#[test]
fn test_large_array_eq() {
let mut msg1 = PointCollT::default();
let mut msg2 = PointCollT::default();
assert_eq!(msg1, msg2);
msg1.points[32].y = 42.0;
assert_ne!(msg1, msg2);
msg2.points[32].y = 42.0;
assert_eq!(msg1, msg2);
}