use crate::base_types::{
TgqeLine, TgqeSourceCache,
};
#[test]
fn iter_line_returns_lines_sorted_by_file_then_line()
{
let mut cache = TgqeSourceCache::new();
cache.push_line_at(
"b.rs",
1,
0,
"b1".into(),
);
cache.push_line_at(
"a.rs",
2,
3,
"a2".into(),
);
cache.push_line_at(
"a.rs",
1,
0,
"a1".into(),
);
let lines: Vec<TgqeLine> =
cache.iter_line().collect();
assert_eq!(lines.len(), 3);
assert_eq!(lines[0].filepath, "a.rs");
assert_eq!(lines[0].line, 1);
assert_eq!(lines[0].code, "a1");
assert_eq!(lines[1].filepath, "a.rs");
assert_eq!(lines[1].line, 2);
assert_eq!(lines[2].filepath, "b.rs");
assert_eq!(lines[2].line, 1);
}
#[test]
fn iter_line_is_repeatable_and_owned() {
let mut cache = TgqeSourceCache::new();
cache.push_line_at(
"a.rs",
1,
0,
"x".into(),
);
let first: Vec<TgqeLine> =
cache.iter_line().collect();
let second: Vec<TgqeLine> =
cache.iter_line().collect();
assert_eq!(first.len(), second.len());
assert_eq!(
first[0].filepath,
second[0].filepath
);
assert_eq!(
first[0].code,
second[0].code
);
}
#[test]
fn source_window_locates_lines_by_offset() {
let mut cache = TgqeSourceCache::new();
cache.push_line_at(
"a.rs",
1,
0,
"ab".into(),
);
cache.push_line_at(
"a.rs",
2,
3,
"cde".into(),
);
cache.push_line_at(
"a.rs",
3,
7,
"f".into(),
);
let (text, start, end, display) = cache
.source_window("a.rs", 1, 5)
.unwrap();
assert_eq!(text, "ab\ncde");
assert_eq!((start, end), (1, 5));
assert_eq!(display, 0);
let (text, start, end, display) = cache
.source_window("a.rs", 4, 8)
.unwrap();
assert_eq!(text, "cde\nf");
assert_eq!((start, end), (1, 5));
assert_eq!(display, 1);
let (text, start, end, display) = cache
.source_window("a.rs", 0, 2)
.unwrap();
assert_eq!(text, "ab");
assert_eq!((start, end), (0, 2));
assert_eq!(display, 0);
assert_eq!(
cache.source_window(
"missing.rs",
0,
1,
),
None
);
}