Files
qt-migration-legatus/qt6-after/qt6-migrated-legatus/tests/test_qt6_api_migrations.cpp
T
torstenandCopilot de6c7a6038 Qt6 Migration: Complete SituationMap module migration with comprehensive tests
Migration Summary:
- Migrated 7 subdirectories: GraphicalObjects, Rubberbands, MathUtils, MapImpl,
  SymbologyImpl, Viewshed3D, and Common
- Applied Qt6 API changes: QTouchEvent, Qt::MiddleButton, QFuture continuations
- Updated ArcGIS SDK v300: include paths, identifyGraphicsOverlaysAsync()
- Fixed QList/QVector unification issues in MathUtils
- Replaced QSharedPointer::use_count() with isNull()/data() comparisons

Test Coverage:
- Created 6 new test files following check_pr_policies.py naming conventions
- test_graphical_objects.cpp, test_rubberbands.cpp, test_mathutils.cpp
- test_mapimpl.cpp, test_symbologyimpl.cpp, test_viewshed3d.cpp
- All tests integrated into CMake and CTest
- 42 SituationMap tests passing (695 total tests)

Build Validation:
- Docker build successful with Qt 6.10.2 via aqtinstall
- Fixed LtsDataView dependency order in CMakeLists.txt
- Fixed test paths to use absolute TESTS_DIR
- Removed duplicate main() functions from test files

Documentation:
- Created MIGRATION_STATUS.md with detailed migration status
- Created TEST_REPORT.md with comprehensive test coverage summary

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-10-20 02:49:34 +02:00

187 lines
5.9 KiB
C++

/**
* @RDE_HEADER@
* Unit Tests for Qt6 API Migrations in SituationMap Module
* $Id$
* $HeadURL$
* $Author$
*/
#include <gtest/gtest.h>
#include <QCoreApplication>
#include <QString>
#include <QStringView>
#include <QList>
#include <QVector>
#include <QFuture>
#include <QtConcurrent>
#include <QVariantMap>
#include <QMouseEvent>
#include <QTouchEvent>
#include <QWheelEvent>
// Test QStringView::sliced() API (Qt6 replacement for slice())
TEST(Qt6ApiTest, QStringView_Sliced)
{
QString testString = QStringLiteral("Hello World");
QStringView view(testString);
// Qt6: slice() -> sliced()
QStringView subView = view.sliced(0, 5);
EXPECT_EQ(subView.toString(), QStringLiteral("Hello"));
QStringView subView2 = view.sliced(6);
EXPECT_EQ(subView2.toString(), QStringLiteral("World"));
}
// Test QList/QVector equivalence in Qt6
TEST(Qt6ApiTest, QList_QVector_Equivalence)
{
// In Qt6, QList and QVector are identical
QList<int> list = {1, 2, 3, 4, 5};
QVector<int> vector = {1, 2, 3, 4, 5};
EXPECT_EQ(list.size(), vector.size());
for (int i = 0; i < list.size(); ++i)
{
EXPECT_EQ(list[i], vector[i]);
}
// Test that ambiguous overloads are resolved
auto processList = [](const QList<int>& data) { return data.size(); };
auto processVector = [](const QVector<int>& data) { return data.size(); };
EXPECT_EQ(processList(list), 5);
EXPECT_EQ(processVector(vector), 5);
}
// Test QFuture continuation pattern
TEST(Qt6ApiTest, QFuture_Continuation)
{
QFuture<int> future = QtConcurrent::run([]() {
return 42;
});
// Qt6: QFuture supports .then() continuations
QFuture<QString> continued = future.then([](QFuture<int> result) {
return QString::number(result.result());
});
continued.waitForFinished();
EXPECT_EQ(continued.result(), QStringLiteral("42"));
}
// Test Qt::MiddleButton enum (Qt6 replacement for Qt::MidButton)
TEST(Qt6ApiTest, Qt_MiddleButton_Enum)
{
// Qt6: Qt::MidButton -> Qt::MiddleButton
Qt::MouseButton middleBtn = Qt::MiddleButton;
EXPECT_EQ(middleBtn, Qt::MiddleButton);
EXPECT_NE(middleBtn, Qt::LeftButton);
EXPECT_NE(middleBtn, Qt::RightButton);
}
// Test QVariantMap iteration (Qt6: unite() removed)
TEST(Qt6ApiTest, QVariantMap_Iteration)
{
QVariantMap map1;
map1.insert(QStringLiteral("key1"), 1);
map1.insert(QStringLiteral("key2"), 2);
QVariantMap map2;
// Qt6: Replace unite() with iterate/insert pattern
for (auto it = map1.begin(); it != map1.end(); ++it)
{
map2.insert(it.key(), it.value());
}
EXPECT_EQ(map1.size(), map2.size());
EXPECT_EQ(map1[QStringLiteral("key1")], map2[QStringLiteral("key1")]);
EXPECT_EQ(map1[QStringLiteral("key2")], map2[QStringLiteral("key2")]);
}
// Test QTouchEvent API changes (Qt6)
TEST(Qt6ApiTest, QTouchEvent_API)
{
// This test verifies the API exists - actual touch testing requires GUI
// Qt6: touchPoints() -> points()
// Qt6: QEventPoint::screenPos() -> globalPosition()
// Create a mock test - in real code, QTouchEvent is created by system
// We verify the types compile correctly
using PointType = QEventPoint;
// Verify QEventPoint has the expected Qt6 methods
static_assert(std::is_same_v<decltype(&QEventPoint::position), QPointF(QEventPoint::*)() const>);
static_assert(std::is_same_v<decltype(&QEventPoint::pressPosition), QPointF(QEventPoint::*)() const>);
static_assert(std::is_same_v<decltype(&QEventPoint::globalPosition), QPointF(QEventPoint::*)() const>);
SUCCEED() << "QEventPoint API types verified for Qt6";
}
// Test QMouseEvent position API (Qt6)
TEST(Qt6ApiTest, QMouseEvent_Position_API)
{
// Qt6: event.x()/y() -> event.position().x()/y()
// Create a mouse event with Qt6 API
QMouseEvent event(QEvent::MouseButtonPress,
QPointF(100.0, 200.0), // globalPos
QPointF(100.0, 200.0), // pos
Qt::LeftButton,
Qt::LeftButton,
Qt::NoModifier);
// Qt6 API: position() returns QPointF
EXPECT_DOUBLE_EQ(event.position().x(), 100.0);
EXPECT_DOUBLE_EQ(event.position().y(), 200.0);
// Qt6 API: globalPosition() returns QPointF
EXPECT_DOUBLE_EQ(event.globalPosition().x(), 100.0);
EXPECT_DOUBLE_EQ(event.globalPosition().y(), 200.0);
}
// Test QWheelEvent position API (Qt6)
TEST(Qt6ApiTest, QWheelEvent_Position_API)
{
// Qt6: event.x()/y() -> event.position().x()/y()
QWheelEvent event(QPointF(100.0, 200.0), // pos
QPointF(100.0, 200.0), // globalPos
QPoint(0, 0), // pixelDelta
QPoint(0, 120), // angleDelta
Qt::NoButton,
Qt::NoModifier,
Qt::NoScrollPhase,
false);
// Qt6 API: position() returns QPointF
EXPECT_DOUBLE_EQ(event.position().x(), 100.0);
EXPECT_DOUBLE_EQ(event.position().y(), 200.0);
}
// Test std::list with Qt6 (no changes needed, but verify compatibility)
TEST(Qt6ApiTest, StdList_Compatibility)
{
std::list<int> intList = {1, 2, 3, 4, 5};
// Verify standard operations work
EXPECT_EQ(intList.size(), 5u);
EXPECT_EQ(intList.front(), 1);
EXPECT_EQ(intList.back(), 5);
intList.push_back(6);
EXPECT_EQ(intList.size(), 6u);
}
// Test QSharedPointer (Qt6 compatible)
// Note: Qt6 QSharedPointer doesn't have use_count() - use isNull() and pointer comparison
TEST(Qt6ApiTest, QSharedPointer_Basic)
{
QSharedPointer<int> ptr(new int(42));
EXPECT_FALSE(ptr.isNull());
EXPECT_EQ(*ptr, 42);
QSharedPointer<int> ptr2 = ptr;
EXPECT_FALSE(ptr.isNull());
EXPECT_FALSE(ptr2.isNull());
EXPECT_EQ(ptr.data(), ptr2.data()); // Both point to same object
EXPECT_EQ(*ptr, *ptr2); // Both access same value
}