infigraph-languages 1.5.5

Bundled language packs for infigraph (Tree-sitter grammars + extraction queries)
Documentation
use infigraph_core::Infigraph;
use infigraph_languages::bundled_registry;
use std::path::PathBuf;

#[test]
fn test_infigraph_open() {
    let tmp = tempfile::tempdir().unwrap();
    let registry = bundled_registry().unwrap();
    let tg = Infigraph::open(tmp.path(), registry);
    assert!(tg.is_ok());
}

#[test]
fn test_infigraph_root() {
    let tmp = tempfile::tempdir().unwrap();
    let registry = bundled_registry().unwrap();
    let tg = Infigraph::open(tmp.path(), registry).unwrap();
    assert_eq!(tg.root(), tmp.path().canonicalize().unwrap());
}

#[test]
fn test_infigraph_registry() {
    let tmp = tempfile::tempdir().unwrap();
    let registry = bundled_registry().unwrap();
    let tg = Infigraph::open(tmp.path(), registry).unwrap();
    let reg = tg.registry();
    assert!(reg.for_extension(".py").is_some());
}

#[test]
fn test_infigraph_store_none_before_init() {
    let tmp = tempfile::tempdir().unwrap();
    let registry = bundled_registry().unwrap();
    let tg = Infigraph::open(tmp.path(), registry).unwrap();
    assert!(tg.store().is_none());
}

#[test]
fn test_infigraph_init_creates_store() {
    let tmp = tempfile::tempdir().unwrap();
    let registry = bundled_registry().unwrap();
    let mut tg = Infigraph::open(tmp.path(), registry).unwrap();
    tg.init().unwrap();
    assert!(tg.store().is_some());
}

#[test]
fn test_infigraph_stats_after_init() {
    let tmp = tempfile::tempdir().unwrap();
    let registry = bundled_registry().unwrap();
    let mut tg = Infigraph::open(tmp.path(), registry).unwrap();
    tg.init().unwrap();
    let stats = tg.stats().unwrap();
    assert_eq!(stats.symbols, 0);
    assert_eq!(stats.files, 0);
}

#[test]
fn test_infigraph_index_empty_dir() {
    let tmp = tempfile::tempdir().unwrap();
    let registry = bundled_registry().unwrap();
    let mut tg = Infigraph::open(tmp.path(), registry).unwrap();
    tg.init().unwrap();
    let result = tg.index().unwrap();
    assert_eq!(result.indexed_files, 0);
}

#[test]
fn test_infigraph_index_file() {
    let tmp = tempfile::tempdir().unwrap();
    let root = tmp.path().canonicalize().unwrap();
    std::fs::write(
        root.join("hello.py"),
        "def greet(name):\n    return f'Hello {name}'\n",
    )
    .unwrap();
    let registry = bundled_registry().unwrap();
    let mut tg = Infigraph::open(&root, registry).unwrap();
    tg.init().unwrap();
    tg.index_file(&root.join("hello.py")).unwrap();
    let stats = tg.stats().unwrap();
    assert!(
        stats.symbols >= 1,
        "should have at least 1 symbol, got {}",
        stats.symbols
    );
}

#[test]
fn test_infigraph_index_files() {
    let tmp = tempfile::tempdir().unwrap();
    let root = tmp.path().canonicalize().unwrap();
    std::fs::write(root.join("a.py"), "def foo(): pass\n").unwrap();
    std::fs::write(root.join("b.py"), "def bar(): pass\n").unwrap();
    let registry = bundled_registry().unwrap();
    let mut tg = Infigraph::open(&root, registry).unwrap();
    tg.init().unwrap();
    let paths = vec![root.join("a.py"), root.join("b.py")];
    let result = tg.index_files(&paths).unwrap();
    assert_eq!(result.indexed_files, 2);
}

#[test]
fn test_infigraph_remove_file() {
    let tmp = tempfile::tempdir().unwrap();
    let root = tmp.path().canonicalize().unwrap();
    std::fs::write(root.join("a.py"), "def foo(): pass\n").unwrap();
    let registry = bundled_registry().unwrap();
    let mut tg = Infigraph::open(&root, registry).unwrap();
    tg.init().unwrap();
    tg.index_file(&root.join("a.py")).unwrap();
    let stats_before = tg.stats().unwrap();
    assert!(stats_before.symbols >= 1);

    tg.remove_file(&PathBuf::from("a.py")).unwrap();
    let stats_after = tg.stats().unwrap();
    assert_eq!(
        stats_after.symbols, 0,
        "symbols should be 0 after remove_file"
    );
}

#[test]
fn test_infigraph_detect_bridges_empty() {
    let tmp = tempfile::tempdir().unwrap();
    let root = tmp.path().canonicalize().unwrap();
    std::fs::write(root.join("clean.py"), "def hello(): pass\n").unwrap();
    let registry = bundled_registry().unwrap();
    let mut tg = Infigraph::open(&root, registry).unwrap();
    tg.init().unwrap();
    tg.index().unwrap();
    let bridges = tg.detect_bridges().unwrap();
    assert_eq!(bridges.bridges.len(), 0);
}

#[test]
fn test_infigraph_index_incremental_skips_unchanged() {
    let tmp = tempfile::tempdir().unwrap();
    let root = tmp.path().canonicalize().unwrap();
    std::fs::write(root.join("a.py"), "def foo(): pass\n").unwrap();
    let registry = bundled_registry().unwrap();
    let mut tg = Infigraph::open(&root, registry).unwrap();
    tg.init().unwrap();

    let r1 = tg.index().unwrap();
    assert_eq!(r1.indexed_files, 1);

    let r2 = tg.index().unwrap();
    assert_eq!(r2.indexed_files, 0, "unchanged file should be skipped");
}