Files
qt-migration-legatus/qt6-after/qt6-migrated-legatus/tests/test_qt6_api_migrations.cpp
T
torstenandCopilot 09c244ff18 refactor: clean up verbose migration comments
Remove redundant Qt6 migration comments that restate obvious API changes:
- QtConcurrent::run parameter order explanations (preserved where lambda wrapping needed)
- QStringRef/QStringView API changes (shortened to essential info)
- QComboBox::activated signal signature change
- QMap::unite() removal semantics
- QAction include path change
- QMouseEvent/QWheelEvent position() API
- QList/QVector equivalence in Qt6
- QFuture continuation API
- Code generation comments

Preserved comments explaining non-obvious Qt6 behavior or necessary
API migration details.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-11-04 12:05:23 +00:00

185 lines
5.8 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);
// QBitArray::sliced() in Qt6 (was slice())
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;
});
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)
{
// Qt::MiddleButton in Qt6 (was MidButton)
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;
// QMap::unite() removed in Qt6
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
// QTouchEvent::points() and QEventPoint::globalPosition() in Qt6
// 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)
{
// QMouseEvent::position() in Qt6 (was 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)
{
// QWheelEvent::position() in Qt6 (was 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
}