1 /***************************************************************************
2 testqgsapppython.cpp
3 --------------------
4 Date : May 2016
5 Copyright : (C) 2016 by Nyall Dawson
6 Email : nyall dot dawson at gmail dot com
7 ***************************************************************************
8 * *
9 * This program is free software; you can redistribute it and/or modify *
10 * it under the terms of the GNU General Public License as published by *
11 * the Free Software Foundation; either version 2 of the License, or *
12 * (at your option) any later version. *
13 * *
14 ***************************************************************************/
15 #include <QApplication>
16 #include <QObject>
17 #include <QSplashScreen>
18 #include <QString>
19 #include <QStringList>
20 #include "qgstest.h"
21
22 #include <qgisapp.h>
23 #include <qgsapplication.h>
24 #include "qgspythonutils.h"
25
26 /**
27 * \ingroup UnitTests
28 * This is a unit test for the QgisApp python support.
29 */
30 class TestQgisAppPython : public QObject
31 {
32 Q_OBJECT
33
34 public:
35 TestQgisAppPython();
36
37 private slots:
38 void initTestCase();// will be called before the first testfunction is executed.
39 void cleanupTestCase();// will be called after the last testfunction was executed.
init()40 void init() {} // will be called before each testfunction is executed.
cleanup()41 void cleanup() {} // will be called after every testfunction.
42
43 void hasPython();
44 void plugins();
45 void pythonPlugin();
46 void pluginMetadata();
47 void runString();
48 void evalString();
49
50 private:
51 QgisApp *mQgisApp = nullptr;
52 QString mTestDataDir;
53 };
54
55 TestQgisAppPython::TestQgisAppPython() = default;
56
57 //runs before all tests
initTestCase()58 void TestQgisAppPython::initTestCase()
59 {
60 qputenv( "QGIS_PLUGINPATH", QByteArray( TEST_DATA_DIR ) + "/test_plugin_path" );
61
62 // Set up the QgsSettings environment
63 QCoreApplication::setOrganizationName( QStringLiteral( "QGIS" ) );
64 QCoreApplication::setOrganizationDomain( QStringLiteral( "qgis.org" ) );
65 QCoreApplication::setApplicationName( QStringLiteral( "QGIS-TEST" ) );
66
67 qDebug() << "TestQgisAppClipboard::initTestCase()";
68 // init QGIS's paths - true means that all path will be inited from prefix
69 QgsApplication::init();
70 QgsApplication::initQgis();
71 mTestDataDir = QStringLiteral( TEST_DATA_DIR ) + '/'; //defined in CmakeLists.txt
72 mQgisApp = new QgisApp();
73 mQgisApp->loadPythonSupport();
74 }
75
76 //runs after all tests
cleanupTestCase()77 void TestQgisAppPython::cleanupTestCase()
78 {
79 QgsApplication::exitQgis();
80 }
81
hasPython()82 void TestQgisAppPython::hasPython()
83 {
84 QVERIFY( mQgisApp->mPythonUtils->isEnabled() );
85 }
86
plugins()87 void TestQgisAppPython::plugins()
88 {
89 QVERIFY( mQgisApp->mPythonUtils->pluginList().contains( QStringLiteral( "PluginPathTest" ) ) );
90 QVERIFY( !mQgisApp->mPythonUtils->isPluginLoaded( QStringLiteral( "PluginPathTest" ) ) );
91 QVERIFY( mQgisApp->mPythonUtils->listActivePlugins().isEmpty() );
92 // load plugin
93 QVERIFY( !mQgisApp->mPythonUtils->unloadPlugin( QStringLiteral( "PluginPathTest" ) ) );
94 QVERIFY( mQgisApp->mPythonUtils->loadPlugin( QStringLiteral( "PluginPathTest" ) ) );
95 QVERIFY( !mQgisApp->mPythonUtils->isPluginLoaded( QStringLiteral( "PluginPathTest" ) ) );
96 QVERIFY( mQgisApp->mPythonUtils->startPlugin( QStringLiteral( "PluginPathTest" ) ) );
97 QVERIFY( mQgisApp->mPythonUtils->isPluginLoaded( QStringLiteral( "PluginPathTest" ) ) );
98 QCOMPARE( mQgisApp->mPythonUtils->listActivePlugins(), QStringList() << QStringLiteral( "PluginPathTest" ) );
99 }
100
pythonPlugin()101 void TestQgisAppPython::pythonPlugin()
102 {
103 QVERIFY( mQgisApp->mPythonUtils->pluginList().contains( QStringLiteral( "ProcessingPluginTest" ) ) );
104 QVERIFY( mQgisApp->mPythonUtils->loadPlugin( QStringLiteral( "ProcessingPluginTest" ) ) );
105 QVERIFY( mQgisApp->mPythonUtils->startProcessingPlugin( QStringLiteral( "ProcessingPluginTest" ) ) );
106 QVERIFY( !mQgisApp->mPythonUtils->startProcessingPlugin( QStringLiteral( "PluginPathTest" ) ) );
107 }
108
pluginMetadata()109 void TestQgisAppPython::pluginMetadata()
110 {
111 QCOMPARE( mQgisApp->mPythonUtils->getPluginMetadata( QStringLiteral( "not a plugin" ), QStringLiteral( "name" ) ), QStringLiteral( "__error__" ) );
112 QCOMPARE( mQgisApp->mPythonUtils->getPluginMetadata( QStringLiteral( "PluginPathTest" ), QStringLiteral( "invalid" ) ), QStringLiteral( "__error__" ) );
113 QCOMPARE( mQgisApp->mPythonUtils->getPluginMetadata( QStringLiteral( "PluginPathTest" ), QStringLiteral( "name" ) ), QStringLiteral( "plugin path test" ) );
114 QCOMPARE( mQgisApp->mPythonUtils->getPluginMetadata( QStringLiteral( "PluginPathTest" ), QStringLiteral( "qgisMinimumVersion" ) ), QStringLiteral( "2.0" ) );
115 QCOMPARE( mQgisApp->mPythonUtils->getPluginMetadata( QStringLiteral( "PluginPathTest" ), QStringLiteral( "description" ) ), QStringLiteral( "desc" ) );
116 QCOMPARE( mQgisApp->mPythonUtils->getPluginMetadata( QStringLiteral( "PluginPathTest" ), QStringLiteral( "version" ) ), QStringLiteral( "0.1" ) );
117 QCOMPARE( mQgisApp->mPythonUtils->getPluginMetadata( QStringLiteral( "PluginPathTest" ), QStringLiteral( "author" ) ), QStringLiteral( "HM/Oslandia" ) );
118 QCOMPARE( mQgisApp->mPythonUtils->getPluginMetadata( QStringLiteral( "PluginPathTest" ), QStringLiteral( "email" ) ), QStringLiteral( "hugo.mercier@oslandia.com" ) );
119 QCOMPARE( mQgisApp->mPythonUtils->getPluginMetadata( QStringLiteral( "PluginPathTest" ), QStringLiteral( "hasProcessingProvider" ) ), QStringLiteral( "__error__" ) );
120 QVERIFY( !mQgisApp->mPythonUtils->pluginHasProcessingProvider( QStringLiteral( "x" ) ) );
121 QVERIFY( !mQgisApp->mPythonUtils->pluginHasProcessingProvider( QStringLiteral( "PluginPathTest" ) ) );
122
123 QCOMPARE( mQgisApp->mPythonUtils->getPluginMetadata( QStringLiteral( "ProcessingPluginTest" ), QStringLiteral( "name" ) ), QStringLiteral( "processing plugin test" ) );
124 QCOMPARE( mQgisApp->mPythonUtils->getPluginMetadata( QStringLiteral( "ProcessingPluginTest" ), QStringLiteral( "hasProcessingProvider" ) ), QStringLiteral( "yes" ) );
125 QVERIFY( mQgisApp->mPythonUtils->pluginHasProcessingProvider( QStringLiteral( "ProcessingPluginTest" ) ) );
126 }
127
runString()128 void TestQgisAppPython::runString()
129 {
130 QVERIFY( mQgisApp->mPythonUtils->runString( "a=1+1" ) );
131 QVERIFY( !mQgisApp->mPythonUtils->runString( "x" ) );
132 QVERIFY( !mQgisApp->mPythonUtils->runString( "" ) );
133 }
134
evalString()135 void TestQgisAppPython::evalString()
136 {
137 QString result;
138 //good string
139 QVERIFY( mQgisApp->mPythonUtils->evalString( "1+1", result ) );
140 QCOMPARE( result, QString( "2" ) );
141
142 //bad string
143 QVERIFY( !mQgisApp->mPythonUtils->evalString( "1+", result ) );
144 }
145
146
147 QGSTEST_MAIN( TestQgisAppPython )
148 #include "testqgisapppython.moc"
149