From 9e2f19b0d7cab18d5c3f6d88eabfc41d20d5b633 Mon Sep 17 00:00:00 2001 From: linianlin Date: Thu, 30 Apr 2026 14:01:09 +0800 Subject: [PATCH] =?UTF-8?q?AI=20=E8=87=AA=E5=8A=A8=E7=94=9F=E6=88=90?= =?UTF-8?q?=E6=B5=8B=E8=AF=95=E7=94=A8=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tests/CMakeLists.txt | 25 ++++++++++++++ tests/test_codegen.cpp | 78 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 103 insertions(+) create mode 100644 tests/CMakeLists.txt create mode 100644 tests/test_codegen.cpp diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt new file mode 100644 index 0000000..6a01a29 --- /dev/null +++ b/tests/CMakeLists.txt @@ -0,0 +1,25 @@ +cmake_minimum_required(VERSION 3.10.0) +project(test_auto_plan) +include(FetchContent) +if (MSVC) + add_compile_options(/utf-8) +endif() +FetchContent_Declare( + googletest + URL https://github.com/google/googletest/archive/03597a01ee50ed33e9dfd640b249b4be3799d395.zip +) +# For Windows: Prevent overriding the parent project's compiler/linker settings +set(gtest_force_shared_crt ON CACHE BOOL "" FORCE) +FetchContent_MakeAvailable(googletest) +set(CMAKE_CXX_STANDARD 14) +set(CMAKE_CXX_STANDARD_REQUIRED ON) +include_directories(${CMAKE_CURRENT_SOURCE_DIR}/../include) + +include(CTest) +enable_testing() + +add_executable(test_auto_plan test_codegen.cpp ../src/codegen.cpp) + +target_link_libraries(test_auto_plan gtest gmock gtest_main) +include(GoogleTest) +gtest_discover_tests(test_auto_plan) \ No newline at end of file diff --git a/tests/test_codegen.cpp b/tests/test_codegen.cpp new file mode 100644 index 0000000..e41373b --- /dev/null +++ b/tests/test_codegen.cpp @@ -0,0 +1,78 @@ +#include +#include "aise/codegen.hpp" +#include +#include + +namespace aise { + +class CodegenModuleTest : public ::testing::Test { +protected: + CodegenModule module_; +}; + +TEST_F(CodegenModuleTest, testGenerateNormalInputCpp) { + auto result = module_.generate("SRS-001", "C++", ""); + EXPECT_TRUE(result.success); + EXPECT_EQ(result.generated_files.size(), 1); + EXPECT_EQ(result.generated_files[0], "SRS-001_impl.cpp"); + EXPECT_EQ(result.trace_links.size(), 1); + EXPECT_EQ(result.trace_links[0].req_id, "SRS-001"); + EXPECT_EQ(result.output_dir, "./generated/SRS-001"); +} + +TEST_F(CodegenModuleTest, testGenerateNormalInputJava) { + auto result = module_.generate("REQ-002", "Java", ""); + EXPECT_TRUE(result.success); + EXPECT_EQ(result.generated_files[0], "REQ-002_impl.java"); + EXPECT_EQ(result.trace_links[0].req_id, "REQ-002"); +} + +TEST_F(CodegenModuleTest, testGenerateUnsupportedLanguage) { + auto result = module_.generate("SRS-003", "Python", ""); + EXPECT_FALSE(result.success); + EXPECT_EQ(result.error_msg, "Unsupported language: Python"); + EXPECT_TRUE(result.generated_files.empty()); +} + +TEST_F(CodegenModuleTest, testGenerateEmptyReqId) { + auto result = module_.generate("", "C++", ""); + EXPECT_TRUE(result.success); + EXPECT_EQ(result.generated_files[0], "_impl.cpp"); +} + +TEST_F(CodegenModuleTest, testGetTraceLinksExisting) { + module_.generate("SRS-001", "C++", ""); + auto links = module_.getTraceLinks("SRS-001"); + ASSERT_EQ(links.size(), 1); + EXPECT_EQ(links[0].req_id, "SRS-001"); + EXPECT_EQ(links[0].file_path, "SRS-001_impl.cpp"); +} + +TEST_F(CodegenModuleTest, testGetTraceLinksNonExisting) { + auto links = module_.getTraceLinks("NONEXISTENT"); + EXPECT_TRUE(links.empty()); +} + +TEST_F(CodegenModuleTest, testGenerateCppSkeletonNormal) { + RequirementItem req; + req.id = "SRS-001"; + req.title = "Test Requirement"; + req.description = "Test Description"; + std::string code = module_.generateCppSkeleton(req); + EXPECT_NE(code.find("class SRSModule"), std::string::npos); + EXPECT_NE(code.find("// Requirement: SRS-001 - Test Requirement"), std::string::npos); + EXPECT_NE(code.find("void execute()"), std::string::npos); +} + +TEST_F(CodegenModuleTest, testGenerateJavaSkeletonNormal) { + RequirementItem req; + req.id = "REQ-002"; + req.title = "Java Requirement"; + req.description = "Java Description"; + std::string code = module_.generateJavaSkeleton(req); + EXPECT_NE(code.find("public class REQModule"), std::string::npos); + EXPECT_NE(code.find("public void execute()"), std::string::npos); + EXPECT_NE(code.find("System.out.println"), std::string::npos); +} + +} // namespace aise \ No newline at end of file