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"