File indexing completed on 2024-05-05 03:52:05

0001 /*
0002     This file is part of the KDE Baloo project.
0003     SPDX-FileCopyrightText: 2016 Christian Ehrlicher <ch.ehrlicher@gmx.de>
0004 
0005     SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
0006 */
0007 
0008 #include <QCryptographicHash>
0009 #include <QTest>
0010 #include "positioncodec.h"
0011 #include "positioninfo.h"
0012 
0013 using namespace Baloo;
0014 
0015 class PositionCodecTest : public QObject
0016 {
0017 Q_OBJECT
0018 public:
0019     PositionCodecTest() = default;
0020     ~PositionCodecTest() = default;
0021 private Q_SLOTS:
0022     void initTestCase();
0023     void checkEncodeOutput();
0024     void checkEncodeOutput2();
0025     void checkEncodeOutput3();
0026 private:
0027     QVector<PositionInfo> m_data;
0028     QVector<PositionInfo> m_data2;
0029     QVector<PositionInfo> m_data3;
0030 };
0031 
0032 QTEST_MAIN ( PositionCodecTest )
0033 
0034 void PositionCodecTest::initTestCase()
0035 {
0036     m_data.clear();
0037     m_data.reserve(100);
0038     for(int i = 0; i < 100; ++i)
0039     {
0040         PositionInfo info;
0041         info.docId = (i + 1) * 4711;
0042         info.positions.reserve(3000);
0043         for (int j = 0; j < 3000; j++) {
0044             info.positions.append((j + 1) * (i * 2));
0045         }
0046         m_data.append(info);
0047     }
0048 
0049     m_data2.clear();
0050     m_data2.reserve(5000);
0051     for (int i = 0; i < 5000; i++) {
0052         PositionInfo info;
0053         info.docId = i;
0054         info.positions = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
0055 
0056         m_data2.append(info);
0057     }
0058 
0059     m_data3.clear();
0060     m_data3.reserve(200);
0061     for (int i = 0; i < 200; i++) {
0062         PositionInfo info;
0063         info.docId = i;
0064         info.positions.reserve(30000); // > 2^14 -> 3 byte VarInt32
0065         for (int j = 0; j < 30000; j++) {
0066             info.positions.append((j + 1) * 200); // increment 200 -> 2 byte DiffVarInt32
0067         }
0068 
0069         m_data3.append(info);
0070     }
0071 }
0072 
0073 void PositionCodecTest::checkEncodeOutput()
0074 {
0075     const QByteArray ba = PositionCodec::encode(m_data);
0076     QCOMPARE(ba.size(), 409000);
0077     const QByteArray md5 = QCryptographicHash::hash(ba, QCryptographicHash::Md5).toHex();
0078     QCOMPARE(md5, QByteArray("ae49eb3279bdda36ef91d29ce3c94c2c"));
0079     // and now decode the whole stuff
0080     QVector<PositionInfo> decodedData = PositionCodec::decode(ba);
0081     QCOMPARE(m_data, decodedData);
0082 }
0083 
0084 void PositionCodecTest::checkEncodeOutput2()
0085 {
0086     const QByteArray ba = PositionCodec::encode(m_data2);
0087     QCOMPARE(ba.size(), (8 + 1 + 10) * 5000); // DocId, VarInt32 len, DiffVarInt position
0088     const QByteArray md5 = QCryptographicHash::hash(ba, QCryptographicHash::Md5).toHex();
0089     QCOMPARE(md5, QByteArray("2f3710246331002e2332dce560ccd783"));
0090     // and now decode the whole stuff
0091     QVector<PositionInfo> decodedData = PositionCodec::decode(ba);
0092     QCOMPARE(m_data2, decodedData);
0093 }
0094 
0095 void PositionCodecTest::checkEncodeOutput3()
0096 {
0097     const QByteArray ba = PositionCodec::encode(m_data3);
0098     QCOMPARE(ba.size(), (8 + 3 + (2 * 30000)) * 200); // DocId, VarInt32 len, DiffVarInt position
0099     const QByteArray md5 = QCryptographicHash::hash(ba, QCryptographicHash::Md5).toHex();
0100     QCOMPARE(md5, QByteArray("79e942003c082073b4cee8e376fffdaa"));
0101     // and now decode the whole stuff
0102     QVector<PositionInfo> decodedData = PositionCodec::decode(ba);
0103     QCOMPARE(m_data3, decodedData);
0104 }
0105 
0106 #include "positioncodectest.moc"