Merge commit 'd803bfe2b1fe7f5e219e50ac20d6801a0a58ac75' as 'vendor/ruvector'
This commit is contained in:
160
vendor/ruvector/crates/ruvector-wasm/tests/wasm.rs
vendored
Normal file
160
vendor/ruvector/crates/ruvector-wasm/tests/wasm.rs
vendored
Normal file
@@ -0,0 +1,160 @@
|
||||
//! 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);
|
||||
}
|
||||
Reference in New Issue
Block a user