use prometeu_analysis::{FileDB, LineIndex}; #[test] fn test_line_index_roundtrip() { let text = "line 1\nline 2\nline 3"; let index = LineIndex::new(text); // Roundtrip for each character for (offset, _) in text.char_indices() { let (line, col) = index.offset_to_line_col(offset as u32); let recovered_offset = index.line_col_to_offset(line, col).expect("Should recover offset"); assert_eq!(offset as u32, recovered_offset, "Offset mismatch at line {}, col {}", line, col); } } #[test] fn test_line_index_boundaries() { let text = "a\nbc\n"; let index = LineIndex::new(text); // "a" -> (0, 0) assert_eq!(index.offset_to_line_col(0), (0, 0)); assert_eq!(index.line_col_to_offset(0, 0), Some(0)); // "\n" -> (0, 1) assert_eq!(index.offset_to_line_col(1), (0, 1)); assert_eq!(index.line_col_to_offset(0, 1), Some(1)); // "b" -> (1, 0) assert_eq!(index.offset_to_line_col(2), (1, 0)); assert_eq!(index.line_col_to_offset(1, 0), Some(2)); // "c" -> (1, 1) assert_eq!(index.offset_to_line_col(3), (1, 1)); assert_eq!(index.line_col_to_offset(1, 1), Some(3)); // "\n" (second) -> (1, 2) assert_eq!(index.offset_to_line_col(4), (1, 2)); assert_eq!(index.line_col_to_offset(1, 2), Some(4)); // EOF (after last \n) -> (2, 0) assert_eq!(index.offset_to_line_col(5), (2, 0)); assert_eq!(index.line_col_to_offset(2, 0), Some(5)); // Out of bounds assert_eq!(index.line_col_to_offset(2, 1), None); assert_eq!(index.line_col_to_offset(3, 0), None); } #[test] fn test_file_db_upsert_and_access() { let mut db = FileDB::new(); let uri = "file:///test.txt"; let text = "hello\nworld".to_string(); let id = db.upsert(uri, text.clone()); assert_eq!(db.file_id(uri), Some(id)); assert_eq!(db.uri(id), uri); assert_eq!(db.text(id), &text); let index = db.line_index(id); assert_eq!(index.offset_to_line_col(6), (1, 0)); // 'w' is at offset 6 // Update existing file let new_text = "new content".to_string(); let same_id = db.upsert(uri, new_text.clone()); assert_eq!(id, same_id); assert_eq!(db.text(id), &new_text); }