161 lines
4.4 KiB
Rust
161 lines
4.4 KiB
Rust
//! WASM-specific tests
|
|
|
|
#![cfg(target_arch = "wasm32")]
|
|
|
|
use js_sys::Float32Array;
|
|
use ruvector_wasm::*;
|
|
use wasm_bindgen_test::*;
|
|
|
|
wasm_bindgen_test_configure!(run_in_browser);
|
|
|
|
#[wasm_bindgen_test]
|
|
fn test_vector_db_creation() {
|
|
let db = VectorDB::new(128, Some("cosine".to_string()), Some(false));
|
|
assert!(db.is_ok());
|
|
}
|
|
|
|
#[wasm_bindgen_test]
|
|
fn test_insert_and_search() {
|
|
let db = VectorDB::new(3, Some("euclidean".to_string()), Some(false)).unwrap();
|
|
|
|
// Insert a vector
|
|
let vector = Float32Array::from(&[1.0, 0.0, 0.0][..]);
|
|
let id = db.insert(vector, Some("test1".to_string()), None);
|
|
assert!(id.is_ok());
|
|
|
|
// Search
|
|
let query = Float32Array::from(&[1.0, 0.0, 0.0][..]);
|
|
let results = db.search(query, 1, None);
|
|
assert!(results.is_ok());
|
|
|
|
let results = results.unwrap();
|
|
assert_eq!(results.len(), 1);
|
|
}
|
|
|
|
#[wasm_bindgen_test]
|
|
fn test_batch_insert() {
|
|
let db = VectorDB::new(3, Some("cosine".to_string()), Some(false)).unwrap();
|
|
|
|
let entries = js_sys::Array::new();
|
|
|
|
for i in 0..10 {
|
|
let entry = js_sys::Object::new();
|
|
let vector = Float32Array::from(&[i as f32, 0.0, 0.0][..]);
|
|
js_sys::Reflect::set(&entry, &"vector".into(), &vector).unwrap();
|
|
js_sys::Reflect::set(&entry, &"id".into(), &format!("vec_{}", i).into()).unwrap();
|
|
entries.push(&entry);
|
|
}
|
|
|
|
let result = db.insert_batch(entries.into());
|
|
assert!(result.is_ok());
|
|
|
|
let ids = result.unwrap();
|
|
assert_eq!(ids.len(), 10);
|
|
}
|
|
|
|
#[wasm_bindgen_test]
|
|
fn test_delete() {
|
|
let db = VectorDB::new(3, Some("cosine".to_string()), Some(false)).unwrap();
|
|
|
|
// Insert
|
|
let vector = Float32Array::from(&[1.0, 0.0, 0.0][..]);
|
|
let id = db
|
|
.insert(vector, Some("test_delete".to_string()), None)
|
|
.unwrap();
|
|
|
|
// Delete
|
|
let deleted = db.delete(&id);
|
|
assert!(deleted.is_ok());
|
|
assert_eq!(deleted.unwrap(), true);
|
|
|
|
// Verify deleted
|
|
let get_result = db.get(&id);
|
|
assert!(get_result.is_ok());
|
|
assert!(get_result.unwrap().is_none());
|
|
}
|
|
|
|
#[wasm_bindgen_test]
|
|
fn test_get() {
|
|
let db = VectorDB::new(3, Some("cosine".to_string()), Some(false)).unwrap();
|
|
|
|
// Insert
|
|
let vector = Float32Array::from(&[1.0, 2.0, 3.0][..]);
|
|
let id = db
|
|
.insert(vector, Some("test_get".to_string()), None)
|
|
.unwrap();
|
|
|
|
// Get
|
|
let entry = db.get(&id);
|
|
assert!(entry.is_ok());
|
|
|
|
let entry = entry.unwrap();
|
|
assert!(entry.is_some());
|
|
|
|
let entry = entry.unwrap();
|
|
assert_eq!(entry.id(), Some("test_get".to_string()));
|
|
}
|
|
|
|
#[wasm_bindgen_test]
|
|
fn test_len_and_is_empty() {
|
|
let db = VectorDB::new(3, Some("cosine".to_string()), Some(false)).unwrap();
|
|
|
|
// Initially empty
|
|
assert!(db.is_empty().unwrap());
|
|
assert_eq!(db.len().unwrap(), 0);
|
|
|
|
// Insert vector
|
|
let vector = Float32Array::from(&[1.0, 0.0, 0.0][..]);
|
|
db.insert(vector, Some("test1".to_string()), None).unwrap();
|
|
|
|
// Not empty
|
|
assert!(!db.is_empty().unwrap());
|
|
assert_eq!(db.len().unwrap(), 1);
|
|
}
|
|
|
|
#[wasm_bindgen_test]
|
|
fn test_different_metrics() {
|
|
for metric in &["euclidean", "cosine", "dotproduct", "manhattan"] {
|
|
let db = VectorDB::new(3, Some(metric.to_string()), Some(false));
|
|
assert!(db.is_ok(), "Failed to create DB with metric: {}", metric);
|
|
}
|
|
}
|
|
|
|
#[wasm_bindgen_test]
|
|
fn test_dimension_mismatch() {
|
|
let db = VectorDB::new(3, Some("cosine".to_string()), Some(false)).unwrap();
|
|
|
|
// Try to insert vector with wrong dimensions
|
|
let vector = Float32Array::from(&[1.0, 0.0][..]); // Only 2 dimensions
|
|
let result = db.insert(vector, Some("test_wrong_dim".to_string()), None);
|
|
|
|
// Should fail due to dimension mismatch
|
|
// Note: This might succeed depending on implementation
|
|
// The search with wrong dimensions should definitely fail
|
|
let query = Float32Array::from(&[1.0, 0.0][..]);
|
|
let search_result = db.search(query, 1, None);
|
|
assert!(search_result.is_err());
|
|
}
|
|
|
|
#[wasm_bindgen_test]
|
|
fn test_version() {
|
|
let v = version();
|
|
assert!(!v.is_empty());
|
|
assert!(v.contains('.'));
|
|
}
|
|
|
|
#[wasm_bindgen_test]
|
|
fn test_detect_simd() {
|
|
// Just ensure it doesn't panic
|
|
let _ = detect_simd();
|
|
}
|
|
|
|
#[wasm_bindgen_test]
|
|
fn test_array_to_float32_array() {
|
|
let arr = vec![1.0, 2.0, 3.0, 4.0];
|
|
let float_arr = array_to_float32_array(arr.clone());
|
|
|
|
assert_eq!(float_arr.length(), 4);
|
|
assert_eq!(float_arr.get_index(0), 1.0);
|
|
assert_eq!(float_arr.get_index(3), 4.0);
|
|
}
|