File indexing completed on 2024-05-19 15:46:56

0001 /*
0002     SPDX-FileCopyrightText: 2011 Silvère Lestang <silvere.lestang@gmail.com>
0003 
0004     SPDX-License-Identifier: GPL-2.0-or-later
0005 */
0006 
0007 #include "test_standardoutputview.h"
0008 
0009 #include <QAction>
0010 #include <QStackedWidget>
0011 #include <QStandardItemModel>
0012 #include <QItemDelegate>
0013 #include <QTreeView>
0014 #include <QTest>
0015 
0016 #include <KLocalizedString>
0017 
0018 #include <tests/testcore.h>
0019 #include <tests/autotestshell.h>
0020 #include <sublime/view.h>
0021 #include <sublime/controller.h>
0022 #include <sublime/area.h>
0023 #include <sublime/tooldocument.h>
0024 #include <interfaces/iplugincontroller.h>
0025 #include <outputview/ioutputview.h>
0026 
0027 #include "../outputwidget.h"
0028 #include "../toolviewdata.h"
0029 
0030 namespace {
0031 QByteArray toolViewConfigSubgroup()
0032 {
0033     return QByteArrayLiteral("test_toolview");
0034 }
0035 QString toolViewTitle()
0036 {
0037     return QStringLiteral("my_toolview");
0038 }
0039 }
0040 
0041 namespace KDevelop
0042 {
0043     class IUiController;
0044 }
0045 
0046 QTEST_MAIN(StandardOutputViewTest)
0047 
0048 void StandardOutputViewTest::initTestCase()
0049 {
0050     KDevelop::AutoTestShell::init({QStringLiteral("KDevStandardOutputView")});
0051     m_testCore = new KDevelop::TestCore();
0052     m_testCore->initialize(KDevelop::Core::Default);
0053 
0054     m_controller = m_testCore->uiControllerInternal();
0055 
0056     QTest::qWait(500); // makes sure that everything is loaded (don't know if it's required)
0057 
0058     m_stdOutputView = nullptr;
0059     KDevelop::IPluginController* plugin_controller = m_testCore->pluginController();
0060 
0061     // make sure KDevStandardOutputView is loaded
0062     KDevelop::IPlugin* plugin = plugin_controller->loadPlugin(QStringLiteral("KDevStandardOutputView"));
0063     QVERIFY(plugin);
0064     m_stdOutputView =  dynamic_cast<KDevelop::IOutputView*>(plugin);
0065     QVERIFY(m_stdOutputView);
0066 }
0067 
0068 void StandardOutputViewTest::cleanupTestCase()
0069 {
0070      m_testCore->cleanup();
0071      delete m_testCore;
0072 }
0073 
0074 OutputWidget* StandardOutputViewTest::toolViewPointer(const QString& toolViewTitle)
0075 {
0076     const QList< Sublime::View* > views = m_controller->activeArea()->toolViews();
0077     for (Sublime::View* view : views) {
0078         auto* doc = qobject_cast<Sublime::ToolDocument*>(view->document());
0079         if(doc) {
0080             if(doc->title() == toolViewTitle && view->hasWidget()) {
0081                 // cannot use qobject_cast here, test code currently slightly fragile due to
0082                 // duplicated compilation of OutputWidget, here & loaded plugin
0083                 // cmp. comment in CMakeLists.txt
0084                 return dynamic_cast<OutputWidget*>(view->widget());
0085             }
0086         }
0087     }
0088     return nullptr;
0089 }
0090 
0091 void StandardOutputViewTest::testRegisterAndRemoveToolView()
0092 {
0093     toolViewId = m_stdOutputView->registerToolView(toolViewConfigSubgroup(), toolViewTitle(),
0094                                                    KDevelop::IOutputView::HistoryView);
0095     QVERIFY(toolViewPointer(toolViewTitle()));
0096 
0097     // re-registering should return the same tool view instead of creating a new one
0098     QCOMPARE(toolViewId,
0099              m_stdOutputView->registerToolView(toolViewConfigSubgroup(), toolViewTitle(),
0100                                                KDevelop::IOutputView::HistoryView));
0101 
0102     m_stdOutputView->removeToolView(toolViewId);
0103     QVERIFY(!toolViewPointer(toolViewTitle()));
0104 }
0105 
0106 void StandardOutputViewTest::testActions()
0107 {
0108     toolViewId = m_stdOutputView->registerToolView(toolViewConfigSubgroup(), toolViewTitle(),
0109                                                    KDevelop::IOutputView::MultipleView, QIcon());
0110     OutputWidget* outputWidget = toolViewPointer(toolViewTitle());
0111     QVERIFY(outputWidget);
0112 
0113     QList<QAction*> actions = outputWidget->actions();
0114     QCOMPARE(actions.size(), 13);
0115 
0116     m_stdOutputView->removeToolView(toolViewId);
0117     QVERIFY(!toolViewPointer(toolViewTitle()));
0118 
0119     QList<QAction*> addedActions;
0120     addedActions.append(new QAction(QStringLiteral("Action1"), this));
0121     addedActions.append(new QAction(QStringLiteral("Action2"), this));
0122     toolViewId = m_stdOutputView->registerToolView(
0123         toolViewConfigSubgroup(), toolViewTitle(), KDevelop::IOutputView::HistoryView, QIcon(),
0124         KDevelop::IOutputView::ShowItemsButton | KDevelop::IOutputView::AddFilterAction, addedActions);
0125     outputWidget = toolViewPointer(toolViewTitle());
0126     QVERIFY(outputWidget);
0127 
0128     actions = outputWidget->actions();
0129     QCOMPARE(actions.size(), 18);
0130     QCOMPARE(actions[actions.size()-2]->text(), addedActions[0]->text());
0131     QCOMPARE(actions[actions.size()-1]->text(), addedActions[1]->text());
0132 
0133     m_stdOutputView->removeToolView(toolViewId);
0134     QVERIFY(!toolViewPointer(toolViewTitle()));
0135 }
0136 
0137 void StandardOutputViewTest::testRegisterAndRemoveOutput()
0138 {
0139     toolViewId = m_stdOutputView->registerToolView(toolViewConfigSubgroup(), toolViewTitle(),
0140                                                    KDevelop::IOutputView::MultipleView, QIcon());
0141     OutputWidget* outputWidget = toolViewPointer(toolViewTitle());
0142     QVERIFY(outputWidget);
0143 
0144     for(int i = 0; i < 5; i++)
0145     {
0146         outputId[i] = m_stdOutputView->registerOutputInToolView(toolViewId, QStringLiteral("output%1").arg(i));
0147     }
0148     for(int i = 0; i < 5; i++)
0149     {
0150         QCOMPARE(outputWidget->data->outputdata.value(outputId[i])->title, QStringLiteral("output%1").arg(i));
0151         QCOMPARE(outputWidget->m_tabwidget->tabText(i), QStringLiteral("output%1").arg(i));
0152     }
0153     for (int id : outputId) {
0154         m_stdOutputView->removeOutput(id);
0155         QVERIFY(!outputWidget->data->outputdata.contains(id));
0156     }
0157     QCOMPARE(outputWidget->m_tabwidget->count(), 0);
0158 
0159     m_stdOutputView->removeToolView(toolViewId);
0160     QVERIFY(!toolViewPointer(toolViewTitle()));
0161 
0162     toolViewId = m_stdOutputView->registerToolView(
0163         toolViewConfigSubgroup(), toolViewTitle(), KDevelop::IOutputView::HistoryView, QIcon(),
0164         KDevelop::IOutputView::ShowItemsButton | KDevelop::IOutputView::AddFilterAction);
0165     outputWidget = toolViewPointer(toolViewTitle());
0166     QVERIFY(outputWidget);
0167 
0168     for(int i = 0; i < 5; i++)
0169     {
0170         outputId[i] = m_stdOutputView->registerOutputInToolView(toolViewId, QStringLiteral("output%1").arg(i));
0171     }
0172     for(int i = 0; i < 5; i++)
0173     {
0174         QCOMPARE(outputWidget->data->outputdata.value(outputId[i])->title, QStringLiteral("output%1").arg(i));
0175     }
0176     for (int id : outputId) {
0177         m_stdOutputView->removeOutput(id);
0178         QVERIFY(!outputWidget->data->outputdata.contains(id));
0179     }
0180     QCOMPARE(outputWidget->m_stackwidget->count(), 0);
0181 
0182     m_stdOutputView->removeToolView(toolViewId);
0183     QVERIFY(!toolViewPointer(toolViewTitle()));
0184 }
0185 
0186 void StandardOutputViewTest::testSetModelAndDelegate()
0187 {
0188     toolViewId = m_stdOutputView->registerToolView(toolViewConfigSubgroup(), toolViewTitle(),
0189                                                    KDevelop::IOutputView::MultipleView, QIcon());
0190     OutputWidget* outputWidget = toolViewPointer(toolViewTitle());
0191     QVERIFY(outputWidget);
0192 
0193     QAbstractItemModel* model = new QStandardItemModel;
0194     QPointer<QAbstractItemModel> checkModel(model);
0195     QAbstractItemDelegate* delegate = new QItemDelegate;
0196     QPointer<QAbstractItemDelegate> checkDelegate(delegate);
0197 
0198     outputId[0] = m_stdOutputView->registerOutputInToolView(toolViewId, QStringLiteral("output"));
0199     m_stdOutputView->setModel(outputId[0], model);
0200     m_stdOutputView->setDelegate(outputId[0], delegate);
0201 
0202     QCOMPARE(outputWidget->m_views.value(outputId[0]).view->model(), model);
0203     QCOMPARE(outputWidget->m_views.value(outputId[0]).view->itemDelegate(), delegate);
0204 
0205     QVERIFY(model->parent()); // they have a parent (the outputdata), so parent() != 0x0
0206     QVERIFY(delegate->parent());
0207 
0208     m_stdOutputView->removeToolView(toolViewId);
0209     QVERIFY(!toolViewPointer(toolViewTitle()));
0210 
0211     // view deleted, hence model + delegate deleted
0212     QVERIFY(!checkModel.data());
0213     QVERIFY(!checkDelegate.data());
0214 }
0215 
0216 void StandardOutputViewTest::testStandardToolViews()
0217 {
0218     QFETCH(KDevelop::IOutputView::StandardToolView, view);
0219     int id = m_stdOutputView->standardToolView(view);
0220     QVERIFY(id);
0221     QCOMPARE(id, m_stdOutputView->standardToolView(view));
0222 }
0223 
0224 void StandardOutputViewTest::testStandardToolViews_data()
0225 {
0226     QTest::addColumn<KDevelop::IOutputView::StandardToolView>("view");
0227 
0228     QTest::newRow("build") << KDevelop::IOutputView::BuildView;
0229     QTest::newRow("run") << KDevelop::IOutputView::RunView;
0230     QTest::newRow("debug") << KDevelop::IOutputView::DebugView;
0231     QTest::newRow("test") << KDevelop::IOutputView::TestView;
0232     QTest::newRow("vcs") << KDevelop::IOutputView::VcsView;
0233 }
0234 
0235 #include "moc_test_standardoutputview.cpp"