#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 checkPdfId();
    void checkNoPdfId();
};

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(TESTDATADIR "/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(TESTDATADIR "/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(TESTDATADIR "/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(TESTDATADIR "/unittestcases/orientation.pdf");
    QVERIFY( doc );

    QVERIFY( doc->isLinearized() );

    delete doc;

    doc = Poppler::Document::load(TESTDATADIR "/unittestcases/truetype.pdf");
    QVERIFY( doc );
    QCOMPARE( doc->isLinearized(), false );

    delete doc;
}

void TestMetaData::checkPortraitOrientation()
{
    Poppler::Document *doc;
    doc = Poppler::Document::load(TESTDATADIR "/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(TESTDATADIR "/unittestcases/doublepage.pdf");
    QVERIFY( doc );
    QCOMPARE( doc->numPages(), 2 );

    delete doc;

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

    delete doc;
}

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

    doc = Poppler::Document::load(TESTDATADIR "/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(TESTDATADIR "/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(TESTDATADIR "/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(TESTDATADIR "/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(TESTDATADIR "/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(TESTDATADIR "/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;
}

void TestMetaData::checkPdfId()
{
    Poppler::Document *doc;
    doc = Poppler::Document::load(TESTDATADIR "/unittestcases/A6EmbeddedFiles.pdf");
    QVERIFY( doc );

    const QByteArray referencePermanentId( "00C9D5B6D8FB11D7A902003065D630AA" );
    const QByteArray referenceUpdateId( "39AECAE6D8FB11D7A902003065D630AA" );

    {
    // no IDs wanted, just existance check
    QVERIFY( doc->getPdfId( 0, 0 ) );
    }
    {
    // only permanent ID
    QByteArray permanentId;
    QVERIFY( doc->getPdfId( &permanentId, 0 ) );
    QCOMPARE( permanentId.toUpper(), referencePermanentId );
    }
    {
    // only update ID
    QByteArray updateId;
    QVERIFY( doc->getPdfId( 0, &updateId ) );
    QCOMPARE( updateId.toUpper(), referenceUpdateId );
    }
    {
    // both IDs
    QByteArray permanentId;
    QByteArray updateId;
    QVERIFY( doc->getPdfId( &permanentId, &updateId ) );
    QCOMPARE( permanentId.toUpper(), referencePermanentId );
    QCOMPARE( updateId.toUpper(), referenceUpdateId );
    }

    delete doc;
}

void TestMetaData::checkNoPdfId()
{
    Poppler::Document *doc;
    doc = Poppler::Document::load(TESTDATADIR "/unittestcases/WithActualText.pdf");
    QVERIFY( doc );

    QVERIFY( !doc->getPdfId( 0, 0 ) );

    delete doc;
}

QTEST_MAIN(TestMetaData)
#include "check_metadata.moc"

