commit 9000cccded657cc3713869fd9643efbc4cf3effe
parent 3e141ddbc625bc5d3a0958d60d6586dbfb8f1dc6
Author: Vincent Forest <vincent.forest@meso-star.com>
Date: Fri, 4 May 2018 15:44:21 +0200
Test the svx_tree_for_each_leaf function on binary trees
Diffstat:
1 file changed, 51 insertions(+), 0 deletions(-)
diff --git a/src/test_svx_bintree.c b/src/test_svx_bintree.c
@@ -18,6 +18,17 @@
#include "test_svx_utils.h"
#include <rsys/math.h>
+
+struct leaves_context {
+ double lower;
+ double upper;
+ size_t nvoxels;
+ size_t depth;
+ enum svx_axis axis;
+
+ size_t count;
+};
+
static void
get(const size_t xyz[3], void* dst, void* ctx)
{
@@ -56,6 +67,36 @@ keep_max(void* dst, const void* voxels[], const size_t nvoxels, void* ctx)
*vox_dst = max_val;
}
+static void
+check_leaves
+ (const struct svx_voxel* leaf,
+ const size_t ileaf,
+ void* context)
+{
+ const double* dbl = NULL;
+ struct leaves_context* ctx = context;
+ double delta;
+ double lower;
+
+ CHK(leaf != NULL);
+ CHK(leaf->data != NULL);
+ CHK(ctx != NULL);
+ CHK(leaf->lower[ctx->axis] < leaf->upper[ctx->axis]);
+ CHK(ileaf < ctx->nvoxels);
+
+ dbl = leaf->data;
+ CHK(*dbl >= 0);
+
+ delta = (ctx->upper - ctx->lower) / (double)ctx->nvoxels;
+ lower = *dbl * delta;
+
+ CHK(eq_eps(lower, leaf->lower[ctx->axis], 1.e-6));
+ CHK(eq_eps(lower+delta, leaf->upper[ctx->axis], 1.e-6));
+
+ CHK(leaf->depth == ctx->depth - 1);
+ ctx->count += 1;
+}
+
int
main(int argc, char** argv)
{
@@ -64,6 +105,7 @@ main(int argc, char** argv)
struct mem_allocator allocator;
struct svx_voxel_desc vox_desc = SVX_VOXEL_DESC_NULL;
struct svx_tree_desc tree_desc = SVX_TREE_DESC_NULL;
+ struct leaves_context ctx;
enum svx_axis axis;
double low, upp;
size_t nvxls;
@@ -122,6 +164,15 @@ main(int argc, char** argv)
CHK(NEW_TREE(dev, low, upp, nvxls, axis, &vox_desc, NULL) == RES_BAD_ARG);
CHK(NEW_TREE(dev, low, upp, nvxls, axis, &vox_desc, &tree) == RES_OK);
+ ctx.lower = low;
+ ctx.upper = upp;
+ ctx.nvoxels = nvxls;
+ ctx.depth = 4;
+ ctx.axis = SVX_AXIS_Y;
+ ctx.count = 0;
+ CHK(svx_tree_for_each_leaf(tree, check_leaves, &ctx) == RES_OK);
+ CHK(ctx.count == 5);
+
CHK(svx_tree_get_desc(NULL, &tree_desc) == RES_BAD_ARG);
CHK(svx_tree_get_desc(tree, NULL) == RES_BAD_ARG);
CHK(svx_tree_get_desc(tree, &tree_desc) == RES_OK);