blob: 8882fef2297577a81cfe1d6b2716e7d535923dcb [file] [log] [blame]
// Copyright 2024 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include <cstdint>
#include <ffl/exponential_average.h>
#include <zxtest/zxtest.h>
using ffl::ExponentialAverage;
using ffl::Fixed;
using ffl::FromInteger;
using ffl::FromRatio;
TEST(FuchsiaFixedPoint, ExponentialAverageSingleRate) {
Fixed<zx_duration_t, 0> initial_value = FromInteger(ZX_MSEC(1));
const Fixed<int32_t, 2> alpha = FromRatio(1, 2);
ExponentialAverage avg(initial_value, alpha);
EXPECT_EQ(avg.value().raw_value(), initial_value.raw_value());
struct TestCase {
Fixed<zx_duration_t, 0> sample;
Fixed<zx_duration_t, 0> expected_avg;
Fixed<zx_duration_t, 0> expected_variance;
};
struct TestCase test_cases[] = {
{FromInteger(ZX_MSEC(1)), FromInteger(ZX_MSEC(1)), FromInteger(0)},
{FromInteger(ZX_MSEC(2)), FromInteger(1500000), FromInteger(250000000000)},
{FromInteger(ZX_MSEC(5)), FromInteger(3250000), FromInteger(3187500000000)},
{FromInteger(ZX_MSEC(3)), FromInteger(3125000), FromInteger(1609375000000)},
{FromInteger(ZX_MSEC(1)), FromInteger(2062500), FromInteger(1933593750000)},
};
for (auto test_case : test_cases) {
avg.AddSample(test_case.sample);
EXPECT_EQ(avg.value().raw_value(), test_case.expected_avg);
EXPECT_EQ(avg.variance().raw_value(), test_case.expected_variance);
}
}
TEST(FuchsiaFixedPoint, ExponentialAverageDualRate) {
const Fixed<int32_t, 2> alpha = FromRatio(1, 4);
const Fixed<int32_t, 2> beta = FromRatio(1, 2);
Fixed<zx_duration_t, 0> initial_value = FromInteger(ZX_MSEC(1));
ExponentialAverage avg(initial_value, alpha, beta);
EXPECT_EQ(avg.value().raw_value(), initial_value.raw_value());
struct TestCase {
Fixed<zx_duration_t, 0> sample;
Fixed<zx_duration_t, 0> expected_avg;
Fixed<zx_duration_t, 0> expected_variance;
};
struct TestCase test_cases[] = {
{FromInteger(ZX_MSEC(2)), FromInteger(1500000), FromInteger(250000000000)},
{FromInteger(ZX_MSEC(5)), FromInteger(3250000), FromInteger(3187500000000)},
{FromInteger(ZX_MSEC(1)), FromInteger(2687500), FromInteger(3339843750000)},
{FromInteger(ZX_MSEC(1)), FromInteger(2265625), FromInteger(3038818359375)},
};
for (auto test_case : test_cases) {
avg.AddSample(test_case.sample);
EXPECT_EQ(avg.value().raw_value(), test_case.expected_avg);
EXPECT_EQ(avg.variance().raw_value(), test_case.expected_variance);
}
}