mirror of
https://bitbucket.org/smil3y/kde-extraapps.git
synced 2025-02-23 18:32:53 +00:00
194 lines
6.3 KiB
C++
194 lines
6.3 KiB
C++
/***************************************************************************
|
|
* Copyright (C) 2013 by Albert Astals Cid <aacid@kde.org> *
|
|
* *
|
|
* 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 <qtest_kde.h>
|
|
|
|
#include "../part.h"
|
|
#include "../ui/toc.h"
|
|
|
|
#include <KConfigDialog>
|
|
#include <KStandardDirs>
|
|
#include <KTempDir>
|
|
|
|
#include <QTreeView>
|
|
|
|
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.setFragment("src:100" + texDestination);
|
|
part.openUrl(u);
|
|
QCOMPARE(part.m_document->currentPage(), 1u);
|
|
#endif
|
|
}
|
|
|
|
void PartTest::testFowardPDF_data()
|
|
{
|
|
QTest::addColumn<QString>("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<KUrl>(); /*as done by kapplication*/
|
|
qRegisterMetaType<KUrl::List>();
|
|
Okular::PartTest test;
|
|
KGlobal::ref(); /* don't quit qeventloop after closing a mainwindow */
|
|
return QTest::qExec( &test, argc, argv );
|
|
}
|
|
|
|
#include "parttest.moc"
|