From 0efb17371ba009b5dad6445ec9901e7ceac2e18f Mon Sep 17 00:00:00 2001 From: "Zed A. Shaw" Date: Mon, 17 Mar 2025 22:56:18 -0400 Subject: [PATCH] Now have a simple stats test. --- meson.build | 1 + rand.hpp | 4 ++-- stats.hpp | 15 +++++++-------- tests/stats.cpp | 27 +++++++++++++++++++++++++++ 4 files changed, 37 insertions(+), 10 deletions(-) create mode 100644 tests/stats.cpp diff --git a/meson.build b/meson.build index fefe1ca..c03cdee 100644 --- a/meson.build +++ b/meson.build @@ -137,6 +137,7 @@ executable('runtests', sources + [ 'tests/rituals.cpp', 'tests/sound.cpp', 'tests/spatialmap.cpp', + 'tests/stats.cpp', 'tests/textures.cpp', 'tests/tilemap.cpp', ], diff --git a/rand.hpp b/rand.hpp index 359c2b5..e639235 100644 --- a/rand.hpp +++ b/rand.hpp @@ -20,8 +20,8 @@ namespace Random { } template - T normal(T from, T to) { - std::normal_distribution rand(from, to); + T normal(T mean, T stddev) { + std::normal_distribution rand(mean, stddev); return rand(GENERATOR); } diff --git a/stats.hpp b/stats.hpp index b600ce0..f7d3759 100644 --- a/stats.hpp +++ b/stats.hpp @@ -7,16 +7,16 @@ struct Stats { double sum = 0.0; double sumsq = 0.0; - unsigned long n = 0L; + double n = 0.0; double min = 0.0; double max = 0.0; inline void reset() { - sum = 0; - sumsq = 0; - n = 0L; - min = 0; - max = 0; + sum = 0.0; + sumsq = 0.0; + n = 0.0; + min = 0.0; + max = 0.0; } inline double mean() { @@ -24,8 +24,7 @@ struct Stats { } inline double stddev() { - return std::sqrt((sumsq - (sum * sum / n)) / - (n - 1)); + return std::sqrt((sumsq - (sum * sum / n)) / (n - 1)); } inline void sample(double s) { diff --git a/tests/stats.cpp b/tests/stats.cpp new file mode 100644 index 0000000..184bc6b --- /dev/null +++ b/tests/stats.cpp @@ -0,0 +1,27 @@ +#include +#include "stats.hpp" +#include "rand.hpp" +#include +#include + +TEST_CASE("basic stats tests", "[stats]") { + Stats stat1; + stat1.sample(1.0); + + for(int i = 0; i < 20; i++) { + double x = Random::normal(20.0,5.0); + stat1.sample(x); + REQUIRE(!std::isnan(stat1.stddev())); + REQUIRE(stat1.mean() < stat1.mean() + stat1.stddev() * 4.0); + } + + stat1.dump(); + + stat1.reset(); + REQUIRE(stat1.n == 0.0); + + auto timer = stat1.time_start(); + for(int i = 0; i < 20; i++) { + stat1.sample_time(timer); + } +}