use horon::{
Horon, HoronConfig, HoronError, HoronResult, SemanticDisk, SemanticOutlier, Store,
StoreError,
};
use g_math::fixed_point::FixedPoint;
use std::ops::Range;
#[test]
fn query_surface_is_nameable_without_the_engine_crate() {
let _nearest: fn(&Horon, &[FixedPoint]) -> HoronResult<(String, FixedPoint)> =
|gf, coords| gf.nearest(coords);
let _nearest_k: fn(&Horon, &[FixedPoint], usize) -> HoronResult<Vec<(String, FixedPoint)>> =
|gf, coords, k| gf.nearest_k(coords, k);
let _neighbors: fn(&Horon, &str, usize) -> HoronResult<Vec<String>> =
|gf, path, k| gf.neighbors(path, k);
let _find_within: fn(&Horon, &str, FixedPoint) -> HoronResult<Vec<String>> =
|gf, path, radius| gf.find_within(path, radius);
let _position: fn(&Horon, &str) -> HoronResult<Vec<FixedPoint>> =
|gf, key| gf.position(key);
let _nearest_semantic: fn(
&Horon,
&[u8],
usize,
Range<usize>,
) -> HoronResult<Vec<(String, FixedPoint)>> =
|gf, coords, k, dims| gf.nearest_semantic(coords, k, dims);
let _neighbors_semantic: fn(
&Horon,
&str,
usize,
Range<usize>,
) -> HoronResult<Vec<(String, FixedPoint)>> =
|gf, path, k, dims| gf.neighbors_semantic(path, k, dims);
let _find_similar: fn(
&Horon,
&str,
usize,
Range<usize>,
) -> HoronResult<Vec<(String, FixedPoint)>> =
|gf, key, k, dims| gf.find_similar(key, k, dims);
let _find_outliers: fn(
&Horon,
&str,
FixedPoint,
Range<usize>,
) -> HoronResult<Vec<SemanticOutlier>> =
|gf, prefix, z, dims| gf.find_outliers(prefix, z, dims);
let _semantic_distance: fn(&[u8], &[u8], Range<usize>) -> FixedPoint =
Horon::semantic_distance;
let _store: fn(&Horon) -> &Store = |gf| gf.store();
}
#[test]
fn semantic_disk_is_usable_without_the_engine_crate() {
let _build: fn(&[(&str, usize)]) -> Result<SemanticDisk, StoreError> = SemanticDisk::build;
}
fn coords(vals: &[i32]) -> Vec<u8> {
let mut out = vec![0u8; 16 * 16];
for v in vals {
out.extend_from_slice(&FixedPoint::from_int(*v).raw().to_le_bytes());
}
out
}
#[test]
fn forwarded_queries_reach_the_right_engine_methods() {
let dir = tempfile::tempdir().unwrap();
let config = HoronConfig {
semantic_dims: 18,
..Default::default()
};
let gf = Horon::open_with_config(dir.path().join("smoke.htt"), config).unwrap();
gf.put("/a/1", b"one").unwrap();
gf.put("/a/2", b"two").unwrap();
gf.put("/a/3", b"three").unwrap();
let origin: Vec<FixedPoint> = vec![FixedPoint::from_int(0); 4];
let hits = gf.nearest_k(&origin, 2).unwrap();
assert_eq!(hits.len(), 2);
assert!(hits[0].1 <= hits[1].1);
let pos = gf.position("/a/1").unwrap();
assert_eq!(pos.len(), 4);
let within = gf.find_within("/a/1", FixedPoint::from_int(1000)).unwrap();
assert!(within.iter().any(|k| k == "/a/2"));
assert!(!within.iter().any(|k| k == "/a/1"));
gf.set_semantic("/a/1", coords(&[1, 1])).unwrap();
gf.set_semantic("/a/2", coords(&[2, 1])).unwrap();
gf.set_semantic("/a/3", coords(&[50, 50])).unwrap();
let similar = gf.find_similar("/a/1", 1, 16..18).unwrap();
assert_eq!(similar[0].0, "/a/2");
let (a, b) = (coords(&[1, 1]), coords(&[4, 5]));
let zero = FixedPoint::from_int(0);
assert_eq!(Horon::semantic_distance(&a, &a, 16..18), zero);
let d = Horon::semantic_distance(&a, &b, 16..18);
assert!(d > zero);
assert_eq!(Horon::semantic_distance(&b, &a, 16..18), d);
}
#[test]
fn engine_error_payload_is_matchable_via_this_crate() {
let err = HoronError::Store(StoreError::NotFound("k".to_string()));
match err {
HoronError::Store(StoreError::NotFound(key)) => assert_eq!(key, "k"),
other => panic!("expected Store(NotFound), got {other:?}"),
}
}