blob: bb7983d28a307792952796bae749ee8198a3e7d8 [file] [log] [blame]
#include <QtTest/QTest>
#include <poppler-qt5.h>
#include <memory>
class TestFontsData : public QObject
{
Q_OBJECT
public:
explicit TestFontsData(QObject *parent = nullptr) : QObject(parent) { }
private slots:
void checkNoFonts();
void checkType1();
void checkType3();
void checkTrueType();
void checkFontIterator();
void checkSecondDocumentQuery();
void checkMultipleIterations();
void checkIteratorFonts();
};
static QList<Poppler::FontInfo> loadFontsViaIterator(Poppler::Document *doc, int from = 0, int count = -1)
{
int num = count == -1 ? doc->numPages() - from : count;
QList<Poppler::FontInfo> list;
std::unique_ptr<Poppler::FontIterator> it(doc->newFontIterator(from));
while (it->hasNext() && num) {
list += it->next();
--num;
}
return list;
}
namespace Poppler {
static bool operator==(const FontInfo &f1, const FontInfo &f2)
{
if (f1.name() != f2.name()) {
return false;
}
if (f1.file() != f2.file()) {
return false;
}
if (f1.isEmbedded() != f2.isEmbedded()) {
return false;
}
if (f1.isSubset() != f2.isSubset()) {
return false;
}
if (f1.type() != f2.type()) {
return false;
}
if (f1.typeName() != f2.typeName()) {
return false;
}
return true;
}
}
void TestFontsData::checkNoFonts()
{
Poppler::Document *doc;
doc = Poppler::Document::load(TESTDATADIR "/tests/image.pdf");
QVERIFY(doc);
QList<Poppler::FontInfo> listOfFonts = doc->fonts();
QCOMPARE(listOfFonts.size(), 0);
delete doc;
}
void TestFontsData::checkType1()
{
Poppler::Document *doc;
doc = Poppler::Document::load(TESTDATADIR "/tests/text.pdf");
QVERIFY(doc);
QList<Poppler::FontInfo> listOfFonts = doc->fonts();
QCOMPARE(listOfFonts.size(), 1);
QCOMPARE(listOfFonts.at(0).name(), QLatin1String("Helvetica"));
QCOMPARE(listOfFonts.at(0).type(), Poppler::FontInfo::Type1);
QCOMPARE(listOfFonts.at(0).typeName(), QLatin1String("Type 1"));
QCOMPARE(listOfFonts.at(0).isEmbedded(), false);
QCOMPARE(listOfFonts.at(0).isSubset(), false);
delete doc;
}
void TestFontsData::checkType3()
{
Poppler::Document *doc;
doc = Poppler::Document::load(TESTDATADIR "/tests/type3.pdf");
QVERIFY(doc);
QList<Poppler::FontInfo> listOfFonts = doc->fonts();
QCOMPARE(listOfFonts.size(), 2);
QCOMPARE(listOfFonts.at(0).name(), QLatin1String("Helvetica"));
QCOMPARE(listOfFonts.at(0).type(), Poppler::FontInfo::Type1);
QCOMPARE(listOfFonts.at(0).typeName(), QLatin1String("Type 1"));
QCOMPARE(listOfFonts.at(0).isEmbedded(), false);
QCOMPARE(listOfFonts.at(0).isSubset(), false);
QCOMPARE(listOfFonts.at(1).name(), QString());
QCOMPARE(listOfFonts.at(1).type(), Poppler::FontInfo::Type3);
QCOMPARE(listOfFonts.at(1).typeName(), QLatin1String("Type 3"));
QCOMPARE(listOfFonts.at(1).isEmbedded(), true);
QCOMPARE(listOfFonts.at(1).isSubset(), false);
delete doc;
}
void TestFontsData::checkTrueType()
{
Poppler::Document *doc;
doc = Poppler::Document::load(TESTDATADIR "/unittestcases/truetype.pdf");
QVERIFY(doc);
QList<Poppler::FontInfo> listOfFonts = doc->fonts();
QCOMPARE(listOfFonts.size(), 2);
QCOMPARE(listOfFonts.at(0).name(), QLatin1String("Arial-BoldMT"));
QCOMPARE(listOfFonts.at(0).type(), Poppler::FontInfo::TrueType);
QCOMPARE(listOfFonts.at(0).typeName(), QLatin1String("TrueType"));
QCOMPARE(listOfFonts.at(0).isEmbedded(), false);
QCOMPARE(listOfFonts.at(0).isSubset(), false);
QCOMPARE(listOfFonts.at(1).name(), QLatin1String("ArialMT"));
QCOMPARE(listOfFonts.at(1).type(), Poppler::FontInfo::TrueType);
QCOMPARE(listOfFonts.at(1).typeName(), QLatin1String("TrueType"));
QCOMPARE(listOfFonts.at(1).isEmbedded(), false);
QCOMPARE(listOfFonts.at(1).isSubset(), false);
delete doc;
}
void TestFontsData::checkFontIterator()
{
// loading a 1-page document
Poppler::Document *doc;
doc = Poppler::Document::load(TESTDATADIR "/tests/type3.pdf");
QVERIFY(doc);
// loading a 6-pages document
Poppler::Document *doc6 = Poppler::Document::load(TESTDATADIR "/tests/cropbox.pdf");
QVERIFY(doc6);
std::unique_ptr<Poppler::FontIterator> it;
// some tests with the 1-page document:
// - check a default iterator
it.reset(doc->newFontIterator());
QVERIFY(it->hasNext());
// - check an iterator for negative pages to behave as 0
it.reset(doc->newFontIterator(-1));
QVERIFY(it->hasNext());
// - check an iterator for pages out of the page limit
it.reset(doc->newFontIterator(1));
QVERIFY(!it->hasNext());
// - check that it reaches the end after 1 iteration
it.reset(doc->newFontIterator());
QVERIFY(it->hasNext());
it->next();
QVERIFY(!it->hasNext());
// some tests with the 6-page document:
// - check a default iterator
it.reset(doc6->newFontIterator());
QVERIFY(it->hasNext());
// - check an iterator for pages out of the page limit
it.reset(doc6->newFontIterator(6));
QVERIFY(!it->hasNext());
// - check that it reaches the end after 6 iterations
it.reset(doc6->newFontIterator());
QVERIFY(it->hasNext());
it->next();
QVERIFY(it->hasNext());
it->next();
QVERIFY(it->hasNext());
it->next();
QVERIFY(it->hasNext());
it->next();
QVERIFY(it->hasNext());
it->next();
QVERIFY(it->hasNext());
it->next();
QVERIFY(!it->hasNext());
delete doc;
delete doc6;
}
void TestFontsData::checkSecondDocumentQuery()
{
Poppler::Document *doc;
doc = Poppler::Document::load(TESTDATADIR "/tests/type3.pdf");
QVERIFY(doc);
QList<Poppler::FontInfo> listOfFonts = doc->fonts();
QCOMPARE(listOfFonts.size(), 2);
// check we get the very same result when calling fonts() again (#19405)
QList<Poppler::FontInfo> listOfFonts2 = doc->fonts();
QCOMPARE(listOfFonts, listOfFonts2);
delete doc;
}
void TestFontsData::checkMultipleIterations()
{
Poppler::Document *doc;
doc = Poppler::Document::load(TESTDATADIR "/tests/type3.pdf");
QVERIFY(doc);
QList<Poppler::FontInfo> listOfFonts = loadFontsViaIterator(doc);
QCOMPARE(listOfFonts.size(), 2);
QList<Poppler::FontInfo> listOfFonts2 = loadFontsViaIterator(doc);
QCOMPARE(listOfFonts, listOfFonts2);
delete doc;
}
void TestFontsData::checkIteratorFonts()
{
Poppler::Document *doc;
doc = Poppler::Document::load(TESTDATADIR "/tests/fonts.pdf");
QVERIFY(doc);
QList<Poppler::FontInfo> listOfFonts = doc->fonts();
QCOMPARE(listOfFonts.size(), 3);
// check we get the very same result when gatering fonts using the iterator
QList<Poppler::FontInfo> listOfFonts2 = loadFontsViaIterator(doc);
QCOMPARE(listOfFonts, listOfFonts2);
delete doc;
}
QTEST_GUILESS_MAIN(TestFontsData)
#include "check_fonts.moc"