/*************************************************************************** * Copyright (C) 2013 by Albert Astals Cid * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * ***************************************************************************/ #include #include "../part.h" #include "../ui/toc.h" #include #include #include #include namespace Okular { class PartTest : public QObject { Q_OBJECT private slots: void testReload(); void testCanceledReload(); void testTOCReload(); void testFowardPDF(); void testFowardPDF_data(); void testGeneratorPreferences(); }; class PartThatHijacksQueryClose : public Okular::Part { public: PartThatHijacksQueryClose(QWidget* parentWidget, QObject* parent, const QVariantList& args, KComponentData componentData) : Okular::Part(parentWidget, parent, args, componentData), behavior(PassThru) {} enum Behavior { PassThru, ReturnTrue, ReturnFalse }; void setQueryCloseBehavior(Behavior new_behavior) { behavior = new_behavior; } bool queryClose() { if (behavior == PassThru) return Okular::Part::queryClose(); else // ReturnTrue or ReturnFalse return (behavior == ReturnTrue); } private: Behavior behavior; }; // Test that Okular doesn't crash after a successful reload void PartTest::testReload() { QVariantList dummyArgs; Okular::Part part(NULL, NULL, dummyArgs, KGlobal::mainComponent()); part.openDocument(KDESRCDIR "data/file1.pdf"); part.reload(); qApp->processEvents(); } // Test that Okular doesn't crash after a canceled reload void PartTest::testCanceledReload() { QVariantList dummyArgs; PartThatHijacksQueryClose part(NULL, NULL, dummyArgs, KGlobal::mainComponent()); part.openDocument(KDESRCDIR "data/file1.pdf"); // When queryClose() returns false, the reload operation is canceled (as if // the user had chosen Cancel in the "Save changes?" message box) part.setQueryCloseBehavior(PartThatHijacksQueryClose::ReturnFalse); part.reload(); qApp->processEvents(); } void PartTest::testTOCReload() { // see TODO in generator_pdf.cpp #if 0 QVariantList dummyArgs; Okular::Part part(NULL, NULL, dummyArgs, KGlobal::mainComponent()); part.openDocument(KDESRCDIR "data/tocreload.pdf"); QCOMPARE(part.m_toc->expandedNodes().count(), 0); part.m_toc->m_treeView->expandAll(); QCOMPARE(part.m_toc->expandedNodes().count(), 3); part.reload(); qApp->processEvents(); QCOMPARE(part.m_toc->expandedNodes().count(), 3); #endif } void PartTest::testFowardPDF() { // source references not implemented #if 0 QFETCH(QString, dir); if (KStandardDirs::findExe("pdflatex").isEmpty()) { QSKIP("pdflatex not available", SkipAll); } QVariantList dummyArgs; Okular::Part part(NULL, NULL, dummyArgs, KGlobal::mainComponent()); KTempDir tempDir(dir); QFile f(KDESRCDIR "data/synctextest.tex"); const QString texDestination = tempDir.name() + "synctextest.tex"; QVERIFY(f.copy(texDestination)); QProcess process; process.setWorkingDirectory(tempDir.name()); process.start("pdflatex", QStringList() << "-synctex=1" << "-interaction=nonstopmode" << texDestination); process.waitForFinished(); const QString pdfResult = tempDir.name() + "synctextest.pdf"; QVERIFY(QFile::exists(pdfResult)); part.openDocument(pdfResult); part.m_document->setViewportPage(0); QCOMPARE(part.m_document->currentPage(), 0u); part.closeUrl(); KUrl u(pdfResult); u.setHTMLRef("src:100" + texDestination); part.openUrl(u); QCOMPARE(part.m_document->currentPage(), 1u); #endif } void PartTest::testFowardPDF_data() { QTest::addColumn("dir"); QTest::newRow("non-utf8") << QString(KGlobal::dirs()->resourceDirs("tmp")[0] + QString::fromUtf8("synctextest")); QTest::newRow("utf8") << QString(KGlobal::dirs()->resourceDirs("tmp")[0] + QString::fromUtf8("ßðđđŋßðđŋ")); } void PartTest::testGeneratorPreferences() { KConfigDialog * dialog; QVariantList dummyArgs; Okular::Part part(NULL, NULL, dummyArgs, KGlobal::mainComponent()); // Test that we don't crash while opening the dialog dialog = part.slotGeneratorPreferences(); qApp->processEvents(); delete dialog; // closes the dialog and recursively destroys all widgets // Test that we don't crash while opening a new instance of the dialog // This catches attempts to reuse widgets that have been destroyed dialog = part.slotGeneratorPreferences(); qApp->processEvents(); delete dialog; } } int main(int argc, char *argv[]) { // This is QTEST_KDEMAIN withouth the LC_ALL set setenv("LC_ALL", "en_US.UTF-8", 1); assert( !QDir::homePath().isEmpty() ); setenv("KDEHOME", QFile::encodeName( QDir::homePath() + QString::fromLatin1("/.kde-unit-test") ), 1); setenv("XDG_DATA_HOME", QFile::encodeName( QDir::homePath() + QString::fromLatin1("/.kde-unit-test/xdg/local") ), 1); setenv("XDG_CONFIG_HOME", QFile::encodeName( QDir::homePath() + QString::fromLatin1("/.kde-unit-test/xdg/config") ), 1); QFile::remove(QDir::homePath() + QString::fromLatin1("/.kde-unit-test/share/config/qttestrc")); // set to okular so that the part.rc file is found KAboutData aboutData( QByteArray("okular"), QByteArray(), ki18n("KDE Test Program"), QByteArray("version") ); KComponentData cData(&aboutData); QApplication app( argc, argv ); app.setApplicationName( QLatin1String("qttest") ); qRegisterMetaType(); /*as done by kapplication*/ qRegisterMetaType(); Okular::PartTest test; KGlobal::ref(); /* don't quit qeventloop after closing a mainwindow */ return QTest::qExec( &test, argc, argv ); } #include "parttest.moc"