From 04e5435950feb3b4143586ed63ac2497e778d0d6 Mon Sep 17 00:00:00 2001 From: HarryPotter1tech Date: Sun, 28 Sep 2025 17:53:20 +0800 Subject: [PATCH 01/10] =?UTF-8?q?=E5=9C=A8test/=20=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E4=BA=86pnpsolver=20mock,=E9=80=9A=E8=BF=87=E4=BA=86=E7=BC=96?= =?UTF-8?q?=E8=AF=91=EF=BC=8C=E6=B5=8B=E8=AF=95=E4=BA=86=E6=8E=A5=E5=8F=A3?= =?UTF-8?q?=E8=BE=93=E5=85=A5=E8=BE=93=E5=87=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CMakeLists.txt | 10 ++++++++++ tests/CMakeLists.txt | 30 ++++++++++++++++++++++++++++++ tests/test_main.cpp | 29 ++++++++++++++++++++++++++++- tests/test_main.hpp | 44 ++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 112 insertions(+), 1 deletion(-) create mode 100644 tests/CMakeLists.txt create mode 100644 tests/test_main.hpp diff --git a/CMakeLists.txt b/CMakeLists.txt index b65fe5a..bdb4f19 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -9,6 +9,9 @@ project(alliance_auto_aim VERSION 0.0.1 LANGUAGES CXX) include_directories(./include ./src) +option(ENABLE_TESTS "Enable building tests" OFF) +message(STATUS "ENABLE_TESTS is set to: ${ENABLE_TESTS}") + ### Target lib === add_library(${PROJECT_NAME} SHARED) file(GLOB_RECURSE sources_v1 CONFIGURE_DEPENDS @@ -79,3 +82,10 @@ EXPORT ${PROJECT_NAME} RUNTIME DESTINATION bin ) +if(ENABLE_TESTS) + message(STATUS "Tests are enabled") + enable_testing() # 启用 CTest + add_subdirectory(tests) +else() + message(STATUS "Tests are disabled. Use -DENABLE_TESTS=ON to enable.") +endif() \ No newline at end of file diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt new file mode 100644 index 0000000..405b6b5 --- /dev/null +++ b/tests/CMakeLists.txt @@ -0,0 +1,30 @@ +cmake_minimum_required(VERSION 3.16) + +set(CMAKE_CXX_STANDARD 20) +set(CMAKE_CXX_STANDARD_REQUIRED ON) + +# 包含主项目头文件 +include_directories(../include) + +add_executable(test_main test_main.cpp) + +# 确保测试使用 C++20 +target_compile_features(test_main PRIVATE cxx_std_20) + +# GoogleTest 配置 +include(FetchContent) +FetchContent_Declare( + googletest + URL https://github.com/google/googletest/archive/refs/heads/main.zip +) + +set(gtest_force_shared_crt ON CACHE BOOL "" FORCE) +FetchContent_MakeAvailable(googletest) + +target_link_libraries(test_main + GTest::gtest_main + GTest::gmock_main +) + +include(GoogleTest) +gtest_discover_tests(test_main) \ No newline at end of file diff --git a/tests/test_main.cpp b/tests/test_main.cpp index 41ed330..dd49b69 100644 --- a/tests/test_main.cpp +++ b/tests/test_main.cpp @@ -1 +1,28 @@ -int main() { } \ No newline at end of file +#include "test_main.hpp" + +using namespace world_exe::alliance_auto_aim::tests; +using namespace world_exe::interfaces; +using namespace world_exe::data; +using namespace world_exe::enumeration; + +using ::testing::Return; +using ::testing::_; + +TEST(DataFlowTest, Datain_out) +{ + MockPnpSolver Mock_solver; + auto mock_armor_in_image = std::make_shared(); + auto mock_armor_in_camera = std::make_shared(); + std::shared_ptr armor_in_image = mock_armor_in_image; + std::shared_ptr armor_in_camera = mock_armor_in_camera; + + EXPECT_CALL(Mock_solver,SolvePnp(armor_in_image)).WillOnce(Return(armor_in_camera)); + + auto result = Mock_solver.SolvePnp(armor_in_image); + EXPECT_EQ(result, armor_in_camera); +} + +int main(int argc, char **argv) { + ::testing::InitGoogleMock(&argc, argv); + return RUN_ALL_TESTS(); +} \ No newline at end of file diff --git a/tests/test_main.hpp b/tests/test_main.hpp new file mode 100644 index 0000000..00d9468 --- /dev/null +++ b/tests/test_main.hpp @@ -0,0 +1,44 @@ +#pragma once + +#include +#include +#include "interfaces/pnp_solver.hpp" +#include "interfaces/armor_in_camera.hpp" +#include "interfaces/armor_in_image.hpp" + +namespace world_exe::alliance_auto_aim::tests { + + class MockPnpSolver : public world_exe::interfaces::IPnpSolver { + public: + MOCK_METHOD(std::shared_ptr, + SolvePnp, + (std::shared_ptr), + (override)); + }; + + class MockArmorInCamera : public world_exe::interfaces::IArmorInCamera { + public: + MOCK_METHOD(const std::vector&, + GetArmors, + (const world_exe::enumeration::ArmorIdFlag& armor_id), + (const, override)); + + MOCK_METHOD(const world_exe::interfaces::ITimeStamped&, + GetTimeStamped, + (), + (const, override)); + }; + + class MockArmorInImage : public world_exe::interfaces::IArmorInImage { + public: + MOCK_METHOD(const std::vector&, + GetArmors, + (const world_exe::enumeration::ArmorIdFlag& armor_id), + (const, override)); + + MOCK_METHOD(const world_exe::interfaces::ITimeStamped&, + GetTimeStamped, + (), + (const, override)); + }; +} \ No newline at end of file From bc3c88f105e6328511d298c951b9f4e3102d96a7 Mon Sep 17 00:00:00 2001 From: alray <1780284652@qq.com> Date: Mon, 29 Sep 2025 00:12:03 +0800 Subject: [PATCH 02/10] =?UTF-8?q?[CI]:=20=E5=BC=80=E5=90=AFpr=E8=87=AA?= =?UTF-8?q?=E5=8A=A8=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/test-single-platform.yml | 33 ++++++++++++++++++++++ tests/docker/ubuntu22.04.build.dockerfile | 6 ++-- tests/docker/ubuntu22.04.test.dockerfile | 25 ++++++++++++++++ 3 files changed, 62 insertions(+), 2 deletions(-) create mode 100644 .github/workflows/test-single-platform.yml create mode 100644 tests/docker/ubuntu22.04.test.dockerfile diff --git a/.github/workflows/test-single-platform.yml b/.github/workflows/test-single-platform.yml new file mode 100644 index 0000000..d6532a4 --- /dev/null +++ b/.github/workflows/test-single-platform.yml @@ -0,0 +1,33 @@ +# This starter workflow is for a CMake project running on a single platform. There is a different starter workflow if you need cross-platform coverage. +# See: https://github.com/actions/starter-workflows/blob/main/ci/cmake-multi-platform.yml +name: CMake on a single platform + +on: + pull_request: + branches: [ "main" ] + +jobs: + docker-test: + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@v4 + + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Build and cache Docker image + uses: docker/build-push-action@v6 + with: + context: . + file: ./tests/docker/ubuntu22.04.test.dockerfile + tags: alliance_auto_aim_ci:ubuntu2204-test + push: false + cache-from: type=gha + cache-to: type=gha,mode=max + load: true + + - name: Run in ubuntu 22.04 + run: | + docker run --rm alliance_auto_aim_ci:ubuntu2204-test diff --git a/tests/docker/ubuntu22.04.build.dockerfile b/tests/docker/ubuntu22.04.build.dockerfile index cf2136f..0883e6a 100644 --- a/tests/docker/ubuntu22.04.build.dockerfile +++ b/tests/docker/ubuntu22.04.build.dockerfile @@ -4,8 +4,6 @@ FROM ubuntu:22.04 # 设置工作目录 WORKDIR /app -# 拷贝项目文件 -COPY ./env /env RUN apt-get update && apt-get install -y sudo @@ -17,6 +15,10 @@ RUN apt-get update && \ ln -fs /usr/share/zoneinfo/$TZ /etc/localtime && \ dpkg-reconfigure --frontend noninteractive tzdata + +# 拷贝项目文件 +COPY ./env /env + RUN chmod +x /env/ubuntu22.04.sh && /env/ubuntu22.04.sh COPY . /app diff --git a/tests/docker/ubuntu22.04.test.dockerfile b/tests/docker/ubuntu22.04.test.dockerfile new file mode 100644 index 0000000..7ec502e --- /dev/null +++ b/tests/docker/ubuntu22.04.test.dockerfile @@ -0,0 +1,25 @@ +# 使用 Ubuntu 22.04 作为基础镜像 +FROM ubuntu:22.04 + +# 设置工作目录 +WORKDIR /app + +RUN apt-get update && apt-get install -y sudo + +ENV DEBIAN_FRONTEND=noninteractive \ + TZ=Asia/Shanghai + +RUN apt-get update && \ + apt-get install -y tzdata && \ + ln -fs /usr/share/zoneinfo/$TZ /etc/localtime && \ + dpkg-reconfigure --frontend noninteractive tzdata + +# 拷贝项目文件 +COPY ./env /env + +RUN chmod +x /env/ubuntu22.04.sh && /env/ubuntu22.04.sh + +COPY . /app + +RUN cmake -b build -D ENABLE_TESTS=ON && cd build && make -j && ctest + From 786949eb048e17860f15081c208aa88f605e15fb Mon Sep 17 00:00:00 2001 From: Alray Qiu <70491601+AlrayQiu@users.noreply.github.com> Date: Mon, 29 Sep 2025 00:19:19 +0800 Subject: [PATCH 03/10] =?UTF-8?q?[CI]=20=E9=87=8D=E5=91=BD=E5=90=8D?= =?UTF-8?q?=E6=B5=8B=E8=AF=95=E8=A1=8C=E6=96=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/test-single-platform.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test-single-platform.yml b/.github/workflows/test-single-platform.yml index d6532a4..7ba0d7a 100644 --- a/.github/workflows/test-single-platform.yml +++ b/.github/workflows/test-single-platform.yml @@ -1,6 +1,6 @@ # This starter workflow is for a CMake project running on a single platform. There is a different starter workflow if you need cross-platform coverage. # See: https://github.com/actions/starter-workflows/blob/main/ci/cmake-multi-platform.yml -name: CMake on a single platform +name: Test in ubuntu/2204 on: pull_request: From 5a30a95a2e09b7116c6d405a1edaec0ddadff60b Mon Sep 17 00:00:00 2001 From: Alray Qiu <70491601+AlrayQiu@users.noreply.github.com> Date: Mon, 29 Sep 2025 00:22:00 +0800 Subject: [PATCH 04/10] =?UTF-8?q?[CI]=20=20=E4=BF=AE=E5=A4=8Dubuntu22.4.te?= =?UTF-8?q?st.test.dockerfile?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tests/docker/ubuntu22.04.test.dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/docker/ubuntu22.04.test.dockerfile b/tests/docker/ubuntu22.04.test.dockerfile index 7ec502e..1848133 100644 --- a/tests/docker/ubuntu22.04.test.dockerfile +++ b/tests/docker/ubuntu22.04.test.dockerfile @@ -21,5 +21,5 @@ RUN chmod +x /env/ubuntu22.04.sh && /env/ubuntu22.04.sh COPY . /app -RUN cmake -b build -D ENABLE_TESTS=ON && cd build && make -j && ctest +RUN cmake -B build -D ENABLE_TESTS=ON && cd build && make -j && ctest From 3f9b76f45684dae84f203b27527c17b6e94a9bb1 Mon Sep 17 00:00:00 2001 From: alray <1780284652@qq.com> Date: Tue, 30 Sep 2025 07:03:38 +0800 Subject: [PATCH 05/10] =?UTF-8?q?[Fix]:=20=E4=BF=AE=E5=A4=8D=E6=8A=BD?= =?UTF-8?q?=E8=B1=A1=E7=B1=BBdetail::TimeStamped?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CMakeLists.txt | 11 ++--------- .../HZA/identifier/time_stamped_detail.hpp | 18 +++++++++--------- 2 files changed, 11 insertions(+), 18 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index bdb4f19..96afdd5 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -15,15 +15,8 @@ message(STATUS "ENABLE_TESTS is set to: ${ENABLE_TESTS}") ### Target lib === add_library(${PROJECT_NAME} SHARED) file(GLOB_RECURSE sources_v1 CONFIGURE_DEPENDS -# src/v1/*.cpp -# src/v1/*.cc -src/tongji/*.cpp -src/tongji/*.cc -src/tongji/*.cpp -src/playground/*.cpp -src/playground/*.cc -src/core/*.cpp -src/util/*.cpp) +src/*/*.cpp +src/*/*.cc) target_sources( ${PROJECT_NAME} PUBLIC ${sources_v1} diff --git a/src/playground/HZA/identifier/time_stamped_detail.hpp b/src/playground/HZA/identifier/time_stamped_detail.hpp index ff93edc..1ae4c19 100644 --- a/src/playground/HZA/identifier/time_stamped_detail.hpp +++ b/src/playground/HZA/identifier/time_stamped_detail.hpp @@ -1,14 +1,14 @@ -#pragma once +#pragma once #include "interfaces/time_stamped.hpp" #include namespace world_exe::interfaces::detail { - class TimeStamped :public world_exe::interfaces::ITimeStamped { - public: - TimeStamped(); - virtual ~TimeStamped() = default; - virtual const std::time_t& GetTimeStamp() const override; +class TimeStamped : public world_exe::interfaces::ITimeStamped { +public: + TimeStamped() = default; + virtual ~TimeStamped() = default; + const std::time_t& GetTimeStamp() const override; - private: - std::time_t time_stamp_; - }; +private: + std::time_t time_stamp_; +}; } \ No newline at end of file From 64d745db759d4874a21da13963d70613f02cf330 Mon Sep 17 00:00:00 2001 From: alray <1780284652@qq.com> Date: Tue, 30 Sep 2025 07:21:49 +0800 Subject: [PATCH 06/10] =?UTF-8?q?[Fix]=20=E4=BF=AE=E5=A4=8DCMake=20?= =?UTF-8?q?=E4=BE=9D=E8=B5=96=E5=AF=BC=E5=87=BA=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CMakeLists.txt | 114 +++++++++++++++++++++--------------------- cmake/Config.cmake.in | 3 ++ tests/CMakeLists.txt | 1 + 3 files changed, 60 insertions(+), 58 deletions(-) create mode 100644 cmake/Config.cmake.in diff --git a/CMakeLists.txt b/CMakeLists.txt index 96afdd5..145ffe0 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,80 +1,78 @@ cmake_minimum_required(VERSION 3.22) +project(alliance_auto_aim VERSION 0.0.1 LANGUAGES CXX) -set(CMAKE_EXPORT_COMPILE_COMMANDS ON) -set(CMAKE_CXX_STANDARD_REQUIRED ON) +# 编译选项 set(CMAKE_CXX_STANDARD 20) -set(CMAKE_BUILD_TYPE "Release") +set(CMAKE_CXX_STANDARD_REQUIRED ON) +set(CMAKE_POSITION_INDEPENDENT_CODE ON) +set(CMAKE_EXPORT_COMPILE_COMMANDS ON) -project(alliance_auto_aim VERSION 0.0.1 LANGUAGES CXX) +# 构建类型 +if(NOT CMAKE_BUILD_TYPE) + set(CMAKE_BUILD_TYPE Release) +endif() +# 源码与头文件 include_directories(./include ./src) +file(GLOB_RECURSE SOURCES CONFIGURE_DEPENDS src/*.cpp src/*.cc) +add_library(alliance_auto_aim SHARED ${SOURCES}) +target_include_directories(alliance_auto_aim PUBLIC + $ + $ +) -option(ENABLE_TESTS "Enable building tests" OFF) -message(STATUS "ENABLE_TESTS is set to: ${ENABLE_TESTS}") - -### Target lib === -add_library(${PROJECT_NAME} SHARED) -file(GLOB_RECURSE sources_v1 CONFIGURE_DEPENDS -src/*/*.cpp -src/*/*.cc) -target_sources( - ${PROJECT_NAME} PUBLIC - ${sources_v1} - ) -### Target lib End === - -### OpenCV === -# set(OpenCV_DIR /path/to/opencv/build) # 如果需要这个可以方便你设置 +# 第三方依赖 find_package(OpenCV REQUIRED) -include_directories(${OpenCV_INCLUDE_DIRS}) -target_link_libraries(${PROJECT_NAME} ${OpenCV_LIBS}) -### OpenCV End === - -### Eigen === find_package(Eigen3 REQUIRED) -INCLUDE_DIRECTORIES(${EIGEN3_INCLUDE_DIR}) -### Eigen End === - -### TBB === find_package(TBB REQUIRED) -include_directories(${TBB_INCLUDE_DIRS}) -target_link_libraries(${PROJECT_NAME} ${TBB_LIBRARIES}) -### TBB End === - -### OpenVINO === find_package(OpenVINO REQUIRED) -target_link_libraries(${PROJECT_NAME} openvino::runtime) -### OpenVINO End === - -### ceres === find_package(Ceres REQUIRED) -include_directories(${CERES_INCLUDE_DIRS}) -target_link_libraries(${PROJECT_NAME} ${CERES_LIBRARIES}) -### ceres End === - -### libspdlog-dev === find_package(spdlog REQUIRED) -target_link_libraries(${PROJECT_NAME} ${fmt_LIBRARIES}) -### libspdlog-dev End === - -### libfmt-dev === find_package(fmt REQUIRED) -target_link_libraries(${PROJECT_NAME} ${fmt_LIBRARIES}) -### libfmt-dev End === -# 安装库文件 -target_include_directories(${PROJECT_NAME} PUBLIC - $ - $ +# 链接依赖(使用目标名,自动传递) +target_link_libraries(alliance_auto_aim PUBLIC + fmt::fmt + spdlog::spdlog + ${OpenCV_LIBS} + Eigen3::Eigen + TBB::tbb + openvino::runtime + Ceres::ceres +) + +# 安装规则 +include(GNUInstallDirs) +install(TARGETS alliance_auto_aim + EXPORT alliance_auto_aimTargets + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} + ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} + INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} ) -install(TARGETS ${PROJECT_NAME} -EXPORT ${PROJECT_NAME} - ARCHIVE DESTINATION lib/${PROJECT_NAME} - LIBRARY DESTINATION lib/${PROJECT_NAME} - RUNTIME DESTINATION bin +install(DIRECTORY include/ DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}) + +# 导出配置 +include(CMakePackageConfigHelpers) +configure_package_config_file( + "${CMAKE_CURRENT_SOURCE_DIR}/cmake/Config.cmake.in" + "${CMAKE_CURRENT_BINARY_DIR}/alliance_auto_aimConfig.cmake" + INSTALL_DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/alliance_auto_aim +) + +install(FILES + "${CMAKE_CURRENT_BINARY_DIR}/alliance_auto_aimConfig.cmake" + DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/alliance_auto_aim ) +install(EXPORT alliance_auto_aimTargets + FILE alliance_auto_aimTargets.cmake + NAMESPACE alliance_auto_aim:: + DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/alliance_auto_aim +) + + if(ENABLE_TESTS) message(STATUS "Tests are enabled") enable_testing() # 启用 CTest diff --git a/cmake/Config.cmake.in b/cmake/Config.cmake.in new file mode 100644 index 0000000..646919b --- /dev/null +++ b/cmake/Config.cmake.in @@ -0,0 +1,3 @@ +@PACKAGE_INIT@ + +include("${CMAKE_CURRENT_LIST_DIR}/alliance_auto_aimTargets.cmake") diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 405b6b5..f2b9563 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -24,6 +24,7 @@ FetchContent_MakeAvailable(googletest) target_link_libraries(test_main GTest::gtest_main GTest::gmock_main + alliance_auto_aim ) include(GoogleTest) From b16c7d4181f83f2e1a90bde636b3f800f7a0c671 Mon Sep 17 00:00:00 2001 From: HarryPotter1tech Date: Thu, 9 Oct 2025 21:24:43 +0800 Subject: [PATCH 07/10] =?UTF-8?q?=E4=BF=AE=E6=94=B9pnp=20mock,?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../predictor/in_gimbal_control_armor.hpp | 2 +- tests/Pnpsolver.cpp | 24 ++++++++++ tests/mocks/MockArmor2D.hpp | 47 +++++++++++++++++++ tests/mocks/MockHikCameraProfile.hpp | 17 +++++++ tests/test_main.cpp | 19 ++------ tests/test_main.hpp | 44 ----------------- 6 files changed, 94 insertions(+), 59 deletions(-) create mode 100644 tests/Pnpsolver.cpp create mode 100644 tests/mocks/MockArmor2D.hpp create mode 100644 tests/mocks/MockHikCameraProfile.hpp delete mode 100644 tests/test_main.hpp diff --git a/src/tongji/predictor/in_gimbal_control_armor.hpp b/src/tongji/predictor/in_gimbal_control_armor.hpp index 117203a..627d12a 100644 --- a/src/tongji/predictor/in_gimbal_control_armor.hpp +++ b/src/tongji/predictor/in_gimbal_control_armor.hpp @@ -31,6 +31,6 @@ class InGimbalControlArmor final : public interfaces::IArmorInGimbalControl { TimeStamp time_stamp_; std::unordered_map> armors_map_; - static const std::vector empty; + static inline const std::vector empty={}; }; } \ No newline at end of file diff --git a/tests/Pnpsolver.cpp b/tests/Pnpsolver.cpp new file mode 100644 index 0000000..ca02d7d --- /dev/null +++ b/tests/Pnpsolver.cpp @@ -0,0 +1,24 @@ +#include +#include "mocks/MockArmor2D.hpp" +#include "v1/pnpsolver/armor_pnp_solver.hpp" +#include "parameters/rm_parameters.hpp" +#include "mocks/MockHikCameraProfile.hpp" + +using world_exe::v1::pnpsolver::ArmorIPPEPnPSolver; +using world_exe::interfaces::mock::MockArmorInImage; +using world_exe::parameters::Robomaster; +void RunableTest(ArmorIPPEPnPSolver& pnp_solver) +{ + auto mockarmor = MockArmorInImage::createMockArmorInImage(); + pnp_solver.SolvePnp(mockarmor); +} + +class PnpsolverTest : public ::testing::Test { +protected: + ArmorIPPEPnPSolver pnp_solver; + PnpsolverTest(): pnp_solver( Robomaster::NormalArmorObjectPointsOpencv,Robomaster::LargeArmorObjectPointsOpencv){} + + void RunTest() { + RunableTest(pnp_solver); + } +}; \ No newline at end of file diff --git a/tests/mocks/MockArmor2D.hpp b/tests/mocks/MockArmor2D.hpp new file mode 100644 index 0000000..8b5e387 --- /dev/null +++ b/tests/mocks/MockArmor2D.hpp @@ -0,0 +1,47 @@ +#pragma once +#include "interfaces/armor_in_image.hpp" +#include "interfaces/time_stamped.hpp" +#include +#include +#include +#include +#include + +namespace world_exe::interfaces::mock{ + class MockArmorInImage :public world_exe::interfaces::IArmorInImage,public world_exe::interfaces::ITimeStamped{ + public: + std::vector armors; + std::time_t time_stamp = std::chrono::system_clock::to_time_t(std::chrono::system_clock::now()); + + MockArmorInImage(std::vector armors):armors(armors){} + ~MockArmorInImage() = default; + + const std::vector& GetArmors(const world_exe::enumeration::ArmorIdFlag& armor_id) const override + { + return armors; + } + const world_exe::interfaces::ITimeStamped& GetTimeStamped() const override { + return *this; + } + const std::time_t& GetTimeStamp() const override { return time_stamp; } + //MockArmorInImage工厂函数 + static std::shared_ptr createMockArmorInImage(){ + //Mock装甲板生成 + std::vector MockArmors;//装甲板组 + world_exe::data::ArmorImageSpacing MockArmor;//单装甲板 + for(int j=0;j<4;j++){ + MockArmor.image_points.clear(); + for(int i=0;i<4;i++){ + double RandomX = static_cast(std::rand() % 1440); + double RandomY = static_cast(std::rand() % 1080); + MockArmor.image_points.push_back(cv::Point2d(RandomX,RandomY)); + } + MockArmor.id = enumeration::ArmorIdFlag::Hero; + MockArmor.isLargeArmor = false; + MockArmors.push_back(MockArmor); + } + return std::make_shared(MockArmors); + } + }; + +} \ No newline at end of file diff --git a/tests/mocks/MockHikCameraProfile.hpp b/tests/mocks/MockHikCameraProfile.hpp new file mode 100644 index 0000000..0a4263b --- /dev/null +++ b/tests/mocks/MockHikCameraProfile.hpp @@ -0,0 +1,17 @@ +#pragma once +#include "parameters/profile.hpp" + +namespace world_exe::parameters::mock { +class MockHikCameraProfile{ + public: + static const cv::Mat& get_intrinsic_parameters(){ + static cv::Mat intrinsic = (cv::Mat_(3,3) << 800, 0, 320, 0, 800, 240, 0, 0, 1); + return intrinsic; + } + static const cv::Mat& get_distortion_parameters(){ + static cv::Mat distortion = (cv::Mat_(1,5) << 0.1, -0.05, 0, 0, 0); + return distortion; + + } +}; +} \ No newline at end of file diff --git a/tests/test_main.cpp b/tests/test_main.cpp index dd49b69..958f001 100644 --- a/tests/test_main.cpp +++ b/tests/test_main.cpp @@ -1,6 +1,6 @@ -#include "test_main.hpp" - -using namespace world_exe::alliance_auto_aim::tests; +#include "Pnpsolver.cpp" +#include +#include using namespace world_exe::interfaces; using namespace world_exe::data; using namespace world_exe::enumeration; @@ -8,18 +8,9 @@ using namespace world_exe::enumeration; using ::testing::Return; using ::testing::_; -TEST(DataFlowTest, Datain_out) +TEST_F(PnpsolverTest,AbilityTest) { - MockPnpSolver Mock_solver; - auto mock_armor_in_image = std::make_shared(); - auto mock_armor_in_camera = std::make_shared(); - std::shared_ptr armor_in_image = mock_armor_in_image; - std::shared_ptr armor_in_camera = mock_armor_in_camera; - - EXPECT_CALL(Mock_solver,SolvePnp(armor_in_image)).WillOnce(Return(armor_in_camera)); - - auto result = Mock_solver.SolvePnp(armor_in_image); - EXPECT_EQ(result, armor_in_camera); + RunTest(); } int main(int argc, char **argv) { diff --git a/tests/test_main.hpp b/tests/test_main.hpp deleted file mode 100644 index 00d9468..0000000 --- a/tests/test_main.hpp +++ /dev/null @@ -1,44 +0,0 @@ -#pragma once - -#include -#include -#include "interfaces/pnp_solver.hpp" -#include "interfaces/armor_in_camera.hpp" -#include "interfaces/armor_in_image.hpp" - -namespace world_exe::alliance_auto_aim::tests { - - class MockPnpSolver : public world_exe::interfaces::IPnpSolver { - public: - MOCK_METHOD(std::shared_ptr, - SolvePnp, - (std::shared_ptr), - (override)); - }; - - class MockArmorInCamera : public world_exe::interfaces::IArmorInCamera { - public: - MOCK_METHOD(const std::vector&, - GetArmors, - (const world_exe::enumeration::ArmorIdFlag& armor_id), - (const, override)); - - MOCK_METHOD(const world_exe::interfaces::ITimeStamped&, - GetTimeStamped, - (), - (const, override)); - }; - - class MockArmorInImage : public world_exe::interfaces::IArmorInImage { - public: - MOCK_METHOD(const std::vector&, - GetArmors, - (const world_exe::enumeration::ArmorIdFlag& armor_id), - (const, override)); - - MOCK_METHOD(const world_exe::interfaces::ITimeStamped&, - GetTimeStamped, - (), - (const, override)); - }; -} \ No newline at end of file From 53e58423f98cf5bc129036b04da71cce552b136c Mon Sep 17 00:00:00 2001 From: HarryPotter1tech Date: Thu, 9 Oct 2025 21:39:20 +0800 Subject: [PATCH 08/10] =?UTF-8?q?=E6=B7=BB=E5=8A=A0googletest=E4=BD=9C?= =?UTF-8?q?=E4=B8=BA=E5=AD=90=E6=A8=A1=E5=9D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitmodules | 3 +++ thirdparty/googletest | 1 + 2 files changed, 4 insertions(+) create mode 160000 thirdparty/googletest diff --git a/.gitmodules b/.gitmodules index e6e9b3f..c0a10d4 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,6 @@ [submodule "thirdparty/backward-cpp"] path = thirdparty/backward-cpp url = git@github.com:Alliance-Algorithm/backward-cpp.git +[submodule "thirdparty/googletest"] + path = thirdparty/googletest + url = https://github.com/google/googletest.git diff --git a/thirdparty/googletest b/thirdparty/googletest new file mode 160000 index 0000000..52eb810 --- /dev/null +++ b/thirdparty/googletest @@ -0,0 +1 @@ +Subproject commit 52eb8108c5bdec04579160ae17225d66034bd723 From 3bbbb1b9a72fdbef3d694a57cdd32b348c2ae9c4 Mon Sep 17 00:00:00 2001 From: alray <1780284652@qq.com> Date: Fri, 10 Oct 2025 00:00:40 +0800 Subject: [PATCH 09/10] =?UTF-8?q?[Test]=20=E4=BF=AE=E6=94=B9=E5=91=BD?= =?UTF-8?q?=E5=90=8D=E7=A9=BA=E9=97=B4=EF=BC=8C=E4=BF=AE=E6=AD=A3=E6=B5=8B?= =?UTF-8?q?=E8=AF=95=E7=B1=BB=E5=9E=8B=E4=BE=9D=E8=B5=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tests/Pnpsolver.cpp | 6 ++++-- tests/mocks/MockArmor2D.hpp | 6 +++--- tests/mocks/MockHikCameraProfile.hpp | 2 +- 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/tests/Pnpsolver.cpp b/tests/Pnpsolver.cpp index ca02d7d..9e91446 100644 --- a/tests/Pnpsolver.cpp +++ b/tests/Pnpsolver.cpp @@ -1,13 +1,15 @@ #include +#include #include "mocks/MockArmor2D.hpp" #include "v1/pnpsolver/armor_pnp_solver.hpp" #include "parameters/rm_parameters.hpp" #include "mocks/MockHikCameraProfile.hpp" using world_exe::v1::pnpsolver::ArmorIPPEPnPSolver; -using world_exe::interfaces::mock::MockArmorInImage; +using world_exe::tests::mock::MockArmorInImage; using world_exe::parameters::Robomaster; -void RunableTest(ArmorIPPEPnPSolver& pnp_solver) + +void RunableTest(world_exe::interfaces::IPnpSolver& pnp_solver) { auto mockarmor = MockArmorInImage::createMockArmorInImage(); pnp_solver.SolvePnp(mockarmor); diff --git a/tests/mocks/MockArmor2D.hpp b/tests/mocks/MockArmor2D.hpp index 8b5e387..2cd1d63 100644 --- a/tests/mocks/MockArmor2D.hpp +++ b/tests/mocks/MockArmor2D.hpp @@ -7,7 +7,7 @@ #include #include -namespace world_exe::interfaces::mock{ +namespace world_exe::tests::mock{ class MockArmorInImage :public world_exe::interfaces::IArmorInImage,public world_exe::interfaces::ITimeStamped{ public: std::vector armors; @@ -25,7 +25,7 @@ namespace world_exe::interfaces::mock{ } const std::time_t& GetTimeStamp() const override { return time_stamp; } //MockArmorInImage工厂函数 - static std::shared_ptr createMockArmorInImage(){ + static std::shared_ptr createMockArmorInImage(){ //Mock装甲板生成 std::vector MockArmors;//装甲板组 world_exe::data::ArmorImageSpacing MockArmor;//单装甲板 @@ -40,7 +40,7 @@ namespace world_exe::interfaces::mock{ MockArmor.isLargeArmor = false; MockArmors.push_back(MockArmor); } - return std::make_shared(MockArmors); + return std::make_shared(MockArmors); } }; diff --git a/tests/mocks/MockHikCameraProfile.hpp b/tests/mocks/MockHikCameraProfile.hpp index 0a4263b..80dc127 100644 --- a/tests/mocks/MockHikCameraProfile.hpp +++ b/tests/mocks/MockHikCameraProfile.hpp @@ -1,7 +1,7 @@ #pragma once #include "parameters/profile.hpp" -namespace world_exe::parameters::mock { +namespace world_exe::tests::mock { class MockHikCameraProfile{ public: static const cv::Mat& get_intrinsic_parameters(){ From 64db0f2410f804630897599cfd06872ea1975064 Mon Sep 17 00:00:00 2001 From: HarryPotter1tech Date: Fri, 10 Oct 2025 20:20:58 +0800 Subject: [PATCH 10/10] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=B5=8B=E8=AF=95?= =?UTF-8?q?=E7=B1=BB=EF=BC=8C=E7=BB=A7=E6=89=BF=E8=87=AAtesting::TestWithP?= =?UTF-8?q?aram=E5=8F=82=E6=95=B0=E5=8C=96=E6=B5=8B=E8=AF=95?= =?UTF-8?q?=EF=BC=8C=E4=BC=A0=E5=85=A5=E4=BD=BF=E7=94=A8=E6=8E=A5=E5=8F=A3?= =?UTF-8?q?=E7=B1=BB=EF=BC=8C=E4=BF=AE=E6=94=B9=E5=91=BD=E5=90=8D=E7=A9=BA?= =?UTF-8?q?=E9=97=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tests/Pnpsolver.cpp | 27 +++++++++++++-------------- tests/test_main.cpp | 18 ++++++++++++++---- 2 files changed, 27 insertions(+), 18 deletions(-) diff --git a/tests/Pnpsolver.cpp b/tests/Pnpsolver.cpp index 9e91446..2c70b6a 100644 --- a/tests/Pnpsolver.cpp +++ b/tests/Pnpsolver.cpp @@ -1,26 +1,25 @@ #include #include #include "mocks/MockArmor2D.hpp" -#include "v1/pnpsolver/armor_pnp_solver.hpp" +#include "interfaces/pnp_solver.hpp" #include "parameters/rm_parameters.hpp" #include "mocks/MockHikCameraProfile.hpp" -using world_exe::v1::pnpsolver::ArmorIPPEPnPSolver; +using world_exe::interfaces::IPnpSolver; using world_exe::tests::mock::MockArmorInImage; -using world_exe::parameters::Robomaster; -void RunableTest(world_exe::interfaces::IPnpSolver& pnp_solver) -{ - auto mockarmor = MockArmorInImage::createMockArmorInImage(); - pnp_solver.SolvePnp(mockarmor); -} - -class PnpsolverTest : public ::testing::Test { -protected: - ArmorIPPEPnPSolver pnp_solver; - PnpsolverTest(): pnp_solver( Robomaster::NormalArmorObjectPointsOpencv,Robomaster::LargeArmorObjectPointsOpencv){} +class PnpsolverTest : public ::testing::TestWithParam { +public: + PnpsolverTest() : pnp_solver_test(GetParam()) {} + void RunableTest() + { + auto mockarmor = MockArmorInImage::createMockArmorInImage(); + pnp_solver_test->SolvePnp(mockarmor); + } void RunTest() { - RunableTest(pnp_solver); + RunableTest(); } +private: + IPnpSolver* pnp_solver_test; }; \ No newline at end of file diff --git a/tests/test_main.cpp b/tests/test_main.cpp index 958f001..de2bbfe 100644 --- a/tests/test_main.cpp +++ b/tests/test_main.cpp @@ -1,18 +1,28 @@ #include "Pnpsolver.cpp" +#include "v1/pnpsolver/armor_pnp_solver.hpp" #include #include -using namespace world_exe::interfaces; -using namespace world_exe::data; -using namespace world_exe::enumeration; + +using namespace world_exe::v1::pnpsolver; +using world_exe::parameters::Robomaster; using ::testing::Return; using ::testing::_; -TEST_F(PnpsolverTest,AbilityTest) +TEST_P(PnpsolverTest,AbilityTest) { + ArmorIPPEPnPSolver pnp_solver_test_v1(Robomaster::NormalArmorObjectPointsOpencv,Robomaster::LargeArmorObjectPointsOpencv); RunTest(); + } +INSTANTIATE_TEST_SUITE_P(PnpsolverTest, PnpsolverTest, ::testing::Values( + new ArmorIPPEPnPSolver(Robomaster::NormalArmorObjectPointsOpencv,Robomaster::LargeArmorObjectPointsOpencv) + )); + // INSTANTIATE__SUITE_P() + // 测试套件 + // 测试类名 + // 测试类的参数传入->GetParam() int main(int argc, char **argv) { ::testing::InitGoogleMock(&argc, argv); return RUN_ALL_TESTS();