/* SPDX-License-Identifier: BSD-3-Clause */ /* * Copyright © 2010, Zed A. Shaw. * Copyright © 2020 rsiddharth */ #include "minunit.h" #include #include #include 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);