vectoria-core 0.1.6

Embedded hybrid search engine core — BM25 + vector + behavioral signals
#[allow(dead_code)]
mod common;

use std::sync::{atomic::Ordering, Arc};
use vectoria_core::embedding::{cache::CachedEmbedding, EmbeddingProvider};

#[tokio::test]
async fn test_cache_hits_skip_inner_embed() {
    let stub = Arc::new(common::StubEmbedding::new(32));
    let calls = Arc::clone(&stub.calls);
    let inner: Arc<dyn EmbeddingProvider> = stub;
    let cached = CachedEmbedding::new(inner, 1000);

    let v1 = cached.embed("running shoes").await.unwrap();
    assert_eq!(calls.load(Ordering::SeqCst), 1);

    let v2 = cached.embed("running shoes").await.unwrap();
    assert_eq!(calls.load(Ordering::SeqCst), 1, "cache should short-circuit inner");

    assert_eq!(v1, v2);
}

#[tokio::test]
async fn test_cache_different_queries_both_embedded() {
    let stub = Arc::new(common::StubEmbedding::new(32));
    let calls = Arc::clone(&stub.calls);
    let inner: Arc<dyn EmbeddingProvider> = stub;
    let cached = CachedEmbedding::new(inner, 1000);

    cached.embed("query one").await.unwrap();
    cached.embed("query two").await.unwrap();
    assert_eq!(calls.load(Ordering::SeqCst), 2, "distinct queries must each call inner");

    cached.embed("query one").await.unwrap();
    cached.embed("query two").await.unwrap();
    assert_eq!(calls.load(Ordering::SeqCst), 2, "repeated queries must be cached");
}