70 lines
2.2 KiB
Rust
70 lines
2.2 KiB
Rust
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);
|
|
}
|