1*da668aa1SThomas Huth /*
2*da668aa1SThomas Huth * Copyright (C) 2016, Emilio G. Cota <cota@braap.org>
3*da668aa1SThomas Huth *
4*da668aa1SThomas Huth * License: GNU GPL, version 2 or later.
5*da668aa1SThomas Huth * See the COPYING file in the top-level directory.
6*da668aa1SThomas Huth */
7*da668aa1SThomas Huth #include "qemu/osdep.h"
8*da668aa1SThomas Huth #include "qemu/qdist.h"
9*da668aa1SThomas Huth
10*da668aa1SThomas Huth #include <math.h>
11*da668aa1SThomas Huth
12*da668aa1SThomas Huth struct entry_desc {
13*da668aa1SThomas Huth double x;
14*da668aa1SThomas Huth unsigned long count;
15*da668aa1SThomas Huth
16*da668aa1SThomas Huth /* 0 prints a space, 1-8 prints from qdist_blocks[] */
17*da668aa1SThomas Huth int fill_code;
18*da668aa1SThomas Huth };
19*da668aa1SThomas Huth
20*da668aa1SThomas Huth /* See: https://en.wikipedia.org/wiki/Block_Elements */
21*da668aa1SThomas Huth static const gunichar qdist_blocks[] = {
22*da668aa1SThomas Huth 0x2581,
23*da668aa1SThomas Huth 0x2582,
24*da668aa1SThomas Huth 0x2583,
25*da668aa1SThomas Huth 0x2584,
26*da668aa1SThomas Huth 0x2585,
27*da668aa1SThomas Huth 0x2586,
28*da668aa1SThomas Huth 0x2587,
29*da668aa1SThomas Huth 0x2588
30*da668aa1SThomas Huth };
31*da668aa1SThomas Huth
32*da668aa1SThomas Huth #define QDIST_NR_BLOCK_CODES ARRAY_SIZE(qdist_blocks)
33*da668aa1SThomas Huth
pr_hist(const struct entry_desc * darr,size_t n)34*da668aa1SThomas Huth static char *pr_hist(const struct entry_desc *darr, size_t n)
35*da668aa1SThomas Huth {
36*da668aa1SThomas Huth GString *s = g_string_new("");
37*da668aa1SThomas Huth size_t i;
38*da668aa1SThomas Huth
39*da668aa1SThomas Huth for (i = 0; i < n; i++) {
40*da668aa1SThomas Huth int fill = darr[i].fill_code;
41*da668aa1SThomas Huth
42*da668aa1SThomas Huth if (fill) {
43*da668aa1SThomas Huth assert(fill <= QDIST_NR_BLOCK_CODES);
44*da668aa1SThomas Huth g_string_append_unichar(s, qdist_blocks[fill - 1]);
45*da668aa1SThomas Huth } else {
46*da668aa1SThomas Huth g_string_append_c(s, ' ');
47*da668aa1SThomas Huth }
48*da668aa1SThomas Huth }
49*da668aa1SThomas Huth return g_string_free(s, FALSE);
50*da668aa1SThomas Huth }
51*da668aa1SThomas Huth
52*da668aa1SThomas Huth static void
histogram_check(const struct qdist * dist,const struct entry_desc * darr,size_t n,size_t n_bins)53*da668aa1SThomas Huth histogram_check(const struct qdist *dist, const struct entry_desc *darr,
54*da668aa1SThomas Huth size_t n, size_t n_bins)
55*da668aa1SThomas Huth {
56*da668aa1SThomas Huth char *pr = qdist_pr_plain(dist, n_bins);
57*da668aa1SThomas Huth char *str = pr_hist(darr, n);
58*da668aa1SThomas Huth
59*da668aa1SThomas Huth g_assert_cmpstr(pr, ==, str);
60*da668aa1SThomas Huth g_free(pr);
61*da668aa1SThomas Huth g_free(str);
62*da668aa1SThomas Huth }
63*da668aa1SThomas Huth
histogram_check_single_full(const struct qdist * dist,size_t n_bins)64*da668aa1SThomas Huth static void histogram_check_single_full(const struct qdist *dist, size_t n_bins)
65*da668aa1SThomas Huth {
66*da668aa1SThomas Huth struct entry_desc desc = { .fill_code = 8 };
67*da668aa1SThomas Huth
68*da668aa1SThomas Huth histogram_check(dist, &desc, 1, n_bins);
69*da668aa1SThomas Huth }
70*da668aa1SThomas Huth
71*da668aa1SThomas Huth static void
entries_check(const struct qdist * dist,const struct entry_desc * darr,size_t n)72*da668aa1SThomas Huth entries_check(const struct qdist *dist, const struct entry_desc *darr, size_t n)
73*da668aa1SThomas Huth {
74*da668aa1SThomas Huth size_t i;
75*da668aa1SThomas Huth
76*da668aa1SThomas Huth for (i = 0; i < n; i++) {
77*da668aa1SThomas Huth struct qdist_entry *e = &dist->entries[i];
78*da668aa1SThomas Huth
79*da668aa1SThomas Huth g_assert_cmpuint(e->count, ==, darr[i].count);
80*da668aa1SThomas Huth }
81*da668aa1SThomas Huth }
82*da668aa1SThomas Huth
83*da668aa1SThomas Huth static void
entries_insert(struct qdist * dist,const struct entry_desc * darr,size_t n)84*da668aa1SThomas Huth entries_insert(struct qdist *dist, const struct entry_desc *darr, size_t n)
85*da668aa1SThomas Huth {
86*da668aa1SThomas Huth size_t i;
87*da668aa1SThomas Huth
88*da668aa1SThomas Huth for (i = 0; i < n; i++) {
89*da668aa1SThomas Huth qdist_add(dist, darr[i].x, darr[i].count);
90*da668aa1SThomas Huth }
91*da668aa1SThomas Huth }
92*da668aa1SThomas Huth
do_test_bin(const struct entry_desc * a,size_t n_a,const struct entry_desc * b,size_t n_b)93*da668aa1SThomas Huth static void do_test_bin(const struct entry_desc *a, size_t n_a,
94*da668aa1SThomas Huth const struct entry_desc *b, size_t n_b)
95*da668aa1SThomas Huth {
96*da668aa1SThomas Huth struct qdist qda;
97*da668aa1SThomas Huth struct qdist qdb;
98*da668aa1SThomas Huth
99*da668aa1SThomas Huth qdist_init(&qda);
100*da668aa1SThomas Huth
101*da668aa1SThomas Huth entries_insert(&qda, a, n_a);
102*da668aa1SThomas Huth qdist_inc(&qda, a[0].x);
103*da668aa1SThomas Huth qdist_add(&qda, a[0].x, -1);
104*da668aa1SThomas Huth
105*da668aa1SThomas Huth g_assert_cmpuint(qdist_unique_entries(&qda), ==, n_a);
106*da668aa1SThomas Huth g_assert_cmpfloat(qdist_xmin(&qda), ==, a[0].x);
107*da668aa1SThomas Huth g_assert_cmpfloat(qdist_xmax(&qda), ==, a[n_a - 1].x);
108*da668aa1SThomas Huth histogram_check(&qda, a, n_a, 0);
109*da668aa1SThomas Huth histogram_check(&qda, a, n_a, n_a);
110*da668aa1SThomas Huth
111*da668aa1SThomas Huth qdist_bin__internal(&qdb, &qda, n_b);
112*da668aa1SThomas Huth g_assert_cmpuint(qdb.n, ==, n_b);
113*da668aa1SThomas Huth entries_check(&qdb, b, n_b);
114*da668aa1SThomas Huth g_assert_cmpuint(qdist_sample_count(&qda), ==, qdist_sample_count(&qdb));
115*da668aa1SThomas Huth /*
116*da668aa1SThomas Huth * No histogram_check() for $qdb, since we'd rebin it and that is a bug.
117*da668aa1SThomas Huth * Instead, regenerate it from $qda.
118*da668aa1SThomas Huth */
119*da668aa1SThomas Huth histogram_check(&qda, b, n_b, n_b);
120*da668aa1SThomas Huth
121*da668aa1SThomas Huth qdist_destroy(&qdb);
122*da668aa1SThomas Huth qdist_destroy(&qda);
123*da668aa1SThomas Huth }
124*da668aa1SThomas Huth
do_test_pr(uint32_t opt)125*da668aa1SThomas Huth static void do_test_pr(uint32_t opt)
126*da668aa1SThomas Huth {
127*da668aa1SThomas Huth static const struct entry_desc desc[] = {
128*da668aa1SThomas Huth [0] = { 1, 900, 8 },
129*da668aa1SThomas Huth [1] = { 2, 1, 1 },
130*da668aa1SThomas Huth [2] = { 3, 2, 1 }
131*da668aa1SThomas Huth };
132*da668aa1SThomas Huth static const char border[] = "|";
133*da668aa1SThomas Huth const char *llabel = NULL;
134*da668aa1SThomas Huth const char *rlabel = NULL;
135*da668aa1SThomas Huth struct qdist dist;
136*da668aa1SThomas Huth GString *s;
137*da668aa1SThomas Huth char *str;
138*da668aa1SThomas Huth char *pr;
139*da668aa1SThomas Huth size_t n;
140*da668aa1SThomas Huth
141*da668aa1SThomas Huth n = ARRAY_SIZE(desc);
142*da668aa1SThomas Huth qdist_init(&dist);
143*da668aa1SThomas Huth
144*da668aa1SThomas Huth entries_insert(&dist, desc, n);
145*da668aa1SThomas Huth histogram_check(&dist, desc, n, 0);
146*da668aa1SThomas Huth
147*da668aa1SThomas Huth s = g_string_new("");
148*da668aa1SThomas Huth
149*da668aa1SThomas Huth if (opt & QDIST_PR_LABELS) {
150*da668aa1SThomas Huth unsigned int lopts = opt & (QDIST_PR_NODECIMAL |
151*da668aa1SThomas Huth QDIST_PR_PERCENT |
152*da668aa1SThomas Huth QDIST_PR_100X |
153*da668aa1SThomas Huth QDIST_PR_NOBINRANGE);
154*da668aa1SThomas Huth
155*da668aa1SThomas Huth if (lopts == 0) {
156*da668aa1SThomas Huth llabel = "[1.0,1.7)";
157*da668aa1SThomas Huth rlabel = "[2.3,3.0]";
158*da668aa1SThomas Huth } else if (lopts == QDIST_PR_NODECIMAL) {
159*da668aa1SThomas Huth llabel = "[1,2)";
160*da668aa1SThomas Huth rlabel = "[2,3]";
161*da668aa1SThomas Huth } else if (lopts == (QDIST_PR_PERCENT | QDIST_PR_NODECIMAL)) {
162*da668aa1SThomas Huth llabel = "[1,2)%";
163*da668aa1SThomas Huth rlabel = "[2,3]%";
164*da668aa1SThomas Huth } else if (lopts == QDIST_PR_100X) {
165*da668aa1SThomas Huth llabel = "[100.0,166.7)";
166*da668aa1SThomas Huth rlabel = "[233.3,300.0]";
167*da668aa1SThomas Huth } else if (lopts == (QDIST_PR_NOBINRANGE | QDIST_PR_NODECIMAL)) {
168*da668aa1SThomas Huth llabel = "1";
169*da668aa1SThomas Huth rlabel = "3";
170*da668aa1SThomas Huth } else {
171*da668aa1SThomas Huth g_assert_cmpstr("BUG", ==, "This is not meant to be exhaustive");
172*da668aa1SThomas Huth }
173*da668aa1SThomas Huth }
174*da668aa1SThomas Huth
175*da668aa1SThomas Huth if (llabel) {
176*da668aa1SThomas Huth g_string_append(s, llabel);
177*da668aa1SThomas Huth }
178*da668aa1SThomas Huth if (opt & QDIST_PR_BORDER) {
179*da668aa1SThomas Huth g_string_append(s, border);
180*da668aa1SThomas Huth }
181*da668aa1SThomas Huth
182*da668aa1SThomas Huth str = pr_hist(desc, n);
183*da668aa1SThomas Huth g_string_append(s, str);
184*da668aa1SThomas Huth g_free(str);
185*da668aa1SThomas Huth
186*da668aa1SThomas Huth if (opt & QDIST_PR_BORDER) {
187*da668aa1SThomas Huth g_string_append(s, border);
188*da668aa1SThomas Huth }
189*da668aa1SThomas Huth if (rlabel) {
190*da668aa1SThomas Huth g_string_append(s, rlabel);
191*da668aa1SThomas Huth }
192*da668aa1SThomas Huth
193*da668aa1SThomas Huth str = g_string_free(s, FALSE);
194*da668aa1SThomas Huth pr = qdist_pr(&dist, n, opt);
195*da668aa1SThomas Huth g_assert_cmpstr(pr, ==, str);
196*da668aa1SThomas Huth g_free(pr);
197*da668aa1SThomas Huth g_free(str);
198*da668aa1SThomas Huth
199*da668aa1SThomas Huth qdist_destroy(&dist);
200*da668aa1SThomas Huth }
201*da668aa1SThomas Huth
do_test_pr_label(uint32_t opt)202*da668aa1SThomas Huth static inline void do_test_pr_label(uint32_t opt)
203*da668aa1SThomas Huth {
204*da668aa1SThomas Huth opt |= QDIST_PR_LABELS;
205*da668aa1SThomas Huth do_test_pr(opt);
206*da668aa1SThomas Huth }
207*da668aa1SThomas Huth
test_pr(void)208*da668aa1SThomas Huth static void test_pr(void)
209*da668aa1SThomas Huth {
210*da668aa1SThomas Huth do_test_pr(0);
211*da668aa1SThomas Huth
212*da668aa1SThomas Huth do_test_pr(QDIST_PR_BORDER);
213*da668aa1SThomas Huth
214*da668aa1SThomas Huth /* 100X should be ignored because we're not setting LABELS */
215*da668aa1SThomas Huth do_test_pr(QDIST_PR_100X);
216*da668aa1SThomas Huth
217*da668aa1SThomas Huth do_test_pr_label(0);
218*da668aa1SThomas Huth do_test_pr_label(QDIST_PR_NODECIMAL);
219*da668aa1SThomas Huth do_test_pr_label(QDIST_PR_PERCENT | QDIST_PR_NODECIMAL);
220*da668aa1SThomas Huth do_test_pr_label(QDIST_PR_100X);
221*da668aa1SThomas Huth do_test_pr_label(QDIST_PR_NOBINRANGE | QDIST_PR_NODECIMAL);
222*da668aa1SThomas Huth }
223*da668aa1SThomas Huth
test_bin_shrink(void)224*da668aa1SThomas Huth static void test_bin_shrink(void)
225*da668aa1SThomas Huth {
226*da668aa1SThomas Huth static const struct entry_desc a[] = {
227*da668aa1SThomas Huth [0] = { 0.0, 42922, 7 },
228*da668aa1SThomas Huth [1] = { 0.25, 47834, 8 },
229*da668aa1SThomas Huth [2] = { 0.50, 26628, 0 },
230*da668aa1SThomas Huth [3] = { 0.625, 597, 4 },
231*da668aa1SThomas Huth [4] = { 0.75, 10298, 1 },
232*da668aa1SThomas Huth [5] = { 0.875, 22, 2 },
233*da668aa1SThomas Huth [6] = { 1.0, 2771, 1 }
234*da668aa1SThomas Huth };
235*da668aa1SThomas Huth static const struct entry_desc b[] = {
236*da668aa1SThomas Huth [0] = { 0.0, 42922, 7 },
237*da668aa1SThomas Huth [1] = { 0.25, 47834, 8 },
238*da668aa1SThomas Huth [2] = { 0.50, 27225, 3 },
239*da668aa1SThomas Huth [3] = { 0.75, 13091, 1 }
240*da668aa1SThomas Huth };
241*da668aa1SThomas Huth
242*da668aa1SThomas Huth return do_test_bin(a, ARRAY_SIZE(a), b, ARRAY_SIZE(b));
243*da668aa1SThomas Huth }
244*da668aa1SThomas Huth
test_bin_expand(void)245*da668aa1SThomas Huth static void test_bin_expand(void)
246*da668aa1SThomas Huth {
247*da668aa1SThomas Huth static const struct entry_desc a[] = {
248*da668aa1SThomas Huth [0] = { 0.0, 11713, 5 },
249*da668aa1SThomas Huth [1] = { 0.25, 20294, 0 },
250*da668aa1SThomas Huth [2] = { 0.50, 17266, 8 },
251*da668aa1SThomas Huth [3] = { 0.625, 1506, 0 },
252*da668aa1SThomas Huth [4] = { 0.75, 10355, 6 },
253*da668aa1SThomas Huth [5] = { 0.833, 2, 1 },
254*da668aa1SThomas Huth [6] = { 0.875, 99, 4 },
255*da668aa1SThomas Huth [7] = { 1.0, 4301, 2 }
256*da668aa1SThomas Huth };
257*da668aa1SThomas Huth static const struct entry_desc b[] = {
258*da668aa1SThomas Huth [0] = { 0.0, 11713, 5 },
259*da668aa1SThomas Huth [1] = { 0.0, 0, 0 },
260*da668aa1SThomas Huth [2] = { 0.0, 20294, 8 },
261*da668aa1SThomas Huth [3] = { 0.0, 0, 0 },
262*da668aa1SThomas Huth [4] = { 0.0, 0, 0 },
263*da668aa1SThomas Huth [5] = { 0.0, 17266, 6 },
264*da668aa1SThomas Huth [6] = { 0.0, 1506, 1 },
265*da668aa1SThomas Huth [7] = { 0.0, 10355, 4 },
266*da668aa1SThomas Huth [8] = { 0.0, 101, 1 },
267*da668aa1SThomas Huth [9] = { 0.0, 4301, 2 }
268*da668aa1SThomas Huth };
269*da668aa1SThomas Huth
270*da668aa1SThomas Huth return do_test_bin(a, ARRAY_SIZE(a), b, ARRAY_SIZE(b));
271*da668aa1SThomas Huth }
272*da668aa1SThomas Huth
test_bin_precision(void)273*da668aa1SThomas Huth static void test_bin_precision(void)
274*da668aa1SThomas Huth {
275*da668aa1SThomas Huth static const struct entry_desc a[] = {
276*da668aa1SThomas Huth [0] = { 0, 213549, 8 },
277*da668aa1SThomas Huth [1] = { 1, 70, 1 },
278*da668aa1SThomas Huth };
279*da668aa1SThomas Huth static const struct entry_desc b[] = {
280*da668aa1SThomas Huth [0] = { 0, 213549, 8 },
281*da668aa1SThomas Huth [1] = { 0, 70, 1 },
282*da668aa1SThomas Huth };
283*da668aa1SThomas Huth
284*da668aa1SThomas Huth return do_test_bin(a, ARRAY_SIZE(a), b, ARRAY_SIZE(b));
285*da668aa1SThomas Huth }
286*da668aa1SThomas Huth
test_bin_simple(void)287*da668aa1SThomas Huth static void test_bin_simple(void)
288*da668aa1SThomas Huth {
289*da668aa1SThomas Huth static const struct entry_desc a[] = {
290*da668aa1SThomas Huth [0] = { 10, 101, 8 },
291*da668aa1SThomas Huth [1] = { 11, 0, 0 },
292*da668aa1SThomas Huth [2] = { 12, 2, 1 }
293*da668aa1SThomas Huth };
294*da668aa1SThomas Huth static const struct entry_desc b[] = {
295*da668aa1SThomas Huth [0] = { 0, 101, 8 },
296*da668aa1SThomas Huth [1] = { 0, 0, 0 },
297*da668aa1SThomas Huth [2] = { 0, 0, 0 },
298*da668aa1SThomas Huth [3] = { 0, 0, 0 },
299*da668aa1SThomas Huth [4] = { 0, 2, 1 }
300*da668aa1SThomas Huth };
301*da668aa1SThomas Huth
302*da668aa1SThomas Huth return do_test_bin(a, ARRAY_SIZE(a), b, ARRAY_SIZE(b));
303*da668aa1SThomas Huth }
304*da668aa1SThomas Huth
test_single_full(void)305*da668aa1SThomas Huth static void test_single_full(void)
306*da668aa1SThomas Huth {
307*da668aa1SThomas Huth struct qdist dist;
308*da668aa1SThomas Huth
309*da668aa1SThomas Huth qdist_init(&dist);
310*da668aa1SThomas Huth
311*da668aa1SThomas Huth qdist_add(&dist, 3, 102);
312*da668aa1SThomas Huth g_assert_cmpfloat(qdist_avg(&dist), ==, 3);
313*da668aa1SThomas Huth g_assert_cmpfloat(qdist_xmin(&dist), ==, 3);
314*da668aa1SThomas Huth g_assert_cmpfloat(qdist_xmax(&dist), ==, 3);
315*da668aa1SThomas Huth
316*da668aa1SThomas Huth histogram_check_single_full(&dist, 0);
317*da668aa1SThomas Huth histogram_check_single_full(&dist, 1);
318*da668aa1SThomas Huth histogram_check_single_full(&dist, 10);
319*da668aa1SThomas Huth
320*da668aa1SThomas Huth qdist_destroy(&dist);
321*da668aa1SThomas Huth }
322*da668aa1SThomas Huth
test_single_empty(void)323*da668aa1SThomas Huth static void test_single_empty(void)
324*da668aa1SThomas Huth {
325*da668aa1SThomas Huth struct qdist dist;
326*da668aa1SThomas Huth char *pr;
327*da668aa1SThomas Huth
328*da668aa1SThomas Huth qdist_init(&dist);
329*da668aa1SThomas Huth
330*da668aa1SThomas Huth qdist_add(&dist, 3, 0);
331*da668aa1SThomas Huth g_assert_cmpuint(qdist_sample_count(&dist), ==, 0);
332*da668aa1SThomas Huth g_assert(isnan(qdist_avg(&dist)));
333*da668aa1SThomas Huth g_assert_cmpfloat(qdist_xmin(&dist), ==, 3);
334*da668aa1SThomas Huth g_assert_cmpfloat(qdist_xmax(&dist), ==, 3);
335*da668aa1SThomas Huth
336*da668aa1SThomas Huth pr = qdist_pr_plain(&dist, 0);
337*da668aa1SThomas Huth g_assert_cmpstr(pr, ==, " ");
338*da668aa1SThomas Huth g_free(pr);
339*da668aa1SThomas Huth
340*da668aa1SThomas Huth pr = qdist_pr_plain(&dist, 1);
341*da668aa1SThomas Huth g_assert_cmpstr(pr, ==, " ");
342*da668aa1SThomas Huth g_free(pr);
343*da668aa1SThomas Huth
344*da668aa1SThomas Huth pr = qdist_pr_plain(&dist, 2);
345*da668aa1SThomas Huth g_assert_cmpstr(pr, ==, " ");
346*da668aa1SThomas Huth g_free(pr);
347*da668aa1SThomas Huth
348*da668aa1SThomas Huth qdist_destroy(&dist);
349*da668aa1SThomas Huth }
350*da668aa1SThomas Huth
test_none(void)351*da668aa1SThomas Huth static void test_none(void)
352*da668aa1SThomas Huth {
353*da668aa1SThomas Huth struct qdist dist;
354*da668aa1SThomas Huth char *pr;
355*da668aa1SThomas Huth
356*da668aa1SThomas Huth qdist_init(&dist);
357*da668aa1SThomas Huth
358*da668aa1SThomas Huth g_assert(isnan(qdist_avg(&dist)));
359*da668aa1SThomas Huth g_assert(isnan(qdist_xmin(&dist)));
360*da668aa1SThomas Huth g_assert(isnan(qdist_xmax(&dist)));
361*da668aa1SThomas Huth
362*da668aa1SThomas Huth pr = qdist_pr_plain(&dist, 0);
363*da668aa1SThomas Huth g_assert_cmpstr(pr, ==, "(empty)");
364*da668aa1SThomas Huth g_free(pr);
365*da668aa1SThomas Huth
366*da668aa1SThomas Huth pr = qdist_pr_plain(&dist, 2);
367*da668aa1SThomas Huth g_assert_cmpstr(pr, ==, "(empty)");
368*da668aa1SThomas Huth g_free(pr);
369*da668aa1SThomas Huth
370*da668aa1SThomas Huth pr = qdist_pr(&dist, 0, QDIST_PR_BORDER);
371*da668aa1SThomas Huth g_assert_cmpstr(pr, ==, "(empty)");
372*da668aa1SThomas Huth g_free(pr);
373*da668aa1SThomas Huth
374*da668aa1SThomas Huth qdist_destroy(&dist);
375*da668aa1SThomas Huth }
376*da668aa1SThomas Huth
main(int argc,char * argv[])377*da668aa1SThomas Huth int main(int argc, char *argv[])
378*da668aa1SThomas Huth {
379*da668aa1SThomas Huth g_test_init(&argc, &argv, NULL);
380*da668aa1SThomas Huth g_test_add_func("/qdist/none", test_none);
381*da668aa1SThomas Huth g_test_add_func("/qdist/single/empty", test_single_empty);
382*da668aa1SThomas Huth g_test_add_func("/qdist/single/full", test_single_full);
383*da668aa1SThomas Huth g_test_add_func("/qdist/binning/simple", test_bin_simple);
384*da668aa1SThomas Huth g_test_add_func("/qdist/binning/precision", test_bin_precision);
385*da668aa1SThomas Huth g_test_add_func("/qdist/binning/expand", test_bin_expand);
386*da668aa1SThomas Huth g_test_add_func("/qdist/binning/shrink", test_bin_shrink);
387*da668aa1SThomas Huth g_test_add_func("/qdist/pr", test_pr);
388*da668aa1SThomas Huth return g_test_run();
389*da668aa1SThomas Huth }
390