summaryrefslogtreecommitdiffstats
path: root/tests/stats_tests.c
diff options
context:
space:
mode:
Diffstat (limited to 'tests/stats_tests.c')
-rw-r--r--tests/stats_tests.c132
1 files changed, 132 insertions, 0 deletions
diff --git a/tests/stats_tests.c b/tests/stats_tests.c
new file mode 100644
index 0000000..72bee3f
--- /dev/null
+++ b/tests/stats_tests.c
@@ -0,0 +1,132 @@
+/* SPDX-License-Identifier: BSD-3-Clause */
+/*
+ * Copyright © 2010, Zed A. Shaw.
+ * Copyright © 2020 rsiddharth <s@ricketyspace.net>
+ */
+
+#include "minunit.h"
+#include <stats.h>
+#include <string.h>
+#include <math.h>
+
+static char *st_str = NULL;
+
+const int NUM_SAMPLES = 10;
+double samples[] = {
+ 6.1061334, 9.6783204, 1.2747090, 8.2395131, 0.3333483,
+ 6.9755066, 1.0626275, 7.6587523, 4.9382973, 9.5788115
+};
+
+Stats expect = {
+ .sumsq = 425.1641,
+ .sum = 55.84602,
+ .min = 0.333,
+ .max = 9.678,
+ .n = 10
+};
+
+double expect_mean = 5.584602;
+double expect_stddev = 3.547868;
+
+#define EQ(X,Y,N) (round((X) * pow(10, N)) == round((Y) * pow(10, N)))
+
+char *test_operations()
+{
+ int i = 0;
+ Stats *st = Stats_create();
+ mu_assert(st != NULL, "Fail to create stats.");
+
+ for (i = 0; i < NUM_SAMPLES; i++) {
+ Stats_sample(st, samples[i]);
+ }
+
+ Stats_dump(st);
+
+ mu_assert(EQ(st->sumsq, expect.sumsq, 3), "sumsq not valid");
+ mu_assert(EQ(st->sum, expect.sum, 3), "sum not valid");
+ mu_assert(EQ(st->min, expect.min, 3), "min not valid");
+ mu_assert(EQ(st->max, expect.max, 3), "max not valid");
+ mu_assert(EQ(st->n, expect.n, 3), "n not valid");
+ mu_assert(EQ(expect_mean, Stats_mean(st), 3), "mean not valid");
+ mu_assert(EQ(expect_stddev, Stats_stddev(st), 3),
+ "stddev not valid");
+
+ return NULL;
+}
+
+char *test_recreate()
+{
+ Stats *st = Stats_recreate(
+ expect.sum, expect.sumsq, expect.n, expect.min, expect.max);
+
+ mu_assert(st->sum == expect.sum, "sum not equal");
+ mu_assert(st->sumsq == expect.sumsq, "sumsq not equal");
+ mu_assert(st->n == expect.n, "n not equal");
+ mu_assert(st->min == expect.min, "min not equal");
+ mu_assert(st->max == expect.max, "max not equal");
+ mu_assert(EQ(expect_mean, Stats_mean(st), 3), "mean not valid");
+ mu_assert(EQ(expect_stddev, Stats_stddev(st), 3),
+ "stddev not valid");
+
+ return NULL;
+}
+
+char *test_stats_stringify()
+{
+ Stats *st = Stats_create();
+ mu_assert(st != NULL, "stats create failed");
+
+ // fill with dummy data.
+ st->sum = 8238.33892;
+ st->sumsq = 4260238.8292;
+ st->n = 28;
+ st->min = 28.3921;
+ st->max = 238.27;
+
+ st_str = Stats_stringify(st);
+ mu_assert(st_str != NULL, "stats stringify failed");
+
+ char *expected_st_str = "8238.34:4260238.83:28:28.39:238.27";
+ mu_assert(strncmp(st_str, expected_st_str, strlen(expected_st_str)) == 0,
+ "stringified str invalid");
+
+ // cleanup
+ free(st);
+
+ return NULL;
+}
+
+char *test_stats_unstringify()
+{
+ mu_assert(st_str != NULL, "st_str not initialized");
+
+ Stats *st = Stats_unstringify(st_str);
+ mu_assert(st != NULL, "stats unstringify failed");
+
+ mu_assert(st->sum == 8238.34, "stats sum incorrect");
+ mu_assert(st->sumsq == 4260238.83, "stats sumsq incorrect");
+ mu_assert(st->n == 28, "stats n incorrect");
+ mu_assert(st->min == 28.39, "stats min incorrect");
+ mu_assert(st->max == 238.27, "stats max incorrect");
+
+ // clean up
+ free(st);
+ free(st_str);
+
+ return NULL;
+}
+
+char *all_tests()
+{
+ mu_suite_start();
+
+ mu_run_test(test_operations);
+ mu_run_test(test_recreate);
+
+ mu_run_test(test_stats_stringify);
+ mu_run_test(test_stats_unstringify);
+
+ return NULL;
+}
+
+RUN_TESTS(all_tests);