File indexing completed on 2024-05-12 05:55:43
0001 /* 0002 * This file is part of the Okteta Kasten module, made within the KDE community. 0003 * 0004 * SPDX-FileCopyrightText: 2012 Alex Richardson <alex.richardson@gmx.de> 0005 * 0006 * SPDX-License-Identifier: LGPL-2.1-or-later 0007 */ 0008 0009 #include "view/structures/allprimitivetypes.hpp" 0010 // Okteta 0011 #include <Okteta/ByteArrayModel> 0012 // Qt 0013 #include <QTest> 0014 // Std 0015 #include <memory> 0016 0017 class AllPrimitiveTypesTest : public QObject 0018 { 0019 Q_OBJECT 0020 0021 private Q_SLOTS: 0022 void initTestCase(); 0023 void readLittleEndian(); 0024 void readBigEndian(); 0025 void testValuesMatch(); 0026 0027 private: 0028 template <typename T> inline T readLittle(quint8 bitOffset) 0029 { 0030 return AllPrimitiveTypes::readValue<T>(model.get(), 0, QSysInfo::LittleEndian, bitOffset); 0031 } 0032 template <typename T> inline T readBig(quint8 bitOffset) 0033 { 0034 return AllPrimitiveTypes::readValue<T>(model.get(), 0, QSysInfo::BigEndian, bitOffset); 0035 } 0036 0037 private: 0038 std::unique_ptr<Okteta::ByteArrayModel> model; 0039 }; 0040 0041 static constexpr Okteta::Byte data[9] = 0042 { 0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0, 0x00 }; 0043 0044 inline void AllPrimitiveTypesTest::initTestCase() 0045 { 0046 auto* copy = new Okteta::Byte[sizeof(data)]; 0047 memcpy(copy, data, sizeof(data)); 0048 model.reset(new Okteta::ByteArrayModel(copy, sizeof(data))); 0049 model->setAutoDelete(true); 0050 QCOMPARE(model->size(), Okteta::Size(sizeof(data))); 0051 } 0052 0053 void AllPrimitiveTypesTest::testValuesMatch() 0054 { 0055 QCOMPARE((int)sizeof(AllPrimitiveTypes), 8); 0056 AllPrimitiveTypes test = Q_UINT64_C(0x1234567890abcdef); 0057 QCOMPARE(test.value<qint8>(), qint8(0xef)); 0058 QCOMPARE(test.value<quint8>(), quint8(0xef)); 0059 QCOMPARE(test.value<qint16>(), qint16(0xcdef)); 0060 QCOMPARE(test.value<quint16>(), quint16(0xcdef)); 0061 QCOMPARE(test.value<qint32>(), qint32(0x90abcdef)); 0062 QCOMPARE(test.value<quint32>(), quint32(0x90abcdef)); 0063 QCOMPARE(test.value<qint64>(), Q_INT64_C(0x1234567890abcdef)); 0064 QCOMPARE(test.value<quint64>(), Q_UINT64_C(0x1234567890abcdef)); 0065 AllPrimitiveTypes test2 = Q_INT64_C(-0x1234567890abcdef); 0066 QVERIFY(test2 == Q_UINT64_C(0xedcba9876f543211)); 0067 } 0068 0069 inline void AllPrimitiveTypesTest::readLittleEndian() 0070 { 0071 QCOMPARE(readLittle<quint8>(0), quint8(0x12U)); 0072 QCOMPARE(readLittle<quint16>(0), quint16(0x3412U)); 0073 QCOMPARE(readLittle<quint32>(0), quint32(0x78563412U)); 0074 QCOMPARE(readLittle<quint64>(0), Q_UINT64_C(0xf0debc9a78563412)); 0075 // shifted by 4 0076 // this is the way gcc handles it on little endian systems 0077 QCOMPARE(readLittle<quint8>(4), quint8(0x41U)); 0078 QCOMPARE(readLittle<quint16>(4), quint16(0x6341U)); 0079 QCOMPARE(readLittle<quint32>(4), quint32(0xa7856341U)); 0080 QCOMPARE(readLittle<quint64>(4), Q_UINT64_C(0x0f0debc9a7856341)); 0081 0082 // now read a quint16 with bitOffset 1 to 7 0083 QCOMPARE(readLittle<quint16>(1), quint16(0x1a09U)); 0084 QCOMPARE(readLittle<quint16>(2), quint16(0x8d04U)); 0085 QCOMPARE(readLittle<quint16>(3), quint16(0xc682U)); 0086 QCOMPARE(readLittle<quint16>(4), quint16(0x6341U)); 0087 QCOMPARE(readLittle<quint16>(5), quint16(0xb1a0U)); 0088 QCOMPARE(readLittle<quint16>(6), quint16(0x58d0U)); 0089 QCOMPARE(readLittle<quint16>(7), quint16(0xac68U)); 0090 0091 } 0092 0093 /** 0094 * 7 6 5 4 | 3 2 1 0 | 7 6 5 4 | 3 2 1 0 | 7 6 5 4 | 3 2 1 0 | 0095 * ------------------|-------------------|-------------------| 0096 * 0 0 0 1 | 0 0 1 0 | 0 0 1 1 | 0 1 0 0 | 0 1 0 1 | 0 1 1 0 | 0097 */ 0098 0099 inline void AllPrimitiveTypesTest::readBigEndian() 0100 { 0101 QCOMPARE(readBig<quint8>(0), quint8(0x12U)); 0102 QCOMPARE(readBig<quint16>(0), quint16(0x1234U)); 0103 QCOMPARE(readBig<quint32>(0), quint32(0x12345678U)); 0104 QCOMPARE(readBig<quint64>(0), Q_UINT64_C(0x123456789abcdef0)); 0105 0106 QCOMPARE(readBig<quint8>(4), quint8(0x23U)); 0107 QCOMPARE(readBig<quint16>(4), quint16(0x2345U)); 0108 0109 QCOMPARE(readBig<quint16>(1), quint16(0x2468U)); 0110 QCOMPARE(readBig<quint16>(2), quint16(0x48d1U)); 0111 QCOMPARE(readBig<quint16>(3), quint16(0x91a2U)); 0112 QCOMPARE(readBig<quint16>(4), quint16(0x2345U)); 0113 QCOMPARE(readBig<quint16>(5), quint16(0x468aU)); 0114 QCOMPARE(readBig<quint16>(6), quint16(0x8d15U)); 0115 QCOMPARE(readBig<quint16>(7), quint16(0x1a2bU)); 0116 0117 } 0118 0119 QTEST_GUILESS_MAIN(AllPrimitiveTypesTest) 0120 0121 #include "allprimitivetypestest.moc"