diff --git a/tests/auto/corelib/global/qcomparehelpers/CMakeLists.txt b/tests/auto/corelib/global/qcomparehelpers/CMakeLists.txt index 4647bb5c7b6..bbb75041389 100644 --- a/tests/auto/corelib/global/qcomparehelpers/CMakeLists.txt +++ b/tests/auto/corelib/global/qcomparehelpers/CMakeLists.txt @@ -3,7 +3,8 @@ qt_internal_add_test(tst_qcomparehelpers SOURCES - tst_qcomparehelpers.cpp + tst_qcomparehelpers.h tst_qcomparehelpers.cpp + wrappertypes.h LIBRARIES Qt::TestPrivate ) @@ -13,7 +14,8 @@ qt_internal_add_test(tst_qcomparehelpers if (CMAKE_VERSION VERSION_GREATER_EQUAL "3.20" AND NOT MACOS) qt_internal_add_test(tst_qcomparehelpers_cpp23 SOURCES - tst_qcomparehelpers.cpp + tst_qcomparehelpers.h tst_qcomparehelpers.cpp + wrappertypes.h DEFINES tst_QCompareHelpers=tst_QCompareHelpersCpp23 LIBRARIES diff --git a/tests/auto/corelib/global/qcomparehelpers/tst_qcomparehelpers.cpp b/tests/auto/corelib/global/qcomparehelpers/tst_qcomparehelpers.cpp index 5cd6ec18be1..f140c23ed0f 100644 --- a/tests/auto/corelib/global/qcomparehelpers/tst_qcomparehelpers.cpp +++ b/tests/auto/corelib/global/qcomparehelpers/tst_qcomparehelpers.cpp @@ -1,198 +1,20 @@ // Copyright (C) 2023 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only -#include -#include -#include +#include "tst_qcomparehelpers.h" +#include "wrappertypes.h" #if defined(__STDCPP_FLOAT16_T__) && __has_include() #include #endif -class IntWrapper -{ -public: - // implicit constructor and operator int() to simulate the case that - // triggers a bug on MSVC < 19.36. - IntWrapper(int val) : m_val(val) {} - operator int() const noexcept { return m_val; } +/* + NOTE: Do not add any other test cases to this cpp file! + minGW already complains about a too large tst_qcomparehelpers.cpp.obj + object file. - int value() const { return m_val; } - -private: - friend bool comparesEqual(const IntWrapper &lhs, const IntWrapper &rhs) noexcept - { return lhs.m_val == rhs.m_val; } - friend Qt::strong_ordering - compareThreeWay(const IntWrapper &lhs, const IntWrapper &rhs) noexcept - { - return Qt::compareThreeWay(lhs.m_val, rhs.m_val); - } - friend bool comparesEqual(const IntWrapper &lhs, int rhs) noexcept - { return lhs.m_val == rhs; } - friend Qt::strong_ordering compareThreeWay(const IntWrapper &lhs, int rhs) noexcept - { return compareThreeWay(lhs, IntWrapper(rhs)); } - - Q_DECLARE_STRONGLY_ORDERED(IntWrapper) - Q_DECLARE_STRONGLY_ORDERED(IntWrapper, int) - - int m_val = 0; -}; - -class DoubleWrapper -{ -public: - explicit DoubleWrapper(double val) : m_val(val) {} - double value() const { return m_val; } - -private: - friend bool comparesEqual(const DoubleWrapper &lhs, const DoubleWrapper &rhs) noexcept - { return lhs.m_val == rhs.m_val; } - friend Qt::partial_ordering - compareThreeWay(const DoubleWrapper &lhs, const DoubleWrapper &rhs) noexcept - { - return Qt::compareThreeWay(lhs.m_val, rhs.m_val); - } - friend bool comparesEqual(const DoubleWrapper &lhs, const IntWrapper &rhs) noexcept - { return comparesEqual(lhs, DoubleWrapper(rhs.value())); } - friend Qt::partial_ordering - compareThreeWay(const DoubleWrapper &lhs, const IntWrapper &rhs) noexcept - { return compareThreeWay(lhs, DoubleWrapper(rhs.value())); } - friend bool comparesEqual(const DoubleWrapper &lhs, double rhs) noexcept - { return lhs.m_val == rhs; } - friend Qt::partial_ordering compareThreeWay(const DoubleWrapper &lhs, double rhs) noexcept - { - return Qt::compareThreeWay(lhs.m_val, rhs); - } - - Q_DECLARE_PARTIALLY_ORDERED(DoubleWrapper) - Q_DECLARE_PARTIALLY_ORDERED(DoubleWrapper, IntWrapper) - Q_DECLARE_PARTIALLY_ORDERED(DoubleWrapper, double) - - double m_val = 0.0; -}; - -template -class StringWrapper -{ -public: - explicit StringWrapper(String val) : m_val(val) {} - String value() const { return m_val; } - -private: - // Some of the helper functions are intentionally NOT marked as noexcept - // to test the conditional noexcept in the macros. - template - friend bool comparesEqual(const StringWrapper &, const StringWrapper &) noexcept; - template - friend Qt::weak_ordering - compareThreeWay(const StringWrapper &, const StringWrapper &) noexcept; - template - friend bool comparesEqual(const StringWrapper &, QAnyStringView); - template - friend Qt::weak_ordering compareThreeWay(const StringWrapper &, QAnyStringView); - - Q_DECLARE_WEAKLY_ORDERED(StringWrapper) - Q_DECLARE_WEAKLY_ORDERED(StringWrapper, QAnyStringView) - - String m_val; -}; - -// StringWrapper comparison helper functions - -bool equalsHelper(QAnyStringView lhs, QAnyStringView rhs) noexcept -{ - return QAnyStringView::compare(lhs, rhs, Qt::CaseInsensitive) == 0; -} - -template -bool comparesEqual(const StringWrapper &lhs, const StringWrapper &rhs) noexcept -{ - return equalsHelper(lhs.m_val, rhs.m_val); -} - -Qt::weak_ordering compareHelper(QAnyStringView lhs, QAnyStringView rhs) noexcept -{ - const int res = QAnyStringView::compare(lhs, rhs, Qt::CaseInsensitive); - if (res < 0) - return Qt::weak_ordering::less; - else if (res > 0) - return Qt::weak_ordering::greater; - else - return Qt::weak_ordering::equivalent; -} - -template -Qt::weak_ordering compareThreeWay(const StringWrapper &lhs, const StringWrapper &rhs) noexcept -{ - return compareHelper(lhs.m_val, rhs.m_val); -} - -template -bool comparesEqual(const StringWrapper &lhs, QAnyStringView rhs) -{ - return equalsHelper(lhs.m_val, rhs); -} - -template -Qt::weak_ordering compareThreeWay(const StringWrapper &lhs, QAnyStringView rhs) -{ - return compareHelper(lhs.m_val, rhs); -} - -// Test class - -class tst_QCompareHelpers : public QObject -{ - Q_OBJECT - -private: - template - void compareImpl(); - - template - void compareIntData(); - - template - void compareFloatData(); - - template - void compareStringData(); - -private slots: - void comparisonCompiles(); - - void compare_IntWrapper_data() { compareIntData(); } - void compare_IntWrapper() { compareImpl(); } - - void compare_IntWrapper_int_data() { compareIntData(); } - void compare_IntWrapper_int() { compareImpl(); } - - void compare_DoubleWrapper_data() { compareFloatData(); } - void compare_DoubleWrapper() - { compareImpl(); } - - void compare_DoubleWrapper_double_data() { compareFloatData(); } - void compare_DoubleWrapper_double() - { compareImpl(); } - - void compare_IntWrapper_DoubleWrapper_data(); - void compare_IntWrapper_DoubleWrapper() - { compareImpl(); } - - void compare_StringWrapper_data() - { compareStringData, StringWrapper>(); } - void compare_StringWrapper() - { compareImpl, StringWrapper, Qt::weak_ordering>(); } - - void compare_StringWrapper_AnyStringView_data() - { compareStringData, QAnyStringView>(); } - void compare_StringWrapper_AnyStringView() - { compareImpl, QAnyStringView, Qt::weak_ordering>(); } - - void generatedClasses(); - - void builtinOrder(); -}; + Create a new cpp file and add new tests there. +*/ template void tst_QCompareHelpers::compareImpl() @@ -315,6 +137,46 @@ void tst_QCompareHelpers::comparisonCompiles() return; } +void tst_QCompareHelpers::compare_IntWrapper_data() +{ + compareIntData(); +} + +void tst_QCompareHelpers::compare_IntWrapper() +{ + compareImpl(); +} + +void tst_QCompareHelpers::compare_IntWrapper_int_data() +{ + compareIntData(); +} + +void tst_QCompareHelpers::compare_IntWrapper_int() +{ + compareImpl(); +} + +void tst_QCompareHelpers::compare_DoubleWrapper_data() +{ + compareFloatData(); +} + +void tst_QCompareHelpers::compare_DoubleWrapper() +{ + compareImpl(); +} + +void tst_QCompareHelpers::compare_DoubleWrapper_double_data() +{ + compareFloatData(); +} + +void tst_QCompareHelpers::compare_DoubleWrapper_double() +{ + compareImpl(); +} + void tst_QCompareHelpers::compare_IntWrapper_DoubleWrapper_data() { QTest::addColumn("lhs"); @@ -347,6 +209,31 @@ void tst_QCompareHelpers::compare_IntWrapper_DoubleWrapper_data() createRow(min, -inf, Qt::partial_ordering::greater); } +void tst_QCompareHelpers::compare_IntWrapper_DoubleWrapper() +{ + compareImpl(); +} + +void tst_QCompareHelpers::compare_StringWrapper_data() +{ + compareStringData, StringWrapper>(); +} + +void tst_QCompareHelpers::compare_StringWrapper() +{ + compareImpl, StringWrapper, Qt::weak_ordering>(); +} + +void tst_QCompareHelpers::compare_StringWrapper_AnyStringView_data() +{ + compareStringData, QAnyStringView>(); +} + +void tst_QCompareHelpers::compare_StringWrapper_AnyStringView() +{ + compareImpl, QAnyStringView, Qt::weak_ordering>(); +} + #define DECLARE_TYPE(Name, Type, Attrs, RetType, Constexpr, Suffix) \ class Dummy ## Name \ { \ diff --git a/tests/auto/corelib/global/qcomparehelpers/tst_qcomparehelpers.h b/tests/auto/corelib/global/qcomparehelpers/tst_qcomparehelpers.h new file mode 100644 index 00000000000..82f527609f3 --- /dev/null +++ b/tests/auto/corelib/global/qcomparehelpers/tst_qcomparehelpers.h @@ -0,0 +1,62 @@ +// Copyright (C) 2024 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only + +#ifndef TST_QCOMPAREHELPERS_H +#define TST_QCOMPAREHELPERS_H + +#include + +#include +#include + +class tst_QCompareHelpers : public QObject +{ + Q_OBJECT + +private: + template + void compareImpl(); + + template + void compareIntData(); + + template + void compareFloatData(); + + template + void compareStringData(); + +private Q_SLOTS: + // tst_qcomparehelpers.cpp + void comparisonCompiles(); + + void compare_IntWrapper_data(); + void compare_IntWrapper(); + + void compare_IntWrapper_int_data(); + void compare_IntWrapper_int(); + + void compare_DoubleWrapper_data(); + void compare_DoubleWrapper(); + + void compare_DoubleWrapper_double_data(); + void compare_DoubleWrapper_double(); + + void compare_IntWrapper_DoubleWrapper_data(); + void compare_IntWrapper_DoubleWrapper(); + + void compare_StringWrapper_data(); + void compare_StringWrapper(); + + void compare_StringWrapper_AnyStringView_data(); + void compare_StringWrapper_AnyStringView(); + + void generatedClasses(); + + void builtinOrder(); + + // Add new test cases to another cpp file, because minGW already complains + // about a too large tst_qcomparehelpers.cpp.obj object file +}; + +#endif // TST_QCOMPAREHELPERS_H diff --git a/tests/auto/corelib/global/qcomparehelpers/wrappertypes.h b/tests/auto/corelib/global/qcomparehelpers/wrappertypes.h new file mode 100644 index 00000000000..1dd221a8b03 --- /dev/null +++ b/tests/auto/corelib/global/qcomparehelpers/wrappertypes.h @@ -0,0 +1,116 @@ +// Copyright (C) 2024 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only + +#ifndef TST_QCOMPAREHELPERS_WRAPPERTYPES_H +#define TST_QCOMPAREHELPERS_WRAPPERTYPES_H + +#include +#include + +class IntWrapper +{ +public: + // implicit constructor and operator int() to simulate the case that + // triggers a bug on MSVC < 19.36. + IntWrapper(int val) : m_val(val) {} + operator int() const noexcept { return m_val; } + + int value() const { return m_val; } + +private: + friend bool comparesEqual(const IntWrapper &lhs, const IntWrapper &rhs) noexcept + { return lhs.m_val == rhs.m_val; } + friend Qt::strong_ordering + compareThreeWay(const IntWrapper &lhs, const IntWrapper &rhs) noexcept + { + return Qt::compareThreeWay(lhs.m_val, rhs.m_val); + } + friend bool comparesEqual(const IntWrapper &lhs, int rhs) noexcept + { return lhs.m_val == rhs; } + friend Qt::strong_ordering compareThreeWay(const IntWrapper &lhs, int rhs) noexcept + { return compareThreeWay(lhs, IntWrapper(rhs)); } + + Q_DECLARE_STRONGLY_ORDERED(IntWrapper) + Q_DECLARE_STRONGLY_ORDERED(IntWrapper, int) + + int m_val = 0; +}; + +class DoubleWrapper +{ +public: + explicit DoubleWrapper(double val) : m_val(val) {} + double value() const { return m_val; } + +private: + friend bool comparesEqual(const DoubleWrapper &lhs, const DoubleWrapper &rhs) noexcept + { return lhs.m_val == rhs.m_val; } + friend Qt::partial_ordering + compareThreeWay(const DoubleWrapper &lhs, const DoubleWrapper &rhs) noexcept + { + return Qt::compareThreeWay(lhs.m_val, rhs.m_val); + } + friend bool comparesEqual(const DoubleWrapper &lhs, const IntWrapper &rhs) noexcept + { return comparesEqual(lhs, DoubleWrapper(rhs.value())); } + friend Qt::partial_ordering + compareThreeWay(const DoubleWrapper &lhs, const IntWrapper &rhs) noexcept + { return compareThreeWay(lhs, DoubleWrapper(rhs.value())); } + friend bool comparesEqual(const DoubleWrapper &lhs, double rhs) noexcept + { return lhs.m_val == rhs; } + friend Qt::partial_ordering compareThreeWay(const DoubleWrapper &lhs, double rhs) noexcept + { + return Qt::compareThreeWay(lhs.m_val, rhs); + } + + Q_DECLARE_PARTIALLY_ORDERED(DoubleWrapper) + Q_DECLARE_PARTIALLY_ORDERED(DoubleWrapper, IntWrapper) + Q_DECLARE_PARTIALLY_ORDERED(DoubleWrapper, double) + + double m_val = 0.0; +}; + +template +class StringWrapper +{ +public: + explicit StringWrapper(String val) : m_val(val) {} + String value() const { return m_val; } + +private: + static bool equalsHelper(QAnyStringView lhs, QAnyStringView rhs) noexcept + { return QAnyStringView::compare(lhs, rhs, Qt::CaseInsensitive) == 0; } + + static Qt::weak_ordering compareHelper(QAnyStringView lhs, QAnyStringView rhs) noexcept + { + const int res = QAnyStringView::compare(lhs, rhs, Qt::CaseInsensitive); + if (res < 0) + return Qt::weak_ordering::less; + else if (res > 0) + return Qt::weak_ordering::greater; + else + return Qt::weak_ordering::equivalent; + } + + // Some of the helper functions are intentionally NOT marked as noexcept + // to test the conditional noexcept in the macros. + template + friend bool comparesEqual(const StringWrapper &lhs, const StringWrapper &rhs) noexcept + { return StringWrapper::equalsHelper(lhs.m_val, rhs.m_val); } + template + friend Qt::weak_ordering + compareThreeWay(const StringWrapper &lhs, const StringWrapper &rhs) noexcept + { return StringWrapper::compareHelper(lhs.m_val, rhs.m_val); } + template + friend bool comparesEqual(const StringWrapper &lhs, QAnyStringView rhs) + { return StringWrapper::equalsHelper(lhs.m_val, rhs); } + template + friend Qt::weak_ordering compareThreeWay(const StringWrapper &lhs, QAnyStringView rhs) + { return StringWrapper::compareHelper(lhs.m_val, rhs); } + + Q_DECLARE_WEAKLY_ORDERED(StringWrapper) + Q_DECLARE_WEAKLY_ORDERED(StringWrapper, QAnyStringView) + + String m_val; +}; + +#endif // TST_QCOMPAREHELPERS_WRAPPERTYPES_H