From 22fff4bb9a67e4961e15677ea379f382c0eacb7a Mon Sep 17 00:00:00 2001 From: Leo Collins Date: Mon, 23 Mar 2026 19:01:54 +0000 Subject: [PATCH 1/3] add singleton depth test --- rtree-capi/tests/test.c | 46 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/rtree-capi/tests/test.c b/rtree-capi/tests/test.c index 798d54a..8db8ac5 100644 --- a/rtree-capi/tests/test.c +++ b/rtree-capi/tests/test.c @@ -595,6 +595,51 @@ bool test_rtree_empty_1d(void) { return true; } +bool test_rtree_singleton_depth(void) { + const size_t N = 1; + const uint32_t dim = 2; + double mins[2] = {0.0, 0.0}; + double maxs[2] = {1.0, 1.0}; + size_t ids[1] = {1}; + RTreeH *tree = NULL; + rtree_bulk_load(&tree, mins, maxs, ids, N, dim); + if (tree == NULL) { + fprintf(stderr, "Expected to create tree, got null pointer\n"); + return false; + } + + // test rtree_depth + size_t depth = 0; + rtree_depth(tree, &depth); + if (depth != 0) { + fprintf(stderr, "Expected tree depth 0 for singleton tree, got %zu\n", depth); + rtree_free(tree); + return false; + } + rtree_free(tree); + + const uint32_t dim1d = 1; + double mins1d[1] = {0.0}; + double maxs1d[1] = {1.0}; + RTreeH *tree1d = NULL; + rtree_bulk_load(&tree1d, mins1d, maxs1d, ids, N, dim1d); + if (tree1d == NULL) { + fprintf(stderr, "Expected to create 1d tree, got null pointer\n"); + return false; + } + + size_t depth1d = 0; + rtree_depth(tree1d, &depth1d); + if (depth1d != 0) { + fprintf(stderr, "Expected tree depth 0 for singleton 1d tree, got %zu\n", depth1d); + rtree_free(tree1d); + return false; + } + rtree_free(tree1d); + + return true; +} + void run_test( bool (test)(void), const char *test_name, @@ -621,6 +666,7 @@ int main(void) { run_test(test_rtree_empty, "test_rtree_empty", &passed); run_test(test_rtree_empty_1d, "test_rtree_empty_1d", &passed); run_test(test_invalid_dimension, "test_invalid_dimension", &passed); + run_test(test_rtree_singleton_depth, "test_rtree_singleton_depth", &passed); if (passed) { fprintf(stdout, "All tests passed\n"); From 99088111ed4e900b892a5676bba65c6990c574be Mon Sep 17 00:00:00 2001 From: Leo Collins Date: Mon, 23 Mar 2026 22:15:17 +0000 Subject: [PATCH 2/3] count root node as a level --- rtree-capi/src/rtree.rs | 2 +- rtree-capi/tests/test.c | 62 +++++++++++++++++++++++++++++++++++++---- 2 files changed, 57 insertions(+), 7 deletions(-) diff --git a/rtree-capi/src/rtree.rs b/rtree-capi/src/rtree.rs index 17d8651..4587154 100644 --- a/rtree-capi/src/rtree.rs +++ b/rtree-capi/src/rtree.rs @@ -223,7 +223,7 @@ pub extern "C" fn rtree_depth(tree: *const RTreeH, depth_out: *mut usize) -> RTr return RTreeError::Success; } let depth = match rtree { - RTreeDim::D1(tree) => _interval_tree_depth(tree.root().unwrap()), + RTreeDim::D1(tree) => _interval_tree_depth(tree.root().unwrap()) + 1, RTreeDim::D2(tree) => _rtree_depth(tree.root()), RTreeDim::D3(tree) => _rtree_depth(tree.root()), }; diff --git a/rtree-capi/tests/test.c b/rtree-capi/tests/test.c index 8db8ac5..54973ea 100644 --- a/rtree-capi/tests/test.c +++ b/rtree-capi/tests/test.c @@ -264,8 +264,8 @@ bool test_rtree_1d(void) { // test rtree_depth size_t depth = 0; rtree_depth(tree, &depth); - if (depth != 1) { - fprintf(stderr, "Expected tree depth 1, got %zu\n", depth); + if (depth != 2) { + fprintf(stderr, "Expected tree depth 2, got %zu\n", depth); rtree_free(tree); return false; } @@ -611,8 +611,8 @@ bool test_rtree_singleton_depth(void) { // test rtree_depth size_t depth = 0; rtree_depth(tree, &depth); - if (depth != 0) { - fprintf(stderr, "Expected tree depth 0 for singleton tree, got %zu\n", depth); + if (depth != 1) { + fprintf(stderr, "Expected tree depth 1 for singleton tree, got %zu\n", depth); rtree_free(tree); return false; } @@ -630,8 +630,8 @@ bool test_rtree_singleton_depth(void) { size_t depth1d = 0; rtree_depth(tree1d, &depth1d); - if (depth1d != 0) { - fprintf(stderr, "Expected tree depth 0 for singleton 1d tree, got %zu\n", depth1d); + if (depth1d != 1) { + fprintf(stderr, "Expected tree depth 1 for singleton 1d tree, got %zu\n", depth1d); rtree_free(tree1d); return false; } @@ -640,6 +640,55 @@ bool test_rtree_singleton_depth(void) { return true; } +bool test_rtree_depth(void) { + // Default MAX_SIZE is 6, so bulk loading 6 should create a tree of depth 1, + // while bulk loading 7 should create a tree of depth 2. + const size_t N = 6; + const uint32_t dim = 2; + double mins[12]; + double maxs[12]; + size_t ids[6]; + for (size_t i = 0; i < N; i++) { + mins[2*i] = (double)i; + mins[2*i + 1] = (double)i; + maxs[2*i] = (double)i + 0.5; + maxs[2*i + 1] = (double)i + 0.5; + ids[i] = i + 1; + } + RTreeH *tree = NULL; + rtree_bulk_load(&tree, mins, maxs, ids, N, dim); + if (tree == NULL) { + fprintf(stderr, "Expected to create tree, got null pointer\n"); + return false; + } + size_t depth = 0; + rtree_depth(tree, &depth); + if (depth != 1) { + fprintf(stderr, "Expected tree depth 1 for 6 items, got %zu\n", depth); + rtree_free(tree); + return false; + } + rtree_free(tree); + + const size_t N1 = 7; + RTreeH *tree1 = NULL; + rtree_bulk_load(&tree1, mins, maxs, ids, N1, dim); + if (tree1 == NULL) { + fprintf(stderr, "Expected to create tree, got null pointer\n"); + return false; + } + size_t depth1 = 0; + rtree_depth(tree1, &depth1); + if (depth1 != 2) { + fprintf(stderr, "Expected tree depth 2 for 7 items, got %zu\n", depth1); + rtree_free(tree1); + return false; + } + + rtree_free(tree1); + return true; +} + void run_test( bool (test)(void), const char *test_name, @@ -667,6 +716,7 @@ int main(void) { run_test(test_rtree_empty_1d, "test_rtree_empty_1d", &passed); run_test(test_invalid_dimension, "test_invalid_dimension", &passed); run_test(test_rtree_singleton_depth, "test_rtree_singleton_depth", &passed); + run_test(test_rtree_depth, "test_rtree_depth", &passed); if (passed) { fprintf(stdout, "All tests passed\n"); From 0f1271ce091c0ff5783c739d18b79f651bae52a3 Mon Sep 17 00:00:00 2001 From: Leo Collins Date: Mon, 23 Mar 2026 22:26:55 +0000 Subject: [PATCH 3/3] fix test --- rtree-capi/tests/test.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/rtree-capi/tests/test.c b/rtree-capi/tests/test.c index 54973ea..175009c 100644 --- a/rtree-capi/tests/test.c +++ b/rtree-capi/tests/test.c @@ -671,8 +671,18 @@ bool test_rtree_depth(void) { rtree_free(tree); const size_t N1 = 7; + double mins1[14]; + double maxs1[14]; + size_t ids1[7]; + for (size_t i = 0; i < N1; i++) { + mins1[2*i] = (double)i; + mins1[2*i + 1] = (double)i; + maxs1[2*i] = (double)i + 0.5; + maxs1[2*i + 1] = (double)i + 0.5; + ids1[i] = i + 1; + } RTreeH *tree1 = NULL; - rtree_bulk_load(&tree1, mins, maxs, ids, N1, dim); + rtree_bulk_load(&tree1, mins1, maxs1, ids1, N1, dim); if (tree1 == NULL) { fprintf(stderr, "Expected to create tree, got null pointer\n"); return false;