1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143
|
// Copyright (C) 2016 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
#include <QtCore/QString>
#include <QtCore/QTime>
#include <QtCore/QElapsedTimer>
#include <QTest>
#include <QTimer>
static const int minResolution = 100; // the minimum resolution for the tests
QT_BEGIN_NAMESPACE
QDebug operator<<(QDebug s, const QElapsedTimer &t)
{
s.nospace() << "(" << t.msecsSinceReference() << ")";
return s.space();
}
QT_END_NAMESPACE
class tst_QElapsedTimer : public QObject
{
Q_OBJECT
private Q_SLOTS:
void statics();
void validity();
void basics();
void elapsed();
void msecsTo();
};
void tst_QElapsedTimer::statics()
{
qDebug() << "Clock type is" << QElapsedTimer::clockType();
qDebug() << "Said clock is" << (QElapsedTimer::isMonotonic() ? "monotonic" : "not monotonic");
QElapsedTimer t;
t.start();
qDebug() << "Current time is" << t.msecsSinceReference();
}
void tst_QElapsedTimer::validity()
{
QElapsedTimer t;
QVERIFY(!t.isValid()); // non-POD now, it should always start invalid
t.start();
QVERIFY(t.isValid());
t.invalidate();
QVERIFY(!t.isValid());
}
void tst_QElapsedTimer::basics()
{
QElapsedTimer t1;
t1.start();
QVERIFY(t1.msecsSinceReference() != 0);
QCOMPARE(t1, t1);
QVERIFY(!(t1 != t1));
QVERIFY(!(t1 < t1));
QCOMPARE(t1.msecsTo(t1), qint64(0));
QCOMPARE(t1.secsTo(t1), qint64(0));
quint64 value1 = t1.msecsSinceReference();
qDebug() << "value1:" << value1 << "t1:" << t1;
qint64 nsecs = t1.nsecsElapsed();
qint64 elapsed = t1.restart();
QVERIFY(elapsed < minResolution);
QVERIFY(nsecs / 1000000 < minResolution);
quint64 value2 = t1.msecsSinceReference();
qDebug() << "value2:" << value2 << "t1:" << t1
<< "elapsed:" << elapsed << "nsecs:" << nsecs;
// in theory, elapsed == value2 - value1
// However, since QElapsedTimer keeps internally the full resolution,
// we have here a rounding error due to integer division
QVERIFY(qAbs(elapsed - qint64(value2 - value1)) <= 1);
}
void tst_QElapsedTimer::elapsed()
{
qint64 nsecs = 0;
qint64 msecs = 0;
bool expired1 = false;
bool expired8 = false;
bool expiredInf = false;
qint64 elapsed = 0;
bool timerExecuted = false;
QElapsedTimer t1;
t1.start();
QTimer::singleShot(2 * minResolution, Qt::PreciseTimer, [&](){
nsecs = t1.nsecsElapsed();
msecs = t1.elapsed();
expired1 = t1.hasExpired(minResolution);
expired8 = t1.hasExpired(8 * minResolution);
expiredInf = t1.hasExpired(-1);
elapsed = t1.restart();
timerExecuted = true;
});
QTRY_VERIFY2_WITH_TIMEOUT(timerExecuted,
"Looks like timer didn't fire on time.", 4 * minResolution);
QVERIFY(nsecs > 0);
QVERIFY(msecs > 0);
// the number of elapsed nanoseconds and milliseconds should match
QVERIFY(nsecs - msecs * 1000000 < 1000000);
QVERIFY(expired1);
QVERIFY(!expired8);
QVERIFY(!expiredInf);
QVERIFY(elapsed >= msecs);
QVERIFY(elapsed < msecs + 3 * minResolution);
}
void tst_QElapsedTimer::msecsTo()
{
QElapsedTimer t1;
t1.start();
QTest::qSleep(minResolution);
QElapsedTimer t2;
t2.start();
QVERIFY(t1 != t2);
QVERIFY(!(t1 == t2));
QVERIFY(t1 < t2);
auto diff = t1.msecsTo(t2);
QVERIFY2(diff > 0, QString("difference t1 and t2 is %1").arg(diff).toLatin1());
diff = t2.msecsTo(t1);
QVERIFY2(diff < 0, QString("difference t2 and t1 is %1").arg(diff).toLatin1());
}
QTEST_MAIN(tst_QElapsedTimer);
#include "tst_qelapsedtimer.moc"
|