generated from habedi/template-rust-project
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtest_bsp_tree.rs
231 lines (212 loc) · 6.59 KB
/
test_bsp_tree.rs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
#[path = "shared.rs"]
mod shared;
use shared::*;
use spart::bsp_tree::{BSPTree, Point2DBSP, Point3DBSP};
use spart::geometry::{Point2D, Point3D};
use tracing::{debug, info};
fn run_bsp_tree_2d_test() {
info!("Starting BSPTree 2D test");
let mut tree: BSPTree<Point2DBSP<&str>> = BSPTree::new(CAPACITY);
let points: Vec<Point2DBSP<&str>> = common_points_2d()
.into_iter()
.map(|pt| Point2DBSP { point: pt })
.collect();
for pt in &points {
tree.insert(pt.clone());
debug!("Inserted 2D BSPTree point: {:?}", pt);
}
info!("Finished inserting {} points", points.len());
let target = Point2DBSP {
point: Point2D {
x: target_point_2d().x,
y: target_point_2d().y,
data: Some("Target"),
},
};
// kNN search test
let knn_results = tree.knn_search(&target, KNN_COUNT);
info!(
"BSPTree 2D kNN search returned {} results",
knn_results.len()
);
assert_eq!(
knn_results.len(),
KNN_COUNT,
"Expected {} nearest neighbors (BSPTree 2D), got {}",
KNN_COUNT,
knn_results.len()
);
// Range search using bounding rectangle
let rect = query_rect();
info!(
"Performing 2D range search with query rectangle: {:?}",
rect
);
let range_results_bbox = tree.range_search_bbox(&rect);
info!(
"BSPTree 2D range search (bbox) returned {} results",
range_results_bbox.len()
);
for pt in &range_results_bbox {
let p = &pt.point;
debug!("BSPTree 2D range result: {:?}", p);
assert!(
p.x >= rect.x
&& p.x <= rect.x + rect.width
&& p.y >= rect.y
&& p.y <= rect.y + rect.height,
"BSPTree 2D point {:?} is outside the query rectangle {:?}",
p,
rect
);
}
assert!(
range_results_bbox.len() >= 5,
"Expected at least 5 points in BSPTree 2D range (bbox), got {}",
range_results_bbox.len()
);
// Range search using radius
let range_results_radius = tree.range_search(&target, 5.0);
info!(
"BSPTree 2D range search (radius) returned {} results",
range_results_radius.len()
);
for pt in &range_results_radius {
let d = distance_2d(&target.point, &pt.point);
assert!(
d <= 5.0,
"Point {:?} is outside the radius 5.0 (distance {})",
pt,
d
);
}
// Deletion test
let delete_point = Point2DBSP {
point: Point2D::new(21.0, 21.0, Some("F")),
};
info!("Deleting BSPTree 2D point {:?}", delete_point);
let deleted = tree.delete(&delete_point);
info!("Deletion result: {}", deleted);
assert!(deleted, "Expected deletion in BSPTree 2D to succeed");
assert!(
!tree.delete(&delete_point),
"Deleting non-existent BSPTree 2D point should return false"
);
let knn_after = tree.knn_search(&target, KNN_COUNT);
for pt in &knn_after {
debug!("BSPTree 2D kNN after deletion: {:?}", pt);
assert_ne!(
pt.point.data,
Some("F"),
"Deleted BSPTree 2D point still returned in kNN search"
);
}
info!("BSPTree 2D test completed successfully");
}
fn run_bsp_tree_3d_test() {
info!("Starting BSPTree 3D test");
let mut tree: BSPTree<Point3DBSP<&str>> = BSPTree::new(CAPACITY);
let points: Vec<Point3DBSP<&str>> = common_points_3d()
.into_iter()
.map(|pt| Point3DBSP { point: pt })
.collect();
for pt in &points {
tree.insert(pt.clone());
debug!("Inserted 3D BSPTree point: {:?}", pt);
}
info!("Finished inserting {} points", points.len());
let target = Point3DBSP {
point: Point3D {
x: target_point_3d().x,
y: target_point_3d().y,
z: target_point_3d().z,
data: Some("Target"),
},
};
// kNN search test
let knn_results = tree.knn_search(&target, KNN_COUNT);
info!(
"BSPTree 3D kNN search returned {} results",
knn_results.len()
);
assert_eq!(
knn_results.len(),
KNN_COUNT,
"Expected {} nearest neighbors (BSPTree 3D), got {}",
KNN_COUNT,
knn_results.len()
);
// Range search using bounding cube
let cube = query_cube();
info!("Performing 3D range search with query cube: {:?}", cube);
let range_results_bbox = tree.range_search_bbox(&cube);
info!(
"BSPTree 3D range search (bbox) returned {} results",
range_results_bbox.len()
);
for pt in &range_results_bbox {
let p = &pt.point;
debug!("BSPTree 3D range result: {:?}", p);
assert!(
p.x >= cube.x
&& p.x <= cube.x + cube.width
&& p.y >= cube.y
&& p.y <= cube.y + cube.height
&& p.z >= cube.z
&& p.z <= cube.z + cube.depth,
"BSPTree 3D point {:?} is outside the query cube {:?}",
p,
cube
);
}
assert!(
range_results_bbox.len() >= 5,
"Expected at least 5 points in BSPTree 3D range (bbox), got {}",
range_results_bbox.len()
);
// Range search using radius
let range_results_radius = tree.range_search(&target, 5.0);
info!(
"BSPTree 3D range search (radius) returned {} results",
range_results_radius.len()
);
for pt in &range_results_radius {
let d = distance_3d(&target.point, &pt.point);
assert!(
d <= 5.0,
"Point {:?} is outside the radius 5.0 (distance {})",
pt,
d
);
}
// Deletion test
let delete_point = Point3DBSP {
point: Point3D::new(21.0, 21.0, 21.0, Some("F")),
};
info!("Deleting BSPTree 3D point {:?}", delete_point);
let deleted = tree.delete(&delete_point);
info!("Deletion result: {}", deleted);
assert!(deleted, "Expected deletion in BSPTree 3D to succeed");
assert!(
!tree.delete(&delete_point),
"Deleting non-existent BSPTree 3D point should return false"
);
let knn_after = tree.knn_search(&target, KNN_COUNT);
for pt in &knn_after {
debug!("BSPTree 3D kNN after deletion: {:?}", pt);
assert_ne!(
pt.point.data,
Some("F"),
"Deleted BSPTree 3D point still returned in kNN search"
);
}
info!("BSPTree 3D test completed successfully");
}
#[test]
fn test_bsptree_2d() {
run_bsp_tree_2d_test();
}
#[test]
fn test_bsptree_3d() {
run_bsp_tree_3d_test();
}