#include <QtTest/QtTest>

#include <poppler-qt4.h>

class TestMetaData: public QObject
{
    Q_OBJECT
private slots:
    void checkStrings_data();
    void checkStrings();
    void checkStrings2_data();
    void checkStrings2();
    void checkStringKeys();
    void checkLinearised();
    void checkNumPages();
    void checkDate();
    void checkPageSize();
    void checkPortraitOrientation();
    void checkLandscapeOrientation();
    void checkUpsideDownOrientation();
    void checkSeascapeOrientation();
    void checkVersion();
};

void TestMetaData::checkStrings_data()
{
    QTest::addColumn<QString>("key");
    QTest::addColumn<QString>("value");

    QTest::newRow( "Author" ) << "Author" << "Brad Hards";
    QTest::newRow( "Title" ) << "Title" << "Two pages";
    QTest::newRow( "Subject" ) << "Subject"
			       << "A two page layout for poppler testing";
    QTest::newRow( "Keywords" ) << "Keywords" << "Qt4 bindings";
    QTest::newRow( "Creator" ) << "Creator" << "iText: cgpdftops CUPS filter";
    QTest::newRow( "Producer" ) << "Producer" << "Acrobat Distiller 7.0 for Macintosh";
}

void TestMetaData::checkStrings()
{
    Poppler::Document *doc;
    doc = Poppler::Document::load("../../../test/unittestcases/doublepage.pdf");
    QVERIFY( doc );

    QFETCH( QString, key );
    QFETCH( QString, value );
    QCOMPARE( doc->info(key), value );

    delete doc;
}

void TestMetaData::checkStrings2_data()
{
    QTest::addColumn<QString>("key");
    QTest::addColumn<QString>("value");

    QTest::newRow( "Title" ) << "Title" << "Malaga hotels";
    QTest::newRow( "Author" ) << "Author" << "Brad Hards";
    QTest::newRow( "Creator" ) << "Creator" << "Safari: cgpdftops CUPS filter";
    QTest::newRow( "Producer" )  << "Producer" << "Acrobat Distiller 7.0 for Macintosh";
    QTest::newRow( "Keywords" ) << "Keywords" << "First\rSecond\rthird";
    QTest::newRow( "Custom1" ) << "Custom1" << "CustomValue1";
    QTest::newRow( "Custom2" ) << "Custom2" << "CustomValue2";
}

void TestMetaData::checkStrings2()
{
    Poppler::Document *doc;
    doc = Poppler::Document::load("../../../test/unittestcases/truetype.pdf");
    QVERIFY( doc );

    QFETCH( QString, key );
    QFETCH( QString, value );
    QCOMPARE( doc->info(key), value );

    delete doc;
}

void TestMetaData::checkStringKeys()
{
    Poppler::Document *doc;
    doc = Poppler::Document::load("../../../test/unittestcases/truetype.pdf");
    QVERIFY( doc );

    QStringList keyList;
    keyList << "Title" << "Author" << "Creator" << "Keywords" << "CreationDate";
    keyList << "Producer" << "ModDate" << "Custom1" << "Custom2";
    keyList.sort();
    QStringList keysInDoc = doc->infoKeys();
    keysInDoc.sort();
    QCOMPARE( keysInDoc, keyList );

    delete doc;
}

void TestMetaData::checkLinearised()
{
    Poppler::Document *doc;
    doc = Poppler::Document::load("../../../test/unittestcases/orientation.pdf");
    QVERIFY( doc );

    QVERIFY( doc->isLinearized() );

    delete doc;

    doc = Poppler::Document::load("../../../test/unittestcases/truetype.pdf");
    QVERIFY( doc );
    QEXPECT_FAIL("", "We don't yet handle linearisation correctly", Continue);
    QCOMPARE( doc->isLinearized(), false );

    delete doc;
}

void TestMetaData::checkPortraitOrientation()
{
    Poppler::Document *doc;
    doc = Poppler::Document::load("../../../test/unittestcases/orientation.pdf");
    QVERIFY( doc );
  
    Poppler::Page *page = doc->page(0);
    QCOMPARE( page->orientation(), Poppler::Page::Portrait );

    delete page;
    delete doc;
}

void TestMetaData::checkNumPages()
{
    Poppler::Document *doc;
    doc = Poppler::Document::load("../../../test/unittestcases/doublepage.pdf");
    QVERIFY( doc );
    QCOMPARE( doc->numPages(), 2 );

    delete doc;

    doc = Poppler::Document::load("../../../test/unittestcases/truetype.pdf");
    QVERIFY( doc );
    QCOMPARE( doc->numPages(), 1 );

    delete doc;
}

void TestMetaData::checkDate()
{
    Poppler::Document *doc;

    doc = Poppler::Document::load("../../../test/unittestcases/truetype.pdf");
    QVERIFY( doc );
    QCOMPARE( doc->date("ModDate"), QDateTime(QDate(2005, 12, 5), QTime(9,44,46), Qt::UTC ) );
    QCOMPARE( doc->date("CreationDate"), QDateTime(QDate(2005, 8, 13), QTime(1,12,11), Qt::UTC ) );

    delete doc;
}

void TestMetaData::checkPageSize()
{
    Poppler::Document *doc;

    doc = Poppler::Document::load("../../../test/unittestcases/truetype.pdf");
    QVERIFY( doc );
    Poppler::Page *page = doc->page(0);
    QCOMPARE( page->pageSize(), QSize(595, 842) );
    QCOMPARE( page->pageSizeF(), QSizeF(595.22, 842) );

    delete page;
    delete doc;
}


void TestMetaData::checkLandscapeOrientation()
{
    Poppler::Document *doc;
    doc = Poppler::Document::load("../../../test/unittestcases/orientation.pdf");
    QVERIFY( doc );
  
    Poppler::Page *page = doc->page(1);
    QCOMPARE( page->orientation(), Poppler::Page::Landscape );

    delete page;
    delete doc;
}

void TestMetaData::checkUpsideDownOrientation()
{
    Poppler::Document *doc;
    doc = Poppler::Document::load("../../../test/unittestcases/orientation.pdf");
    QVERIFY( doc );

    Poppler::Page *page = doc->page(2);
    QCOMPARE( page->orientation(), Poppler::Page::UpsideDown );

    delete page;
    delete doc;
}

void TestMetaData::checkSeascapeOrientation()
{
    Poppler::Document *doc;
    doc = Poppler::Document::load("../../../test/unittestcases/orientation.pdf");
    QVERIFY( doc );

    Poppler::Page *page = doc->page(3);
    QCOMPARE( page->orientation(), Poppler::Page::Seascape );

    delete page;
    delete doc;
}

void TestMetaData::checkVersion()
{
    Poppler::Document *doc;
    doc = Poppler::Document::load("../../../test/unittestcases/doublepage.pdf");
    QVERIFY( doc );

    QCOMPARE( doc->pdfVersion(), 1.6 );
    int major = 0, minor = 0;
    doc->getPdfVersion( &major, &minor );
    QCOMPARE( major, 1 );
    QCOMPARE( minor, 6 );

    delete doc;
}

QTEST_MAIN(TestMetaData)
#include "check_metadata.moc"

