diff --git a/server/src/visitors/FunctionPointerForStubsVisitor.cpp b/server/src/visitors/FunctionPointerForStubsVisitor.cpp index ba9cc3fdf..a75c87724 100644 --- a/server/src/visitors/FunctionPointerForStubsVisitor.cpp +++ b/server/src/visitors/FunctionPointerForStubsVisitor.cpp @@ -56,9 +56,7 @@ namespace visitor { const tests::AbstractValueView *view, const std::string &access, int depth) { - if (depth == 0) { - AbstractValueViewVisitor::visitPointer(type, name, view, access, depth); - } + AbstractValueViewVisitor::visitPointer(type, name, view, access, depth); } void FunctionPointerForStubsVisitor::visitArray(const types::Type &type, diff --git a/server/test/framework/Server_Tests.cpp b/server/test/framework/Server_Tests.cpp index 2125cd134..d24d86e61 100644 --- a/server/test/framework/Server_Tests.cpp +++ b/server/test/framework/Server_Tests.cpp @@ -2141,4 +2141,42 @@ namespace { StatusCountMap expectedStatusCountMap{ { testsgen::TEST_PASSED, 3 } }; testUtils::checkStatuses(resultsMap, tests); } + + TEST_F(Server_Test, Run_Tests_For_Structs_With_Pointers) { + fs::path structs_with_pointers_c = getTestFilePath("structs_with_pointers.c"); + auto request = testUtils::createFileRequest(projectName, suitePath, buildDirRelativePath, + srcPaths, structs_with_pointers_c, + GrpcUtils::UTBOT_AUTO_TARGET_PATH, true, false); + auto testGen = FileTestGen(*request, writer.get(), TESTMODE); + Status status = Server::TestsGenServiceImpl::ProcessBaseTestRequest(testGen, writer.get()); + ASSERT_TRUE(status.ok()) << status.error_message(); + EXPECT_GE(testUtils::getNumberOfTests(testGen.tests), 3); + + fs::path testsDirPath = getTestFilePath("tests"); + + fs::path structs_with_pointers_test_cpp = Paths::sourcePathToTestPath( + utbot::ProjectContext(projectName, suitePath, testsDirPath, buildDirRelativePath, clientProjectPath), + structs_with_pointers_c); + auto testFilter = GrpcUtils::createTestFilterForFile(structs_with_pointers_test_cpp); + auto runRequest = testUtils::createCoverageAndResultsRequest( + projectName, suitePath, testsDirPath, buildDirRelativePath, std::move(testFilter)); + + static auto coverageAndResultsWriter = + std::make_unique(nullptr); + CoverageAndResultsGenerator coverageGenerator{ runRequest.get(), + coverageAndResultsWriter.get() }; + utbot::SettingsContext settingsContext{ + true, false, 45, 0, false, false, ErrorMode::FAILING, false + }; + coverageGenerator.generate(false, settingsContext); + + EXPECT_FALSE(coverageGenerator.hasExceptions()); + ASSERT_TRUE(coverageGenerator.getCoverageMap().empty()); + + auto resultsMap = coverageGenerator.getTestResultMap(); + auto tests = coverageGenerator.getTestsToLaunch(); + + StatusCountMap expectedStatusCountMap{ { testsgen::TEST_PASSED, 3 } }; + testUtils::checkStatuses(resultsMap, tests); + } } diff --git a/server/test/suites/server/CMakeLists.txt b/server/test/suites/server/CMakeLists.txt index 9195dc522..0c0502edf 100644 --- a/server/test/suites/server/CMakeLists.txt +++ b/server/test/suites/server/CMakeLists.txt @@ -25,6 +25,7 @@ add_executable(server simple_structs.c simple_unions.c struct_with_union.c + structs_with_pointers.c complex_structs.c typedefs.c types.c diff --git a/server/test/suites/server/structs_with_pointers.c b/server/test/suites/server/structs_with_pointers.c new file mode 100644 index 000000000..cf56fb404 --- /dev/null +++ b/server/test/suites/server/structs_with_pointers.c @@ -0,0 +1,8 @@ +#include "structs_with_pointers.h" + +int process_struct_with_func_pointer(struct MainStruct* str) { + if (str && str->inner && str->inner->func_id != 0) { + return 1; + } + return 0; +} \ No newline at end of file diff --git a/server/test/suites/server/structs_with_pointers.h b/server/test/suites/server/structs_with_pointers.h new file mode 100644 index 000000000..29923c44f --- /dev/null +++ b/server/test/suites/server/structs_with_pointers.h @@ -0,0 +1,17 @@ +#ifndef UNITTESTBOT_STRUCTS_WITH_POINTERS_H +#define UNITTESTBOT_STRUCTS_WITH_POINTERS_H + +typedef int (*some_func)(); + +struct InnerStruct { + some_func func; + int func_id; +}; + +struct MainStruct { + struct InnerStruct* inner; +}; + +int process_struct_with_func_pointer(struct MainStruct* str); + +#endif // UNITTESTBOT_STRUCTS_WITH_POINTERS_H