@@ -14,11 +14,61 @@
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
17−#include "homekeywatcher.h"
17+#include "HomeKeyWatcher.h"
19#include <QTest>
19#include <QTest>
20#include <QSignalSpy>
20#include <QSignalSpy>
24+class FakeElapsedTimer : public AbstractElapsedTimer {
26+ static qint64 msecsSinceEpoch;
28+ FakeElapsedTimer() { start(); }
30+ void start() override { m_msecsSinceReference = msecsSinceEpoch; }
31+ qint64 msecsSinceReference() const override { return m_msecsSinceReference; }
32+ qint64 elapsed() const override { return msecsSinceEpoch - m_msecsSinceReference; }
35+ qint64 m_msecsSinceReference;
37+qint64 FakeElapsedTimer::msecsSinceEpoch = 0;
39+class FakeTimer : public AbstractTimer
43+ FakeTimer(QObject *parent = nullptr);
46+ qint64 nextTimeoutTime() const { return m_nextTimeoutTime; }
48+ int interval() const override;
49+ void setInterval(int msecs) override;
50+ void start() override;
51+ bool isSingleShot() const override;
52+ void setSingleShot(bool value) override;
56+ qint64 m_nextTimeoutTime;
59+class FakeTimerFactory : public AbstractTimerFactory
63+ virtual ~FakeTimerFactory();
65+ void updateTime(qint64 targetTime);
67+ AbstractTimer *create(QObject *parent = nullptr) override;
68+ QList<QPointer<FakeTimer>> timers;
70+} // namespace UnityUtil
22using namespace UnityUtil;
72using namespace UnityUtil;
24class HomeKeyWatcherTest : public QObject {
74class HomeKeyWatcherTest : public QObject {
@@ -166,6 +216,107 @@ void HomeKeyWatcherTest::tapWhileTouching()
166 QCOMPARE(activatedSpy.count(), 0);
216 QCOMPARE(activatedSpy.count(), 0);
219+/////////////////////////////////// FakeTimer //////////////////////////////////
221+FakeTimer::FakeTimer(QObject *parent)
222+ : UnityUtil::AbstractTimer(parent)
224+ , m_singleShot(true)
228+void FakeTimer::update()
234+ if (m_nextTimeoutTime <= FakeElapsedTimer::msecsSinceEpoch) {
235+ if (isSingleShot()) {
238+ m_nextTimeoutTime += interval();
244+void FakeTimer::start()
246+ AbstractTimer::start();
247+ m_nextTimeoutTime = FakeElapsedTimer::msecsSinceEpoch + (qint64)interval();
250+int FakeTimer::interval() const
255+void FakeTimer::setInterval(int msecs)
260+bool FakeTimer::isSingleShot() const
262+ return m_singleShot;
265+void FakeTimer::setSingleShot(bool value)
267+ m_singleShot = value;
270+/////////////////////////////////// FakeTimerFactory //////////////////////////////////
272+FakeTimerFactory::FakeTimerFactory()
276+FakeTimerFactory::~FakeTimerFactory()
278+ for (int i = 0; i < timers.count(); ++i) {
279+ FakeTimer *timer = timers[i].data();
286+void FakeTimerFactory::updateTime(qint64 targetTime)
288+ qint64 minTimeoutTime = targetTime;
290+ for (int i = 0; i < timers.count(); ++i) {
291+ FakeTimer *timer = timers[i].data();
292+ if (timer && timer->isRunning() && timer->nextTimeoutTime() < minTimeoutTime) {
293+ minTimeoutTime = timer->nextTimeoutTime();
297+ FakeElapsedTimer::msecsSinceEpoch = minTimeoutTime;
299+ for (int i = 0; i < timers.count(); ++i) {
300+ FakeTimer *timer = timers[i].data();
306+ if (FakeElapsedTimer::msecsSinceEpoch < targetTime) {
307+ updateTime(targetTime);
311+AbstractTimer *FakeTimerFactory::create(QObject *parent)
313+ FakeTimer *fakeTimer = new FakeTimer(parent);
315+ timers.append(fakeTimer);
169QTEST_GUILESS_MAIN(HomeKeyWatcherTest)
320QTEST_GUILESS_MAIN(HomeKeyWatcherTest)
171#include "homekeywatchertest.moc"
322#include "homekeywatchertest.moc"