// // MovingMinMaxAvgTests.cpp // tests/shared/src // // Created by Yixin Wang on 7/8/2014 // Copyright 2014 High Fidelity, Inc. // // Distributed under the Apache License, Version 2.0. // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // #include "MovingMinMaxAvgTests.h" #include #include #include #include #include "../QTestExtensions.h" QTEST_MAIN(MovingMinMaxAvgTests) quint64 MovingMinMaxAvgTests::randQuint64() { quint64 ret = 0; for (int i = 0; i < 32; i++) { ret = (ret + rand() % 4); ret *= 4; } return ret; } void MovingMinMaxAvgTests::testQuint64() { // quint64 test const int INTERVAL_LENGTH = 100; const int WINDOW_INTERVALS = 50; MovingMinMaxAvg stats(INTERVAL_LENGTH, WINDOW_INTERVALS); quint64 min = std::numeric_limits::max(); quint64 max = 0; double average = 0.0; int totalSamples = 0; quint64 windowMin; quint64 windowMax; double windowAverage; QQueue windowSamples; // fill window samples for (int i = 0; i < 100000; i++) { quint64 sample = randQuint64(); windowSamples.enqueue(sample); if (windowSamples.size() > INTERVAL_LENGTH * WINDOW_INTERVALS) { windowSamples.dequeue(); } stats.update(sample); min = std::min(min, sample); max = std::max(max, sample); average = (average * totalSamples + sample) / (totalSamples + 1); totalSamples++; QCOMPARE(stats.getMin(), min); QCOMPARE(stats.getMax(), max); QCOMPARE_WITH_ABS_ERROR((float) stats.getAverage() / (float) average, 1.0f, EPSILON); QCOMPARE_WITH_ABS_ERROR((float) stats.getAverage(), (float) average, EPSILON); if ((i + 1) % INTERVAL_LENGTH == 0) { QVERIFY(stats.getNewStatsAvailableFlag()); stats.clearNewStatsAvailableFlag(); windowMin = std::numeric_limits::max(); windowMax = 0; windowAverage = 0.0; for (quint64 s : windowSamples) { windowMin = std::min(windowMin, s); windowMax = std::max(windowMax, s); windowAverage += (double)s; } windowAverage /= (double)windowSamples.size(); QCOMPARE(stats.getWindowMin(), windowMin); QCOMPARE(stats.getWindowMax(), windowMax); QCOMPARE_WITH_ABS_ERROR((float)stats.getAverage(), (float)average, EPSILON); } else { QVERIFY(!stats.getNewStatsAvailableFlag()); } } } void MovingMinMaxAvgTests::testInt() { // int test const int INTERVAL_LENGTH = 1; const int WINDOW_INTERVALS = 75; MovingMinMaxAvg stats(INTERVAL_LENGTH, WINDOW_INTERVALS); int min = std::numeric_limits::max(); int max = 0; double average = 0.0; int totalSamples = 0; int windowMin; int windowMax; double windowAverage; QQueue windowSamples; // fill window samples for (int i = 0; i < 100000; i++) { int sample = rand(); windowSamples.enqueue(sample); if (windowSamples.size() > INTERVAL_LENGTH * WINDOW_INTERVALS) { windowSamples.dequeue(); } stats.update(sample); min = std::min(min, sample); max = std::max(max, sample); average = (average * totalSamples + sample) / (totalSamples + 1); totalSamples++; QCOMPARE(stats.getMin(), min); QCOMPARE(stats.getMax(), max); QCOMPARE_WITH_ABS_ERROR((float)stats.getAverage(), (float)average, EPSILON); if ((i + 1) % INTERVAL_LENGTH == 0) { QVERIFY(stats.getNewStatsAvailableFlag()); stats.clearNewStatsAvailableFlag(); windowMin = std::numeric_limits::max(); windowMax = 0; windowAverage = 0.0; for (int s : windowSamples) { windowMin = std::min(windowMin, s); windowMax = std::max(windowMax, s); windowAverage += (double)s; } windowAverage /= (double)windowSamples.size(); QCOMPARE(stats.getWindowMin(), windowMin); QCOMPARE(stats.getWindowMax(), windowMax); QCOMPARE_WITH_ABS_ERROR((float)stats.getAverage(), (float)average, EPSILON); } else { QVERIFY(!stats.getNewStatsAvailableFlag()); } } } void MovingMinMaxAvgTests::testFloat() { // float test const int INTERVAL_LENGTH = 57; const int WINDOW_INTERVALS = 1; MovingMinMaxAvg stats(INTERVAL_LENGTH, WINDOW_INTERVALS); float min = std::numeric_limits::max(); float max = 0; double average = 0.0; int totalSamples = 0; float windowMin; float windowMax; double windowAverage; QQueue windowSamples; // fill window samples for (int i = 0; i < 100000; i++) { float sample = randFloat(); windowSamples.enqueue(sample); if (windowSamples.size() > INTERVAL_LENGTH * WINDOW_INTERVALS) { windowSamples.dequeue(); } stats.update(sample); min = std::min(min, sample); max = std::max(max, sample); average = (average * totalSamples + (double)sample) / (totalSamples + 1); totalSamples++; QCOMPARE(stats.getMin(), min); QCOMPARE(stats.getMax(), max); QCOMPARE_WITH_ABS_ERROR((float)stats.getAverage(), (float)average, EPSILON); if ((i + 1) % INTERVAL_LENGTH == 0) { QVERIFY(stats.getNewStatsAvailableFlag()); stats.clearNewStatsAvailableFlag(); windowMin = std::numeric_limits::max(); windowMax = 0; windowAverage = 0.0; for (float s : windowSamples) { windowMin = std::min(windowMin, s); windowMax = std::max(windowMax, s); windowAverage += (double)s; } windowAverage /= (double)windowSamples.size(); QCOMPARE(stats.getWindowMin(), windowMin); QCOMPARE(stats.getWindowMax(), windowMax); QCOMPARE_WITH_ABS_ERROR((float)stats.getAverage(), (float)average, EPSILON); } else { QVERIFY(!stats.getNewStatsAvailableFlag()); } } }