tgqe 0.0.2

The Great Qin Empire —— A centralized system for integrating and summarizing common compiler front-end library errors and span error output libraries, with optional Ariadne integration.
/**

 *  - Copyright (c) 星灿长风v(Starwindv) 2026/08/03
 *  - License: BSD-3
 *  - Author: 星灿长风v(StarWindv)
 *  - Location: tgqe/src/modules/tests/line_code.rs
 */
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(),
    );

    // 跨两行: 窗口为 "ab\ncde", 相对偏移与显示行号
    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);

    // 从第二行中间到第三行: 窗口为 "cde\nf",
    // 基准偏移 3, 显示行号偏移 1
    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
    );
}