rustcodegraph 1.1.5

Local-first code intelligence graph and CLI for AI agents
Documentation
use crate::common::*;

#[test]
fn should_trigger_sync_after_file_change() {
    let _guard = TestGuard::new();
    let project = TempProject::new("codegraph-watcher");
    let (calls, sync_fn) = sync_mock(Vec::new(), Ok(ok(1, 10)));
    let mut watcher = FileWatcher::new(project.path(), sync_fn, inert_options(200));

    watcher.start();
    watcher
        .wait_until_ready(1000)
        .expect("watcher should be ready");
    assert!(__emit_watch_event_for_tests(project.path(), "src/new.ts"));

    wait_for(
        || {
            watcher.flush_due();
            calls.load(Ordering::SeqCst) > 0
        },
        2000,
        25,
    );
    assert!(calls.load(Ordering::SeqCst) > 0);

    watcher.stop();
}

#[test]
fn should_debounce_rapid_changes_into_a_single_sync() {
    let _guard = TestGuard::new();
    let project = TempProject::new("codegraph-watcher");
    let (calls, sync_fn) = sync_mock(Vec::new(), Ok(ok(1, 10)));
    let mut watcher = FileWatcher::new(project.path(), sync_fn, inert_options(400));

    watcher.start();
    watcher
        .wait_until_ready(1000)
        .expect("watcher should be ready");

    for i in 0..5 {
        assert!(__emit_watch_event_for_tests(
            project.path(),
            format!("src/file{i}.ts")
        ));
        thread::sleep(Duration::from_millis(50));
        watcher.flush_due();
        assert_eq!(calls.load(Ordering::SeqCst), 0);
    }

    wait_for(
        || {
            watcher.flush_due();
            calls.load(Ordering::SeqCst) > 0
        },
        2000,
        25,
    );

    assert_eq!(calls.load(Ordering::SeqCst), 1);

    watcher.stop();
}