1/*
2 SPDX-FileCopyrightText: 2025 Stefan BrĂ¼ns <stefan.bruens@rwth-aachen.de>
3 SPDX-License-Identifier: LGPL-2.1-or-later
4*/
5
6#include "mobipocket.h"
7#include "testsconfig.h"
8
9#include <QTest>
10
11#include <QBuffer>
12
13using namespace Mobipocket;
14
15namespace {
16QString testFilePath(const QString& fileName)
17{
18 return QLatin1String(TESTS_FILES_PATH) + QLatin1Char('/') + fileName;
19}
20}
21
22class MobipocketTest : public QObject
23{
24 Q_OBJECT
25
26private Q_SLOTS:
27 void testMetadata();
28 void testText();
29 void testThumbnail();
30 void testTruncation();
31};
32
33void MobipocketTest::testMetadata()
34{
35 QFile file(testFilePath(QStringLiteral("test.mobi")));
36 file.open(flags: QFile::ReadOnly);
37 Mobipocket::Document doc(&file);
38
39 QVERIFY(doc.isValid());
40
41 const auto metadata = doc.metadata();
42
43 QCOMPARE(metadata.value(Document::Author), QStringLiteral("Happy Man"));
44 QCOMPARE(metadata.value(Document::Title), QStringLiteral("The Big Brown Bear"));
45 QCOMPARE(metadata.value(Document::Subject), QStringLiteral("Baloo KFileMetaData"));
46 QCOMPARE(metadata.value(Document::Description), QStringLiteral("Honey"));
47 QCOMPARE(metadata.value(Document::Copyright), QStringLiteral("License"));
48}
49
50void MobipocketTest::testText()
51{
52 QFile file(testFilePath(QStringLiteral("test.mobi")));
53 file.open(flags: QFile::ReadOnly);
54 Mobipocket::Document doc(&file);
55
56 QVERIFY(doc.isValid());
57 QVERIFY(!doc.hasDRM());
58
59 const auto text = doc.text();
60 const auto expected = QStringLiteral("<html><head></head><body>" //
61 "<p height=\"1em\" width=\"0pt\">This is a sample PDF file for KFileMetaData. </p>" //
62 "<mbp:pagebreak/><a ></a> <a ></a> <a ></a></body></html>");
63 QCOMPARE(text, expected);
64}
65
66void MobipocketTest::testThumbnail()
67{
68 QFile file(testFilePath(QStringLiteral("test.mobi")));
69 file.open(flags: QFile::ReadOnly);
70 Mobipocket::Document doc(&file);
71
72 QVERIFY(doc.isValid());
73
74 const auto thumb = doc.thumbnail();
75 QCOMPARE(thumb.width(), 179);
76 QCOMPARE(thumb.height(), 233);
77
78 QVERIFY(doc.imageCount() >= 2);
79 // Thumbnail is second image
80 QCOMPARE(thumb, doc.getImage(1));
81
82 const auto cover = doc.getImage(i: 0);
83 QCOMPARE(cover.width(), 566);
84 QCOMPARE(cover.height(), 734);
85
86 // Should not crash
87 const auto invalid1 = doc.getImage(i: doc.imageCount() + 1);
88 QCOMPARE(invalid1.width(), 0);
89 // Unfortunately allowed by API, fix occasionally and bump ABI version
90 const auto invalid2 = doc.getImage(i: -10);
91 QCOMPARE(invalid2.width(), 0);
92}
93
94void MobipocketTest::testTruncation()
95{
96 QFile file(testFilePath(QStringLiteral("test.mobi")));
97 file.open(flags: QFile::ReadOnly);
98 auto data = file.readAll();
99
100 QCOMPARE(data.size(), 13653);
101
102 for (auto size = data.size(); size >= 0; size--) {
103 QBuffer buf;
104 buf.setData(data: data.constData(), len: size);
105 buf.open(openMode: QIODevice::ReadOnly);
106
107 Mobipocket::Document doc(&buf);
108 const auto metadata = doc.metadata();
109 const auto text = doc.text();
110 }
111}
112
113QTEST_GUILESS_MAIN(MobipocketTest)
114
115#include "mobipockettest.moc"
116

source code of kdegraphics-mobipocket/autotests/mobipockettest.cpp