YAC 3.13.0
Yet Another Coupler
Loading...
Searching...
No Matches
test_interval_tree.c
Go to the documentation of this file.
1// Copyright (c) 2024 The YAC Authors
2//
3// SPDX-License-Identifier: BSD-3-Clause
4
5#include "tests.h"
6#include "interval_tree.h"
7
13static void utest_do_test(
14 struct interval_node *tree, size_t num_nodes, struct overlaps *overlaps);
15
16enum {
17 ntests = 100,
18 ntrees = 100,
19};
20
21
22int main(void) {
23 struct interval_node *tree;
24 struct overlaps overlaps = (struct overlaps){ 0, 0, NULL };
25 size_t nmax = 1550;
26 tree = malloc(nmax * sizeof(tree[0]));
27 if (tree)
28 {
29 size_t i;
30 for (i = 0; i < ntrees; ++i)
31 {
32 size_t n = random()%(nmax + 1);
33 utest_do_test(tree, n, &overlaps);
34 }
35 }
36
37 free(overlaps.overlap_iv);
38 free(tree);
39
40 return TEST_EXIT_CODE;
41}
42
43static inline struct interval rand_interval() {
44 double x, y;
45 struct interval iv;
46 x = (double)(random() - RAND_MAX/2);
47 y = (double)(x + random());
48 iv.left = x;
49 iv.right = y;
50 return iv;
51}
52
53
54static void utest_do_test(struct interval_node *tree, size_t num_nodes,
55 struct overlaps *overlaps)
56{
57 size_t j, noverlaps;
58 unsigned i;
59 for (i = 0; i < num_nodes; ++i)
60 tree[i].range = rand_interval();
61 yac_generate_interval_tree(tree, num_nodes);
62 for (i = 0; i < ntests; ++i)
63 {
64 struct interval iv;
65 iv = rand_interval();
67 yac_search_interval_tree(tree, num_nodes, iv, overlaps);
68 for (j = 0; j < overlaps->num_overlaps; ++j)
69 if (!overlap_test(iv, tree[overlaps->overlap_iv[j]].range))
70 PUT_ERR("overlap result does not overlap\n");
71 noverlaps = 0;
72 for (j = 0; j < num_nodes; j++)
73 noverlaps += overlap_test(iv, tree[j].range) != 0;
74 if (noverlaps != overlaps->num_overlaps)
75 PUT_ERR("overlap count mismatch\n");
76 }
77}
78
void yac_search_interval_tree(struct interval_node tree[], size_t num_nodes, struct interval query, struct overlaps *overlaps)
void yac_generate_interval_tree(struct interval_node intervals[], size_t num_nodes)
static int overlap_test(struct interval a, struct interval b)
double right
double left
size_t * overlap_iv
size_t num_overlaps
static struct interval rand_interval()
#define TEST_EXIT_CODE
Definition tests.h:14
#define PUT_ERR(string)
Definition tests.h:10