1 /***************************************************************************
2     testqgsdockwidget.cpp
3      ----------------------
4     Date                 : June 2016
5     Copyright            : (C) 2016 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 
16 
17 #include "qgstest.h"
18 
19 #include "qgsdockwidget.h"
20 #include <QApplication>
21 #include <QMainWindow>
22 #include <QAction>
23 #include <QSignalSpy>
24 
25 class TestQgsDockWidget: public QObject
26 {
27     Q_OBJECT
28   private slots:
29     void initTestCase(); // will be called before the first testfunction is executed.
30     void cleanupTestCase(); // will be called after the last testfunction was executed.
31     void init(); // will be called before each testfunction is executed.
32     void cleanup(); // will be called after every testfunction.
33 
34     void testSignals();
35     void testUserVisible();
36     void testSetUserVisible();
37     void testToggleUserVisible();
38     void testAction();
39 
40   private:
41 
42 };
43 
initTestCase()44 void TestQgsDockWidget::initTestCase()
45 {
46 }
47 
cleanupTestCase()48 void TestQgsDockWidget::cleanupTestCase()
49 {
50 }
51 
init()52 void TestQgsDockWidget::init()
53 {
54 }
55 
cleanup()56 void TestQgsDockWidget::cleanup()
57 {
58 }
59 
testSignals()60 void TestQgsDockWidget::testSignals()
61 {
62   QWidget *w = new QWidget();
63   QApplication::setActiveWindow( w ); //required for focus events
64   QgsDockWidget *d = new QgsDockWidget( w );
65 
66   QSignalSpy spyClosedStateChanged( d, SIGNAL( closedStateChanged( bool ) ) );
67   const QSignalSpy spyClosed( d, SIGNAL( closed() ) );
68   QSignalSpy spyOpenedStateChanged( d, SIGNAL( openedStateChanged( bool ) ) );
69   const QSignalSpy spyOpened( d, SIGNAL( opened() ) );
70 
71   w->show();
72 
73   d->show();
74   QCOMPARE( spyClosedStateChanged.count(), 1 );
75   QCOMPARE( spyClosedStateChanged.last().at( 0 ).toBool(), false );
76   QCOMPARE( spyOpenedStateChanged.count(), 1 );
77   QCOMPARE( spyOpenedStateChanged.last().at( 0 ).toBool(), true );
78   QCOMPARE( spyClosed.count(), 0 );
79   QCOMPARE( spyOpened.count(), 1 );
80 
81   d->close();
82   QCOMPARE( spyClosedStateChanged.count(), 2 );
83   QCOMPARE( spyClosedStateChanged.last().at( 0 ).toBool(), true );
84   QCOMPARE( spyOpenedStateChanged.count(), 2 );
85   QCOMPARE( spyOpenedStateChanged.last().at( 0 ).toBool(), false );
86   QCOMPARE( spyClosed.count(), 1 );
87   QCOMPARE( spyOpened.count(), 1 );
88 
89   delete w;
90 }
91 
testUserVisible()92 void TestQgsDockWidget::testUserVisible()
93 {
94   QgsDockWidget *w = new QgsDockWidget();
95   QVERIFY( !w->isUserVisible() );
96 
97   w->show();
98   QVERIFY( w->isUserVisible() );
99 
100   w->hide();
101   QVERIFY( !w->isUserVisible() );
102   delete w;
103 }
104 
testSetUserVisible()105 void TestQgsDockWidget::testSetUserVisible()
106 {
107   QMainWindow *w = new QMainWindow();
108   QApplication::setActiveWindow( w ); //required for focus events
109   QgsDockWidget *d1 = new QgsDockWidget( w );
110   QgsDockWidget *d2 = new QgsDockWidget( w );
111   w->addDockWidget( Qt::RightDockWidgetArea, d1 );
112   w->addDockWidget( Qt::RightDockWidgetArea, d2 );
113   w->tabifyDockWidget( d1, d2 );
114   w->show();
115 
116   QVERIFY( d2->isUserVisible() );
117   QVERIFY( !d1->isUserVisible() );
118 
119   // showing dock widgets
120 
121   // already visible
122   d2->setUserVisible( true );
123   QVERIFY( d2->isUserVisible() );
124   QVERIFY( d2->isVisible() );
125   QVERIFY( !d1->isUserVisible() );
126   QVERIFY( d1->isVisible() );
127 
128   // visible, but hidden by other dock
129   d1->setUserVisible( true );
130   QVERIFY( !d2->isUserVisible() );
131   QVERIFY( d2->isVisible() );
132   QVERIFY( d1->isUserVisible() );
133   QVERIFY( d1->isVisible() );
134 
135   // hidden
136   d2->hide();
137   d2->setUserVisible( true );
138   QVERIFY( d2->isUserVisible() );
139   QVERIFY( d2->isVisible() );
140   QVERIFY( !d1->isUserVisible() );
141   QVERIFY( d1->isVisible() );
142 
143   // hiding dock widgets
144 
145   // already hidden by other tab
146   d1->setUserVisible( false );
147   QVERIFY( d2->isUserVisible() );
148   QVERIFY( d2->isVisible() );
149   QVERIFY( !d1->isUserVisible() );
150   QVERIFY( d1->isVisible() );
151 
152   // already hidden
153   d2->hide();
154   d1->raise(); //shouldn't be necessary outside of tests
155   QVERIFY( !d2->isUserVisible() );
156   QVERIFY( !d2->isVisible() );
157   QVERIFY( d1->isUserVisible() );
158   QVERIFY( d1->isVisible() );
159 
160   d2->setUserVisible( false );
161   QVERIFY( !d2->isUserVisible() );
162   QVERIFY( !d2->isVisible() );
163   QVERIFY( d1->isUserVisible() );
164   QVERIFY( d1->isVisible() );
165 
166   // setting active dock as not user visible should hide it
167   d2->show();
168   d1->raise();
169   QVERIFY( !d2->isUserVisible() );
170   QVERIFY( d2->isVisible() );
171   QVERIFY( d1->isUserVisible() );
172   QVERIFY( d1->isVisible() );
173 
174   d1->setUserVisible( false );
175   QVERIFY( d2->isVisible() );
176   QVERIFY( !d1->isUserVisible() );
177   QVERIFY( !d1->isVisible() );
178 
179   delete w;
180 
181 }
182 
testToggleUserVisible()183 void TestQgsDockWidget::testToggleUserVisible()
184 {
185   QMainWindow *w = new QMainWindow();
186   QApplication::setActiveWindow( w ); //required for focus events
187   QgsDockWidget *d1 = new QgsDockWidget( w );
188   QgsDockWidget *d2 = new QgsDockWidget( w );
189   w->addDockWidget( Qt::RightDockWidgetArea, d1 );
190   w->addDockWidget( Qt::RightDockWidgetArea, d2 );
191   w->tabifyDockWidget( d1, d2 );
192   w->show();
193 
194   QVERIFY( d2->isUserVisible() );
195   QVERIFY( !d1->isUserVisible() );
196 
197   d1->toggleUserVisible();
198   QVERIFY( !d2->isUserVisible() );
199   QVERIFY( d2->isVisible() );
200   QVERIFY( d1->isUserVisible() );
201   QVERIFY( d1->isVisible() );
202 
203   d2->hide();
204   d2->toggleUserVisible();
205   QVERIFY( d2->isUserVisible() );
206   QVERIFY( d2->isVisible() );
207   QVERIFY( !d1->isUserVisible() );
208   QVERIFY( d1->isVisible() );
209 
210   d2->hide();
211   d1->raise(); //shouldn't be necessary outside of tests
212   QVERIFY( !d2->isUserVisible() );
213   QVERIFY( !d2->isVisible() );
214   QVERIFY( d1->isUserVisible() );
215   QVERIFY( d1->isVisible() );
216 
217   d1->toggleUserVisible();
218   QVERIFY( !d2->isVisible() );
219   QVERIFY( !d1->isUserVisible() );
220   QVERIFY( !d1->isVisible() );
221 
222   delete w;
223 
224 }
225 
testAction()226 void TestQgsDockWidget::testAction()
227 {
228   QMainWindow *w = new QMainWindow();
229   QApplication::setActiveWindow( w ); //required for focus events
230   QgsDockWidget *d1 = new QgsDockWidget( w );
231   QgsDockWidget *d2 = new QgsDockWidget( w );
232   w->addDockWidget( Qt::RightDockWidgetArea, d1 );
233   w->addDockWidget( Qt::RightDockWidgetArea, d2 );
234   w->tabifyDockWidget( d1, d2 );
235   w->show();
236 
237   QAction *a1 = new QAction( w );
238   QAction *a2 = new QAction( w );
239 
240   QVERIFY( ! d1->toggleVisibilityAction() );
241   d1->setToggleVisibilityAction( a1 );
242   d2->setToggleVisibilityAction( a2 );
243   QVERIFY( a1->isCheckable() );
244   QVERIFY( a2->isCheckable() );
245   QCOMPARE( d1->toggleVisibilityAction(), a1 );
246   QCOMPARE( d2->toggleVisibilityAction(), a2 );
247 
248   QVERIFY( d2->isUserVisible() );
249   QVERIFY( a2->isChecked() );
250   QVERIFY( !d1->isUserVisible() );
251   QVERIFY( !a1->isChecked() );
252 
253   a1->setChecked( true );
254   QVERIFY( !d2->isUserVisible() );
255   QVERIFY( !a2->isChecked() );
256   QVERIFY( d1->isUserVisible() );
257   QVERIFY( a1->isChecked() );
258 
259   a1->setChecked( true );
260   QVERIFY( !d2->isUserVisible() );
261   QVERIFY( !a2->isChecked() );
262   QVERIFY( d1->isUserVisible() );
263   QVERIFY( a1->isChecked() );
264 
265   a2->setChecked( true );
266   QVERIFY( d2->isUserVisible() );
267   QVERIFY( a2->isChecked() );
268   QVERIFY( !d1->isUserVisible() );
269   QVERIFY( !a1->isChecked() );
270 
271   d2->hide();
272   d1->raise(); //shouldn't be necessary outside of tests
273   QVERIFY( !a2->isChecked() );
274   QVERIFY( d1->isUserVisible() );
275   QVERIFY( a1->isChecked() );
276 
277   a1->setChecked( false );
278   QVERIFY( !d1->isUserVisible() );
279   QVERIFY( !a1->isChecked() );
280 }
281 
282 QGSTEST_MAIN( TestQgsDockWidget )
283 #include "testqgsdockwidget.moc"
284