224 lines · 6.3 KB · C++
RawDownload
////  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 <qqueue.h> #include <MovingMinMaxAvg.h>#include <NumericalConstants.h>#include <SharedUtil.h> #include <test-utils/GLMTestUtils.h>#include <test-utils/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<quint64> stats(INTERVAL_LENGTH, WINDOW_INTERVALS);     quint64 min = std::numeric_limits<quint64>::max();    quint64 max = 0;    double average = 0.0;    int totalSamples = 0;     quint64 windowMin;    quint64 windowMax;    double windowAverage;     QQueue<quint64> 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<quint64>::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<int> stats(INTERVAL_LENGTH, WINDOW_INTERVALS);     int min = std::numeric_limits<int>::max();    int max = 0;    double average = 0.0;    int totalSamples = 0;     int windowMin;    int windowMax;    double windowAverage;     QQueue<int> 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<int>::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<float> stats(INTERVAL_LENGTH, WINDOW_INTERVALS);     float min = std::numeric_limits<float>::max();    float max = 0;    double average = 0.0;    int totalSamples = 0;     float windowMin;    float windowMax;    double windowAverage;     QQueue<float> 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<float>::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());        }    }}