#include #include #include namespace aethera::web { TEST(Sliding_Statistics, Publishes_Derived_Window_Statistics_On_Submit) { Sliding_Statistics statistics{20}; for (int value = 1; value <= 20; ++value) static_cast(statistics.submit(static_cast(value))); const auto& state = statistics.state(); EXPECT_EQ(state.count, 20U); EXPECT_DOUBLE_EQ(state.latest, 20.0); EXPECT_DOUBLE_EQ(state.minimum, 1.0); EXPECT_DOUBLE_EQ(state.maximum, 20.0); EXPECT_DOUBLE_EQ(state.average, 10.5); EXPECT_DOUBLE_EQ(state.trimmed_average, 10.5); EXPECT_NEAR(state.p50, 10.0, 2.0); EXPECT_GE(state.p95, 15.0); EXPECT_LE(state.p95, 20.0); EXPECT_GE(state.p99, state.p95); EXPECT_LE(state.p99, 20.0); } TEST(Sliding_Statistics, Overwrites_Oldest_And_Ignores_Nonfinite_Values) { Sliding_Statistics statistics{3}; static_cast(statistics.submit(1.0)); static_cast(statistics.submit(2.0)); static_cast(statistics.submit(std::numeric_limits::infinity())); static_cast(statistics.submit(3.0)); static_cast(statistics.submit(4.0)); const auto& state = statistics.state(); EXPECT_EQ(state.count, 3U); EXPECT_DOUBLE_EQ(state.latest, 4.0); EXPECT_DOUBLE_EQ(state.minimum, 2.0); EXPECT_DOUBLE_EQ(state.maximum, 4.0); EXPECT_DOUBLE_EQ(state.average, 3.0); } TEST(Sliding_Statistics, Estimates_Quantiles_Without_Growing_The_Window) { Sliding_Statistics statistics{64}; for (int value = 1; value <= 1000; ++value) static_cast(statistics.submit(static_cast(value))); const auto& state = statistics.state(); EXPECT_EQ(state.count, 64U); EXPECT_NEAR(state.average, 968.5, 0.001); EXPECT_DOUBLE_EQ(state.minimum, 937.0); EXPECT_DOUBLE_EQ(state.maximum, 1000.0); EXPECT_NEAR(state.p50, 500.0, 10.0); EXPECT_NEAR(state.p95, 950.0, 15.0); EXPECT_NEAR(state.p99, 990.0, 15.0); } }