use alpha_id::model::{AlphaIdEntry, Config, IndexStatus}; use alpha_id::packed::{packed_path, write_packed, PackedHeader}; use alpha_id::pipeline::load_packed_or_store; fn entry(text: &str) -> AlphaIdEntry { AlphaIdEntry { alpha_id: "X".to_string(), valid: true, icd_primary: "A00".to_string(), icd_star: String::new(), icd_addon: String::new(), icd_primary2: String::new(), orpha: String::new(), text: text.to_string(), } } fn cfg_in(dir: &std::path::Path) -> Config { let mut cfg = Config::load("config/default.toml").unwrap(); cfg.index_dir = dir.to_str().unwrap().to_string(); cfg.embed_model = "test/model".to_string(); cfg } #[test] fn index_status_defaults_to_absent() { assert_eq!(IndexStatus::default(), IndexStatus::Absent); } #[test] fn index_status_serializes_externally_tagged() { let j = serde_json::to_string(&IndexStatus::Mismatch("x".to_string())).unwrap(); assert!(j.contains("Mismatch"), "got {j}"); } #[test] fn packed_beats_store_builds_without_store() { let dir = tempfile::tempdir().unwrap(); let cfg = cfg_in(dir.path()); let entries = vec![entry("a"), entry("b")]; let rows = vec![vec![1.0f32, 0.0], vec![0.0f32, 1.0]]; let h = PackedHeader { n_rows: 2, dim: 2, embed_model: cfg.embed_model.clone(), corpus_sha256: "irrelevant-in-iter1".to_string(), corpus_name: "c.txt".to_string(), }; write_packed(&packed_path(&cfg.index_dir, &cfg.embed_model), &h, &rows).unwrap(); // No per-file store populated in `dir`; the index must come from the packed file. let (vector, status) = load_packed_or_store(&cfg, &entries); assert!(vector.is_some()); assert_eq!(status, IndexStatus::Ok); } #[test] fn n_rows_mismatch_yields_mismatch_none() { let dir = tempfile::tempdir().unwrap(); let cfg = cfg_in(dir.path()); let entries = vec![entry("a"), entry("b"), entry("c")]; // 3 entries let rows = vec![vec![1.0f32, 0.0], vec![0.0f32, 1.0]]; // packed claims 2 rows let h = PackedHeader { n_rows: 2, dim: 2, embed_model: cfg.embed_model.clone(), corpus_sha256: "x".to_string(), corpus_name: "c.txt".to_string(), }; write_packed(&packed_path(&cfg.index_dir, &cfg.embed_model), &h, &rows).unwrap(); let (vector, status) = load_packed_or_store(&cfg, &entries); assert!(vector.is_none()); assert!(matches!(status, IndexStatus::Mismatch(_))); }