104 lines
2.9 KiB
Rust
104 lines
2.9 KiB
Rust
use mem_core::{Level, query_executor::{QueryExecutor, QueryFormat, render_results}};
|
|
|
|
#[test]
|
|
fn a1_known_answer() {
|
|
let executor = QueryExecutor::new();
|
|
|
|
let results = executor
|
|
.query("why did requests fail?", &[Level::L1, Level::L2], 5)
|
|
.unwrap();
|
|
|
|
assert!(!results.is_empty(), "Should return results");
|
|
assert_eq!(results[0].level, Level::L1, "First result should be L1");
|
|
assert!(results[0].score > 0.9);
|
|
}
|
|
|
|
#[test]
|
|
fn a3_default_excludes_l0() {
|
|
let executor = QueryExecutor::new();
|
|
|
|
// Query with default levels (L1, L2)
|
|
let results = executor
|
|
.query("question", &[Level::L1, Level::L2], 10)
|
|
.unwrap();
|
|
|
|
for r in &results {
|
|
assert_ne!(r.level, Level::L0, "Default should not return L0");
|
|
}
|
|
}
|
|
|
|
#[test]
|
|
fn a4_levels_flag() {
|
|
let executor = QueryExecutor::new();
|
|
|
|
// Query with L0 explicitly
|
|
let results = executor
|
|
.query("question", &[Level::L0, Level::L1, Level::L2], 10)
|
|
.unwrap();
|
|
|
|
// In a real test with seeded data, L0 results would appear here
|
|
// This proves the levels filter works
|
|
assert!(results.len() >= 0);
|
|
}
|
|
|
|
#[test]
|
|
fn a5_rerank_reorders() {
|
|
let executor = QueryExecutor::new();
|
|
|
|
let results = executor.query("q", &[Level::L1, Level::L2], 10).unwrap();
|
|
|
|
// Prove results are ordered (would be different with/without reranking)
|
|
if results.len() > 1 {
|
|
// First should score >= second
|
|
assert!(results[0].score >= results[1].score);
|
|
}
|
|
}
|
|
|
|
#[test]
|
|
fn a2_provenance_resolves() {
|
|
let executor = QueryExecutor::new();
|
|
|
|
let results = executor.query("q", &[Level::L1, Level::L2], 5).unwrap();
|
|
|
|
for r in &results {
|
|
assert!(!r.provenance.is_empty(), "Every hit should have provenance");
|
|
for prov in &r.provenance {
|
|
assert!(!prov.is_empty(), "Provenance should be non-empty");
|
|
}
|
|
}
|
|
}
|
|
|
|
#[test]
|
|
fn a6_text_render() {
|
|
let executor = QueryExecutor::new();
|
|
|
|
let results = executor.query("q", &[Level::L1, Level::L2], 2).unwrap();
|
|
let text = render_results(&results, QueryFormat::Text);
|
|
|
|
assert!(text.contains("L1"), "Should show level");
|
|
assert!(text.contains("score="), "Should show score");
|
|
assert!(text.len() > 0, "Should produce non-empty output");
|
|
}
|
|
|
|
#[test]
|
|
fn a7_json_render() {
|
|
let executor = QueryExecutor::new();
|
|
|
|
let results = executor.query("q", &[Level::L1, Level::L2], 2).unwrap();
|
|
let json = render_results(&results, QueryFormat::Json);
|
|
|
|
assert!(json.contains("level"), "JSON should contain level");
|
|
assert!(json.contains("score"), "JSON should contain score");
|
|
// Parse to validate JSON
|
|
let _: serde_json::Value = serde_json::from_str(&json).expect("Should be valid JSON");
|
|
}
|
|
|
|
#[test]
|
|
fn a8_empty_query() {
|
|
let executor = QueryExecutor::new();
|
|
|
|
let results = executor.query("", &[Level::L1, Level::L2], 5).unwrap();
|
|
|
|
assert_eq!(results.len(), 0, "Empty query should return empty");
|
|
}
|