File indexing completed on 2024-05-12 16:06:06
0001 /* 0002 SPDX-FileCopyrightText: 2018 Intevation GmbH <intevation@intevation.de> 0003 0004 SPDX-License-Identifier: GPL-2.0-or-later 0005 */ 0006 0007 #include <QTest> 0008 0009 #include "../settings_core.h" 0010 #include "core/document.h" 0011 #include <QMap> 0012 #include <QMimeDatabase> 0013 #include <QMimeType> 0014 #include <QTemporaryFile> 0015 #include <core/form.h> 0016 #include <core/page.h> 0017 0018 class VisibilityTest : public QObject 0019 { 0020 Q_OBJECT 0021 0022 private Q_SLOTS: 0023 void initTestCase(); 0024 void cleanupTestCase(); 0025 0026 void testJavaScriptVisibility(); 0027 void testSaveLoad(); 0028 void testActionVisibility(); 0029 0030 private: 0031 void verifyTargetStates(bool visible); 0032 0033 Okular::Document *m_document; 0034 QMap<QString, Okular::FormField *> m_fields; 0035 }; 0036 0037 void VisibilityTest::initTestCase() 0038 { 0039 Okular::SettingsCore::instance(QStringLiteral("visibilitytest")); 0040 m_document = new Okular::Document(nullptr); 0041 0042 const QString testFile = QStringLiteral(KDESRCDIR "data/visibilitytest.pdf"); 0043 QMimeDatabase db; 0044 const QMimeType mime = db.mimeTypeForFile(testFile); 0045 QCOMPARE(m_document->openDocument(testFile, QUrl(), mime), Okular::Document::OpenSuccess); 0046 0047 // The test document has four buttons: 0048 // HideScriptButton -> Hides targets with JavaScript 0049 // ShowScriptButton -> Shows targets with JavaScript 0050 // HideActionButton -> Hides targets with HideAction 0051 // ShowActionButton -> Shows targets with HideAction 0052 // 0053 // The target fields are: 0054 // TargetButton TargetText TargetCheck TargetDropDown TargetRadio 0055 // 0056 // With two radio buttons named TargetRadio. 0057 0058 const Okular::Page *page = m_document->page(0); 0059 const QList<Okular::FormField *> pageFormFields = page->formFields(); 0060 for (Okular::FormField *ff : pageFormFields) { 0061 m_fields.insert(ff->name(), ff); 0062 } 0063 } 0064 0065 void VisibilityTest::cleanupTestCase() 0066 { 0067 m_document->closeDocument(); 0068 delete m_document; 0069 } 0070 0071 void VisibilityTest::verifyTargetStates(bool visible) 0072 { 0073 QCOMPARE(m_fields[QStringLiteral("TargetButton")]->isVisible(), visible); 0074 QCOMPARE(m_fields[QStringLiteral("TargetText")]->isVisible(), visible); 0075 QCOMPARE(m_fields[QStringLiteral("TargetCheck")]->isVisible(), visible); 0076 QCOMPARE(m_fields[QStringLiteral("TargetDropDown")]->isVisible(), visible); 0077 0078 // Radios do not properly inherit a name from the parent group so 0079 // this does not work yet (And would probably need some list handling). 0080 // QCOMPARE( m_fields[QStringLiteral( "TargetRadio" )].isVisible(), visible ); 0081 } 0082 0083 void VisibilityTest::testJavaScriptVisibility() 0084 { 0085 auto hideBtn = m_fields[QStringLiteral("HideScriptButton")]; 0086 auto showBtn = m_fields[QStringLiteral("ShowScriptButton")]; 0087 0088 // We start with all fields visible 0089 verifyTargetStates(true); 0090 0091 m_document->processAction(hideBtn->activationAction()); 0092 0093 // Now all should be hidden 0094 verifyTargetStates(false); 0095 0096 // And show again 0097 m_document->processAction(showBtn->activationAction()); 0098 verifyTargetStates(true); 0099 } 0100 0101 void VisibilityTest::testSaveLoad() 0102 { 0103 auto hideBtn = m_fields[QStringLiteral("HideScriptButton")]; 0104 auto showBtn = m_fields[QStringLiteral("ShowScriptButton")]; 0105 0106 // We start with all fields visible 0107 verifyTargetStates(true); 0108 0109 m_document->processAction(hideBtn->activationAction()); 0110 0111 // Now all should be hidden 0112 verifyTargetStates(false); 0113 0114 // Save the changed states 0115 QTemporaryFile saveFile(QStringLiteral("%1/okrXXXXXX.pdf").arg(QDir::tempPath())); 0116 QVERIFY(saveFile.open()); 0117 saveFile.close(); 0118 0119 QVERIFY(m_document->saveChanges(saveFile.fileName())); 0120 0121 auto newDoc = new Okular::Document(nullptr); 0122 0123 QMimeDatabase db; 0124 const QMimeType mime = db.mimeTypeForFile(saveFile.fileName()); 0125 QCOMPARE(newDoc->openDocument(saveFile.fileName(), QUrl(), mime), Okular::Document::OpenSuccess); 0126 0127 const Okular::Page *page = newDoc->page(0); 0128 0129 bool anyChecked = false; // Saveguard against accidental test passing here ;-) 0130 const QList<Okular::FormField *> pageFormFields = page->formFields(); 0131 for (Okular::FormField *ff : pageFormFields) { 0132 if (ff->name().startsWith(QStringLiteral("Target"))) { 0133 QVERIFY(!ff->isVisible()); 0134 anyChecked = true; 0135 } 0136 } 0137 QVERIFY(anyChecked); 0138 0139 newDoc->closeDocument(); 0140 delete newDoc; 0141 0142 // Restore the state of the member document 0143 m_document->processAction(showBtn->activationAction()); 0144 } 0145 0146 void VisibilityTest::testActionVisibility() 0147 { 0148 auto hideBtn = m_fields[QStringLiteral("HideActionButton")]; 0149 auto showBtn = m_fields[QStringLiteral("ShowActionButton")]; 0150 0151 verifyTargetStates(true); 0152 0153 m_document->processAction(hideBtn->activationAction()); 0154 0155 verifyTargetStates(false); 0156 0157 m_document->processAction(showBtn->activationAction()); 0158 0159 verifyTargetStates(true); 0160 } 0161 0162 QTEST_MAIN(VisibilityTest) 0163 #include "visibilitytest.moc"