/*
* Copyright 2013 Canonical Ltd.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation; version 3.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program. If not, see .
*
* Authors:
* Nick Dedekind
*/
#include "menucontentactivator.h"
#include
#include
class FakeTimer : public UnityIndicators::AbstractTimer
{
Q_OBJECT
public:
FakeTimer(QObject *parent = 0)
: UnityIndicators::AbstractTimer(parent)
, m_duration(0)
{}
int interval() const override { return m_duration; }
void setInterval(int msecs) override { m_duration = msecs; }
void emitTimeout() {
if (isRunning()) {
Q_EMIT timeout();
}
}
private:
int m_duration;
};
class MenuConentActivatorTest : public QObject
{
Q_OBJECT
private Q_SLOTS:
void init() // called right before each and every test function is executed
{
m_fakeTimeSource = new FakeTimer(this);
m_deltas.clear();
}
void cleanup() // called right after each and every test function is executed
{
delete m_fakeTimeSource;
m_fakeTimeSource = 0;
}
/*
* Tests the ordering of activation
*/
void testContentActiveChange()
{
MenuContentActivator activator;
activator.setContentTimer(m_fakeTimeSource);
activator.setCount(10);
activator.setBaseIndex(5);
activator.restart();
QCOMPARE(activator.isMenuContentActive(4), false);
QCOMPARE(activator.isMenuContentActive(5), true); // always active at base index.
QCOMPARE(activator.isMenuContentActive(6), false);
m_fakeTimeSource->emitTimeout();
QCOMPARE(activator.isMenuContentActive(4), false);
QCOMPARE(activator.isMenuContentActive(5), true);
QCOMPARE(activator.isMenuContentActive(6), true);
QCOMPARE(activator.isMenuContentActive(7), false);
m_fakeTimeSource->emitTimeout();
QCOMPARE(activator.isMenuContentActive(3), false);
QCOMPARE(activator.isMenuContentActive(4), true);
QCOMPARE(activator.isMenuContentActive(5), true);
QCOMPARE(activator.isMenuContentActive(6), true);
QCOMPARE(activator.isMenuContentActive(7), false);
m_fakeTimeSource->emitTimeout();
QCOMPARE(activator.isMenuContentActive(3), false);
QCOMPARE(activator.isMenuContentActive(4), true);
QCOMPARE(activator.isMenuContentActive(5), true);
QCOMPARE(activator.isMenuContentActive(6), true);
QCOMPARE(activator.isMenuContentActive(7), true);
QCOMPARE(activator.isMenuContentActive(8), false);
m_fakeTimeSource->emitTimeout();
QCOMPARE(activator.isMenuContentActive(2), false);
QCOMPARE(activator.isMenuContentActive(3), true);
QCOMPARE(activator.isMenuContentActive(4), true);
QCOMPARE(activator.isMenuContentActive(5), true);
QCOMPARE(activator.isMenuContentActive(6), true);
QCOMPARE(activator.isMenuContentActive(7), true);
QCOMPARE(activator.isMenuContentActive(8), false);
m_fakeTimeSource->emitTimeout();
QCOMPARE(activator.isMenuContentActive(2), false);
QCOMPARE(activator.isMenuContentActive(3), true);
QCOMPARE(activator.isMenuContentActive(4), true);
QCOMPARE(activator.isMenuContentActive(5), true);
QCOMPARE(activator.isMenuContentActive(6), true);
QCOMPARE(activator.isMenuContentActive(7), true);
QCOMPARE(activator.isMenuContentActive(8), true);
QCOMPARE(activator.isMenuContentActive(9), false);
m_fakeTimeSource->emitTimeout();
QCOMPARE(activator.isMenuContentActive(1), false);
QCOMPARE(activator.isMenuContentActive(2), true);
QCOMPARE(activator.isMenuContentActive(3), true);
QCOMPARE(activator.isMenuContentActive(4), true);
QCOMPARE(activator.isMenuContentActive(5), true);
QCOMPARE(activator.isMenuContentActive(6), true);
QCOMPARE(activator.isMenuContentActive(7), true);
QCOMPARE(activator.isMenuContentActive(8), true);
QCOMPARE(activator.isMenuContentActive(9), false);
m_fakeTimeSource->emitTimeout();
QCOMPARE(activator.isMenuContentActive(1), false);
QCOMPARE(activator.isMenuContentActive(2), true);
QCOMPARE(activator.isMenuContentActive(3), true);
QCOMPARE(activator.isMenuContentActive(4), true);
QCOMPARE(activator.isMenuContentActive(5), true);
QCOMPARE(activator.isMenuContentActive(6), true);
QCOMPARE(activator.isMenuContentActive(7), true);
QCOMPARE(activator.isMenuContentActive(8), true);
QCOMPARE(activator.isMenuContentActive(9), true);
QCOMPARE(activator.isMenuContentActive(10), false);
m_fakeTimeSource->emitTimeout();
QCOMPARE(activator.isMenuContentActive(0), false);
QCOMPARE(activator.isMenuContentActive(1), true);
QCOMPARE(activator.isMenuContentActive(2), true);
QCOMPARE(activator.isMenuContentActive(3), true);
QCOMPARE(activator.isMenuContentActive(4), true);
QCOMPARE(activator.isMenuContentActive(5), true);
QCOMPARE(activator.isMenuContentActive(6), true);
QCOMPARE(activator.isMenuContentActive(7), true);
QCOMPARE(activator.isMenuContentActive(8), true);
QCOMPARE(activator.isMenuContentActive(9), true);
QCOMPARE(activator.isMenuContentActive(10), false);
m_fakeTimeSource->emitTimeout();
QCOMPARE(activator.isMenuContentActive(-1), false);
QCOMPARE(activator.isMenuContentActive(0), true);
QCOMPARE(activator.isMenuContentActive(1), true);
QCOMPARE(activator.isMenuContentActive(2), true);
QCOMPARE(activator.isMenuContentActive(3), true);
QCOMPARE(activator.isMenuContentActive(4), true);
QCOMPARE(activator.isMenuContentActive(5), true);
QCOMPARE(activator.isMenuContentActive(6), true);
QCOMPARE(activator.isMenuContentActive(7), true);
QCOMPARE(activator.isMenuContentActive(8), true);
QCOMPARE(activator.isMenuContentActive(9), true);
QCOMPARE(activator.isMenuContentActive(10), false);
}
/*
* Tests the delta calculation for each timeout.
*/
void testDelta()
{
MenuContentActivator activator;
activator.setContentTimer(m_fakeTimeSource);
activator.setCount(9);
activator.setBaseIndex(3);
connect(&activator, &MenuContentActivator::deltaChanged,
this, &MenuConentActivatorTest::onDeltaChange);
activator.restart();
QCOMPARE(m_deltas, QList()); // empty
QCOMPARE(getIndexList(&activator), QList()); // empty
m_fakeTimeSource->emitTimeout();
QCOMPARE(m_deltas, QList() << 1);
QCOMPARE(getIndexList(&activator), QList() << 4);
m_fakeTimeSource->emitTimeout();
QCOMPARE(m_deltas, QList() << 1 << -1);
QCOMPARE(getIndexList(&activator), QList() << 4 << 2);
m_fakeTimeSource->emitTimeout();
QCOMPARE(m_deltas, QList() << 1 << -1 << 2);
QCOMPARE(getIndexList(&activator), QList() << 4 << 2 << 5);
m_fakeTimeSource->emitTimeout();
QCOMPARE(m_deltas, QList() << 1 << -1 << 2 << -2);
QCOMPARE(getIndexList(&activator), QList() << 4 << 2 << 5 << 1);
m_fakeTimeSource->emitTimeout();
QCOMPARE(m_deltas, QList() << 1 << -1 << 2 << -2 << 3);
QCOMPARE(getIndexList(&activator), QList() << 4 << 2 << 5 << 1 << 6);
m_fakeTimeSource->emitTimeout();
QCOMPARE(m_deltas, QList() << 1 << -1 << 2 << -2 << 3 << -3);
QCOMPARE(getIndexList(&activator), QList() << 4 << 2 << 5 << 1 << 6 << 0);
m_fakeTimeSource->emitTimeout();
QCOMPARE(m_deltas, QList() << 1 << -1 << 2 << -2 << 3 << -3 << 4);
QCOMPARE(getIndexList(&activator), QList() << 4 << 2 << 5 << 1 << 6 << 0 << 7);
m_fakeTimeSource->emitTimeout();
QCOMPARE(m_deltas, QList() << 1 << -1 << 2 << -2 << 3 << -3 << 4 << 5);
QCOMPARE(getIndexList(&activator), QList() << 4 << 2 << 5 << 1 << 6 << 0 << 7 << 8);
m_fakeTimeSource->emitTimeout();
QCOMPARE(m_deltas, QList() << 1 << -1 << 2 << -2 << 3 << -3 << 4 << 5);
QCOMPARE(getIndexList(&activator), QList() << 4 << 2 << 5 << 1 << 6 << 0 << 7 << 8);
}
/*
* Tests that changing the base index re-prioritizes the activation
* around the base index.
*/
void testBaseIndexChange()
{
MenuContentActivator activator;
activator.setContentTimer(m_fakeTimeSource);
activator.setCount(12);
activator.setBaseIndex(5);
activator.restart();
m_fakeTimeSource->emitTimeout();
m_fakeTimeSource->emitTimeout();
QCOMPARE(activator.isMenuContentActive(3), false);
QCOMPARE(activator.isMenuContentActive(4), true);
QCOMPARE(activator.isMenuContentActive(5), true); // always active at base index.
QCOMPARE(activator.isMenuContentActive(6), true);
QCOMPARE(activator.isMenuContentActive(7), false);
activator.setBaseIndex(8);
QCOMPARE(activator.isMenuContentActive(3), false);
QCOMPARE(activator.isMenuContentActive(4), true);
QCOMPARE(activator.isMenuContentActive(5), true);
QCOMPARE(activator.isMenuContentActive(6), true);
QCOMPARE(activator.isMenuContentActive(7), false);
QCOMPARE(activator.isMenuContentActive(8), true);
QCOMPARE(activator.isMenuContentActive(9), false);
m_fakeTimeSource->emitTimeout();
QCOMPARE(activator.isMenuContentActive(3), false);
QCOMPARE(activator.isMenuContentActive(4), true);
QCOMPARE(activator.isMenuContentActive(5), true);
QCOMPARE(activator.isMenuContentActive(6), true);
QCOMPARE(activator.isMenuContentActive(7), false);
QCOMPARE(activator.isMenuContentActive(8), true);
QCOMPARE(activator.isMenuContentActive(9), true);
QCOMPARE(activator.isMenuContentActive(10), false);
m_fakeTimeSource->emitTimeout();
QCOMPARE(activator.isMenuContentActive(3), false);
QCOMPARE(activator.isMenuContentActive(4), true);
QCOMPARE(activator.isMenuContentActive(5), true);
QCOMPARE(activator.isMenuContentActive(6), true);
QCOMPARE(activator.isMenuContentActive(7), true);
QCOMPARE(activator.isMenuContentActive(8), true);
QCOMPARE(activator.isMenuContentActive(9), true);
QCOMPARE(activator.isMenuContentActive(10), false);
m_fakeTimeSource->emitTimeout();
QCOMPARE(activator.isMenuContentActive(3), false);
QCOMPARE(activator.isMenuContentActive(4), true);
QCOMPARE(activator.isMenuContentActive(5), true);
QCOMPARE(activator.isMenuContentActive(6), true);
QCOMPARE(activator.isMenuContentActive(7), true);
QCOMPARE(activator.isMenuContentActive(8), true);
QCOMPARE(activator.isMenuContentActive(9), true);
QCOMPARE(activator.isMenuContentActive(10), true);
QCOMPARE(activator.isMenuContentActive(11), false);
}
void onDeltaChange(int delta)
{
m_deltas << delta;
}
private:
QList getIndexList(MenuContentActivator* activator)
{
QList list;
Q_FOREACH(int delta, m_deltas) {
list << (activator->baseIndex() + delta);
}
return list;
}
FakeTimer* m_fakeTimeSource;
QList m_deltas;
};
QTEST_GUILESS_MAIN(MenuConentActivatorTest)
#include "MenuContentActivatorTest.moc"