56 lines
1.7 KiB
Rust
56 lines
1.7 KiB
Rust
// Test for semantic search functionality
|
|
use mcp_server::semantic::index::SemanticIndex;
|
|
|
|
#[test]
|
|
fn test_semantic_index_cosine_similarity() {
|
|
let mut index = SemanticIndex::new(3);
|
|
|
|
// Add some test vectors
|
|
index.add_vector(&[1.0, 0.0, 0.0], "vec1");
|
|
index.add_vector(&[0.0, 1.0, 0.0], "vec2");
|
|
index.add_vector(&[0.0, 0.0, 1.0], "vec3");
|
|
index.add_vector(&[0.6, 0.6, 0.0], "vec4");
|
|
|
|
// Search for vectors similar to [1.0, 0.0, 0.0]
|
|
let results = index.search(&[1.0, 0.0, 0.0], 2);
|
|
|
|
// vec1 should be most similar (cosine similarity = 1.0)
|
|
// vec4 should be next most similar (cosine similarity = 0.6)
|
|
assert_eq!(results.len(), 2);
|
|
assert_eq!(results[0].0, "vec1");
|
|
assert!(results[0].1 > 0.9); // Should be very similar
|
|
assert_eq!(results[1].0, "vec4");
|
|
assert!(results[1].1 > 0.5); // Should be somewhat similar
|
|
}
|
|
|
|
#[test]
|
|
fn test_semantic_index_search_with_fewer_results() {
|
|
let mut index = SemanticIndex::new(2);
|
|
|
|
// Add only one vector
|
|
index.add_vector(&[1.0, 0.0], "single");
|
|
|
|
// Search for 3 results when only 1 exists
|
|
let results = index.search(&[1.0, 0.0], 3);
|
|
|
|
// Should return only 1 result
|
|
assert_eq!(results.len(), 1);
|
|
assert_eq!(results[0].0, "single");
|
|
assert!(results[0].1 > 0.9);
|
|
}
|
|
|
|
#[test]
|
|
fn test_semantic_index_zero_vector_handling() {
|
|
let mut index = SemanticIndex::new(3);
|
|
|
|
// Add a zero vector
|
|
index.add_vector(&[0.0, 0.0, 0.0], "zero");
|
|
|
|
// Search with a non-zero vector
|
|
let results = index.search(&[1.0, 0.0, 0.0], 1);
|
|
|
|
// Should handle gracefully (similarity should be 0)
|
|
assert_eq!(results.len(), 1);
|
|
assert_eq!(results[0].0, "zero");
|
|
assert_eq!(results[0].1, 0.0);
|
|
} |