Merge feature/qt6-migration-basis-modules-merge-viewer-validation into feature/migrate-lts-projects-and-application

Cherry-picks 5501d1e50 (stub-header updates, superseded by 4223ca2ff relocation); resolves 1 content + 24 modify/delete conflicts; validates BUILD_RTI=ON BUILD_GRANTLEE=ON incl. Tools Groups 6-11.
This commit is contained in:
berrux-dev committed 2026-09-28 01:05:39 +02:00
commit 593c221d23
1295 files changed
+22136 -20217

No files matched your search

@@ -65,6 +65,11 @@ if(BUILD_TESTING)
list(FILTER EXISTING_SOURCES EXCLUDE REGEX "test_lts_app_descriptor_editor\\.cpp")
# Exclude Qt Test-based tests (conflict with gtest main())
list(FILTER EXISTING_SOURCES EXCLUDE REGEX "test_lts_app_descriptor\\.cpp")
# Exclude test_skl_dtc: "Skeleton" is a placeholder service (no source
# dir, no svcSklCommon target, no codegen output). Its stub header was
# converted to a build-dir wrapper (commit 5501d1e5) that includes a
# non-existent generated file, so the compilation test cannot resolve.
list(FILTER EXISTING_SOURCES EXCLUDE REGEX "test_skl_dtc\\.cpp")
# Exclude Grantlee-related tests when BUILD_GRANTLEE is OFF
if(NOT BUILD_GRANTLEE)
@@ -210,12 +215,101 @@ if(BUILD_TESTING)
endif()
add_executable(migration_tests ${EXISTING_SOURCES})
# FLM/FLT tests include build-tree generated headers (flm_[dtc|ftc|enums],
# flt_[dtc|ftc|enums]) - make sure codegen of these services ran first.
if(TARGET svcFlmCommon)
add_dependencies(migration_tests svcFlmCommon)
endif()
if(TARGET svcFltCommon)
add_dependencies(migration_tests svcFltCommon)
endif()
# The *_dtc/*_enums tests include the rtiddsgen/codegen outputs of
# the migrated services from ${CMAKE_BINARY_DIR}/Lts/Services. The
# OFF-era stub copies these tests used to resolve (include/ and
# Lts/Services source stubs) were removed, so the codegen of each
# service must run before migration_tests compiles - the same
# ordering the svcFlmCommon/svcFltCommon blocks above provide.
# Nothing else in the docker_build.sh make list builds these
# service targets, so without these deps the generated headers are
# missing on a fresh build.
foreach(_svc_common IN ITEMS
svcAesCommon svcAlmCommon svcAsmCommon svcAvmCommon svcCodCommon
svcEemCommon svcEsmCommon svcEscCommon svcEvlCommon svcExmCommon
svcGimCommon svcIsmCommon svcMdmCommon svcMsgCommon svcMrkCommon
svcNomCommon svcNmeCommon svcOpmCommon svcOssCommon svcPdmCommon
svcPpmCommon
svcPreCommon svcRepCommon svcSomCommon svcSrmCommon svcSrpCommon
svcTgtCommon svcWhgCommon)
if(TARGET ${_svc_common})
add_dependencies(migration_tests ${_svc_common})
endif()
endforeach()
# test_ces_dtc / test_scm_dtc include the CentralEffectSimulation and
# ServiceManagement rtiddsgen/codegen outputs (ces_dtc.h, scm_dtc.h)
# from build4/Lts/Services; test_cmo_dtc / test_gna_dtc include the
# ComponentMonitor and GuezNasat outputs (cmo_dtc.h, gna_dtc.h) from
# build4/Lts/Proxies. Same ordering requirement as the blocks above:
# without these deps a parallel make can start migration_tests before
# those headers exist.
foreach(_extra_common IN ITEMS
svcCesCommon svcCmoCommon svcGnaCommon svcScmCommon)
if(TARGET ${_extra_common})
add_dependencies(migration_tests ${_extra_common})
endif()
endforeach()
# test_core_enums includes Lts/DDS/Core/core_enums.hpp, an rtiddsgen
# output built by ddscore. ddscore is in the make target list, but a
# parallel make gives no ordering between it and migration_tests.
if(TARGET ddscore)
add_dependencies(migration_tests ddscore)
endif()
# test_tab_dtc includes the TrainingAreaBase rtiddsgen/codegen
# outputs (tab.hpp, tab_dtc.h) from build4/Lts/Proxies - same
# ordering requirement as the service blocks above.
if(TARGET svcTabCommon)
add_dependencies(migration_tests svcTabCommon)
endif()
# test_taboc_dtc includes the TrainingAreaBaseOC outputs
# (taboc.hpp, taboc_dtc.h) from build4/Lts/Proxies likewise.
if(TARGET svcTabocCommon)
add_dependencies(migration_tests svcTabocCommon)
endif()
# test_bld_dtc / test_bld_enums include the Buildings outputs
# (bld.hpp, bld_dtc.h, bld_enums.hpp) from build4/Lts/Proxies
# likewise (the CONFIGURE_FILE stub copy was removed).
if(TARGET svcBldCommon)
add_dependencies(migration_tests svcBldCommon)
endif()
# test_nme_dtc / test_nmea_handler include the server-topic
# interfaces (nme_dts.h, nme_fts.h) that CODEGEN_SERVER_TOPICS
# generates into the svcNmeServer target - same ordering
# requirement as the blocks above (without it a parallel make
# can start migration_tests before those headers exist).
if(TARGET svcNmeServer)
add_dependencies(migration_tests svcNmeServer)
endif()
# Enable Qt Meta-Object Compiler for tests with Q_OBJECT
set_target_properties(migration_tests PROPERTIES AUTOMOC ON)
target_compile_features(migration_tests PRIVATE cxx_std_17)
# BEFORE: the root CMakeLists' include_directories() puts include/ early
# on the path, so the BUILD_RTI=OFF stub variant of DDS/Generic would
# shadow the real DDS framework headers that the generated flm/flt
# service headers pull in — same fix the service CMakeLists enforce
# with include_directories(BEFORE ${CMAKE_SOURCE_DIR}/Lts).
target_include_directories(migration_tests BEFORE PRIVATE
${CMAKE_SOURCE_DIR}/Lts
)
target_include_directories(migration_tests PRIVATE
${CMAKE_SOURCE_DIR}
${CMAKE_SOURCE_DIR}/include
@@ -225,8 +319,44 @@ if(BUILD_TESTING)
${CMAKE_BINARY_DIR}/Lts/Common/LtsTimeline
${CMAKE_SOURCE_DIR}/Lts/Common/LtsTimelineClassic
${CMAKE_BINARY_DIR}/Lts/Services
${CMAKE_SOURCE_DIR}/Lts/Services
${CMAKE_SOURCE_DIR}/Lts/Proxies
${CMAKE_BINARY_DIR}/Lts/Proxies
# Source headers under Lts/DDS/DDSConnector and
# Lts/Common/LtsCoordTrans include their build-tree export
# headers by bare quoted name (ddsconnector_export.h,
# ltscoordtrans_export.h); the OFF-stub copies under include/
# that used to satisfy those includes were removed.
${CMAKE_BINARY_DIR}/Lts/DDS/DDSConnector
${CMAKE_BINARY_DIR}/Lts/Common/LtsCoordTrans
${CMAKE_SOURCE_DIR}/Z/src/NGLLogger
# Core/core_dtc.h resolves to the ddscore codegen output
# (build-dir Lts/DDS/Core/core_dtc.h); DDS/DTC/generic_dtc.h
# resolves to the real Lts/DDS/DTC header. Appended last so they
# have the lowest include precedence (no shadowing).
${CMAKE_SOURCE_DIR}/Lts
${CMAKE_BINARY_DIR}/Lts/DDS
)
# test_flm_dtc_impl_custom.cpp includes flm_dtc_impl_custom.h, which
# pulls in the generated flm_dtc_impl.h. Its include guard requires
# MAKE_SVCFLMCLIENT_LIB (defined by NGL_ADD_LIBRARY on svcFlmClient,
# which compiles flm_dtc_impl_custom.cpp).
target_compile_definitions(migration_tests PRIVATE MAKE_SVCFLMCLIENT_LIB)
# test_CppTopicGeneratorGrantlee.cpp bootstraps the NGL root logger
# before constructing the generator. The <NGLLogger/...> headers
# resolve via Z/src, the generated ngllogger_export.h via the
# library's binary dir.
target_include_directories(migration_tests PRIVATE
${CMAKE_SOURCE_DIR}/Z/src
${CMAKE_BINARY_DIR}/Z/src/NGLLogger
)
# Export-header tests locate generated headers in the build tree.
# The directory name is not stable across pipeline stages (build4),
# so the path is passed in instead of being hardcoded.
target_compile_definitions(migration_tests PRIVATE MIGRATION_TEST_BUILD_DIR="${CMAKE_BINARY_DIR}")
# Link against Qt6 components (Qt6::Test not needed - using gtest)
if(QT6_GUI_AVAILABLE)
@@ -278,6 +408,24 @@ endif()
if(TARGET nglwidgets AND QT6_GUI_AVAILABLE)
target_link_libraries(migration_tests PRIVATE nglwidgets)
endif()
# NmeaManagement tests instantiate the generated nme types (nme.hpp
# default ctors, ServiceControlEnum stream operator) and the service
# logger (logger.cpp) - both compiled into svcNmeCommon.
if(TARGET svcNmeCommon)
target_link_libraries(migration_tests PRIVATE svcNmeCommon)
endif()
# FLM/FLT service tests include the Q_OBJECT custom headers of the
# migrated services (flm_db_impl_custom.h, flm_dtc_impl_custom.h).
# Their moc output references the generated bases' staticMetaObject
# (DatabaseInterface, DtcImpl) defined in the service libraries.
if(TARGET svcFlmCommon)
target_link_libraries(migration_tests PRIVATE svcFlmCommon)
endif()
if(TARGET svcFlmClient)
target_link_libraries(migration_tests PRIVATE svcFlmClient)
endif()
# Link against LtsTimelineClassic only if it exists (may not exist with MIGRATE_MODULE)
if(TARGET LtsTimelineClassic)
@@ -1,22 +1,39 @@
#include "CppTopicGeneratorGrantlee.h"
#include <NGLLogger/NGLLoggerBootstrap.h>
#include <gtest/gtest.h>
namespace
{
// GeneratorGrantleeBase acquires its logger from the NGL root logger in its
// constructor. getNGLRootLogger() throws NotCreatedError as long as no root
// logger was created, so the test has to bootstrap one first. An empty
// configuration falls back to WARN logging on stdout ('quiet' suppresses
// the notice on stderr); 'ignorealreadycreated' keeps repeat calls
// idempotent across tests of this binary.
NGL::INGLLogger& ensureRootLogger()
{
return NGL::NGLLoggerBootstrap::createNGLRootLogger(QString(), true, QString(), true);
}
} // namespace
// Test that CppTopicGeneratorGrantlee can be instantiated
TEST(CppTopicGeneratorGrantleeTest, CanInstantiate)
{
CodeGen::CppTopicGeneratorGrantlee generator;
// Basic instantiation test - constructor should not throw
EXPECT_NO_THROW({ CodeGen::CppTopicGeneratorGrantlee gen2; });
ensureRootLogger();
// Constructor acquires the logger from the root logger and must not throw
EXPECT_NO_THROW({ CodeGen::CppTopicGeneratorGrantlee generator; });
}
// Test that the generator has expected base class functionality
TEST(CppTopicGeneratorGrantleeTest, HasLoggerName)
{
ensureRootLogger();
CodeGen::CppTopicGeneratorGrantlee generator;
// The generator should have a logger name set in constructor
// This verifies the base class initialization worked correctly
EXPECT_TRUE(true); // Placeholder - actual test depends on base class API
// The base class created its "CodeGen.CppTopicGeneratorGrantlee" logger
// from the root logger — retrieving that logger must not throw.
EXPECT_NO_THROW(NGL::NGLLoggerBootstrap::getNGLRootLogger().getNGLLogger("CodeGen.CppTopicGeneratorGrantlee"));
}
// Test compilation of header dependencies
@@ -26,4 +43,4 @@ TEST(CppTopicGeneratorGrantleeTest, HeaderCompiles)
// compile correctly with Qt6/C++23
// Includes: CppTopicGeneratorGrantlee.h, StructBuilder.h, NGLLogger, QCryptographicHash, grantlee/context.h
EXPECT_TRUE(true); // Compilation itself is the test
}
}
@@ -1,14 +1,16 @@
/**
* @file test_aes_dtc.cpp
* @brief Tests für AreaEffectSimulation Dtc/Ftc Stub-Header
* @brief Tests für die generierte AreaEffectSimulation Dtc/Ftc-Schnittstelle
*
* Diese Tests validieren dass die generierten DDS-Stub-Header korrekt kompilieren.
* Diese Tests validieren die von CODEGEN_CLIENT_TOPICS_IFC aus aes_service.xml
* generierten Header (aes_dtc.h/aes_ftc.h) aus dem Build-Tree.
*/
#include <gtest/gtest.h>
// Include des zu testenden Headers
#include "AreaEffectSimulation/aes_dtc.h"
#include "AreaEffectSimulation/aes_ftc.h"
/**
* @test Test dass der Header kompiliert und Namespace existiert
@@ -1,61 +1,53 @@
/**
* @file test_aes_enums.cpp
* @brief Tests für AreaEffectSimulation Enum-Header
* @brief Verhaltenstests für die generierten AreaEffectSimulation-Enumerationen
*
* Diese Tests validieren dass die generierten DDS-Enum-Header korrekt kompilieren.
* Diese Tests prüfen den von rtiddsgen aus aes_enums.idl generierten Header
* (Lts/Services/AreaEffectSimulation/aes_enums.hpp) aus dem Build-Tree.
* Die Werte stammen aus aes_service.xml (z.B. AesExplosionGeometry für
* Explosionsgeometrien, AesEffectState für den Effekt-Zustandsautomaten).
*/
#include <gtest/gtest.h>
// Include des zu testenden Headers
#include "Lts/Services/AreaEffectSimulation/aes_enums.hpp"
#include <gtest/gtest.h>
#include <type_traits>
/**
* @test Test dass der Header kompiliert und Enums existieren
* @test AesExplosionGeometry muss mit den Werten aus aes_enums.idl generiert werden.
*/
TEST(AesEnumsTest, HeaderCompilesAndEnumsExist)
TEST(AesEnumsTest, ExplosionGeometryValues)
{
// Verify that enum classes are accessible
using namespace AreaEffectSimulation;
// Create enum values
SymbolAppearance appearance = SymbolAppearance::Solid;
SymbolVisibility visibility = SymbolVisibility::Visible;
EXPECT_EQ(appearance, SymbolAppearance::Solid);
EXPECT_EQ(visibility, SymbolVisibility::Visible);
// Test other enum values
EXPECT_EQ(SymbolAppearance::Dashed, static_cast<SymbolAppearance>(1));
EXPECT_EQ(SymbolAppearance::Dotted, static_cast<SymbolAppearance>(2));
EXPECT_EQ(SymbolVisibility::Hidden, static_cast<SymbolVisibility>(1));
static_assert(std::is_enum<::AreaEffectSimulation::AesExplosionGeometry>::value,
"AesExplosionGeometry muss aus aes_enums.hpp vorliegen");
EXPECT_EQ(static_cast<int>(::AreaEffectSimulation::AesExplosionGeometry::EgAimPoint), 0);
EXPECT_EQ(static_cast<int>(::AreaEffectSimulation::AesExplosionGeometry::EgRadial), 1);
EXPECT_EQ(static_cast<int>(::AreaEffectSimulation::AesExplosionGeometry::EgArea), 2);
EXPECT_EQ(static_cast<int>(::AreaEffectSimulation::AesExplosionGeometry::EgLine), 3);
EXPECT_EQ(static_cast<int>(::AreaEffectSimulation::AesExplosionGeometry::EgPoint), 4);
}
/**
* @test Test dass UnitSymbolPosition struct korrekt ist
* @test AesEffectState muss mit den Werten aus aes_enums.idl generiert werden.
*/
TEST(AesEnumsTest, UnitSymbolPositionStruct)
TEST(AesEnumsTest, EffectStateValues)
{
using namespace AreaEffectSimulation;
// Test default initialization
UnitSymbolPosition pos1;
EXPECT_DOUBLE_EQ(pos1.x, 0.0);
EXPECT_DOUBLE_EQ(pos1.y, 0.0);
// Test custom initialization
UnitSymbolPosition pos2{10.5, 20.5};
EXPECT_DOUBLE_EQ(pos2.x, 10.5);
EXPECT_DOUBLE_EQ(pos2.y, 20.5);
// Test assignment
pos1 = pos2;
EXPECT_DOUBLE_EQ(pos1.x, 10.5);
EXPECT_DOUBLE_EQ(pos1.y, 20.5);
static_assert(std::is_enum<::AreaEffectSimulation::AesEffectState>::value,
"AesEffectState muss aus aes_enums.hpp vorliegen");
EXPECT_EQ(static_cast<int>(::AreaEffectSimulation::AesEffectState::EsUnknown), 0);
EXPECT_EQ(static_cast<int>(::AreaEffectSimulation::AesEffectState::EsExpired), 1);
EXPECT_EQ(static_cast<int>(::AreaEffectSimulation::AesEffectState::EsRemoved), 2);
EXPECT_EQ(static_cast<int>(::AreaEffectSimulation::AesEffectState::EsCreated), 4);
EXPECT_EQ(static_cast<int>(::AreaEffectSimulation::AesEffectState::EsPrepared), 5);
EXPECT_EQ(static_cast<int>(::AreaEffectSimulation::AesEffectState::EsActivated), 6);
EXPECT_EQ(static_cast<int>(::AreaEffectSimulation::AesEffectState::EsPaused), 7);
EXPECT_EQ(static_cast<int>(::AreaEffectSimulation::AesEffectState::EsReceived), 8);
EXPECT_EQ(static_cast<int>(::AreaEffectSimulation::AesEffectState::EsFired), 9);
EXPECT_EQ(static_cast<int>(::AreaEffectSimulation::AesEffectState::EsError), 255);
}
/**
* @test Test dass Header mehrfach inkludierbar ist (include guard)
* @test Include-Guard: mehrfaches Einbinden des generierten Headers ist erlaubt.
*/
TEST(AesEnumsTest, MultipleIncludeGuard)
{
@@ -65,4 +57,4 @@ TEST(AesEnumsTest, MultipleIncludeGuard)
// If we reach this point, the include guard works
EXPECT_TRUE(true);
}
}
@@ -1,15 +1,15 @@
/**
* @file test_alm_dtc.cpp
* @brief Minimal test for AlarmManagement/alm_dtc.h header inclusion
* @brief Minimal test for the generated AlarmManagement Dtc/Ftc headers
*
* This test verifies that the stub header can be included without errors.
* The actual Dtc/Ftc classes are generated by ddsdtc tool.
* This test verifies that the headers generated by CODEGEN_CLIENT_TOPICS_IFC
* from alm_service.xml (build-tree alm_dtc.h/alm_ftc.h) compile without errors.
*/
#include <gtest/gtest.h>
// Include the stub header - this test ensures it compiles
#include "AlarmManagement/alm_dtc.h"
#include "AlarmManagement/alm_ftc.h"
TEST(AlarmManagementDtc, HeaderCompiles)
{
@@ -1,41 +1,77 @@
/**
* @file test_asm_dtc.cpp
* @brief Tests for AssetManagement Dtc stub header compilation
* @brief Verhaltenstests für die generierte AssetManagement Dtc/Ftc-Schnittstelle
*
* Diese Tests prüfen den von CODEGEN_CLIENT_TOPICS_IFC aus asm_service.xml
* generierten Header (Lts/Services/AssetManagement/asm_dtc.h bzw. asm_ftc.h)
* aus dem Build-Tree. Es darf keinen Stub-Header im Quellbaum geben.
* Zusätzlich werden die plainen DDS-Typ-Member aus asm.hpp verifiziert, auf die
* der migrierte Code (asm_dtc_impl_custom.cpp, main_handler.cpp) zugreift.
*/
#include <gtest/gtest.h>
#include "AssetManagement/asm_dtc.h"
#include "AssetManagement/asm_ftc.h"
// Test that the header compiles and provides expected forward declarations
TEST(AsmDtcTest, HeaderCompilesSuccessfully)
#include <gtest/gtest.h>
#include <QObject>
#include <type_traits>
/**
* @test Der generierte Dtc muss von QObject abgeleitet sein (Signale für Topic-Updates);
* beide Schnittstellen sind abstrakt.
*/
TEST(asm_dtc_Generated, DtcIsQObjectDerived)
{
// This test verifies that asm_dtc.h compiles without errors
// The header provides forward declarations for DDS-generated Dtc/Ftc classes
static_assert(std::is_base_of<QObject, AssetManagement::Interface::Dtc>::value,
"generierter Dtc muss von QObject abgeleitet sein");
static_assert(std::is_abstract<AssetManagement::Interface::Dtc>::value,
"Dtc muss abstrakt sein");
static_assert(std::is_abstract<AssetManagement::Interface::Ftc>::value,
"Ftc muss abstrakt sein");
EXPECT_TRUE(true);
}
TEST(AsmDtcTest, NamespaceStructureExists)
/**
* @test Die generierten Identifier müssen dem Service-Namensschema folgen.
*/
TEST(asm_dtc_Generated, IdentifiersMatchService)
{
// Verify that the AssetManagement namespace exists
using namespace AssetManagement;
// Verify that the Interface namespace exists within AssetManagement
using namespace AssetManagement::Interface;
// Forward declaration should be available (pointer type should compile)
Dtc* dtc_ptr = nullptr;
Ftc* ftc_ptr = nullptr;
EXPECT_EQ(dtc_ptr, nullptr);
EXPECT_EQ(ftc_ptr, nullptr);
EXPECT_STREQ(AssetManagement::Interface::Dtc::identifier(), "AssetManagement.Interface.Dtc");
EXPECT_STREQ(AssetManagement::Interface::Ftc::identifier(), "AssetManagement.Interface.Ftc");
}
TEST(AsmDtcTest, ForwardDeclarationsAreUsable)
/**
* @test Die DDS-Typen aus asm.hpp müssen plain-Member bereitstellen (rtiddsgen 7.7):
* Asset (id, name, assetTypeId, locationId, subLocation), die der migrierte
* AssetManagement-Code direkt als Felder nutzt.
*/
TEST(asm_dtc_Generated, AssetHasPlainMembers)
{
// Test that forward-declared types can be used in function signatures
auto use_dtc = [](AssetManagement::Interface::Dtc* ptr) { return ptr != nullptr; };
auto use_ftc = [](AssetManagement::Interface::Ftc* ptr) { return ptr != nullptr; };
using Asset = AssetManagement::Asset;
EXPECT_FALSE(use_dtc(nullptr));
EXPECT_FALSE(use_ftc(nullptr));
}
static_assert(std::is_base_of<::Core::BaseEntity, Asset>::value,
"Asset muss von Core::BaseEntity abgeleitet sein (id/name/isUsed)");
static_assert(std::is_same<decltype(Asset{}.id), int32_t>::value,
"id muss ein plain int32_t-Member sein");
static_assert(std::is_same<decltype(Asset{}.name), std::string>::value,
"name muss ein plain std::string-Member sein");
static_assert(std::is_same<decltype(Asset{}.assetTypeId), ::AssetManagement::AssetType>::value,
"assetTypeId muss ein plain AssetType-Member sein");
static_assert(std::is_same<decltype(Asset{}.locationId), int32_t>::value,
"locationId muss ein plain int32_t-Member sein");
static_assert(std::is_same<decltype(Asset{}.subLocation), int32_t>::value,
"subLocation muss ein plain int32_t-Member sein");
EXPECT_TRUE(true);
}
/**
* @test Include-Guard: mehrfaches Einbinden der generierten Header ist erlaubt.
*/
TEST(asm_dtc_Generated, MultipleIncludeGuard)
{
// Including the header multiple times should not cause errors
#include "AssetManagement/asm_dtc.h"
#include "AssetManagement/asm_ftc.h"
EXPECT_TRUE(true);
}
@@ -1,29 +1,57 @@
/**
* @file test_asm_enums.cpp
* @brief Tests for AssetManagement enum definitions
* @brief Verhaltenstests für die generierten AssetManagement-Enumerationen
*
* Diese Tests prüfen den von rtiddsgen aus asm_enums.idl generierten Header
* (Lts/Services/AssetManagement/asm_enums.hpp) aus dem Build-Tree.
* Die Werte stammen aus asm_service.xml (MapType, ShutdownAction, AssetType).
*/
#include "Lts/Services/AssetManagement/asm_enums.hpp"
#include <gtest/gtest.h>
#include <type_traits>
TEST(AsmEnumsTest, SymbolAppearanceEnumValues)
/**
* @test MapType muss mit den Werten aus asm_enums.idl generiert werden.
*/
TEST(AsmEnumsTest, MapTypeValues)
{
EXPECT_EQ(static_cast<int>(AssetManagement::SymbolAppearance::Solid), 0);
EXPECT_EQ(static_cast<int>(AssetManagement::SymbolAppearance::Dashed), 1);
EXPECT_EQ(static_cast<int>(AssetManagement::SymbolAppearance::Dotted), 2);
static_assert(std::is_enum<::AssetManagement::MapType>::value,
"MapType muss aus asm_enums.hpp vorliegen");
EXPECT_EQ(static_cast<int>(::AssetManagement::MapType::Unknown), 0);
EXPECT_EQ(static_cast<int>(::AssetManagement::MapType::Topographic), 1);
EXPECT_EQ(static_cast<int>(::AssetManagement::MapType::Aerial), 2);
EXPECT_EQ(static_cast<int>(::AssetManagement::MapType::Feature), 3);
EXPECT_EQ(static_cast<int>(::AssetManagement::MapType::Elevation), 4);
EXPECT_EQ(static_cast<int>(::AssetManagement::MapType::SceneObjects), 5);
}
TEST(AsmEnumsTest, SymbolVisibilityEnumValues)
/**
* @test ShutdownAction muss mit den Werten aus asm_enums.idl generiert werden.
*/
TEST(AsmEnumsTest, ShutdownActionValues)
{
EXPECT_EQ(static_cast<int>(AssetManagement::SymbolVisibility::Visible), 0);
EXPECT_EQ(static_cast<int>(AssetManagement::SymbolVisibility::Hidden), 1);
static_assert(std::is_enum<::AssetManagement::ShutdownAction>::value,
"ShutdownAction muss aus asm_enums.hpp vorliegen");
EXPECT_EQ(static_cast<int>(::AssetManagement::ShutdownAction::NoAction), 0);
EXPECT_EQ(static_cast<int>(::AssetManagement::ShutdownAction::Logout), 1);
EXPECT_EQ(static_cast<int>(::AssetManagement::ShutdownAction::Shutdown), 2);
EXPECT_EQ(static_cast<int>(::AssetManagement::ShutdownAction::Reboot), 3);
}
TEST(AsmEnumsTest, UnitSymbolPositionDefaultValues)
/**
* @test AssetType muss mit den Werten aus asm_enums.idl generiert werden.
*/
TEST(AsmEnumsTest, AssetTypeValues)
{
AssetManagement::UnitSymbolPosition pos;
EXPECT_DOUBLE_EQ(pos.x, 0.0);
EXPECT_DOUBLE_EQ(pos.y, 0.0);
EXPECT_DOUBLE_EQ(pos.z, 0.0);
}
static_assert(std::is_enum<::AssetManagement::AssetType>::value,
"AssetType muss aus asm_enums.hpp vorliegen");
EXPECT_EQ(static_cast<int>(::AssetManagement::AssetType::Unknown), 0);
EXPECT_EQ(static_cast<int>(::AssetManagement::AssetType::Workstation), 1);
EXPECT_EQ(static_cast<int>(::AssetManagement::AssetType::Printer), 2);
EXPECT_EQ(static_cast<int>(::AssetManagement::AssetType::Beamer), 3);
EXPECT_EQ(static_cast<int>(::AssetManagement::AssetType::ProjectionWorkstation), 4);
EXPECT_EQ(static_cast<int>(::AssetManagement::AssetType::MobileAfterActionVehicle), 5);
EXPECT_EQ(static_cast<int>(::AssetManagement::AssetType::AdlerSAA), 6);
}
@@ -1,16 +1,74 @@
/**
* @file test_bld_dtc.cpp
* @brief Compilation test for Buildings/bld_dtc.h
* @brief Verhaltenstests für die generierte Buildings Dtc/Ftc-Schnittstelle
*
* This test verifies that the migrated header compiles correctly with Qt6/C++23.
* Diese Tests prüfen den von CODEGEN_CLIENT_TOPICS_IFC aus der bld_service.xml
* generierten Header (Lts/Proxies/Buildings/bld_dtc.h bzw. bld_ftc.h) aus dem
* Build-Tree. Der OFF-Stub include/Buildings/bld_dtc.h wurde entfernt, da er
* den generierten Header verschattet hat. Zusätzlich werden die plainen
* DDS-Typ-Member aus bld.hpp verifiziert (SwitchRelayRequest), die die
* migrierten Consumer (relay_info_handler, VWM) direkt als Felder nutzen.
*/
#include "Buildings/bld_dtc.h"
#include "Buildings/bld_ftc.h"
#include <gtest/gtest.h>
#include <QObject>
#include <type_traits>
TEST(bld_dtc_Compilation, HeaderCompiles)
/**
* @test Der generierte Dtc muss von QObject abgeleitet sein (Signale für Topic-Updates);
* beide Schnittstellen sind abstrakt.
*/
TEST(bld_dtc_Generated, DtcIsQObjectDerived)
{
// This test verifies that the header compiles without errors
static_assert(std::is_base_of<QObject, Buildings::Interface::Dtc>::value,
"generierter Dtc muss von QObject abgeleitet sein");
static_assert(std::is_abstract<Buildings::Interface::Dtc>::value,
"Dtc muss abstrakt sein");
static_assert(std::is_abstract<Buildings::Interface::Ftc>::value,
"Ftc muss abstrakt sein");
EXPECT_TRUE(true);
}
/**
* @test Die generierten Identifier müssen dem Proxy-Namensschema folgen.
*/
TEST(bld_dtc_Generated, IdentifiersMatchProxy)
{
EXPECT_STREQ(Buildings::Interface::Dtc::identifier(), "Buildings.Interface.Dtc");
EXPECT_STREQ(Buildings::Interface::Ftc::identifier(), "Buildings.Interface.Ftc");
}
/**
* @test Die DDS-Typen aus bld.hpp müssen plain-Member bereitstellen (rtiddsgen 7.7):
* SwitchRelayRequest (buildingId/assetId/state), den relay_info_handler
* und die VWM-Steuerung als Felder nutzen.
*/
TEST(bld_dtc_Generated, SwitchRelayRequestHasPlainMembers)
{
using SwitchRelayRequest = Buildings::SwitchRelayRequest;
static_assert(std::is_same<decltype(SwitchRelayRequest{}.buildingId), int32_t>::value,
"buildingId muss ein plain int32_t-Member sein");
static_assert(std::is_same<decltype(SwitchRelayRequest{}.assetId), int32_t>::value,
"assetId muss ein plain int32_t-Member sein");
static_assert(std::is_same<decltype(SwitchRelayRequest{}.state), ::Buildings::StateSetRelay>::value,
"state muss ein plain Buildings::StateSetRelay-Member sein");
static_assert(std::is_same<decltype(SwitchRelayRequest{}.number), int32_t>::value,
"number muss ein plain int32_t-Member sein");
EXPECT_TRUE(true);
}
/**
* @test Include-Guard: mehrfaches Einbinden der generierten Header ist erlaubt.
*/
TEST(bld_dtc_Generated, MultipleIncludeGuard)
{
// Including the header multiple times should not cause errors
#include "Buildings/bld_dtc.h"
#include "Buildings/bld_ftc.h"
EXPECT_TRUE(true);
}
@@ -1,16 +1,61 @@
/**
* @file test_bld_enums.cpp
* @brief Compilation test for Buildings/bld_enums.hpp
* @brief Verhaltenstests für die generierten Buildings-Enumerationen
*
* This test verifies that the migrated header compiles correctly with Qt6/C++23.
* Diese Tests prüfen den von rtiddsgen aus bld_enums.idl generierten Header
* (Lts/Proxies/Buildings/bld_enums.hpp) aus dem Build-Tree. Die frühere
* CONFIGURE_FILE-Stub-Kopie (BuildingType/BuildingStatus/BuildingInfo) wurde
* entfernt, da sie bei jedem CMake-Reconfigure die echten generierten
* Enumerationen überschrieben hat.
*/
#include "Lts/Proxies/Buildings/bld_enums.hpp"
#include "Buildings/bld_enums.hpp"
#include <gtest/gtest.h>
#include <type_traits>
TEST(bld_enums_Compilation, HeaderCompiles)
/**
* @test EffectTypeEnum muss mit den Werten aus bld_enums.idl generiert werden.
*/
TEST(bld_enums_Generated, EffectTypeEnumValues)
{
// This test verifies that the header compiles without errors
static_assert(std::is_enum<::Buildings::EffectTypeEnum>::value,
"EffectTypeEnum muss aus bld_enums.hpp vorliegen");
static_assert(static_cast<int32_t>(::Buildings::EffectTypeEnum::Undefined) == 0,
"EffectTypeEnum::Undefined muss 0 sein");
static_assert(static_cast<int32_t>(::Buildings::EffectTypeEnum::Relay) == 1,
"EffectTypeEnum::Relay muss 1 sein");
static_assert(static_cast<int32_t>(::Buildings::EffectTypeEnum::BackgroundSound) == 2,
"EffectTypeEnum::BackgroundSound muss 2 sein");
static_assert(static_cast<int32_t>(::Buildings::EffectTypeEnum::BsmFlash) == 3,
"EffectTypeEnum::BsmFlash muss 3 sein");
EXPECT_TRUE(true);
}
/**
* @test StateSetRelay muss mit den Werten aus bld_enums.idl generiert werden.
*/
TEST(bld_enums_Generated, StateSetRelayValues)
{
static_assert(std::is_enum<::Buildings::StateSetRelay>::value,
"StateSetRelay muss aus bld_enums.hpp vorliegen");
static_assert(static_cast<int32_t>(::Buildings::StateSetRelay::SwitchOff) == 0,
"StateSetRelay::SwitchOff muss 0 sein");
static_assert(static_cast<int32_t>(::Buildings::StateSetRelay::SwitchOn) == 1,
"StateSetRelay::SwitchOn muss 1 sein");
static_assert(static_cast<int32_t>(::Buildings::StateSetRelay::Pulse) == 2,
"StateSetRelay::Pulse muss 2 sein");
static_assert(static_cast<int32_t>(::Buildings::StateSetRelay::GetState) == 3,
"StateSetRelay::GetState muss 3 sein");
EXPECT_TRUE(true);
}
/**
* @test Include-Guard: mehrfaches Einbinden des generierten Headers ist erlaubt.
*/
TEST(bld_enums_Generated, MultipleIncludeGuard)
{
// Including the header multiple times should not cause errors
#include "Buildings/bld_enums.hpp"
EXPECT_TRUE(true);
}
@@ -3,9 +3,12 @@
* @brief Tests für BUILD_RTI conditional compilation guards
*
* Tests verify that:
* 1. Code compiles with BUILD_RTI=OFF (fallback mode)
* 2. RTI-dependent code is properly guarded
* 3. Non-RTI code paths work correctly
* 1. BUILD_RTI is defined as 1 in the validated configuration
* 2. RTI-dependent code paths are active (BUILD_RTI=ON)
* 3. #if BUILD_RTI guards compile and evaluate correctly
*
* BUILD_RTI=ON is the only valid migration configuration — the OFF
* variant is neither built nor tested.
*/
#include <gtest/gtest.h>
@@ -23,27 +26,25 @@ TEST(BuildRTIGuards, MacroDefined)
#endif
}
// Test 2: Verify DDS connector compiles without RTI
TEST(BuildRTIGuards, DDSConnectorFallback)
// Test 2: Verify RTI code paths are active in the validated configuration
TEST(BuildRTIGuards, RtiAvailableInValidatedConfig)
{
// This test verifies that DDS-related headers can be included
// and basic functionality works without RTI libraries
// The actual DDS connector should have fallback implementations
// The validated migration configuration is BUILD_RTI=ON: the RTI
// code paths must be compiled in and available.
bool rti_available = false;
#ifdef BUILD_RTI
rti_available = true;
#endif
EXPECT_FALSE(rti_available); // In fallback mode, RTI is not available
EXPECT_TRUE(rti_available);
}
// Test 3: Verify conditional compilation doesn't break build
TEST(BuildRTIGuards, ConditionalCompilationSafe)
{
// Verify that #if BUILD_RTI guards don't cause syntax errors
// Verify that #if BUILD_RTI guards evaluate to the active branch
int value = 0;
#if BUILD_RTI
value = 1;
#endif
// In fallback mode, value should remain 0
EXPECT_EQ(value, 0);
EXPECT_EQ(value, 1);
}
@@ -1,16 +1,77 @@
/**
* @file test_cod_dtc.cpp
* @brief Compilation test for CodificationManagement/cod_dtc.h
* @brief Verhaltenstests für die generierte CodificationManagement Dtc/Ftc-Schnittstelle
*
* This test verifies that the migrated header compiles correctly with Qt6/C++23.
* Diese Tests prüfen den von CODEGEN_CLIENT_TOPICS_IFC aus cod_service.xml
* generierten Header (Lts/Services/CodificationManagement/cod_dtc.h bzw.
* cod_ftc.h) aus dem Build-Tree. Es darf keinen Stub-Header im Quellbaum geben.
* Zusätzlich werden die plainen DDS-Typ-Member aus cod.hpp verifiziert, auf die
* der migrierte Code (object_codification_data.cpp, handler_codification_data.cpp)
* zugreift.
*/
#include "CodificationManagement/cod_dtc.h"
#include "CodificationManagement/cod_ftc.h"
#include <gtest/gtest.h>
#include <QObject>
#include <type_traits>
TEST(cod_dtc_Compilation, HeaderCompiles)
/**
* @test Der generierte Dtc muss von QObject abgeleitet sein (Signale für Topic-Updates);
* beide Schnittstellen sind abstrakt.
*/
TEST(cod_dtc_Generated, DtcIsQObjectDerived)
{
// This test verifies that the header compiles without errors
static_assert(std::is_base_of<QObject, CodificationManagement::Interface::Dtc>::value,
"generierter Dtc muss von QObject abgeleitet sein");
static_assert(std::is_abstract<CodificationManagement::Interface::Dtc>::value,
"Dtc muss abstrakt sein");
static_assert(std::is_abstract<CodificationManagement::Interface::Ftc>::value,
"Ftc muss abstrakt sein");
EXPECT_TRUE(true);
}
/**
* @test Die generierten Identifier müssen dem Service-Namensschema folgen.
*/
TEST(cod_dtc_Generated, IdentifiersMatchService)
{
EXPECT_STREQ(CodificationManagement::Interface::Dtc::identifier(), "CodificationManagement.Interface.Dtc");
EXPECT_STREQ(CodificationManagement::Interface::Ftc::identifier(), "CodificationManagement.Interface.Ftc");
}
/**
* @test Die DDS-Typen aus cod.hpp müssen plain-Member bereitstellen (rtiddsgen 7.7):
* CodificationData (id, isUsed, identifier, partyId), die
* object_codification_data.cpp und handler_codification_data.cpp direkt
* als Felder nutzen.
*/
TEST(cod_dtc_Generated, CodificationDataHasPlainMembers)
{
using CodificationData = CodificationManagement::CodificationData;
static_assert(std::is_base_of<::Core::BaseEntity, CodificationData>::value,
"CodificationData muss von Core::BaseEntity abgeleitet sein (id/name/isUsed)");
static_assert(std::is_same<decltype(CodificationData{}.id), int32_t>::value,
"id muss ein plain int32_t-Member sein");
static_assert(std::is_same<decltype(CodificationData{}.isUsed), bool>::value,
"isUsed muss ein plain bool-Member sein");
static_assert(std::is_same<decltype(CodificationData{}.identifier), std::string>::value,
"identifier muss ein plain std::string-Member sein");
static_assert(std::is_same<decltype(CodificationData{}.partyId), int32_t>::value,
"partyId muss ein plain int32_t-Member sein");
EXPECT_TRUE(true);
}
/**
* @test Include-Guard: mehrfaches Einbinden der generierten Header ist erlaubt.
*/
TEST(cod_dtc_Generated, MultipleIncludeGuard)
{
// Including the header multiple times should not cause errors
#include "CodificationManagement/cod_dtc.h"
#include "CodificationManagement/cod_ftc.h"
EXPECT_TRUE(true);
}
@@ -1,16 +1,90 @@
/**
* @file test_evl_dtc.cpp
* @brief Compilation test for Evaluations/evl_dtc.h
* @brief Verhaltenstests für die generierte Evaluations Dtc/Ftc-Schnittstelle
*
* This test verifies that the migrated header compiles correctly with Qt6/C++23.
* Diese Tests prüfen den von CODEGEN_CLIENT_TOPICS_IFC aus evl_service.xml
* generierten Header (Lts/Services/Evaluations/evl_dtc.h bzw. evl_ftc.h)
* aus dem Build-Tree. Es darf keinen Stub-Header im Quellbaum geben.
* Zusätzlich werden die plainen DDS-Typ-Member aus evl.hpp verifiziert, auf die
* der migrierte Code (handler_comment.cpp, handler_san_nine_liner.cpp,
* object_comment.cpp, object_san_nine_liner.cpp usw.) zugreift.
*/
#include "Evaluations/evl_dtc.h"
#include "Evaluations/evl_ftc.h"
#include <gtest/gtest.h>
#include <QObject>
#include <type_traits>
TEST(evl_dtc_Compilation, HeaderCompiles)
/**
* @test Der generierte Dtc muss von QObject abgeleitet sein (Signale für Topic-Updates);
* beide Schnittstellen sind abstrakt.
*/
TEST(evl_dtc_Generated, DtcIsQObjectDerived)
{
// This test verifies that the header compiles without errors
static_assert(std::is_base_of<QObject, Evaluations::Interface::Dtc>::value,
"generierter Dtc muss von QObject abgeleitet sein");
static_assert(std::is_abstract<Evaluations::Interface::Dtc>::value,
"Dtc muss abstrakt sein");
static_assert(std::is_abstract<Evaluations::Interface::Ftc>::value,
"Ftc muss abstrakt sein");
EXPECT_TRUE(true);
}
/**
* @test Die generierten Identifier müssen dem Service-Namensschema folgen.
*/
TEST(evl_dtc_Generated, IdentifiersMatchService)
{
EXPECT_STREQ(Evaluations::Interface::Dtc::identifier(), "Evaluations.Interface.Dtc");
EXPECT_STREQ(Evaluations::Interface::Ftc::identifier(), "Evaluations.Interface.Ftc");
}
/**
* @test Die DDS-Typen aus evl.hpp müssen plain-Member bereitstellen (rtiddsgen 7.7):
* EvaluationComment (optionaler receiverOperatorId, text), EvaluationCriterium
* und SanNineLiner (line1_position als GeoPosition2D mit plain lon/lat), die
* der migrierte Evaluations-Code direkt als Felder nutzt.
*/
TEST(evl_dtc_Generated, EvaluationTypesHavePlainMembers)
{
using EvaluationComment = Evaluations::EvaluationComment;
using EvaluationCriterium = Evaluations::EvaluationCriterium;
using SanNineLiner = Evaluations::SanNineLiner;
static_assert(std::is_same<decltype(EvaluationComment{}.receiverOperatorId),
::omg::types::optional<int32_t>>::value,
"receiverOperatorId muss ein omg::types::optional<int32_t>-Member sein");
static_assert(std::is_same<decltype(EvaluationComment{}.text), std::string>::value,
"text muss ein plain std::string-Member sein");
static_assert(std::is_same<decltype(EvaluationComment{}.elementId), int32_t>::value,
"elementId muss ein plain int32_t-Member sein");
static_assert(std::is_same<decltype(EvaluationCriterium{}.name), std::string>::value,
"EvaluationCriterium::name muss ein plain std::string-Member sein");
static_assert(std::is_same<decltype(SanNineLiner{}.line1_position), ::Core::GeoPosition2D>::value,
"line1_position muss ein plain Core::GeoPosition2D-Member sein");
static_assert(std::is_same<decltype(SanNineLiner{}.lines), std::string>::value,
"lines muss ein plain std::string-Member sein");
// GeoPosition2D bringt plain lon/lat-Member mit (kein Getter/Setter mehr).
static_assert(std::is_same<decltype(::Core::GeoPosition2D{}.lon), double>::value,
"GeoPosition2D::lon muss ein plain double-Member sein");
static_assert(std::is_same<decltype(::Core::GeoPosition2D{}.lat), double>::value,
"GeoPosition2D::lat muss ein plain double-Member sein");
EXPECT_TRUE(true);
}
/**
* @test Include-Guard: mehrfaches Einbinden der generierten Header ist erlaubt.
*/
TEST(evl_dtc_Generated, MultipleIncludeGuard)
{
// Including the header multiple times should not cause errors
#include "Evaluations/evl_dtc.h"
#include "Evaluations/evl_ftc.h"
EXPECT_TRUE(true);
}
@@ -5,6 +5,11 @@
* Tests verify that export headers exist and can be included without errors.
* Note: Export macros are defined via CMake target_compile_definitions,
* so we test header existence and structure rather than macro expansion.
*
* All export headers are generated into the build tree. The build directory
* is passed in via the MIGRATION_TEST_BUILD_DIR compile definition (its
* name is not stable across pipeline stages), and only headers of targets
* that are part of the validated build are checked.
*/
#include <fstream>
@@ -12,6 +17,14 @@
#include <string>
#include <vector>
#ifndef MIGRATION_TEST_BUILD_DIR
#error "MIGRATION_TEST_BUILD_DIR must be defined by tests/CMakeLists.txt"
#endif
namespace
{
const std::string kBuildDir = MIGRATION_TEST_BUILD_DIR;
// Helper to check if file exists and is readable
bool fileExists(const std::string& path)
{
@@ -29,32 +42,38 @@ std::string readFile(const std::string& path)
}
return std::string((std::istreambuf_iterator<char>(file)), std::istreambuf_iterator<char>());
}
} // namespace
// Test 1: nglwidgets_export.h exists
TEST(ExportHeaders, NglWidgetsExportExists)
{
std::string path = "build/Z/src/nglwidgets/nglwidgets_export.h";
std::string path = kBuildDir + "/Z/src/nglwidgets/nglwidgets_export.h";
EXPECT_TRUE(fileExists(path)) << "Export header not found: " << path;
}
// Test 2: qtsingleapplication_export.h exists
TEST(ExportHeaders, QtSingleApplicationExportExists)
{
std::string path = "build/Z/src/QtSingleApplication/qtsingleapplication_export.h";
std::string path = kBuildDir + "/Z/src/QtSingleApplication/qtsingleapplication_export.h";
EXPECT_TRUE(fileExists(path)) << "Export header not found: " << path;
}
// Test 3: ltssessiondata_export.h exists
TEST(ExportHeaders, LtsSessionDataExportExists)
{
std::string path = "build/Lts/Common/LtsSession/ltssessiondata_export.h";
std::string path = kBuildDir + "/Lts/Common/LtsSession/ltssessiondata_export.h";
EXPECT_TRUE(fileExists(path)) << "Export header not found: " << path;
}
// Test 4: svcgmpserver_export.h exists
TEST(ExportHeaders, SvcGmpServerExportExists)
// Test 4: ddsconnector_export.h exists
TEST(ExportHeaders, DdsConnectorExportExists)
{
std::string path = "build/Lts/Services/GuezMinelayerProcessing/svcgmpserver_export.h";
// This originally asserted svcgmpserver_export.h (GuezMinelayerProcessing).
// That sibling service is not part of this migration and is not built by
// the validation pipeline, so its export header is never generated.
// ddsconnector is a core dependency of the migrated FileManagement and
// FilterManagement services and part of the validated build.
std::string path = kBuildDir + "/Lts/DDS/DDSConnector/ddsconnector_export.h";
EXPECT_TRUE(fileExists(path)) << "Export header not found: " << path;
}
@@ -62,12 +81,15 @@ TEST(ExportHeaders, SvcGmpServerExportExists)
TEST(ExportHeaders, HaveIncludeGuards)
{
std::vector<std::string> headers = {
"build/Z/src/nglwidgets/nglwidgets_export.h", "build/Z/src/QtSingleApplication/qtsingleapplication_export.h",
"build/Lts/Common/LtsSession/ltssessiondata_export.h", "build/Lts/Proxies/ProjectDataManagement/pdm_export.h"};
kBuildDir + "/Z/src/nglwidgets/nglwidgets_export.h",
kBuildDir + "/Z/src/QtSingleApplication/qtsingleapplication_export.h",
kBuildDir + "/Lts/Common/LtsSession/ltssessiondata_export.h",
kBuildDir + "/Lts/DDS/DDSConnector/ddsconnector_export.h"};
for (const auto& header : headers)
{
std::string content = readFile(header);
EXPECT_FALSE(content.empty()) << "Export header not found: " << header;
if (!content.empty())
{
// Check for #ifndef guard
@@ -83,16 +105,17 @@ TEST(ExportHeaders, HaveIncludeGuards)
// Test 6: Export macros follow naming convention
TEST(ExportHeaders, MacroNamingConvention)
{
// Check that export headers follow CMake naming convention
std::string adlerPath =
"qt-migration-legatus/qt6-after/qt6-migrated-legatus/build/Lts/Plugins/AdlerJson/adler_export.h";
std::string content = readFile(adlerPath);
// Check that export headers follow CMake naming convention:
// <PREFIX>_EXPORT_H guard for target <prefix>
std::string connectorPath = kBuildDir + "/Lts/DDS/DDSConnector/ddsconnector_export.h";
std::string content = readFile(connectorPath);
EXPECT_FALSE(content.empty()) << "Export header not found: " << connectorPath;
if (!content.empty())
{
// Should have ADLER_EXPORT_H guard
bool hasCorrectGuard = content.find("#ifndef ADLER_EXPORT_H") != std::string::npos;
EXPECT_TRUE(hasCorrectGuard) << "adler_export.h should use ADLER_EXPORT_H guard";
// Should have DDSCONNECTOR_EXPORT_H guard
bool hasCorrectGuard = content.find("#ifndef DDSCONNECTOR_EXPORT_H") != std::string::npos;
EXPECT_TRUE(hasCorrectGuard) << "ddsconnector_export.h should use DDSCONNECTOR_EXPORT_H guard";
}
}
@@ -100,18 +123,17 @@ TEST(ExportHeaders, MacroNamingConvention)
TEST(ExportHeaders, ExportAndNoExportMacros)
{
std::vector<std::pair<std::string, std::string>> expectedMacros = {
{"qt-migration-legatus/qt6-after/qt6-migrated-legatus/build/Lts/Plugins/AdlerJson/adler_export.h", "ADLER"},
{"qt-migration-legatus/qt6-after/qt6-migrated-legatus/build/Lts/Services/PresentationManagement/"
"svcprecommon_export.h",
"SVCPRECOMMON"},
{"qt-migration-legatus/qt6-after/qt6-migrated-legatus/build/Lts/Common/LtsSession/ltssessiondata_export.h",
"LTSESSIONDATA"},
{"qt-migration-legatus/qt6-after/qt6-migrated-legatus/build/Lts/Proxies/ProjectDataManagement/pdm_export.h",
"PDM"}};
{kBuildDir + "/Lts/DDS/DDSConnector/ddsconnector_export.h", "DDSCONNECTOR"},
{kBuildDir + "/Lts/DDS/FTS/ddsfts_export.h", "DDSFTS"},
{kBuildDir + "/Lts/DDS/Core/ddscore_export.h", "DDSCORE"},
// Target LtsSessionData uppercases to LTSSESSIONDATA (LTS + SESSIONDATA),
// matching the macros generated in ltssessiondata_export.h.
{kBuildDir + "/Lts/Common/LtsSession/ltssessiondata_export.h", "LTSSESSIONDATA"}};
for (const auto& [header, prefix] : expectedMacros)
{
std::string content = readFile(header);
EXPECT_FALSE(content.empty()) << "Export header not found: " << header;
if (!content.empty())
{
bool hasExport = content.find(prefix + "_EXPORT") != std::string::npos;
@@ -121,4 +143,4 @@ TEST(ExportHeaders, ExportAndNoExportMacros)
EXPECT_TRUE(hasNoExport) << header << " should define " << prefix << "_NO_EXPORT";
}
}
}
}
@@ -0,0 +1,75 @@
/**
* @file test_flm_db_impl_custom.cpp
* @brief Tests für DatabaseInterfaceImplCustom (flm_db_impl_custom.cpp/.h)
*
* Die DB-Methoden selbst (updateStatus/setUsedBy) benötigen eine live
* Datenbankverbindung und laufen daher nur im Integrationstest flmTests
* (docker: make flmTests). Diese Unit-Tests sichern die Qt6-relevante Kopplung
* an den generierten Basistyp flm_db_impl.h ab: Klassenhierarchie,
* Override-Signaturen und die Enum-Konvertierung (static_cast<int>), die
* flm_db_impl_custom.cpp für Status-Vergleich und SQL-Bind verwendet.
*/
#include <FileManagement/flm_db_impl_custom.h>
#include <gtest/gtest.h>
#include <type_traits>
/**
* @test DatabaseInterfaceImplCustom muss final sein und vom generierten
* DatabaseInterfaceImpl (flm_db_impl.h) erben.
*/
TEST(flm_db_impl_custom, CustomClassIsFinalDerivedFromGeneratedBase)
{
static_assert(std::is_final<FileManagement::DatabaseInterfaceImplCustom>::value,
"DatabaseInterfaceImplCustom muss final sein");
static_assert(std::is_base_of<FileManagement::DatabaseInterfaceImpl,
FileManagement::DatabaseInterfaceImplCustom>::value,
"DatabaseInterfaceImplCustom muss von DatabaseInterfaceImpl erben");
SUCCEED();
}
/**
* @test Die generierte Basis DatabaseInterfaceImpl ist abstrakt (sie
* implementiert updateStatus/setUsedBy nicht); die Custom-Klasse muss
* durch ihre beiden Overrides konkret sein.
*/
TEST(flm_db_impl_custom, OverridesAllPureVirtualMethodsOfGeneratedBase)
{
static_assert(std::is_abstract<FileManagement::DatabaseInterfaceImpl>::value,
"generierte Basis muss abstrakt sein");
static_assert(!std::is_abstract<FileManagement::DatabaseInterfaceImplCustom>::value,
"Custom-Klasse muss alle pure-virtual Methoden überschreiben");
SUCCEED();
}
/**
* @test Die Override-Signaturen müssen exakt den Deklarationen in der
* generierten Basis flm_db.h entsprechen (const FileStatus&/const bool&).
*/
TEST(flm_db_impl_custom, OverrideSignaturesMatchGeneratedBase)
{
using UpdateStatus =
bool (FileManagement::DatabaseInterfaceImplCustom::*)(int, const FileManagement::FileStatus &, int);
using SetUsedBy =
bool (FileManagement::DatabaseInterfaceImplCustom::*)(int, const bool &, int, int);
static_assert(std::is_same<UpdateStatus,
decltype(&FileManagement::DatabaseInterfaceImplCustom::updateStatus)>::value,
"updateStatus-Signatur muss (int, const FileStatus&, int) sein");
static_assert(std::is_same<SetUsedBy,
decltype(&FileManagement::DatabaseInterfaceImplCustom::setUsedBy)>::value,
"setUsedBy-Signatur muss (int, const bool&, int, int) sein");
SUCCEED();
}
/**
* @test flm_db_impl_custom.cpp vergleicht status gegen FileStatus::Deleted
* bzw. FileStatus::Valid und bindet static_cast<int>(status) an :st —
* die Enum-Werte sind der Vertrag der geänderten Logik.
*/
TEST(flm_db_impl_custom, StatusEnumValuesMatchSqlBindConversion)
{
EXPECT_EQ(static_cast<int>(FileManagement::FileStatus::Valid), 0);
EXPECT_EQ(static_cast<int>(FileManagement::FileStatus::Deleted), 1);
}
@@ -1,16 +1,60 @@
/**
* @file test_flm_dtc.cpp
* @brief Compilation test for FileManagement/flm_dtc.h
* @brief Verhaltenstests für die generierte FileManagement Dtc/Ftc-Schnittstelle
*
* This test verifies that the migrated header compiles correctly with Qt6/C++23.
* Diese Tests prüfen den von CODEGEN_CLIENT_TOPICS_IFC aus flm_service.xml
* generierten Header (Lts/Services/FileManagement/flm_dtc.h bzw. flm_ftc.h)
* aus dem Build-Tree. Es darf keinen Stub-Header im Quellbaum geben.
*/
#include "FileManagement/flm_dtc.h"
#include "FileManagement/flm_ftc.h"
#include <gtest/gtest.h>
#include <QObject>
#include <type_traits>
TEST(flm_dtc_Compilation, HeaderCompiles)
/**
* @test Der generierte Dtc muss von QObject abgeleitet sein (Signale für Topic-Updates).
*/
TEST(flm_dtc_Generated, DtcIsQObjectDerived)
{
// This test verifies that the header compiles without errors
static_assert(std::is_base_of<QObject, FileManagement::Interface::Dtc>::value,
"generierter Dtc muss von QObject abgeleitet sein");
EXPECT_TRUE(true);
}
/**
* @test Die generierten Identifier müssen dem Service-Namensschema folgen.
*/
TEST(flm_dtc_Generated, IdentifiersMatchService)
{
EXPECT_STREQ(FileManagement::Interface::Dtc::identifier(), "FileManagement.Interface.Dtc");
EXPECT_STREQ(FileManagement::Interface::Ftc::identifier(), "FileManagement.Interface.Ftc");
}
/**
* @test Die Schnittstellen sind abstrakt und stellen die Topic-Zugriffe aus
* flm_service.xml bereit (Folder, FileContent, ...).
*/
TEST(flm_dtc_Generated, TopicInterfacesAreAbstract)
{
using DtcType = FileManagement::Interface::Dtc;
using FtcType = FileManagement::Interface::Ftc;
static_assert(std::is_abstract<DtcType>::value, "Dtc muss abstrakt sein");
static_assert(std::is_abstract<FtcType>::value, "Ftc muss abstrakt sein");
EXPECT_TRUE(true);
}
/**
* @test Include-Guard: mehrfaches Einbinden der generierten Header ist erlaubt.
*/
TEST(flm_dtc_Generated, MultipleIncludeGuard)
{
// Including the header multiple times should not cause errors
#include "FileManagement/flm_dtc.h"
#include "FileManagement/flm_ftc.h"
EXPECT_TRUE(true);
}
@@ -0,0 +1,63 @@
/**
* @file test_flm_dtc_impl_custom.cpp
* @brief Tests für DtcImplCustom (flm_dtc_impl_custom.h)
*
* DtcImplCustom-Instanzen benötigen einen live DDSConnector (Domain
* Participant); Verhaltenstests laufen daher nur im Integrationstest flmTests
* (docker: make flmTests). Diese Unit-Tests sichern die Qt6-relevante Struktur
* ab: Q_OBJECT-Klasse, Vererbung vom generierten Interface::DtcImpl,
* Konstruktor-Signatur und die inline Folder-Name-Methoden.
*/
#include <FileManagement/flm_dtc_impl_custom.h>
#include <gtest/gtest.h>
#include <type_traits>
/**
* @test DtcImplCustom muss final sein, vom generierten Interface::DtcImpl
* erben und (wegen des Q_OBJECT-Makros) QObject-abgeleitet sein —
* moc verifiziert die Klasse beim Bauen von migration_tests.
*/
TEST(flm_dtc_impl_custom, IsFinalQObjectDerivedFromGeneratedDtcImpl)
{
static_assert(std::is_final<FileManagement::Interface::DtcImplCustom>::value,
"DtcImplCustom muss final sein");
static_assert(std::is_base_of<FileManagement::Interface::DtcImpl,
FileManagement::Interface::DtcImplCustom>::value,
"DtcImplCustom muss von Interface::DtcImpl erben");
static_assert(std::is_base_of<QObject, FileManagement::Interface::DtcImplCustom>::value,
"Q_OBJECT erfordert eine QObject-Basis");
SUCCEED();
}
/**
* @test Der Konstruktor muss den shared_ptr<DDSConnector::DdsConnector> aus
* der generierten DtcImpl-Basis durchreichen (inherited ctor).
*/
TEST(flm_dtc_impl_custom, ConstructorTakesDdsConnector)
{
static_assert(
std::is_constructible<FileManagement::Interface::DtcImplCustom,
const std::shared_ptr<DDSConnector::DdsConnector> &>::value,
"DtcImplCustom muss aus const std::shared_ptr<DdsConnector>& konstruierbar sein");
SUCCEED();
}
/**
* @test Die in flm_dtc_impl_custom.h inline implementierten Folder-Name-
* Formatierungen ("$EX_"/"$PY_"/"$PH_" + Id) müssen als const-Methoden
* mit QString-Rückgabe deklariert sein. (Aufruf braucht eine Instanz
* mit live DDS — siehe Klassenkommentar.)
*/
TEST(flm_dtc_impl_custom, InlineFolderNameSignatures)
{
using FileManagement::Interface::DtcImplCustom;
static_assert(std::is_same<QString, decltype(std::declval<const DtcImplCustom &>().getExerciseFolderName(1))>::value,
"getExerciseFolderName muss const QString(int) sein");
static_assert(std::is_same<QString, decltype(std::declval<const DtcImplCustom &>().getPartyFolderName(1))>::value,
"getPartyFolderName muss const QString(int) sein");
static_assert(std::is_same<QString, decltype(std::declval<const DtcImplCustom &>().getPhaseFolderName(1))>::value,
"getPhaseFolderName muss const QString(int) sein");
SUCCEED();
}
@@ -1,16 +1,58 @@
/**
* @file test_flm_enums.cpp
* @brief Compilation test for FileManagement/flm_enums.hpp
* @brief Verhaltenstests für die aus flm_service.xml generierten Enums
*
* This test verifies that the migrated header compiles correctly with Qt6/C++23.
* Diese Tests prüfen die Enum-Werte im generierten Header
* (Lts/Services/FileManagement/flm_enums.hpp aus flm_enums.idl via rtiddsgen)
* gegen die Definitionen in flm_service.xml. rtiddsgen 7.7 generiert
* enum class; Stub-Werte (z. B. FileStatus mit fünf Einträgen) fallen damit auf.
*/
#include "Lts/Services/FileManagement/flm_enums.hpp"
#include <gtest/gtest.h>
TEST(flm_enums_Compilation, HeaderCompiles)
/**
* @test FileStatus: laut flm_service.xml gilt Valid = 0 und Deleted = 1.
*/
TEST(flm_enums_Generated, FileStatusValues)
{
// This test verifies that the header compiles without errors
EXPECT_EQ(static_cast<int>(FileManagement::FileStatus::Valid), 0);
EXPECT_EQ(static_cast<int>(FileManagement::FileStatus::Deleted), 1);
}
/**
* @test FileType: Stichproben aus der Definition in flm_service.xml
* (Unknown = 0, Pdf = 3, AdlerJson = 19).
*/
TEST(flm_enums_Generated, FileTypeValues)
{
EXPECT_EQ(static_cast<int>(FileManagement::FileType::Unknown), 0);
EXPECT_EQ(static_cast<int>(FileManagement::FileType::Pdf), 3);
EXPECT_EQ(static_cast<int>(FileManagement::FileType::AdlerJson), 19);
}
/**
* @test FileCategory und MainFolder: Werte aus flm_service.xml
* (Global = 1, Exercise = 2, User = 3 bzw. GlobalDocuments = 1, ...).
*/
TEST(flm_enums_Generated, FileCategoryAndMainFolderValues)
{
EXPECT_EQ(static_cast<int>(FileManagement::FileCategory::Global), 1);
EXPECT_EQ(static_cast<int>(FileManagement::FileCategory::Exercise), 2);
EXPECT_EQ(static_cast<int>(FileManagement::FileCategory::User), 3);
EXPECT_EQ(static_cast<int>(FileManagement::MainFolder::GlobalDocuments), 1);
EXPECT_EQ(static_cast<int>(FileManagement::MainFolder::ExerciseDocuments), 2);
EXPECT_EQ(static_cast<int>(FileManagement::MainFolder::UserDocuments), 3);
}
/**
* @test Include-Guard: mehrfaches Einbinden des generierten Headers ist erlaubt.
*/
TEST(flm_enums_Generated, MultipleIncludeGuard)
{
// Including the header multiple times should not cause errors
#include "Lts/Services/FileManagement/flm_enums.hpp"
EXPECT_TRUE(true);
}
@@ -0,0 +1,70 @@
/**
* @file test_flm_tests.cpp
* @brief Tests für das FLM-Modultest-Fixture (ModuleTests/flm_tests.h/.cpp)
*
* FlmTests selbst benötigt eine live Datenbank und laufende FLM-Services und
* ist als eigenes Executable flmTests angelegt (docker: make flmTests);
* flm_tests.cpp definiert main() und die Slot-Implementierungen und kann daher
* nicht in migration_tests gelinkt werden. Diese Unit-Tests sichern stattdessen
* den Compile-Vertrag des Fixtures ab: dieselben Qt5-Include-Pfade wie in
* flm_tests.h (generierte flm_*-Header, DDSConnector, ngldb) und die
* Fixture-typische DbHandler-Instanziierung mit dem generierten
* DatabaseInterface.
*/
#include <FileManagement/flm_ftc.h>
#include <FileManagement/flm_dtc.h>
#include <FileManagement/flm_db.h>
#include <FileManagement/flm_db_impl_custom.h>
#include <FileManagement/flm_ftc_types.h>
#include <DDS/DDSConnector/dds_connector.h>
#include <FileManagement/logger.h>
#include <ngldb/db_service_handler.h>
#include <gtest/gtest.h>
#include <type_traits>
/**
* @test flm_tests.h typedef'iert DbHandler = NGLDB::DbServiceHandler<DatabaseInterface>
* — diese Instanziierung muss mit dem generierten DatabaseInterface
* kompilieren (Template vollständig instanziierbar).
*/
TEST(flm_tests, DbHandlerInstantiatesWithGeneratedDatabaseInterface)
{
using DbHandler = NGLDB::DbServiceHandler<FileManagement::DatabaseInterface>;
static_assert(std::is_class<DbHandler>::value,
"NGLDB::DbServiceHandler<FileManagement::DatabaseInterface> muss eine Klasse sein");
SUCCEED();
}
/**
* @test FlmTests erbt (protected) von genau diesen sechs Ftc-ReplyHandlern —
* sie müssen über <FileManagement/flm_ftc.h> vollständig vorliegen.
*/
TEST(flm_tests, FtcReplyHandlerBasesAreComplete)
{
using namespace FileManagement::Interface;
static_assert(std::is_class<Ftc::FolderModifyReplyHandler>::value, "FolderModifyReplyHandler fehlt");
static_assert(std::is_class<Ftc::FolderRemoveReplyHandler>::value, "FolderRemoveReplyHandler fehlt");
static_assert(std::is_class<Ftc::FileContentModifyReplyHandler>::value, "FileContentModifyReplyHandler fehlt");
static_assert(std::is_class<Ftc::FileContentRemoveReplyHandler>::value, "FileContentRemoveReplyHandler fehlt");
static_assert(std::is_class<Ftc::FileContentExportReplyHandler>::value, "FileContentExportReplyHandler fehlt");
static_assert(std::is_class<Ftc::GetFileContentDataReplyHandler>::value, "GetFileContentDataReplyHandler fehlt");
SUCCEED();
}
/**
* @test Der von FlmTests::init verwendete Dtc muss die Factory-Methode
* create(const std::shared_ptr<DdsConnector>&) bereitstellen.
*/
TEST(flm_tests, DtcCreateFactorySignature)
{
static_assert(
std::is_same<std::shared_ptr<FileManagement::Interface::Dtc> (*)(
const std::shared_ptr<DDSConnector::DdsConnector> &),
decltype(&FileManagement::Interface::Dtc::create)>::value,
"Dtc::create muss (const std::shared_ptr<DdsConnector>&) -> shared_ptr<Dtc> sein");
SUCCEED();
}
@@ -0,0 +1,60 @@
/**
* @file test_flt_dtc.cpp
* @brief Verhaltenstests für die generierte FilterManagement Dtc/Ftc-Schnittstelle
*
* Diese Tests prüfen den von CODEGEN_CLIENT_TOPICS_IFC aus flt_service.xml
* generierten Header (Lts/Services/FilterManagement/flt_dtc.h bzw. flt_ftc.h)
* aus dem Build-Tree. Es darf keinen Stub-Header im Quellbaum geben.
*/
#include "FilterManagement/flt_dtc.h"
#include "FilterManagement/flt_ftc.h"
#include <gtest/gtest.h>
#include <QObject>
#include <type_traits>
/**
* @test Der generierte Dtc muss von QObject abgeleitet sein (Signale für Topic-Updates).
*/
TEST(flt_dtc_Generated, DtcIsQObjectDerived)
{
static_assert(std::is_base_of<QObject, FilterManagement::Interface::Dtc>::value,
"generierter Dtc muss von QObject abgeleitet sein");
EXPECT_TRUE(true);
}
/**
* @test Die generierten Identifier müssen dem Service-Namensschema folgen.
*/
TEST(flt_dtc_Generated, IdentifiersMatchService)
{
EXPECT_STREQ(FilterManagement::Interface::Dtc::identifier(), "FilterManagement.Interface.Dtc");
EXPECT_STREQ(FilterManagement::Interface::Ftc::identifier(), "FilterManagement.Interface.Ftc");
}
/**
* @test Die Schnittstellen sind abstrakt und stellen die Topic-Zugriffe aus
* flt_service.xml bereit.
*/
TEST(flt_dtc_Generated, TopicInterfacesAreAbstract)
{
using DtcType = FilterManagement::Interface::Dtc;
using FtcType = FilterManagement::Interface::Ftc;
static_assert(std::is_abstract<DtcType>::value, "Dtc muss abstrakt sein");
static_assert(std::is_abstract<FtcType>::value, "Ftc muss abstrakt sein");
EXPECT_TRUE(true);
}
/**
* @test Include-Guard: mehrfaches Einbinden der generierten Header ist erlaubt.
*/
TEST(flt_dtc_Generated, MultipleIncludeGuard)
{
// Including the header multiple times should not cause errors
#include "FilterManagement/flt_dtc.h"
#include "FilterManagement/flt_ftc.h"
EXPECT_TRUE(true);
}
@@ -0,0 +1,32 @@
/**
* @file test_flt_enums.cpp
* @brief Verhaltenstests für die aus flt_service.xml generierten Enums
*
* Diese Tests prüfen die Enum-Werte im generierten Header
* (Lts/Services/FilterManagement/flt_enums.hpp aus flt_enums.idl via rtiddsgen)
* gegen die Definitionen in flt_service.xml. rtiddsgen 7.7 generiert
* enum class.
*/
#include "Lts/Services/FilterManagement/flt_enums.hpp"
#include <gtest/gtest.h>
/**
* @test DummyEnum: laut flt_service.xml gilt val1 = 1 und val2 = 2.
*/
TEST(flt_enums_Generated, DummyEnumValues)
{
EXPECT_EQ(static_cast<int>(FilterManagement::DummyEnum::val1), 1);
EXPECT_EQ(static_cast<int>(FilterManagement::DummyEnum::val2), 2);
}
/**
* @test Include-Guard: mehrfaches Einbinden des generierten Headers ist erlaubt.
*/
TEST(flt_enums_Generated, MultipleIncludeGuard)
{
// Including the header multiple times should not cause errors
#include "Lts/Services/FilterManagement/flt_enums.hpp"
EXPECT_TRUE(true);
}
@@ -1,16 +1,73 @@
/**
* @file test_gim_dtc.cpp
* @brief Compilation test for GuezIedManagement/gim_dtc.h
* @brief Verhaltenstests für die generierte GuezIedManagement Dtc/Ftc-Schnittstelle
*
* This test verifies that the migrated header compiles correctly with Qt6/C++23.
* Diese Tests prüfen den von CODEGEN_CLIENT_TOPICS_IFC aus gim_service.xml
* generierten Header (Lts/Services/GuezIedManagement/gim_dtc.h bzw. gim_ftc.h)
* aus dem Build-Tree. Es darf keinen Stub-Header im Quellbaum geben.
* Zusätzlich werden die plainen DDS-Typ-Member aus gim.hpp verifiziert, auf die
* der migrierte Code (gim_dtc_impl_custom.cpp) zugreift.
*/
#include "GuezIedManagement/gim_dtc.h"
#include "GuezIedManagement/gim_ftc.h"
#include <gtest/gtest.h>
#include <QObject>
#include <type_traits>
TEST(gim_dtc_Compilation, HeaderCompiles)
/**
* @test Der generierte Dtc muss von QObject abgeleitet sein (Signale für Topic-Updates);
* beide Schnittstellen sind abstrakt.
*/
TEST(gim_dtc_Generated, DtcIsQObjectDerived)
{
// This test verifies that the header compiles without errors
static_assert(std::is_base_of<QObject, GuezIedManagement::Interface::Dtc>::value,
"generierter Dtc muss von QObject abgeleitet sein");
static_assert(std::is_abstract<GuezIedManagement::Interface::Dtc>::value,
"Dtc muss abstrakt sein");
static_assert(std::is_abstract<GuezIedManagement::Interface::Ftc>::value,
"Ftc muss abstrakt sein");
EXPECT_TRUE(true);
}
/**
* @test Die generierten Identifier müssen dem Service-Namensschema folgen.
*/
TEST(gim_dtc_Generated, IdentifiersMatchService)
{
EXPECT_STREQ(GuezIedManagement::Interface::Dtc::identifier(), "GuezIedManagement.Interface.Dtc");
EXPECT_STREQ(GuezIedManagement::Interface::Ftc::identifier(), "GuezIedManagement.Interface.Ftc");
}
/**
* @test Die DDS-Typen aus gim.hpp müssen plain-Member bereitstellen (rtiddsgen 7.7):
* Ied (equipmentNumber, type, symbol), die gim_dtc_impl_custom.cpp direkt
* als Felder nutzt (ied.equipmentNumber == equipmentNumber).
*/
TEST(gim_dtc_Generated, IedHasPlainMembers)
{
using Ied = GuezIedManagement::Ied;
static_assert(std::is_base_of<::Core::BaseEntityWithSampleTime, Ied>::value,
"Ied muss von Core::BaseEntityWithSampleTime abgeleitet sein");
static_assert(std::is_same<decltype(Ied{}.equipmentNumber), int32_t>::value,
"equipmentNumber muss ein plain int32_t-Member sein");
static_assert(std::is_same<decltype(Ied{}.type), ::GuezIedManagement::IedType>::value,
"type muss ein plain IedType-Member sein");
static_assert(std::is_same<decltype(Ied{}.symbol), std::string>::value,
"symbol muss ein plain std::string-Member sein");
EXPECT_TRUE(true);
}
/**
* @test Include-Guard: mehrfaches Einbinden der generierten Header ist erlaubt.
*/
TEST(gim_dtc_Generated, MultipleIncludeGuard)
{
// Including the header multiple times should not cause errors
#include "GuezIedManagement/gim_dtc.h"
#include "GuezIedManagement/gim_ftc.h"
EXPECT_TRUE(true);
}
@@ -1,16 +1,92 @@
/**
* @file test_ism_dtc.cpp
* @brief Compilation test for include/InfrastructureManagement/ism_dtc.h
* @brief Verhaltenstests für die generierte InfrastructureManagement Dtc/Ftc-Schnittstelle
*
* This test verifies that the migrated header compiles correctly with Qt6/C++23.
* Diese Tests prüfen den von CODEGEN_CLIENT_TOPICS_IFC aus ism_service.xml
* generierten Header (Lts/Services/InfrastructureManagement/ism_dtc.h bzw.
* ism_ftc.h) aus dem Build-Tree. Es darf keinen Stub-Header im Quellbaum geben.
* Zusätzlich werden die plainen DDS-Typ-Member aus ism.hpp verifiziert, auf die
* der migrierte Code (object_main_structure_element.cpp) zugreift.
*/
#include "include/InfrastructureManagement/ism_dtc.h"
#include "InfrastructureManagement/ism_dtc.h"
#include "InfrastructureManagement/ism_ftc.h"
#include <gtest/gtest.h>
#include <QObject>
#include <type_traits>
TEST(ism_dtc_Compilation, HeaderCompiles)
/**
* @test Der generierte Dtc muss von QObject abgeleitet sein (Signale für Topic-Updates);
* beide Schnittstellen sind abstrakt.
*/
TEST(ism_dtc_Generated, DtcIsQObjectDerived)
{
// This test verifies that the header compiles without errors
static_assert(std::is_base_of<QObject, InfrastructureManagement::Interface::Dtc>::value,
"generierter Dtc muss von QObject abgeleitet sein");
static_assert(std::is_abstract<InfrastructureManagement::Interface::Dtc>::value,
"Dtc muss abstrakt sein");
static_assert(std::is_abstract<InfrastructureManagement::Interface::Ftc>::value,
"Ftc muss abstrakt sein");
EXPECT_TRUE(true);
}
/**
* @test Die generierten Identifier müssen dem Service-Namensschema folgen.
*/
TEST(ism_dtc_Generated, IdentifiersMatchService)
{
EXPECT_STREQ(InfrastructureManagement::Interface::Dtc::identifier(), "InfrastructureManagement.Interface.Dtc");
EXPECT_STREQ(InfrastructureManagement::Interface::Ftc::identifier(), "InfrastructureManagement.Interface.Ftc");
}
/**
* @test Die DDS-Typen aus ism.hpp müssen plain-Member bereitstellen (rtiddsgen 7.7):
* MainStructureElement (geoPosition, elements) und StructureElement (path),
* die object_main_structure_element.cpp direkt als Felder nutzt.
*/
TEST(ism_dtc_Generated, StructureElementsHavePlainMembers)
{
using MainStructureElement = InfrastructureManagement::MainStructureElement;
using StructureElement = InfrastructureManagement::StructureElement;
static_assert(std::is_base_of<::Core::BaseEntity, MainStructureElement>::value,
"MainStructureElement muss von Core::BaseEntity abgeleitet sein (id/name/isUsed)");
static_assert(std::is_same<decltype(MainStructureElement{}.structureElementId), int32_t>::value,
"structureElementId muss ein plain int32_t-Member sein");
static_assert(std::is_same<decltype(MainStructureElement{}.geoPosition), ::Core::GeoPosition>::value,
"geoPosition muss ein plain Core::GeoPosition-Member sein");
static_assert(std::is_same<decltype(MainStructureElement{}.elements),
::omg::types::sequence<::InfrastructureManagement::StructureElement>>::value,
"elements muss eine omg::types::sequence<StructureElement> sein");
static_assert(std::is_same<decltype(StructureElement{}.structureElementTypeId),
::InfrastructureManagement::StructureElementType>::value,
"structureElementTypeId muss ein plain StructureElementType-Member sein");
static_assert(std::is_same<decltype(StructureElement{}.path), ::omg::types::sequence<int32_t>>::value,
"path muss eine omg::types::sequence<int32_t> sein");
// Core::GeoPosition bringt plain lon/lat/z-Member mit (kein Getter/Setter mehr).
static_assert(std::is_same<decltype(::Core::GeoPosition{}.lon), double>::value,
"GeoPosition::lon muss ein plain double-Member sein");
static_assert(std::is_same<decltype(::Core::GeoPosition{}.lat), double>::value,
"GeoPosition::lat muss ein plain double-Member sein");
static_assert(std::is_same<decltype(::Core::GeoPosition{}.z), double>::value,
"GeoPosition::z muss ein plain double-Member sein");
static_assert(std::is_enum<::InfrastructureManagement::StructureElementType>::value,
"StructureElementType muss aus ism_enums.hpp als Aufzählung vorliegen");
EXPECT_TRUE(true);
}
/**
* @test Include-Guard: mehrfaches Einbinden der generierten Header ist erlaubt.
*/
TEST(ism_dtc_Generated, MultipleIncludeGuard)
{
// Including the header multiple times should not cause errors
#include "InfrastructureManagement/ism_dtc.h"
#include "InfrastructureManagement/ism_ftc.h"
EXPECT_TRUE(true);
}
@@ -1,13 +1,27 @@
#include <gtest/gtest.h>
// Stub test for lts_coord_vector.cpp migration validation
// Compile-level regression test for the LtsCoordinate migration.
//
// lts_coord_vector.h includes the export header generated by
// NGL_ADD_LIBRARY2 for target LtsCoordinate as
// <LtsCoordinate/ltscoordinate_export.h> (same form as the qt5 legacy).
// The build-tree location (build4/Lts/Common/LtsCoordinate) is reachable
// for consumers via the PUBLIC binary-dir include of LtsCoordinate and of
// the sibling NGL_ADD_LIBRARY2 targets under Lts/Common. A bare quoted
// #include "ltscoordinate_export.h" only resolved inside the LtsCoordinate
// target itself and broke every consumer (svcIsmClient via
// ism_dtc_impl_custom_p.h), so this TU must keep including the header the
// same way consumers do.
#include <LtsCoordinate/lts_coord_vector.h>
namespace Lts
{
namespace Common
{
} // namespace Common
} // namespace Lts
#ifndef LTSCOORDINATE_EXPORT
#error "ltscoordinate_export.h was not resolved; lts_coord_vector.h include regressed"
#endif
#include <type_traits>
static_assert(std::is_class<LtsCoordTrans::LtsCoordVector>::value,
"LtsCoordVector must be declared by lts_coord_vector.h");
TEST(lts_coord_vectorMigrationTest, CompilationStub)
{
@@ -1,11 +1,11 @@
/**
* @file test_mdm_dtc.cpp
* @brief Compilation test for include/MeteoDataManagement/mdm_dtc.h
* @brief Compilation test for MeteoDataManagement/mdm_dtc.h (generated)
*
* This test verifies that the migrated header compiles correctly with Qt6/C++23.
*/
#include "include/MeteoDataManagement/mdm_dtc.h"
#include "MeteoDataManagement/mdm_dtc.h"
#include <gtest/gtest.h>
@@ -1,16 +1,86 @@
/**
* @file test_mrk_dtc.cpp
* @brief Compilation test for include/MarkerManagement/mrk_dtc.h
* @brief Verhaltenstests für die generierte MarkerManagement Dtc/Ftc-Schnittstelle
*
* This test verifies that the migrated header compiles correctly with Qt6/C++23.
* Diese Tests prüfen den von CODEGEN_CLIENT_TOPICS_IFC aus mrk_service.xml
* generierten Header (Lts/Services/MarkerManagement/mrk_dtc.h bzw. mrk_ftc.h)
* aus dem Build-Tree. Es darf keinen Stub-Header im Quellbaum geben.
* Zusätzlich werden die plainen DDS-Typ-Member aus mrk.hpp verifiziert, auf die
* der migrierte Code (object_marker.cpp, object_snapshot.cpp, handler_marker.cpp,
* handler_snapshot.cpp) zugreift.
*/
#include "include/MarkerManagement/mrk_dtc.h"
#include "MarkerManagement/mrk_dtc.h"
#include "MarkerManagement/mrk_ftc.h"
#include <gtest/gtest.h>
#include <QObject>
#include <type_traits>
TEST(mrk_dtc_Compilation, HeaderCompiles)
/**
* @test Der generierte Dtc muss von QObject abgeleitet sein (Signale für Topic-Updates);
* beide Schnittstellen sind abstrakt.
*/
TEST(mrk_dtc_Generated, DtcIsQObjectDerived)
{
// This test verifies that the header compiles without errors
static_assert(std::is_base_of<QObject, MarkerManagement::Interface::Dtc>::value,
"generierter Dtc muss von QObject abgeleitet sein");
static_assert(std::is_abstract<MarkerManagement::Interface::Dtc>::value,
"Dtc muss abstrakt sein");
static_assert(std::is_abstract<MarkerManagement::Interface::Ftc>::value,
"Ftc muss abstrakt sein");
EXPECT_TRUE(true);
}
/**
* @test Die generierten Identifier müssen dem Service-Namensschema folgen.
*/
TEST(mrk_dtc_Generated, IdentifiersMatchService)
{
EXPECT_STREQ(MarkerManagement::Interface::Dtc::identifier(), "MarkerManagement.Interface.Dtc");
EXPECT_STREQ(MarkerManagement::Interface::Ftc::identifier(), "MarkerManagement.Interface.Ftc");
}
/**
* @test Die DDS-Typen aus mrk.hpp müssen plain-Member bereitstellen (rtiddsgen 7.7):
* Marker (descriptions, position), MarkerDescription (markerType, content)
* und Snapshot, die der migrierte Marker/Snapshot-Code direkt als Felder nutzt.
*/
TEST(mrk_dtc_Generated, MarkerTypesHavePlainMembers)
{
using Marker = MarkerManagement::Marker;
using MarkerDescription = MarkerManagement::MarkerDescription;
using Snapshot = MarkerManagement::Snapshot;
static_assert(std::is_base_of<::Core::BaseEntity, Marker>::value,
"Marker muss von Core::BaseEntity abgeleitet sein (id/name/isUsed)");
static_assert(std::is_same<decltype(Marker{}.descriptions),
::omg::types::sequence<::MarkerManagement::MarkerDescription>>::value,
"descriptions muss eine omg::types::sequence<MarkerDescription> sein");
static_assert(std::is_same<decltype(Marker{}.position), ::Core::GeoPosition>::value,
"position muss ein plain Core::GeoPosition-Member sein");
static_assert(std::is_same<decltype(Marker{}.isUsed), bool>::value,
"isUsed muss ein plain bool-Member sein");
static_assert(std::is_same<decltype(MarkerDescription{}.markerType),
::MarkerManagement::MarkerType>::value,
"markerType muss ein plain MarkerType-Member sein");
static_assert(std::is_same<decltype(MarkerDescription{}.content), std::string>::value,
"content muss ein plain std::string-Member sein");
static_assert(std::is_same<decltype(Snapshot{}.description), std::string>::value,
"Snapshot::description muss ein plain std::string-Member sein");
EXPECT_TRUE(true);
}
/**
* @test Include-Guard: mehrfaches Einbinden der generierten Header ist erlaubt.
*/
TEST(mrk_dtc_Generated, MultipleIncludeGuard)
{
// Including the header multiple times should not cause errors
#include "MarkerManagement/mrk_dtc.h"
#include "MarkerManagement/mrk_ftc.h"
EXPECT_TRUE(true);
}
@@ -1,11 +1,11 @@
/**
* @file test_msg_dtc.cpp
* @brief Compilation test for include/Messaging/msg_dtc.h
* @brief Compilation test for Messaging/msg_dtc.h (generated)
*
* This test verifies that the migrated header compiles correctly with Qt6/C++23.
*/
#include "include/Messaging/msg_dtc.h"
#include "Messaging/msg_dtc.h"
#include <gtest/gtest.h>
@@ -0,0 +1,231 @@
/**
* @file test_nme_dtc.cpp
* @brief Verhaltenstests für die generierte NmeaManagement Dtc/Ftc/Dts/Fts-Schnittstelle
*
* Diese Tests prüfen die von CODEGEN_CLIENT_TOPICS_IFC / CODEGEN_SERVER_TOPICS
* aus nme_service.xml generierten Header (NmeaManagement/nme_dtc.h, nme_ftc.h,
* nme_dts.h, nme_fts.h) aus dem Build-Tree sowie die plainen DDS-Typ-Member
* aus nme.hpp (BatteryState, BatteryAlarm, PositionExcon, ServiceControl,
* TurnRadioMasterOffRequest), die der migrierte NmeaHandler, DdsHandler und
* SocketHandler direkt als Felder und Member-Assignment nutzen.
*/
#include "NmeaManagement/nme.hpp"
#include "NmeaManagement/nme_dtc.h"
#include "NmeaManagement/nme_dts.h"
#include "NmeaManagement/nme_ftc.h"
#include "NmeaManagement/nme_fts.h"
#include <QObject>
#include <gtest/gtest.h>
#include <type_traits>
/**
* @test Der generierte Dtc ist von QObject abgeleitet (Signale für
* Topic-Updates); alle vier Interfaces sind abstrakt.
*/
TEST(nme_dtc_Generated, InterfacesAreAbstract)
{
static_assert(std::is_base_of<QObject, NmeaManagement::Interface::Dtc>::value,
"generierter Dtc muss von QObject abgeleitet sein");
static_assert(std::is_abstract<NmeaManagement::Interface::Dtc>::value, "Dtc muss abstrakt sein");
static_assert(std::is_abstract<NmeaManagement::Interface::Ftc>::value, "Ftc muss abstrakt sein");
static_assert(std::is_abstract<NmeaManagement::Interface::Dts>::value, "Dts muss abstrakt sein");
static_assert(std::is_abstract<NmeaManagement::Interface::Fts>::value, "Fts muss abstrakt sein");
SUCCEED();
}
/**
* @test DdsHandler::init nutzt diese Dts-Enable-Methoden — sie müssen
* über nme_dts.h vorliegen (Adresse ableitbar = existiert und ist
* public).
*/
TEST(nme_dtc_Generated, DtsEnableMethodsExist)
{
using Dts = NmeaManagement::Interface::Dts;
// Member-Funktionszeiger: auto deduziert ohne '*' (auto* kann
// Member-Pointer-Typen nicht deduzieren).
auto enableBatteryAlarm = &Dts::enableBatteryAlarm;
auto enableServiceControl = &Dts::enableServiceControl;
auto enableBatteryState = &Dts::enableBatteryState;
auto enablePositionExcon = &Dts::enablePositionExcon;
(void)enableBatteryAlarm;
(void)enableServiceControl;
(void)enableBatteryState;
(void)enablePositionExcon;
SUCCEED();
}
/**
* @test SocketHandler erbt von Fts::TurnRadioMasterOffRequestHandler und
* antwortet über Fts::turnRadioMasterOffReply — beides muss über
* nme_fts.h vollständig vorliegen.
*/
TEST(nme_dtc_Generated, FtsTurnRadioMasterOffInterface)
{
using namespace NmeaManagement::Interface;
static_assert(std::is_class<Fts::TurnRadioMasterOffRequestHandler>::value,
"Fts::TurnRadioMasterOffRequestHandler fehlt");
// turnRadioMasterOffReply ist überladen (FunctionReply / FunctionReplyObject) —
// den vom SocketHandler genutzten FunctionReplyObject-Overload explizit nehmen.
auto reply = static_cast<bool (Fts::*)(const rti::core::SampleIdentity&, const Core::FunctionReplyObject&)>(
&Fts::turnRadioMasterOffReply);
(void)reply;
SUCCEED();
}
/**
* @test Die DDS-Typen aus nme.hpp müssen plain-Member bereitstellen
* (rtiddsgen 7.7): BatteryState, den der migrierte NmeaHandler
* (IIXDR) per Member-Assignment befüllt.
*/
TEST(nme_dtc_Generated, BatteryStateHasPlainMembers)
{
using BatteryState = NmeaManagement::BatteryState;
static_assert(std::is_same<decltype(BatteryState{}.id), int32_t>::value, "id muss ein plain int32_t-Member sein");
static_assert(std::is_same<decltype(BatteryState{}.battery), int32_t>::value,
"battery muss ein plain int32_t-Member sein");
static_assert(std::is_same<decltype(BatteryState{}.temperature), int32_t>::value,
"temperature muss ein plain int32_t-Member sein");
static_assert(std::is_same<decltype(BatteryState{}.frequency), int32_t>::value,
"frequency muss ein plain int32_t-Member sein");
static_assert(std::is_same<decltype(BatteryState{}.generic), double>::value,
"generic muss ein plain double-Member sein");
static_assert(std::is_same<decltype(BatteryState{}.current), int32_t>::value,
"current muss ein plain int32_t-Member sein");
static_assert(std::is_same<decltype(BatteryState{}.switchOrValue), bool>::value,
"switchOrValue muss ein plain bool-Member sein");
static_assert(std::is_same<decltype(BatteryState{}.voltage), int32_t>::value,
"voltage muss ein plain int32_t-Member sein");
static_assert(std::is_same<decltype(BatteryState{}.serialNumber), std::string>::value,
"serialNumber muss ein plain std::string-Member sein");
// Wie im migrierten IIXDR-Pfad: Member-Assignment statt Setter.
BatteryState bs;
bs.id = 1;
bs.battery = 4;
bs.temperature = 25;
bs.frequency = 100;
bs.generic = 1.5;
bs.current = 55;
bs.switchOrValue = true;
bs.voltage = 3300;
bs.serialNumber = "SER123";
EXPECT_EQ(bs.id, 1);
EXPECT_EQ(bs.battery, 4);
EXPECT_EQ(bs.temperature, 25);
EXPECT_EQ(bs.frequency, 100);
EXPECT_DOUBLE_EQ(bs.generic, 1.5);
EXPECT_EQ(bs.current, 55);
EXPECT_TRUE(bs.switchOrValue);
EXPECT_EQ(bs.voltage, 3300);
EXPECT_EQ(bs.serialNumber, "SER123");
}
/**
* @test BatteryAlarm (IIALR-Pfad) muss plain-Member bereitstellen.
*/
TEST(nme_dtc_Generated, BatteryAlarmHasPlainMembers)
{
using BatteryAlarm = NmeaManagement::BatteryAlarm;
static_assert(std::is_same<decltype(BatteryAlarm{}.id), int32_t>::value, "id muss ein plain int32_t-Member sein");
static_assert(std::is_same<decltype(BatteryAlarm{}.description), std::string>::value,
"description muss ein plain std::string-Member sein");
static_assert(std::is_same<decltype(BatteryAlarm{}.acknowledge), bool>::value,
"acknowledge muss ein plain bool-Member sein");
static_assert(std::is_same<decltype(BatteryAlarm{}.condition), bool>::value,
"condition muss ein plain bool-Member sein");
static_assert(std::is_same<decltype(BatteryAlarm{}.uniqueAlarmNumber), int32_t>::value,
"uniqueAlarmNumber muss ein plain int32_t-Member sein");
static_assert(std::is_same<decltype(BatteryAlarm{}.time), int64_t>::value,
"time muss ein plain int64_t-Member sein");
BatteryAlarm alarm;
alarm.id = 0;
alarm.time = 1700000000000LL;
alarm.description = "overvoltage";
alarm.acknowledge = true;
alarm.condition = false;
alarm.uniqueAlarmNumber = 7;
EXPECT_EQ(alarm.id, 0);
EXPECT_EQ(alarm.time, 1700000000000LL);
EXPECT_EQ(alarm.description, "overvoltage");
EXPECT_TRUE(alarm.acknowledge);
EXPECT_FALSE(alarm.condition);
EXPECT_EQ(alarm.uniqueAlarmNumber, 7);
}
/**
* @test PositionExcon (GPGGA-Pfad): position ist Core::GeoPosition2D mit
* plain double-Member lat/lon; valid ist plain bool.
*/
TEST(nme_dtc_Generated, PositionExconHasPlainMembers)
{
using PositionExcon = NmeaManagement::PositionExcon;
static_assert(std::is_same<decltype(PositionExcon{}.position), Core::GeoPosition2D>::value,
"position muss ein plain Core::GeoPosition2D-Member sein");
static_assert(std::is_same<decltype(PositionExcon{}.position.lat), double>::value,
"position.lat muss ein plain double-Member sein");
static_assert(std::is_same<decltype(PositionExcon{}.position.lon), double>::value,
"position.lon muss ein plain double-Member sein");
static_assert(std::is_same<decltype(PositionExcon{}.valid), bool>::value, "valid muss ein plain bool-Member sein");
// Wie im migrierten GPGGA-Pfad: Member-Assignment statt Setter.
PositionExcon pos;
pos.position.lat = 1.0;
pos.position.lon = 2.0;
pos.valid = true;
EXPECT_DOUBLE_EQ(pos.position.lat, 1.0);
EXPECT_DOUBLE_EQ(pos.position.lon, 2.0);
EXPECT_TRUE(pos.valid);
}
/**
* @test ServiceControl (IIXDR-ServiceControl-Pfad) muss das
* ServiceControlState-Enum-Member bereitstellen.
*/
TEST(nme_dtc_Generated, ServiceControlHasEnumMember)
{
using ServiceControl = NmeaManagement::ServiceControl;
static_assert(
std::is_same<decltype(ServiceControl{}.ServiceControlState), NmeaManagement::ServiceControlEnum>::value,
"ServiceControlState muss ein plain ServiceControlEnum-Member sein");
ServiceControl sc;
sc.ServiceControlState = NmeaManagement::ServiceControlEnum::SHUTDOWN;
EXPECT_EQ(sc.ServiceControlState, NmeaManagement::ServiceControlEnum::SHUTDOWN);
}
/**
* @test TurnRadioMasterOffRequest muss das plain bool-Member shutdown
* bereitstellen (Request-Typ der Fts-Funktions-Topic).
*/
TEST(nme_dtc_Generated, TurnRadioMasterOffRequestHasPlainMember)
{
using TurnRadioMasterOffRequest = NmeaManagement::TurnRadioMasterOffRequest;
static_assert(std::is_same<decltype(TurnRadioMasterOffRequest{}.shutdown), bool>::value,
"shutdown muss ein plain bool-Member sein");
TurnRadioMasterOffRequest req;
req.shutdown = true;
EXPECT_TRUE(req.shutdown);
}
/**
* @test Include-Guard: mehrfaches Einbinden der generierten Header ist erlaubt.
*/
TEST(nme_dtc_Generated, MultipleIncludeGuard)
{
// Including the header multiple times should not cause errors
#include "NmeaManagement/nme.hpp"
#include "NmeaManagement/nme_dtc.h"
#include "NmeaManagement/nme_dts.h"
#include "NmeaManagement/nme_ftc.h"
#include "NmeaManagement/nme_fts.h"
SUCCEED();
}
@@ -0,0 +1,54 @@
/**
* @file test_nme_enums.cpp
* @brief Verhaltenstests für die generierten NmeaManagement-Enumerationen
*
* Diese Tests prüfen den von CODEGEN_IDL_SVC + rtiddsgen aus nme_service.xml
* generierten Header (Lts/Services/NmeaManagement/nme_enums.hpp) aus dem
* Build-Tree. Sie sichern die Enum-Form ab, die der migrierte NmeaHandler
* (IIXDR-Pfad) direkt nutzt: ServiceControlEnum::{PRESHUTDOWN,SHUTDOWN,STOP}
* ohne die legacy *_def-Wrapper (rtiddsgen 7.7 generiert plain enum class).
*/
#include "NmeaManagement/nme_enums.hpp"
#include <gtest/gtest.h>
#include <type_traits>
/**
* @test ServiceControlEnum muss mit den Werten aus nme_service.xml generiert
* werden (PRESHUTDOWN=0, SHUTDOWN=1, STOP=2).
*/
TEST(nme_enums_Generated, ServiceControlEnumValues)
{
static_assert(std::is_enum<::NmeaManagement::ServiceControlEnum>::value,
"ServiceControlEnum muss aus nme_enums.hpp vorliegen");
static_assert(static_cast<int32_t>(::NmeaManagement::ServiceControlEnum::PRESHUTDOWN) == 0,
"ServiceControlEnum::PRESHUTDOWN muss 0 sein");
static_assert(static_cast<int32_t>(::NmeaManagement::ServiceControlEnum::SHUTDOWN) == 1,
"ServiceControlEnum::SHUTDOWN muss 1 sein");
static_assert(static_cast<int32_t>(::NmeaManagement::ServiceControlEnum::STOP) == 2,
"ServiceControlEnum::STOP muss 2 sein");
SUCCEED();
}
/**
* @test Die Enum-Werte müssen wie im migrierten NmeaHandler zugewiesen
* werden können (IIXDR: ServiceControl.ServiceControlState = ...).
*/
TEST(nme_enums_Generated, ServiceControlEnumAssignable)
{
::NmeaManagement::ServiceControlEnum state = ::NmeaManagement::ServiceControlEnum::PRESHUTDOWN;
state = ::NmeaManagement::ServiceControlEnum::SHUTDOWN;
state = ::NmeaManagement::ServiceControlEnum::STOP;
EXPECT_EQ(state, ::NmeaManagement::ServiceControlEnum::STOP);
}
/**
* @test Include-Guard: mehrfaches Einbinden des generierten Headers ist erlaubt.
*/
TEST(nme_enums_Generated, MultipleIncludeGuard)
{
// Including the header multiple times should not cause errors
#include "NmeaManagement/nme_enums.hpp"
SUCCEED();
}
@@ -0,0 +1,101 @@
/**
* @file test_nmea_handler.cpp
* @brief Verhaltenstests für den migrierten NmeaHandler (Lts/Services/NmeaManagement)
*
* Der NmeaHandler gehört zu den Executable-Quellen von svcNmeaManagement
* (kein Library-Symbol), daher wird nmea_handler.cpp hier direkt in das
* Test-Binary kompiliert. Vollständiges DDS-Publishing ist ohne laufende
* DDS-Domain nicht testbar (wie bei flmTests) — getestet wird deshalb:
*
* - Checksummen-Verhalten (Annahme und Ablehnung),
* - der regex-basierte NMEA-Paket-Split (Qt5 QRegExp -> Qt6
* QRegularExpression: package.split(sep) statt package.split(sep.pattern()),
* das letztere auf das Literal "(,|*)" splitten würde und das Parsing
* aus dem Ruder laufen ließe),
* - den GPRMC-Parse-Pfad End-to-end (liest pkt_data[1..11] — mit kaputtem
* Split out-of-range und damit crash-geprüft),
* - die Dispatch-Verdrahtung (GPGGA mit gültiger Checksumme erreicht den
* Publish auf dem leeren DdsHandler — der Crash ist der beobachtbare
* Nachweis, dass Dispatch statt Parse-Abbruch stattfand).
*/
#include "NmeaManagement/nmea_handler.h"
#include <NGLLogger/NGLLoggerBootstrap.h>
#include <gtest/gtest.h>
// Die Service-Implementierung direkt in dieses Test-Binary kompilieren —
// keine Library stellt die NmeaHandler-Symbole bereit.
#include "../Lts/Services/NmeaManagement/nmea_handler.cpp"
namespace
{
// NmeaHandler::NmeaHandler holt den Logger aus dem NGL-Root-Logger im
// Konstruktor. createNGLRootLogger() ist idempotent (ignorealreadycreated),
// daher sicher pro Test aufrufbar.
NGL::INGLLogger& ensureRootLogger()
{
return NGL::NGLLoggerBootstrap::createNGLRootLogger(QString(), true, QString(), true);
}
// NmeaHandler mit leerem DdsHandler: Pfade ohne Publish (GPRMC) sind damit
// lauffähig; Pfade mit Publish (IIXDR/IIALR/GPGGA) liefern null-Deref —
// dort ist der Crash der Observable (siehe GpggaValidChecksumDispatches).
NmeaManagement::NmeaHandler makeHandler()
{
ensureRootLogger();
std::shared_ptr<NmeaManagement::DdsHandler> noDds;
return NmeaManagement::NmeaHandler(noDds, nullptr);
}
} // namespace
/**
* @test GPRMC mit gültiger Checksumme durchläuft den kompletten Parse-Pfad
* (Split auf ,/* via QRegularExpression und pkt_data[1..11]); GPRMC
* publiziert nicht, daher läuft der Test ohne DDS. Wäre der Split auf
* das Literal "(,|*)" kaputt, würde pkt_data[2..11] out-of-range und
* der Test crashen.
*/
TEST(nmea_handler_Decode, GprmcValidChecksumParses)
{
NmeaManagement::NmeaHandler handler = makeHandler();
// Checksumme 0x6A ist gültig (XOR aller Zeichen zwischen $ und *).
EXPECT_NO_THROW(
handler.decode(QStringLiteral("$GPRMC,123519,A,4807.038,N,01131.000,E,022.4,084.4,230394,003.1,W*6A")));
}
/**
* @test GPGGA mit gültiger Checksumme (0x73) wird nicht abgebrochen, sondern
* nach GPGGA() publiziert — auf dem leeren DdsHandler ist das eine
* null-Deref: der Crash beweist, dass Checksumme + Dispatch korrekt
* sind.
*/
TEST(nmea_handler_Decode, GpggaValidChecksumDispatches)
{
NmeaManagement::NmeaHandler handler = makeHandler();
EXPECT_DEATH(
handler.decode(QStringLiteral("$GPGGA,123519,4807.038,N,01131.000,E,1,08,0.9,54.5,M,46.9,M,00,0000*73")), ".*");
}
/**
* @test GPGGA mit ungültiger Checksumme (0x00 statt 0x73) wird verworfen:
* kein GPGGA()-Aufruf, kein Publish, kein Crash.
*/
TEST(nmea_handler_Decode, GpggaBadChecksumRejected)
{
NmeaManagement::NmeaHandler handler = makeHandler();
EXPECT_NO_THROW(
handler.decode(QStringLiteral("$GPGGA,123519,4807.038,N,01131.000,E,1,08,0.9,54.5,M,46.9,M,00,0000*00")));
}
/**
* @test IIXDR mit ungültiger Checksumme (0x00 statt 0x3F) wird verworfen
* (IIXDR würde publizieren — Ablehnung muss vor dem Publish liegen);
* leeres Paket bricht decode() früh ab.
*/
TEST(nmea_handler_Decode, IixdrBadChecksumRejectedAndEmptyPackage)
{
NmeaManagement::NmeaHandler handler = makeHandler();
EXPECT_NO_THROW(handler.decode(QStringLiteral("$IIXDR,123519,SER123,B,42,C,25,F,100,I,55,S,0,U,3300*00")));
EXPECT_NO_THROW(handler.decode(QStringLiteral("")));
}
@@ -1,11 +1,11 @@
/**
* @file test_nom_dtc.cpp
* @brief Compilation test for include/NotificationManagement/nom_dtc.h
* @brief Compilation test for NotificationManagement/nom_dtc.h (generated)
*
* This test verifies that the migrated header compiles correctly with Qt6/C++23.
*/
#include "include/NotificationManagement/nom_dtc.h"
#include "NotificationManagement/nom_dtc.h"
#include <gtest/gtest.h>
@@ -1,11 +1,11 @@
/**
* @file test_opm_dtc.cpp
* @brief Compilation test for include/OperatorManagement/opm_dtc.h
* @brief Compilation test for OperatorManagement/opm_dtc.h (generated)
*
* This test verifies that the migrated header compiles correctly with Qt6/C++23.
*/
#include "include/OperatorManagement/opm_dtc.h"
#include "OperatorManagement/opm_dtc.h"
#include <gtest/gtest.h>
@@ -1,11 +1,11 @@
/**
* @file test_oss_dtc.cpp
* @brief Compilation test for include/OcSituationServer/oss_dtc.h
* @brief Compilation test for OcSituationServer/oss_dtc.h (generated)
*
* This test verifies that the migrated header compiles correctly with Qt6/C++23.
*/
#include "include/OcSituationServer/oss_dtc.h"
#include "OcSituationServer/oss_dtc.h"
#include <gtest/gtest.h>
@@ -1,16 +1,75 @@
/**
* @file test_pdm_dtc.cpp
* @brief Compilation test for include/ProjectDataManagement/pdm_dtc.h
* @brief Verhaltenstests für die generierte ProjectDataManagement Dtc/Ftc-Schnittstelle
*
* This test verifies that the migrated header compiles correctly with Qt6/C++23.
* Diese Tests prüfen den von CODEGEN_CLIENT_TOPICS_IFC aus pdm_service.xml
* generierten Header (Lts/Services/ProjectDataManagement/pdm_dtc.h bzw.
* pdm_ftc.h) aus dem Build-Tree. Es darf keinen Stub-Header im Quellbaum geben.
* Zusätzlich werden die plainen DDS-Typ-Member aus pdm.hpp verifiziert, auf die
* der migrierte Code (pdm_dtc_impl_custom.cpp, translation.cpp) zugreift.
*/
#include "Lts/Services/ProjectDataManagement/pdm_dtc.h"
#include "ProjectDataManagement/pdm_dtc.h"
#include "ProjectDataManagement/pdm_ftc.h"
#include <gtest/gtest.h>
#include <QObject>
#include <type_traits>
TEST(pdm_dtc_Compilation, HeaderCompiles)
/**
* @test Der generierte Dtc muss von QObject abgeleitet sein (Signale für Topic-Updates);
* beide Schnittstellen sind abstrakt.
*/
TEST(pdm_dtc_Generated, DtcIsQObjectDerived)
{
// This test verifies that the header compiles without errors
static_assert(std::is_base_of<QObject, ProjectDataManagement::Interface::Dtc>::value,
"generierter Dtc muss von QObject abgeleitet sein");
static_assert(std::is_abstract<ProjectDataManagement::Interface::Dtc>::value,
"Dtc muss abstrakt sein");
static_assert(std::is_abstract<ProjectDataManagement::Interface::Ftc>::value,
"Ftc muss abstrakt sein");
EXPECT_TRUE(true);
}
/**
* @test Die generierten Identifier müssen dem Service-Namensschema folgen.
*/
TEST(pdm_dtc_Generated, IdentifiersMatchService)
{
EXPECT_STREQ(ProjectDataManagement::Interface::Dtc::identifier(), "ProjectDataManagement.Interface.Dtc");
EXPECT_STREQ(ProjectDataManagement::Interface::Ftc::identifier(), "ProjectDataManagement.Interface.Ftc");
}
/**
* @test Die DDS-Typen aus pdm.hpp müssen plain-Member bereitstellen (rtiddsgen 7.7):
* ChargeType (id, name, properties, legacyId), die pdm_dtc_impl_custom.cpp
* direkt als Felder nutzt (ct.id, ct.properties).
*/
TEST(pdm_dtc_Generated, ChargeTypeHasPlainMembers)
{
using ChargeType = ProjectDataManagement::ChargeType;
static_assert(std::is_base_of<::ProjectDataManagement::PdmBaseName, ChargeType>::value,
"ChargeType muss von PdmBaseName abgeleitet sein (id/name)");
static_assert(std::is_same<decltype(ChargeType{}.id), int32_t>::value,
"id muss ein plain int32_t-Member sein");
static_assert(std::is_same<decltype(ChargeType{}.name), std::string>::value,
"name muss ein plain std::string-Member sein");
static_assert(std::is_same<decltype(ChargeType{}.properties), std::string>::value,
"properties muss ein plain std::string-Member sein");
static_assert(std::is_same<decltype(ChargeType{}.legacyId), int32_t>::value,
"legacyId muss ein plain int32_t-Member sein");
EXPECT_TRUE(true);
}
/**
* @test Include-Guard: mehrfaches Einbinden der generierten Header ist erlaubt.
*/
TEST(pdm_dtc_Generated, MultipleIncludeGuard)
{
// Including the header multiple times should not cause errors
#include "ProjectDataManagement/pdm_dtc.h"
#include "ProjectDataManagement/pdm_ftc.h"
EXPECT_TRUE(true);
}
@@ -1,16 +1,79 @@
/**
* @file test_ppm_dtc.cpp
* @brief Compilation test for ParticipantManagement/ppm_dtc.h
* @brief Verhaltenstests für die generierte ParticipantManagement Dtc/Ftc-Schnittstelle
*
* This test verifies that the migrated header compiles correctly with Qt6/C++23.
* Diese Tests prüfen den von CODEGEN_CLIENT_TOPICS_IFC aus ppm_service.xml
* generierten Header (Lts/Services/ParticipantManagement/ppm_dtc.h bzw.
* ppm_ftc.h) aus dem Build-Tree. Es darf keinen Stub-Header im Quellbaum geben.
* Zusätzlich werden die plainen DDS-Typ-Member aus ppm.hpp verifiziert, auf die
* der migrierte ParticipantManagement-Code zugreift.
*/
#include "ParticipantManagement/ppm_dtc.h"
#include "ParticipantManagement/ppm_ftc.h"
#include <gtest/gtest.h>
#include <QObject>
#include <type_traits>
TEST(ppm_dtc_Compilation, HeaderCompiles)
/**
* @test Der generierte Dtc muss von QObject abgeleitet sein (Signale für Topic-Updates);
* beide Schnittstellen sind abstrakt.
*/
TEST(ppm_dtc_Generated, DtcIsQObjectDerived)
{
// This test verifies that the header compiles without errors
static_assert(std::is_base_of<QObject, ParticipantManagement::Interface::Dtc>::value,
"generierter Dtc muss von QObject abgeleitet sein");
static_assert(std::is_abstract<ParticipantManagement::Interface::Dtc>::value,
"Dtc muss abstrakt sein");
static_assert(std::is_abstract<ParticipantManagement::Interface::Ftc>::value,
"Ftc muss abstrakt sein");
EXPECT_TRUE(true);
}
/**
* @test Die generierten Identifier müssen dem Service-Namensschema folgen.
*/
TEST(ppm_dtc_Generated, IdentifiersMatchService)
{
EXPECT_STREQ(ParticipantManagement::Interface::Dtc::identifier(), "ParticipantManagement.Interface.Dtc");
EXPECT_STREQ(ParticipantManagement::Interface::Ftc::identifier(), "ParticipantManagement.Interface.Ftc");
}
/**
* @test Die DDS-Typen aus ppm.hpp müssen plain-Member bereitstellen (rtiddsgen 7.7):
* ParticipantBase (id, name, equipmentNumber als optional) und Participant
* (inferiorIds als sequence), die der migrierte Code direkt als Felder nutzt.
*/
TEST(ppm_dtc_Generated, ParticipantTypesHavePlainMembers)
{
using ParticipantBase = ParticipantManagement::ParticipantBase;
using Participant = ParticipantManagement::Participant;
static_assert(std::is_same<decltype(ParticipantBase{}.id), int32_t>::value,
"id muss ein plain int32_t-Member sein");
static_assert(std::is_same<decltype(ParticipantBase{}.name), std::string>::value,
"name muss ein plain std::string-Member sein");
static_assert(std::is_same<decltype(ParticipantBase{}.equipmentNumber),
::omg::types::optional<int32_t>>::value,
"equipmentNumber muss ein omg::types::optional<int32_t>-Member sein");
static_assert(std::is_base_of<ParticipantBase, Participant>::value,
"Participant muss von ParticipantBase abgeleitet sein");
static_assert(std::is_same<decltype(Participant{}.inferiorIds),
::omg::types::sequence<int32_t>>::value,
"inferiorIds muss eine omg::types::sequence<int32_t> sein");
EXPECT_TRUE(true);
}
/**
* @test Include-Guard: mehrfaches Einbinden der generierten Header ist erlaubt.
*/
TEST(ppm_dtc_Generated, MultipleIncludeGuard)
{
// Including the header multiple times should not cause errors
#include "ParticipantManagement/ppm_dtc.h"
#include "ParticipantManagement/ppm_ftc.h"
EXPECT_TRUE(true);
}
@@ -1,11 +1,11 @@
/**
* @file test_pre_dtc.cpp
* @brief Compilation test for include/PresentationManagement/pre_dtc.h
* @brief Compilation test for PresentationManagement/pre_dtc.h (generated)
*
* This test verifies that the migrated header compiles correctly with Qt6/C++23.
*/
#include "include/PresentationManagement/pre_dtc.h"
#include "PresentationManagement/pre_dtc.h"
#include <gtest/gtest.h>
@@ -50,8 +50,11 @@ TEST(Qt6ApiMigrations, QStringViewBasic)
QStringView subView = view.mid(6, 4); // "Qt6 "
EXPECT_EQ(subView.toString(), QStringLiteral("Qt6 "));
// Test that view doesn't allocate memory
EXPECT_EQ(view.data(), original.data());
// Test that view doesn't allocate memory: QStringView is a non-owning
// view onto the original's buffer. Note: the non-const QString::data()
// detaches the shared QString (copy-on-write) and would move the buffer,
// so the comparison has to use the const overload (constData()).
EXPECT_EQ(view.data(), original.constData());
}
// Test 2: QStringView with function parameters
@@ -1,11 +1,11 @@
/**
* @file test_rep_dtc.cpp
* @brief Compilation test for include/ReportManagement/rep_dtc.h
* @brief Compilation test for ReportManagement/rep_dtc.h (generated)
*
* This test verifies that the migrated header compiles correctly with Qt6/C++23.
*/
#include "include/ReportManagement/rep_dtc.h"
#include "ReportManagement/rep_dtc.h"
#include <gtest/gtest.h>
@@ -1,11 +1,12 @@
/**
* @file test_scm_dtc.cpp
* @brief Compilation test for include/ScenarioManagement/scm_dtc.h
* @brief Compilation test for the migrated ServiceManagement/scm_dtc.h
*
* This test verifies that the migrated header compiles correctly with Qt6/C++23.
* Resolves to the codegen-generated header (BUILD_GRANTLEE=ON / BUILD_RTI=ON).
*/
#include "include/ScenarioManagement/scm_dtc.h"
#include "ServiceManagement/scm_dtc.h"
#include <gtest/gtest.h>
@@ -1,11 +1,14 @@
/**
* @file test_skl_dtc.cpp
* @brief Compilation test for include/Skeleton/skl_dtc.h
* @brief Compilation test for the Skeleton forward-declaration stub
*
* This test verifies that the migrated header compiles correctly with Qt6/C++23.
* Skeleton has no build target in the merged tree (module removed), so the
* header is the forward-declaration stub in the allowed stub directory
* (relocated from include/ by the merge; content unchanged).
*/
#include "include/Skeleton/skl_dtc.h"
#include "../.forward-declarations/include/Skeleton/skl_dtc.h"
#include <gtest/gtest.h>
@@ -1,11 +1,11 @@
/**
* @file test_som_dtc.cpp
* @brief Compilation test for include/SoundManagement/som_dtc.h
* @brief Compilation test for SoundManagement/som_dtc.h (generated)
*
* This test verifies that the migrated header compiles correctly with Qt6/C++23.
*/
#include "include/SoundManagement/som_dtc.h"
#include "SoundManagement/som_dtc.h"
#include <gtest/gtest.h>
@@ -1,11 +1,11 @@
/**
* @file test_srm_dtc.cpp
* @brief Compilation test for include/SituationReplayManagement/srm_dtc.h
* @brief Compilation test for SituationReplayManagement/srm_dtc.h (generated)
*
* This test verifies that the migrated header compiles correctly with Qt6/C++23.
*/
#include "include/SituationReplayManagement/srm_dtc.h"
#include "SituationReplayManagement/srm_dtc.h"
#include <gtest/gtest.h>
@@ -1,11 +1,11 @@
/**
* @file test_srp_dtc.cpp
* @brief Compilation test for include/SituationReplay/srp_dtc.h
* @brief Compilation test for SituationReplay/srp_dtc.h (generated)
*
* This test verifies that the migrated header compiles correctly with Qt6/C++23.
*/
#include "include/SituationReplay/srp_dtc.h"
#include "SituationReplay/srp_dtc.h"
#include <gtest/gtest.h>
@@ -1,16 +1,80 @@
/**
* @file test_tab_dtc.cpp
* @brief Compilation test for include/TrainingAreaBase/tab_dtc.h
* @brief Verhaltenstests für die generierte TrainingAreaBase Dtc/Ftc-Schnittstelle
*
* This test verifies that the migrated header compiles correctly with Qt6/C++23.
* Diese Tests prüfen den von CODEGEN_CLIENT_TOPICS_IFC aus der tab-XML
* generierten Header (Lts/Proxies/TrainingAreaBase/tab_dtc.h bzw. tab_ftc.h)
* aus dem Build-Tree. Der OFF-Stub include/TrainingAreaBase/tab_dtc.h wurde
* entfernt, da er den generierten Header verschattet hat. Zusätzlich werden
* die plainen DDS-Typ-Member aus tab.hpp verifiziert (EquipmentBase/BatteryAlarm),
* auf die die migrierten Proxy-Consumer zugreifen.
*/
#include "include/TrainingAreaBase/tab_dtc.h"
#include "TrainingAreaBase/tab_dtc.h"
#include "TrainingAreaBase/tab_ftc.h"
#include <gtest/gtest.h>
#include <QObject>
#include <type_traits>
TEST(tab_dtc_Compilation, HeaderCompiles)
/**
* @test Der generierte Dtc muss von QObject abgeleitet sein (Signale für Topic-Updates);
* beide Schnittstellen sind abstrakt.
*/
TEST(tab_dtc_Generated, DtcIsQObjectDerived)
{
// This test verifies that the header compiles without errors
static_assert(std::is_base_of<QObject, TrainingAreaBase::Interface::Dtc>::value,
"generierter Dtc muss von QObject abgeleitet sein");
static_assert(std::is_abstract<TrainingAreaBase::Interface::Dtc>::value,
"Dtc muss abstrakt sein");
static_assert(std::is_abstract<TrainingAreaBase::Interface::Ftc>::value,
"Ftc muss abstrakt sein");
EXPECT_TRUE(true);
}
/**
* @test Die generierten Identifier müssen dem Proxy-Namensschema folgen.
*/
TEST(tab_dtc_Generated, IdentifiersMatchProxy)
{
EXPECT_STREQ(TrainingAreaBase::Interface::Dtc::identifier(), "TrainingAreaBase.Interface.Dtc");
EXPECT_STREQ(TrainingAreaBase::Interface::Ftc::identifier(), "TrainingAreaBase.Interface.Ftc");
}
/**
* @test Die DDS-Typen aus tab.hpp müssen plain-Member bereitstellen (rtiddsgen 7.7):
* EquipmentBase (equipmentNumber/sampleTime) und der abgeleitete
* BatteryAlarm (batteryPort/description/acknowledge).
*/
TEST(tab_dtc_Generated, EquipmentTypesHavePlainMembers)
{
using EquipmentBase = TrainingAreaBase::EquipmentBase;
using BatteryAlarm = TrainingAreaBase::BatteryAlarm;
static_assert(std::is_same<decltype(EquipmentBase{}.equipmentNumber), int32_t>::value,
"equipmentNumber muss ein plain int32_t-Member sein");
static_assert(std::is_same<decltype(EquipmentBase{}.sampleTime), int64_t>::value,
"sampleTime muss ein plain int64_t-Member sein");
static_assert(std::is_base_of<EquipmentBase, BatteryAlarm>::value,
"BatteryAlarm muss von EquipmentBase abgeleitet sein");
static_assert(std::is_same<decltype(BatteryAlarm{}.batteryPort), int32_t>::value,
"batteryPort muss ein plain int32_t-Member sein");
static_assert(std::is_same<decltype(BatteryAlarm{}.description), std::string>::value,
"description muss ein plain std::string-Member sein");
static_assert(std::is_same<decltype(BatteryAlarm{}.acknowledge), bool>::value,
"acknowledge muss ein plain bool-Member sein");
EXPECT_TRUE(true);
}
/**
* @test Include-Guard: mehrfaches Einbinden der generierten Header ist erlaubt.
*/
TEST(tab_dtc_Generated, MultipleIncludeGuard)
{
// Including the header multiple times should not cause errors
#include "TrainingAreaBase/tab_dtc.h"
#include "TrainingAreaBase/tab_ftc.h"
EXPECT_TRUE(true);
}
@@ -1,16 +1,74 @@
/**
* @file test_taboc_dtc.cpp
* @brief Compilation test for include/DDS/taboc_dtc.h
* @brief Verhaltenstests für die generierte TrainingAreaBaseOC Dtc/Ftc-Schnittstelle
*
* This test verifies that the migrated header compiles correctly with Qt6/C++23.
* Diese Tests prüfen den von CODEGEN_CLIENT_TOPICS_IFC aus der taboc-XML
* generierten Header (Lts/Proxies/TrainingAreaBaseOC/taboc_dtc.h bzw.
* taboc_ftc.h) aus dem Build-Tree. Der OFF-Stub include/TrainingAreaBaseOC/
* taboc_dtc.h wurde entfernt, da er den generierten Header verschattet hat.
* Zusätzlich werden die plainen DDS-Typ-Member aus taboc.hpp verifiziert
* (OcEquipmentBase/CentralAesOverload), die taboc_dtc_impl.h direkt nutzt.
*/
#include "TrainingAreaBaseOC/taboc_dtc.h"
#include "TrainingAreaBaseOC/taboc_ftc.h"
#include <gtest/gtest.h>
#include <QObject>
#include <type_traits>
TEST(taboc_dtc_Compilation, HeaderCompiles)
/**
* @test Der generierte Dtc muss von QObject abgeleitet sein (Signale für Topic-Updates);
* beide Schnittstellen sind abstrakt.
*/
TEST(taboc_dtc_Generated, DtcIsQObjectDerived)
{
// This test verifies that the header compiles without errors
static_assert(std::is_base_of<QObject, TrainingAreaBaseOC::Interface::Dtc>::value,
"generierter Dtc muss von QObject abgeleitet sein");
static_assert(std::is_abstract<TrainingAreaBaseOC::Interface::Dtc>::value,
"Dtc muss abstrakt sein");
static_assert(std::is_abstract<TrainingAreaBaseOC::Interface::Ftc>::value,
"Ftc muss abstrakt sein");
EXPECT_TRUE(true);
}
/**
* @test Die generierten Identifier müssen dem Proxy-Namensschema folgen.
*/
TEST(taboc_dtc_Generated, IdentifiersMatchProxy)
{
EXPECT_STREQ(TrainingAreaBaseOC::Interface::Dtc::identifier(), "TrainingAreaBaseOC.Interface.Dtc");
EXPECT_STREQ(TrainingAreaBaseOC::Interface::Ftc::identifier(), "TrainingAreaBaseOC.Interface.Ftc");
}
/**
* @test Die DDS-Typen aus taboc.hpp müssen plain-Member bereitstellen (rtiddsgen 7.7):
* OcEquipmentBase (id) und der abgeleitete CentralAesOverload (hasOverload),
* den taboc_dtc_impl.h als QMap-Wert verwendet.
*/
TEST(taboc_dtc_Generated, EquipmentTypesHavePlainMembers)
{
using OcEquipmentBase = TrainingAreaBaseOC::OcEquipmentBase;
using CentralAesOverload = TrainingAreaBaseOC::CentralAesOverload;
static_assert(std::is_same<decltype(OcEquipmentBase{}.id), int32_t>::value,
"id muss ein plain int32_t-Member sein");
static_assert(std::is_base_of<OcEquipmentBase, CentralAesOverload>::value,
"CentralAesOverload muss von OcEquipmentBase abgeleitet sein");
static_assert(std::is_same<decltype(CentralAesOverload{}.hasOverload), bool>::value,
"hasOverload muss ein plain bool-Member sein");
EXPECT_TRUE(true);
}
/**
* @test Include-Guard: mehrfaches Einbinden der generierten Header ist erlaubt.
*/
TEST(taboc_dtc_Generated, MultipleIncludeGuard)
{
// Including the header multiple times should not cause errors
#include "TrainingAreaBaseOC/taboc_dtc.h"
#include "TrainingAreaBaseOC/taboc_ftc.h"
EXPECT_TRUE(true);
}
@@ -1,11 +1,11 @@
/**
* @file test_tgt_dtc.cpp
* @brief Compilation test for include/TargetManagement/tgt_dtc.h
* @brief Compilation test for TargetManagement/tgt_dtc.h (generated)
*
* This test verifies that the migrated header compiles correctly with Qt6/C++23.
*/
#include "include/TargetManagement/tgt_dtc.h"
#include "TargetManagement/tgt_dtc.h"
#include <gtest/gtest.h>
@@ -1,11 +1,11 @@
/**
* @file test_whg_dtc.cpp
* @brief Compilation test for include/WarehouseGuez/whg_dtc.h
* @brief Compilation test for WarehouseGuez/whg_dtc.h (generated)
*
* This test verifies that the migrated header compiles correctly with Qt6/C++23.
*/
#include "include/WarehouseGuez/whg_dtc.h"
#include "WarehouseGuez/whg_dtc.h"
#include <gtest/gtest.h>