diff options
Diffstat (limited to 'tests/auto/corelib/global/qtendian/tst_qtendian.cpp')
-rw-r--r-- | tests/auto/corelib/global/qtendian/tst_qtendian.cpp | 85 |
1 files changed, 58 insertions, 27 deletions
diff --git a/tests/auto/corelib/global/qtendian/tst_qtendian.cpp b/tests/auto/corelib/global/qtendian/tst_qtendian.cpp index 885e693c8d..8e50b2bd08 100644 --- a/tests/auto/corelib/global/qtendian/tst_qtendian.cpp +++ b/tests/auto/corelib/global/qtendian/tst_qtendian.cpp @@ -1,5 +1,5 @@ // Copyright (C) 2021 The Qt Company Ltd. -// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only #include <QTest> @@ -7,6 +7,12 @@ #include <QtCore/private/qendian_p.h> #include <QtCore/qsysinfo.h> +#if QT_SUPPORTS_INT128 +#define ONLY_INT128(...) __VA_ARGS__ +#else +#define ONLY_INT128(...) +#endif + class tst_QtEndian: public QObject { Q_OBJECT @@ -41,6 +47,9 @@ private slots: struct TestData { + ONLY_INT128( + quint128 data128; + ) quint64 data64; quint32 data32; quint16 data16; @@ -57,6 +66,9 @@ template <> quint8 getData(const TestData &d) { return d.data8; } template <> quint16 getData(const TestData &d) { return d.data16; } template <> quint32 getData(const TestData &d) { return d.data32; } template <> quint64 getData(const TestData &d) { return d.data64; } +ONLY_INT128( +template <> quint128 getData(const TestData &d) { return d.data128; } +) template <> float getData(const TestData &d) { return d.dataFloat; } union RawTestData @@ -74,6 +86,9 @@ Float int2Float(typename QIntegerForSizeof<Float>::Unsigned i) } static const TestData inNativeEndian = { + ONLY_INT128( + Q_UINT128_C(0x0123'4567'89ab'cdef'18ba'df00'd1da'cafe), + ) Q_UINT64_C(0x0123456789abcdef), 0x00c0ffee, 0xcafe, @@ -83,6 +98,9 @@ static const TestData inNativeEndian = { '\0' }; static const RawTestData inBigEndian = { + ONLY_INT128( + "\x01\x23\x45\x67\x89\xab\xcd\xef\x18\xba\xdf\x00\xd1\xda\xca\xfe" + ) "\x01\x23\x45\x67\x89\xab\xcd\xef" "\x00\xc0\xff\xee" "\xca\xfe" @@ -91,6 +109,9 @@ static const RawTestData inBigEndian = { "\x01\x23\x45\x67\x89\xab\xcd\xef" }; static const RawTestData inLittleEndian = { + ONLY_INT128( + "\xfe\xca\xda\xd1\x00\xdf\xba\x18\xef\xcd\xab\x89\x67\x45\x23\x01" + ) "\xef\xcd\xab\x89\x67\x45\x23\x01" "\xee\xff\xc0\x00" "\xfe\xca" @@ -102,27 +123,37 @@ static const RawTestData inLittleEndian = { #define EXPAND_ENDIAN_TEST(endian) \ do { \ /* Unsigned tests */ \ - ENDIAN_TEST(endian, quint, 64); \ - ENDIAN_TEST(endian, quint, 32); \ - ENDIAN_TEST(endian, quint, 16); \ - ENDIAN_TEST(endian, quint, 8); \ + ONLY_INT128( \ + ENDIAN_TEST_INT(endian, ui, 128); \ + ) \ + ENDIAN_TEST_INT(endian, ui, 64); \ + ENDIAN_TEST_INT(endian, ui, 32); \ + ENDIAN_TEST_INT(endian, ui, 16); \ + ENDIAN_TEST_INT(endian, ui, 8); \ \ /* Signed tests */ \ - ENDIAN_TEST(endian, qint, 64); \ - ENDIAN_TEST(endian, qint, 32); \ - ENDIAN_TEST(endian, qint, 16); \ - ENDIAN_TEST(endian, qint, 8); \ + ONLY_INT128( \ + ENDIAN_TEST_INT(endian, i, 128); \ + ) \ + ENDIAN_TEST_INT(endian, i, 64); \ + ENDIAN_TEST_INT(endian, i, 32); \ + ENDIAN_TEST_INT(endian, i, 16); \ + ENDIAN_TEST_INT(endian, i, 8); \ } while (false) \ /**/ -#define ENDIAN_TEST(endian, type, size) \ +#define ENDIAN_TEST_INT(Endian, Uns, Size) \ + ENDIAN_TEST(Endian, q ## Uns ## nt ## Size, data ## Size) + +#define ENDIAN_TEST(endian, Type, Data) \ do { \ + static_assert(std::is_same_v<decltype(qbswap(std::declval<Type>())), Type>); \ QCOMPARE(qFrom ## endian ## Endian( \ - (type ## size)(in ## endian ## Endian.data.data ## size)), \ - (type ## size)(inNativeEndian.data ## size)); \ - QCOMPARE(qFrom ## endian ## Endian<type ## size>( \ - in ## endian ## Endian.rawData + offsetof(TestData, data ## size)), \ - (type ## size)(inNativeEndian.data ## size)); \ + (Type)(in ## endian ## Endian.data.Data)), \ + (Type)(inNativeEndian.Data)); \ + QCOMPARE(qFrom ## endian ## Endian<Type>( \ + in ## endian ## Endian.rawData + offsetof(TestData, Data)), \ + (Type)(inNativeEndian.Data)); \ } while (false) \ /**/ @@ -243,18 +274,18 @@ void tst_QtEndian::fromLittleEndianRegion() } } -#define ENDIAN_TEST(endian, type, size) \ - do { \ - QCOMPARE(qTo ## endian ## Endian( \ - (type ## size)(inNativeEndian.data ## size)), \ - (type ## size)(in ## endian ## Endian.data.data ## size)); \ - \ - RawTestData test; \ - qTo ## endian ## Endian( \ - (type ## size)(inNativeEndian.data ## size), \ - test.rawData + offsetof(TestData, data ## size)); \ - QCOMPARE(test.data.data ## size, in ## endian ## Endian.data.data ## size ); \ - } while (false) \ +#define ENDIAN_TEST(endian, Type, Data) \ + do { \ + QCOMPARE(qTo ## endian ## Endian( \ + (Type)(inNativeEndian.Data)), \ + (Type)(in ## endian ## Endian.data.Data)); \ + \ + RawTestData test; \ + qTo ## endian ## Endian( \ + (Type)(inNativeEndian.Data), \ + test.rawData + offsetof(TestData, Data)); \ + QCOMPARE(test.data.Data, in ## endian ## Endian.data.Data ); \ + } while (false) \ /**/ void tst_QtEndian::toBigEndian() |