use horon_engine::Store;
use g_math::fixed_point::FixedPoint;
fn populated() -> Store {
let store = Store::new();
for i in 0..40 {
let p = format!("/n{i}");
store.put(&p, b"x").unwrap();
for j in 0..3 {
store.put(&format!("{p}/c{j}"), b"x").unwrap();
}
}
let mut deep = String::new();
for d in 0..12 {
deep = format!("{deep}/d{d}");
store.put(&deep, b"x").unwrap();
}
store
}
fn fp(v: f64) -> FixedPoint {
FixedPoint::from_f64(v)
}
#[test]
fn find_within_survives_every_radius() {
let store = populated();
for r in [0.0f64, 1e-9, 0.5, 21.0, 28.4, 44.0, 45.0, 1e3, 1e9, 1e15] {
let got = store.find_within("/n0", fp(r));
assert!(got.is_ok(), "find_within panicked or errored at radius {r}");
}
let neg = store.find_within("/n0", fp(-1.0));
assert!(neg.is_ok(), "negative radius must not blow up");
assert!(neg.unwrap().is_empty(), "negative radius must match nothing");
}
#[test]
fn nearest_survives_coordinates_on_and_outside_the_disk() {
let store = populated();
let cases: Vec<(&str, Vec<f64>)> = vec![
("origin", vec![0.0, 0.0, 0.0, 0.0]),
("just inside", vec![0.999_999, 0.0, 0.0, 0.0]),
("on the boundary", vec![1.0, 0.0, 0.0, 0.0]),
("outside", vec![2.0, 0.0, 0.0, 0.0]),
("far outside", vec![1e6, 0.0, 0.0, 0.0]),
("negative outside", vec![-3.0, -3.0, 0.0, 0.0]),
("norm 1 diagonally", vec![0.707_106_78, 0.707_106_78, 0.0, 0.0]),
];
for (label, coords) in cases {
let c: Vec<FixedPoint> = coords.iter().copied().map(fp).collect();
let n = store.nearest(&c);
assert!(n.is_ok() || n.is_err(), "unreachable");
let k = store.nearest_k(&c, 5);
assert!(k.is_ok() || k.is_err(), "unreachable");
let _ = (label, n, k);
}
}
#[test]
fn extreme_k_is_answered_honestly() {
let store = populated();
let n = store.len();
let q: Vec<FixedPoint> = vec![fp(0.1), fp(0.1), fp(0.0), fp(0.0)];
assert_eq!(
store.nearest_k(&q, 0).expect("k=0 against a populated store is not an error"),
vec![],
"k=0 must return nothing, not claim the tree is empty",
);
assert_eq!(store.neighbors("/n0", 0).unwrap(), Vec::<String>::new());
for k in [1usize, 10_000, 1_000_000] {
let got = store.nearest_k(&q, k).unwrap_or_else(|e| panic!("k={k}: {e:?}"));
assert!(got.len() <= n + 1, "k={k} returned more nodes than exist");
assert!(!got.is_empty(), "k={k} must find something in a populated store");
assert!(store.neighbors("/n0", k).is_ok(), "neighbors failed at k={k}");
}
let fresh = Store::new();
let (_, d) = fresh.nearest(&q).expect("a fresh store still holds its root");
assert!(d > FixedPoint::from_int(0), "root is not at the query point");
assert_eq!(fresh.nearest_k(&q, 4).unwrap().len(), 1, "only the root exists");
assert_eq!(fresh.nearest_k(&q, 0).unwrap().len(), 0, "k=0 still means none");
}
#[test]
fn extreme_tau_is_rejected_or_survived() {
use horon_engine::StoreConfig;
for t in [1e-9f64, 0.01, 1.0, 21.0, 100.0] {
let store = Store::with_config(StoreConfig::new().tau(fp(t)));
let root = store.put("/a", b"x");
assert!(root.is_ok() || root.is_err(), "unreachable");
let _ = store.put("/a/b", b"x");
let _ = store.max_depth();
let _ = store.nearest(&[fp(0.0), fp(0.0), fp(0.0), fp(0.0)]);
}
}
#[test]
fn semantic_entry_points_survive_hostile_ranges_and_thresholds() {
let store = Store::new();
for i in 0..20 {
let key = format!("/s{i}");
store.put(&key, b"x").unwrap();
let mut coords = vec![0u8; 4 * 16];
for d in 0..4 {
let v = FixedPoint::from_f64((i as f64 + d as f64) / 32.0).raw().to_le_bytes();
coords[d * 16..(d + 1) * 16].copy_from_slice(&v);
}
store.set_semantic(&key, coords).unwrap();
}
let probe = store.get_semantic("/s3").unwrap();
for r in [0..0, 2..2, 900..1000] {
assert!(
store.nearest_semantic(&probe, 3, r.clone()).is_err(),
"vacuous range {r:?} must be rejected, not answered",
);
assert!(
store.find_similar("/s3", 3, r.clone()).is_err(),
"vacuous range {r:?} must be rejected for find_similar",
);
}
assert!(
store.find_outliers("/", fp(1.5), 0..0).is_err(),
"an empty range leaves nothing for a node to be an outlier in",
);
for r in [0..4, 0..1000, 3..64] {
assert!(
store.nearest_semantic(&probe, 3, r.clone()).is_ok(),
"range {r:?} overlaps the data and must still be answered",
);
}
assert!(store.find_outliers("/", fp(1.5), 0..1000).is_ok());
for z in [0.5f64, 1.5, 1e6] {
assert!(store.find_outliers("/", fp(z), 0..4).is_ok(), "z={z} rejected");
}
}