blob: 7c251c5de95fa6949a983616a8964b1dd2b2eb53 [file] [log] [blame]
#include <QtTest/QtTest>
#include <poppler-qt5.h>
class TestSearch: public QObject
{
Q_OBJECT
public:
TestSearch(QObject *parent = nullptr) : QObject(parent) { }
private slots:
void bug7063();
void testNextAndPrevious();
void testWholeWordsOnly();
void testIgnoreDiacritics();
void testRussianSearch(); // Issue #743
};
void TestSearch::bug7063()
{
QScopedPointer< Poppler::Document > document(Poppler::Document::load(TESTDATADIR "/unittestcases/bug7063.pdf"));
QVERIFY( document );
QScopedPointer< Poppler::Page > page(document->page(0));
QVERIFY( page );
double rectLeft = 0.0, rectTop = 0.0, rectRight = page->pageSizeF().width(), rectBottom = page->pageSizeF().height();
QCOMPARE( page->search(QStringLiteral("non-ascii:"), rectLeft, rectTop, rectRight, rectBottom, Poppler::Page::FromTop), true );
QCOMPARE( page->search(QStringLiteral("Ascii"), rectLeft, rectTop, rectRight, rectBottom, Poppler::Page::FromTop), false );
QCOMPARE( page->search(QStringLiteral("Ascii"), rectLeft, rectTop, rectRight, rectBottom, Poppler::Page::FromTop, Poppler::Page::IgnoreCase), true );
QCOMPARE( page->search(QStringLiteral("latin1:"), rectLeft, rectTop, rectRight, rectBottom, Poppler::Page::FromTop), false );
QCOMPARE( page->search(QString::fromUtf8("é"), rectLeft, rectTop, rectRight, rectBottom, Poppler::Page::FromTop), true ); //clazy:exclude=qstring-allocations
QCOMPARE( page->search(QString::fromUtf8("à"), rectLeft, rectTop, rectRight, rectBottom, Poppler::Page::FromTop), true ); //clazy:exclude=qstring-allocations
QCOMPARE( page->search(QString::fromUtf8("ç"), rectLeft, rectTop, rectRight, rectBottom, Poppler::Page::FromTop), true ); //clazy:exclude=qstring-allocations
QCOMPARE( page->search(QString::fromUtf8("search \"é\", \"à\" or \"ç\""), rectLeft, rectTop, rectRight, rectBottom, Poppler::Page::FromTop), true ); //clazy:exclude=qstring-allocations
QCOMPARE( page->search(QString::fromUtf8("¥µ©"), rectLeft, rectTop, rectRight, rectBottom, Poppler::Page::FromTop), true ); //clazy:exclude=qstring-allocations
QCOMPARE( page->search(QString::fromUtf8("¥©"), rectLeft, rectTop, rectRight, rectBottom, Poppler::Page::FromTop), false ); //clazy:exclude=qstring-allocations
QCOMPARE( page->search(QStringLiteral("non-ascii:"), rectLeft, rectTop, rectRight, rectBottom, Poppler::Page::FromTop), true );
QCOMPARE( page->search(QStringLiteral("Ascii"), rectLeft, rectTop, rectRight, rectBottom, Poppler::Page::FromTop), false );
QCOMPARE( page->search(QStringLiteral("Ascii"), rectLeft, rectTop, rectRight, rectBottom, Poppler::Page::FromTop, Poppler::Page::IgnoreCase), true );
QCOMPARE( page->search(QStringLiteral("latin1:"), rectLeft, rectTop, rectRight, rectBottom, Poppler::Page::FromTop), false );
QCOMPARE( page->search(QString::fromUtf8("é"), rectLeft, rectTop, rectRight, rectBottom, Poppler::Page::FromTop), true ); //clazy:exclude=qstring-allocations
QCOMPARE( page->search(QString::fromUtf8("à"), rectLeft, rectTop, rectRight, rectBottom, Poppler::Page::FromTop), true ); //clazy:exclude=qstring-allocations
QCOMPARE( page->search(QString::fromUtf8("ç"), rectLeft, rectTop, rectRight, rectBottom, Poppler::Page::FromTop), true ); //clazy:exclude=qstring-allocations
QCOMPARE( page->search(QString::fromUtf8("search \"é\", \"à\" or \"ç\""), rectLeft, rectTop, rectRight, rectBottom, Poppler::Page::FromTop), true ); //clazy:exclude=qstring-allocations
QCOMPARE( page->search(QString::fromUtf8("¥µ©"), rectLeft, rectTop, rectRight, rectBottom, Poppler::Page::FromTop), true ); //clazy:exclude=qstring-allocations
QCOMPARE( page->search(QString::fromUtf8("¥©"), rectLeft, rectTop, rectRight, rectBottom, Poppler::Page::FromTop), false ); //clazy:exclude=qstring-allocations
}
void TestSearch::testNextAndPrevious()
{
QScopedPointer< Poppler::Document > document(Poppler::Document::load(TESTDATADIR "/unittestcases/xr01.pdf"));
QVERIFY( document );
QScopedPointer< Poppler::Page > page(document->page(0));
QVERIFY( page );
double rectLeft = 0.0, rectTop = 0.0, rectRight = page->pageSizeF().width(), rectBottom = page->pageSizeF().height();
QCOMPARE( page->search(QStringLiteral("is"), rectLeft, rectTop, rectRight, rectBottom, Poppler::Page::FromTop), true );
QVERIFY( qAbs(rectLeft - 161.44) < 0.01 );
QVERIFY( qAbs(rectTop - 127.85) < 0.01 );
QVERIFY( qAbs(rectRight - rectLeft - 6.70) < 0.01 );
QVERIFY( qAbs(rectBottom - rectTop - 8.85) < 0.01 );
QCOMPARE( page->search(QStringLiteral("is"), rectLeft, rectTop, rectRight, rectBottom, Poppler::Page::NextResult), true );
QVERIFY( qAbs(rectLeft - 171.46) < 0.01 );
QVERIFY( qAbs(rectTop - 127.85) < 0.01 );
QVERIFY( qAbs(rectRight - rectLeft - 6.70) < 0.01 );
QVERIFY( qAbs(rectBottom - rectTop - 8.85) < 0.01 );
QCOMPARE( page->search(QStringLiteral("is"), rectLeft, rectTop, rectRight, rectBottom, Poppler::Page::NextResult), true );
QVERIFY( qAbs(rectLeft - 161.44) < 0.01 );
QVERIFY( qAbs(rectTop - 139.81) < 0.01 );
QVERIFY( qAbs(rectRight - rectLeft - 6.70) < 0.01 );
QVERIFY( qAbs(rectBottom - rectTop - 8.85) < 0.01 );
QCOMPARE( page->search(QStringLiteral("is"), rectLeft, rectTop, rectRight, rectBottom, Poppler::Page::NextResult), true );
QVERIFY( qAbs(rectLeft - 171.46) < 0.01 );
QVERIFY( qAbs(rectTop - 139.81) < 0.01 );
QVERIFY( qAbs(rectRight - rectLeft - 6.70) < 0.01 );
QVERIFY( qAbs(rectBottom - rectTop - 8.85) < 0.01 );
QCOMPARE( page->search(QStringLiteral("is"), rectLeft, rectTop, rectRight, rectBottom, Poppler::Page::NextResult), false );
QCOMPARE( page->search(QStringLiteral("is"), rectLeft, rectTop, rectRight, rectBottom, Poppler::Page::PreviousResult), true );
QVERIFY( qAbs(rectLeft - 161.44) < 0.01 );
QVERIFY( qAbs(rectTop - 139.81) < 0.01 );
QVERIFY( qAbs(rectRight - rectLeft - 6.70) < 0.01 );
QVERIFY( qAbs(rectBottom - rectTop - 8.85) < 0.01 );
QCOMPARE( page->search(QStringLiteral("is"), rectLeft, rectTop, rectRight, rectBottom, Poppler::Page::PreviousResult), true );
QVERIFY( qAbs(rectLeft - 171.46) < 0.01 );
QVERIFY( qAbs(rectTop - 127.85) < 0.01 );
QVERIFY( qAbs(rectRight - rectLeft - 6.70) < 0.01 );
QVERIFY( qAbs(rectBottom - rectTop - 8.85) < 0.01 );
QCOMPARE( page->search(QStringLiteral("is"), rectLeft, rectTop, rectRight, rectBottom, Poppler::Page::PreviousResult), true );
QVERIFY( qAbs(rectLeft - 161.44) < 0.01 );
QVERIFY( qAbs(rectTop - 127.85) < 0.01 );
QVERIFY( qAbs(rectRight - rectLeft - 6.70) < 0.01 );
QVERIFY( qAbs(rectBottom - rectTop - 8.85) < 0.01 );
QCOMPARE( page->search(QStringLiteral("is"), rectLeft, rectTop, rectRight, rectBottom, Poppler::Page::PreviousResult), false );
rectLeft = 0.0, rectTop = 0.0, rectRight = page->pageSizeF().width(), rectBottom = page->pageSizeF().height();
QCOMPARE( page->search(QStringLiteral("is"), rectLeft, rectTop, rectRight, rectBottom, Poppler::Page::FromTop), true );
QVERIFY( qAbs(rectLeft - 161.44) < 0.01 );
QVERIFY( qAbs(rectTop - 127.85) < 0.01 );
QVERIFY( qAbs(rectRight - rectLeft - 6.70) < 0.01 );
QVERIFY( qAbs(rectBottom - rectTop - 8.85) < 0.01 );
QCOMPARE( page->search(QStringLiteral("is"), rectLeft, rectTop, rectRight, rectBottom, Poppler::Page::NextResult), true );
QVERIFY( qAbs(rectLeft - 171.46) < 0.01 );
QVERIFY( qAbs(rectTop - 127.85) < 0.01 );
QVERIFY( qAbs(rectRight - rectLeft - 6.70) < 0.01 );
QVERIFY( qAbs(rectBottom - rectTop - 8.85) < 0.01 );
QCOMPARE( page->search(QStringLiteral("is"), rectLeft, rectTop, rectRight, rectBottom, Poppler::Page::NextResult), true );
QVERIFY( qAbs(rectLeft - 161.44) < 0.01 );
QVERIFY( qAbs(rectTop - 139.81) < 0.01 );
QVERIFY( qAbs(rectRight - rectLeft - 6.70) < 0.01 );
QVERIFY( qAbs(rectBottom - rectTop - 8.85) < 0.01 );
QCOMPARE( page->search(QStringLiteral("is"), rectLeft, rectTop, rectRight, rectBottom, Poppler::Page::NextResult), true );
QVERIFY( qAbs(rectLeft - 171.46) < 0.01 );
QVERIFY( qAbs(rectTop - 139.81) < 0.01 );
QVERIFY( qAbs(rectRight - rectLeft - 6.70) < 0.01 );
QVERIFY( qAbs(rectBottom - rectTop - 8.85) < 0.01 );
QCOMPARE( page->search(QStringLiteral("is"), rectLeft, rectTop, rectRight, rectBottom, Poppler::Page::NextResult), false );
QCOMPARE( page->search(QStringLiteral("is"), rectLeft, rectTop, rectRight, rectBottom, Poppler::Page::PreviousResult), true );
QVERIFY( qAbs(rectLeft - 161.44) < 0.01 );
QVERIFY( qAbs(rectTop - 139.81) < 0.01 );
QVERIFY( qAbs(rectRight - rectLeft - 6.70) < 0.01 );
QVERIFY( qAbs(rectBottom - rectTop - 8.85) < 0.01 );
QCOMPARE( page->search(QStringLiteral("is"), rectLeft, rectTop, rectRight, rectBottom, Poppler::Page::PreviousResult), true );
QVERIFY( qAbs(rectLeft - 171.46) < 0.01 );
QVERIFY( qAbs(rectTop - 127.85) < 0.01 );
QVERIFY( qAbs(rectRight - rectLeft - 6.70) < 0.01 );
QVERIFY( qAbs(rectBottom - rectTop - 8.85) < 0.01 );
QCOMPARE( page->search(QStringLiteral("is"), rectLeft, rectTop, rectRight, rectBottom, Poppler::Page::PreviousResult), true );
QVERIFY( qAbs(rectLeft - 161.44) < 0.01 );
QVERIFY( qAbs(rectTop - 127.85) < 0.01 );
QVERIFY( qAbs(rectRight - rectLeft - 6.70) < 0.01 );
QVERIFY( qAbs(rectBottom - rectTop - 8.85) < 0.01 );
QCOMPARE( page->search(QStringLiteral("is"), rectLeft, rectTop, rectRight, rectBottom, Poppler::Page::PreviousResult), false );
}
void TestSearch::testWholeWordsOnly()
{
QScopedPointer< Poppler::Document > document(Poppler::Document::load(TESTDATADIR "/unittestcases/WithActualText.pdf"));
QVERIFY( document );
QScopedPointer< Poppler::Page > page(document->page(0));
QVERIFY( page );
const Poppler::Page::SearchDirection direction = Poppler::Page::FromTop;
const Poppler::Page::SearchFlags mode0 = nullptr;
const Poppler::Page::SearchFlags mode1 = Poppler::Page::IgnoreCase;
const Poppler::Page::SearchFlags mode2 = Poppler::Page::WholeWords;
const Poppler::Page::SearchFlags mode3 = Poppler::Page::IgnoreCase | Poppler::Page::WholeWords;
double left, top, right, bottom;
QCOMPARE( page->search(QStringLiteral("brown"), left, top, right, bottom, direction, mode0), true );
QCOMPARE( page->search(QStringLiteral("brOwn"), left, top, right, bottom, direction, mode0), false );
QCOMPARE( page->search(QStringLiteral("brOwn"), left, top, right, bottom, direction, mode1), true );
QCOMPARE( page->search(QStringLiteral("brawn"), left, top, right, bottom, direction, mode1), false );
QCOMPARE( page->search(QStringLiteral("brown"), left, top, right, bottom, direction, mode2), true );
QCOMPARE( page->search(QStringLiteral("own"), left, top, right, bottom, direction, mode2), false );
QCOMPARE( page->search(QStringLiteral("brOwn"), left, top, right, bottom, direction, mode3), true );
QCOMPARE( page->search(QStringLiteral("Own"), left, top, right, bottom, direction, mode3), false );
}
void TestSearch::testIgnoreDiacritics()
{
QScopedPointer< Poppler::Document > document(Poppler::Document::load(TESTDATADIR "/unittestcases/Issue637.pdf"));
QVERIFY( document );
QScopedPointer< Poppler::Page > page(document->page(0));
QVERIFY( page );
const Poppler::Page::SearchDirection direction = Poppler::Page::FromTop;
const Poppler::Page::SearchFlags mode0 = nullptr;
const Poppler::Page::SearchFlags mode1 = Poppler::Page::IgnoreDiacritics;
const Poppler::Page::SearchFlags mode2 = Poppler::Page::IgnoreDiacritics | Poppler::Page::IgnoreCase;
const Poppler::Page::SearchFlags mode3 = Poppler::Page::IgnoreDiacritics | Poppler::Page::IgnoreCase | Poppler::Page::WholeWords;
const Poppler::Page::SearchFlags mode4 = Poppler::Page::IgnoreCase | Poppler::Page::WholeWords;
double left, top, right, bottom;
// Test pdf (Issue637.pdf) just contains the following three lines:
// La cigüeña voló sobre nuestras cabezas.
// La cigogne a survolé nos têtes.
// Der Storch flog über unsere Köpfe hinweg.
QCOMPARE( page->search(QStringLiteral("ciguena"), left, top, right, bottom, direction, mode0), false );
QCOMPARE( page->search(QStringLiteral("Ciguena"), left, top, right, bottom, direction, mode1), false );
QCOMPARE( page->search(QStringLiteral("ciguena"), left, top, right, bottom, direction, mode1), true );
QCOMPARE( page->search(QString::fromUtf8("cigüeña"), left, top, right, bottom, direction, mode1), true ); //clazy:exclude=qstring-allocations
QCOMPARE( page->search(QString::fromUtf8("cigüena"), left, top, right, bottom, direction, mode1), false ); //clazy:exclude=qstring-allocations
QCOMPARE( page->search(QString::fromUtf8("Cigüeña"), left, top, right, bottom, direction, mode1), false ); //clazy:exclude=qstring-allocations
QCOMPARE( page->search(QStringLiteral("Ciguena"), left, top, right, bottom, direction, mode2), true );
QCOMPARE( page->search(QStringLiteral("ciguena"), left, top, right, bottom, direction, mode2), true );
QCOMPARE( page->search(QStringLiteral("Ciguena"), left, top, right, bottom, direction, mode3), true );
QCOMPARE( page->search(QStringLiteral("ciguena"), left, top, right, bottom, direction, mode3), true );
QCOMPARE( page->search(QString::fromUtf8("cigüeña"), left, top, right, bottom, direction, mode4), true ); //clazy:exclude=qstring-allocations
QCOMPARE( page->search(QString::fromUtf8("Cigüeña"), left, top, right, bottom, direction, mode4), true ); //clazy:exclude=qstring-allocations
QCOMPARE( page->search(QString::fromUtf8("cigüena"), left, top, right, bottom, direction, mode4), false ); //clazy:exclude=qstring-allocations
QCOMPARE( page->search(QStringLiteral("Ciguena"), left, top, right, bottom, direction, mode4), false );
QCOMPARE( page->search(QStringLiteral("kopfe"), left, top, right, bottom, direction, mode2), true );
QCOMPARE( page->search(QStringLiteral("kopfe"), left, top, right, bottom, direction, mode3), true );
QCOMPARE( page->search(QStringLiteral("uber"), left, top, right, bottom, direction, mode0), false );
QCOMPARE( page->search(QStringLiteral("uber"), left, top, right, bottom, direction, mode1), true );
QCOMPARE( page->search(QStringLiteral("uber"), left, top, right, bottom, direction, mode2), true );
QCOMPARE( page->search(QStringLiteral("uber"), left, top, right, bottom, direction, mode3), true );
QCOMPARE( page->search(QStringLiteral("vole"), left, top, right, bottom, direction, mode2), true );
QCOMPARE( page->search(QStringLiteral("vole"), left, top, right, bottom, direction, mode3), false );
QCOMPARE( page->search(QStringLiteral("survole"), left, top, right, bottom, direction, mode3), true );
QCOMPARE( page->search(QStringLiteral("tete"), left, top, right, bottom, direction, mode3), false );
QCOMPARE( page->search(QStringLiteral("tete"), left, top, right, bottom, direction, mode2), true );
QCOMPARE( page->search(QStringLiteral("La Ciguena Volo"), left, top, right, bottom, direction, mode2), true );
QCOMPARE( page->search(QStringLiteral("Survole Nos Tetes"), left, top, right, bottom, direction, mode2), true );
QCOMPARE( page->search(QStringLiteral("Uber Unsere Kopfe"), left, top, right, bottom, direction, mode2), true );
}
void TestSearch::testRussianSearch()
{
// Test for issue #743
QScopedPointer< Poppler::Document > document(Poppler::Document::load(TESTDATADIR "/unittestcases/russian.pdf"));
QVERIFY( document );
QScopedPointer< Poppler::Page > page(document->page(0));
QVERIFY( page );
const Poppler::Page::SearchDirection direction = Poppler::Page::FromTop;
const Poppler::Page::SearchFlags mode0 = Poppler::Page::NoSearchFlags;
const Poppler::Page::SearchFlags mode1 = Poppler::Page::IgnoreDiacritics;
const Poppler::Page::SearchFlags mode2 = Poppler::Page::IgnoreDiacritics | Poppler::Page::IgnoreCase;
const Poppler::Page::SearchFlags mode0W = mode0 | Poppler::Page::WholeWords;
const Poppler::Page::SearchFlags mode1W = mode1 | Poppler::Page::WholeWords;
const Poppler::Page::SearchFlags mode2W = mode2 | Poppler::Page::WholeWords;
double l, t, r, b; //left, top, right, bottom
// In the searched page 5, these two words do exist: простой and Простой
const QString str = QString::fromUtf8("простой"); //clazy:exclude=qstring-allocations
QCOMPARE( page->search(str, l, t, r, b, direction, mode0), true );
QCOMPARE( page->search(str, l, t, r, b, direction, mode1), true );
QCOMPARE( page->search(str, l, t, r, b, direction, mode2), true );
QCOMPARE( page->search(str, l, t, r, b, direction, mode0W), true );
QCOMPARE( page->search(str, l, t, r, b, direction, mode1W), true );
QCOMPARE( page->search(str, l, t, r, b, direction, mode2W), true );
}
QTEST_GUILESS_MAIN(TestSearch)
#include "check_search.moc"