33// # SPDX-License-Identifier: Apache-2.0
44
55#include " tests/test_package.hpp"
6+ #include " geometry_msgs/msg/transform.hpp"
7+ #include " rcdt_messages/srv/transform_pose.hpp"
68#include " rcdt_utilities/manipulate_pose.h"
9+ #include < chrono>
10+ #include < future>
11+ #include < gtest/gtest.h>
12+ #include < memory>
13+ #include < rclcpp/duration.hpp>
14+ #include < rclcpp/future_return_code.hpp>
15+
16+ #define PI 3.14159265
717
818/* *
919 * @brief Test fixture class for the PackageTester Node.
@@ -27,15 +37,22 @@ class PackageTesterFixture : public testing::Test {
2737
2838protected:
2939 void SetUp () override {
40+ pose_manipulator_node_ = std::make_shared<PoseManipulator>();
3041 tester_node_ = std::make_shared<PackageTester>();
42+
43+ executor_->add_node (pose_manipulator_node_);
3144 executor_->add_node (tester_node_);
3245 }
3346
3447 void TearDown () override {
48+ executor_->remove_node (pose_manipulator_node_);
3549 executor_->remove_node (tester_node_);
50+
51+ pose_manipulator_node_.reset ();
3652 tester_node_.reset ();
3753 }
3854
55+ std::shared_ptr<PoseManipulator> pose_manipulator_node_;
3956 std::shared_ptr<PackageTester> tester_node_;
4057 static std::shared_ptr<rclcpp::executors::MultiThreadedExecutor> executor_;
4158};
@@ -44,10 +61,66 @@ std::shared_ptr<rclcpp::executors::MultiThreadedExecutor>
4461 PackageTesterFixture::executor_ = nullptr ;
4562
4663// TESTS
47- TEST_F (PackageTesterFixture, TestTrue ) {
64+ TEST_F (PackageTesterFixture, TestNodeInitialization ) {
4865 ASSERT_EQ (std::string (tester_node_->get_name ()), " manipulate_pose_tester" );
4966}
5067
68+ TEST_F (PackageTesterFixture, TestServiceInitialization) {
69+ ASSERT_TRUE (tester_node_->waitForServices (std::chrono::seconds (1 )));
70+ }
71+
72+ TEST_F (PackageTesterFixture, TestTransformPoseTranslation) {
73+ geometry_msgs::msg::PoseStamped pose_in;
74+ pose_in.pose .position .y = 1 ;
75+ pose_in.pose .position .z = 2 ;
76+
77+ geometry_msgs::msg::Transform tf;
78+ tf.translation .x = 5 ;
79+ tf.translation .y = 5 ;
80+ tf.translation .z = 5 ;
81+
82+ auto req = std::make_shared<rcdt_messages::srv::TransformPose::Request>();
83+ req->pose = pose_in;
84+ req->transform = tf;
85+
86+ auto future_and_id = tester_node_->sendTransformPoseRequest (req);
87+ auto result_code = executor_->spin_until_future_complete (
88+ future_and_id.future , std::chrono::milliseconds (500 ));
89+
90+ ASSERT_EQ (result_code, rclcpp::FutureReturnCode::SUCCESS);
91+ auto response = future_and_id.future .get ();
92+ ASSERT_NE (response, nullptr );
93+
94+ ASSERT_EQ (response->pose .pose .position .x , 5 );
95+ ASSERT_EQ (response->pose .pose .position .y , 6 );
96+ ASSERT_EQ (response->pose .pose .position .z , 7 );
97+ }
98+
99+ TEST_F (PackageTesterFixture, TestTransformPoseRotation) {
100+ geometry_msgs::msg::PoseStamped pose_in;
101+ pose_in.pose .position .x = 5 ;
102+
103+ // apply rotation of +PI/2 around Z-axis, which shifts pose to Y-axis
104+ geometry_msgs::msg::Transform tf;
105+ tf.rotation .w = 0.7071068 ;
106+ tf.rotation .z = 0.7071068 ;
107+
108+ auto req = std::make_shared<rcdt_messages::srv::TransformPose::Request>();
109+ req->pose = pose_in;
110+ req->transform = tf;
111+
112+ auto future_and_id = tester_node_->sendTransformPoseRequest (req);
113+ auto result_code = executor_->spin_until_future_complete (
114+ future_and_id.future , std::chrono::milliseconds (500 ));
115+
116+ ASSERT_EQ (result_code, rclcpp::FutureReturnCode::SUCCESS);
117+ auto response = future_and_id.future .get ();
118+ ASSERT_NE (response, nullptr );
119+
120+ ASSERT_EQ (response->pose .pose .position .x , 0 );
121+ ASSERT_NEAR (response->pose .pose .position .y , 5 , 1e-4 );
122+ }
123+
51124// MAIN
52125int main (int argc, char **argv) {
53126 testing::InitGoogleTest (&argc, argv);
0 commit comments