@@ -0,0 +1,302 @@
1+/*
2+ * Copyright 2012 Canonical Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU Lesser General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU Lesser General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU Lesser General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ *
16+ * Authors:
17+ * Renato Araujo Oliveira Filho <renato@canonical.com>
18+ */
19+
20+#include "menucontentactivator.h"
21+#include "paths.h"
22+
23+#include <QtTest>
24+#include <QDebug>
25+
26+class FakeTimer : public UnityIndicators::AbstractTimer
27+{
28+ Q_OBJECT
29+public:
30+ FakeTimer(QObject *parent = 0)
31+ : UnityIndicators::AbstractTimer(parent)
32+ {}
33+
34+ virtual int interval() const { return m_duration; }
35+ virtual void setInterval(int msecs) { m_duration = msecs; }
36+
37+ void emitTimeout() {
38+ if (isRunning()) {
39+ Q_EMIT timeout();
40+ }
41+ }
42+private:
43+ int m_duration;
44+};
45+
46+
47+class MenuConentActivatorTest : public QObject
48+{
49+ Q_OBJECT
50+private Q_SLOTS:
51+ void init() // called right before each and every test function is executed
52+ {
53+ m_fakeTimeSource = new FakeTimer(this);
54+ m_deltas.clear();
55+ }
56+ void cleanup() // called right after each and every test function is executed
57+ {
58+ delete m_fakeTimeSource;
59+ m_fakeTimeSource = 0;
60+ }
61+
62+ /*
63+ * Test if a new plugin init function is called only once
64+ */
65+ void testContentActiveChange()
66+ {
67+ // Tests the ordering of activation
68+
69+ MenuContentActivator activator;
70+ activator.setContentTimer(m_fakeTimeSource);
71+ activator.setCount(10);
72+ activator.setBaseIndex(5);
73+ activator.restart();
74+
75+ QCOMPARE(activator.isMenuContentActive(4), false);
76+ QCOMPARE(activator.isMenuContentActive(5), true); // always active at base index.
77+ QCOMPARE(activator.isMenuContentActive(6), false);
78+
79+ m_fakeTimeSource->emitTimeout();
80+ QCOMPARE(activator.isMenuContentActive(4), false);
81+ QCOMPARE(activator.isMenuContentActive(5), true);
82+ QCOMPARE(activator.isMenuContentActive(6), true);
83+ QCOMPARE(activator.isMenuContentActive(7), false);
84+
85+ m_fakeTimeSource->emitTimeout();
86+ QCOMPARE(activator.isMenuContentActive(3), false);
87+ QCOMPARE(activator.isMenuContentActive(4), true);
88+ QCOMPARE(activator.isMenuContentActive(5), true);
89+ QCOMPARE(activator.isMenuContentActive(6), true);
90+ QCOMPARE(activator.isMenuContentActive(7), false);
91+
92+ m_fakeTimeSource->emitTimeout();
93+ QCOMPARE(activator.isMenuContentActive(3), false);
94+ QCOMPARE(activator.isMenuContentActive(4), true);
95+ QCOMPARE(activator.isMenuContentActive(5), true);
96+ QCOMPARE(activator.isMenuContentActive(6), true);
97+ QCOMPARE(activator.isMenuContentActive(7), true);
98+ QCOMPARE(activator.isMenuContentActive(8), false);
99+
100+ m_fakeTimeSource->emitTimeout();
101+ QCOMPARE(activator.isMenuContentActive(2), false);
102+ QCOMPARE(activator.isMenuContentActive(3), true);
103+ QCOMPARE(activator.isMenuContentActive(4), true);
104+ QCOMPARE(activator.isMenuContentActive(5), true);
105+ QCOMPARE(activator.isMenuContentActive(6), true);
106+ QCOMPARE(activator.isMenuContentActive(7), true);
107+ QCOMPARE(activator.isMenuContentActive(8), false);
108+
109+ m_fakeTimeSource->emitTimeout();
110+ QCOMPARE(activator.isMenuContentActive(2), false);
111+ QCOMPARE(activator.isMenuContentActive(3), true);
112+ QCOMPARE(activator.isMenuContentActive(4), true);
113+ QCOMPARE(activator.isMenuContentActive(5), true);
114+ QCOMPARE(activator.isMenuContentActive(6), true);
115+ QCOMPARE(activator.isMenuContentActive(7), true);
116+ QCOMPARE(activator.isMenuContentActive(8), true);
117+ QCOMPARE(activator.isMenuContentActive(9), false);
118+
119+ m_fakeTimeSource->emitTimeout();
120+ QCOMPARE(activator.isMenuContentActive(1), false);
121+ QCOMPARE(activator.isMenuContentActive(2), true);
122+ QCOMPARE(activator.isMenuContentActive(3), true);
123+ QCOMPARE(activator.isMenuContentActive(4), true);
124+ QCOMPARE(activator.isMenuContentActive(5), true);
125+ QCOMPARE(activator.isMenuContentActive(6), true);
126+ QCOMPARE(activator.isMenuContentActive(7), true);
127+ QCOMPARE(activator.isMenuContentActive(8), true);
128+ QCOMPARE(activator.isMenuContentActive(9), false);
129+
130+ m_fakeTimeSource->emitTimeout();
131+ QCOMPARE(activator.isMenuContentActive(1), false);
132+ QCOMPARE(activator.isMenuContentActive(2), true);
133+ QCOMPARE(activator.isMenuContentActive(3), true);
134+ QCOMPARE(activator.isMenuContentActive(4), true);
135+ QCOMPARE(activator.isMenuContentActive(5), true);
136+ QCOMPARE(activator.isMenuContentActive(6), true);
137+ QCOMPARE(activator.isMenuContentActive(7), true);
138+ QCOMPARE(activator.isMenuContentActive(8), true);
139+ QCOMPARE(activator.isMenuContentActive(9), true);
140+ QCOMPARE(activator.isMenuContentActive(10), false);
141+
142+ m_fakeTimeSource->emitTimeout();
143+ QCOMPARE(activator.isMenuContentActive(0), false);
144+ QCOMPARE(activator.isMenuContentActive(1), true);
145+ QCOMPARE(activator.isMenuContentActive(2), true);
146+ QCOMPARE(activator.isMenuContentActive(3), true);
147+ QCOMPARE(activator.isMenuContentActive(4), true);
148+ QCOMPARE(activator.isMenuContentActive(5), true);
149+ QCOMPARE(activator.isMenuContentActive(6), true);
150+ QCOMPARE(activator.isMenuContentActive(7), true);
151+ QCOMPARE(activator.isMenuContentActive(8), true);
152+ QCOMPARE(activator.isMenuContentActive(9), true);
153+ QCOMPARE(activator.isMenuContentActive(10), false);
154+
155+ m_fakeTimeSource->emitTimeout();
156+ QCOMPARE(activator.isMenuContentActive(-1), false);
157+ QCOMPARE(activator.isMenuContentActive(0), true);
158+ QCOMPARE(activator.isMenuContentActive(1), true);
159+ QCOMPARE(activator.isMenuContentActive(2), true);
160+ QCOMPARE(activator.isMenuContentActive(3), true);
161+ QCOMPARE(activator.isMenuContentActive(4), true);
162+ QCOMPARE(activator.isMenuContentActive(5), true);
163+ QCOMPARE(activator.isMenuContentActive(6), true);
164+ QCOMPARE(activator.isMenuContentActive(7), true);
165+ QCOMPARE(activator.isMenuContentActive(8), true);
166+ QCOMPARE(activator.isMenuContentActive(9), true);
167+ QCOMPARE(activator.isMenuContentActive(10), false);
168+ }
169+
170+ void testDelta()
171+ {
172+ // Tests the delta calculation for each timeout.
173+
174+ MenuContentActivator activator;
175+ activator.setContentTimer(m_fakeTimeSource);
176+ activator.setCount(9);
177+ activator.setBaseIndex(3);
178+
179+ connect(&activator, &MenuContentActivator::deltaChanged,
180+ this, &MenuConentActivatorTest::onDeltaChange);
181+ activator.restart();
182+
183+ QCOMPARE(m_deltas, QList<int>()); // empty
184+ QCOMPARE(getIndexList(&activator), QList<int>()); // empty
185+
186+ m_fakeTimeSource->emitTimeout();
187+ QCOMPARE(m_deltas, QList<int>() << 1);
188+ QCOMPARE(getIndexList(&activator), QList<int>() << 4);
189+
190+ m_fakeTimeSource->emitTimeout();
191+ QCOMPARE(m_deltas, QList<int>() << 1 << -1);
192+ QCOMPARE(getIndexList(&activator), QList<int>() << 4 << 2);
193+
194+ m_fakeTimeSource->emitTimeout();
195+ QCOMPARE(m_deltas, QList<int>() << 1 << -1 << 2);
196+ QCOMPARE(getIndexList(&activator), QList<int>() << 4 << 2 << 5);
197+
198+ m_fakeTimeSource->emitTimeout();
199+ QCOMPARE(m_deltas, QList<int>() << 1 << -1 << 2 << -2);
200+ QCOMPARE(getIndexList(&activator), QList<int>() << 4 << 2 << 5 << 1);
201+
202+ m_fakeTimeSource->emitTimeout();
203+ QCOMPARE(m_deltas, QList<int>() << 1 << -1 << 2 << -2 << 3);
204+ QCOMPARE(getIndexList(&activator), QList<int>() << 4 << 2 << 5 << 1 << 6);
205+
206+ m_fakeTimeSource->emitTimeout();
207+ QCOMPARE(m_deltas, QList<int>() << 1 << -1 << 2 << -2 << 3 << -3);
208+ QCOMPARE(getIndexList(&activator), QList<int>() << 4 << 2 << 5 << 1 << 6 << 0);
209+
210+ m_fakeTimeSource->emitTimeout();
211+ QCOMPARE(m_deltas, QList<int>() << 1 << -1 << 2 << -2 << 3 << -3 << 4);
212+ QCOMPARE(getIndexList(&activator), QList<int>() << 4 << 2 << 5 << 1 << 6 << 0 << 7);
213+
214+ m_fakeTimeSource->emitTimeout();
215+ QCOMPARE(m_deltas, QList<int>() << 1 << -1 << 2 << -2 << 3 << -3 << 4 << 5);
216+ QCOMPARE(getIndexList(&activator), QList<int>() << 4 << 2 << 5 << 1 << 6 << 0 << 7 << 8);
217+
218+ m_fakeTimeSource->emitTimeout();
219+ QCOMPARE(m_deltas, QList<int>() << 1 << -1 << 2 << -2 << 3 << -3 << 4 << 5);
220+ QCOMPARE(getIndexList(&activator), QList<int>() << 4 << 2 << 5 << 1 << 6 << 0 << 7 << 8);
221+ }
222+
223+ void testBaseIndexChange()
224+ {
225+ // Tests that changing the base index re-prioritizes the activation
226+ // around the base index.
227+ MenuContentActivator activator;
228+ activator.setContentTimer(m_fakeTimeSource);
229+ activator.setCount(12);
230+ activator.setBaseIndex(5);
231+ activator.restart();
232+
233+ m_fakeTimeSource->emitTimeout();
234+ m_fakeTimeSource->emitTimeout();
235+ QCOMPARE(activator.isMenuContentActive(3), false);
236+ QCOMPARE(activator.isMenuContentActive(4), true);
237+ QCOMPARE(activator.isMenuContentActive(5), true); // always active at base index.
238+ QCOMPARE(activator.isMenuContentActive(6), true);
239+ QCOMPARE(activator.isMenuContentActive(7), false);
240+
241+ activator.setBaseIndex(8);
242+ QCOMPARE(activator.isMenuContentActive(3), false);
243+ QCOMPARE(activator.isMenuContentActive(4), true);
244+ QCOMPARE(activator.isMenuContentActive(5), true);
245+ QCOMPARE(activator.isMenuContentActive(6), true);
246+ QCOMPARE(activator.isMenuContentActive(7), false);
247+ QCOMPARE(activator.isMenuContentActive(8), true);
248+ QCOMPARE(activator.isMenuContentActive(9), false);
249+
250+ m_fakeTimeSource->emitTimeout();
251+ QCOMPARE(activator.isMenuContentActive(3), false);
252+ QCOMPARE(activator.isMenuContentActive(4), true);
253+ QCOMPARE(activator.isMenuContentActive(5), true);
254+ QCOMPARE(activator.isMenuContentActive(6), true);
255+ QCOMPARE(activator.isMenuContentActive(7), false);
256+ QCOMPARE(activator.isMenuContentActive(8), true);
257+ QCOMPARE(activator.isMenuContentActive(9), true);
258+ QCOMPARE(activator.isMenuContentActive(10), false);
259+
260+ m_fakeTimeSource->emitTimeout();
261+ QCOMPARE(activator.isMenuContentActive(3), false);
262+ QCOMPARE(activator.isMenuContentActive(4), true);
263+ QCOMPARE(activator.isMenuContentActive(5), true);
264+ QCOMPARE(activator.isMenuContentActive(6), true);
265+ QCOMPARE(activator.isMenuContentActive(7), true);
266+ QCOMPARE(activator.isMenuContentActive(8), true);
267+ QCOMPARE(activator.isMenuContentActive(9), true);
268+ QCOMPARE(activator.isMenuContentActive(10), false);
269+
270+ m_fakeTimeSource->emitTimeout();
271+ QCOMPARE(activator.isMenuContentActive(3), false);
272+ QCOMPARE(activator.isMenuContentActive(4), true);
273+ QCOMPARE(activator.isMenuContentActive(5), true);
274+ QCOMPARE(activator.isMenuContentActive(6), true);
275+ QCOMPARE(activator.isMenuContentActive(7), true);
276+ QCOMPARE(activator.isMenuContentActive(8), true);
277+ QCOMPARE(activator.isMenuContentActive(9), true);
278+ QCOMPARE(activator.isMenuContentActive(10), true);
279+ QCOMPARE(activator.isMenuContentActive(11), false);
280+ }
281+
282+ void onDeltaChange(int delta)
283+ {
284+ m_deltas << delta;
285+ }
286+
287+private:
288+ QList<int> getIndexList(MenuContentActivator* activator)
289+ {
290+ QList<int> list;
291+ Q_FOREACH(int delta, m_deltas) {
292+ list << (activator->baseIndex() + delta);
293+ }
294+ return list;
295+ }
296+
297+ FakeTimer* m_fakeTimeSource;
298+ QList<int> m_deltas;
299+};
300+
301+QTEST_MAIN(MenuConentActivatorTest)
302+#include "menucontentactivatortest.moc"