whycodes-index 0.6.31

Fast, gitignore-aware workspace file index for WhyCodes
Documentation
use super::*;

#[test]
fn change_mapping_filters_policy() {
    let roots = vec![PathBuf::from("/proj")];
    let mut out = Vec::new();
    push_change(
        &roots,
        Path::new("/proj/src/main.rs"),
        ChangeKind::Upsert,
        &mut out,
    );
    push_change(
        &roots,
        Path::new("/proj/target/x.o"),
        ChangeKind::Upsert,
        &mut out,
    );
    push_change(
        &roots,
        Path::new("/proj/.env"),
        ChangeKind::Upsert,
        &mut out,
    );
    push_change(
        &roots,
        Path::new("/other/f.rs"),
        ChangeKind::Upsert,
        &mut out,
    );
    assert_eq!(out.len(), 1);
    assert_eq!(out[0].rel, "src/main.rs");
    assert_eq!(out[0].root, 0);
}

#[test]
fn map_event_covers_create_remove_modify_rename() {
    use notify::event::{CreateKind, ModifyKind, RemoveKind, RenameMode};
    let roots = vec![PathBuf::from("/proj")];
    let ev = |kind, paths: Vec<PathBuf>| Event {
        kind,
        paths,
        attrs: Default::default(),
    };
    let created = map_event(
        &roots,
        &ev(
            EventKind::Create(CreateKind::File),
            vec![PathBuf::from("/proj/src/a.rs")],
        ),
    );
    assert_eq!(created[0].kind, ChangeKind::Upsert);
    let removed = map_event(
        &roots,
        &ev(
            EventKind::Remove(RemoveKind::File),
            vec![PathBuf::from("/proj/src/a.rs")],
        ),
    );
    assert_eq!(removed[0].kind, ChangeKind::Remove);
    let renamed = map_event(
        &roots,
        &ev(
            EventKind::Modify(ModifyKind::Name(RenameMode::Both)),
            vec![
                PathBuf::from("/proj/src/old.rs"),
                PathBuf::from("/proj/src/new.rs"),
            ],
        ),
    );
    assert_eq!(renamed[0].kind, ChangeKind::Remove);
    assert_eq!(renamed[1].kind, ChangeKind::Upsert);
    let single = map_event(
        &roots,
        &ev(
            EventKind::Modify(ModifyKind::Name(RenameMode::To)),
            vec![PathBuf::from("/proj/src/solo.rs")],
        ),
    );
    assert_eq!(single[0].kind, ChangeKind::Upsert);
    let data = map_event(
        &roots,
        &ev(
            EventKind::Modify(ModifyKind::Data(notify::event::DataChange::Any)),
            vec![PathBuf::from("/proj/src/a.rs")],
        ),
    );
    assert_eq!(data[0].kind, ChangeKind::Upsert);
    let access = map_event(
        &roots,
        &ev(EventKind::Access(notify::event::AccessKind::Any), vec![]),
    );
    assert!(access.is_empty());
    let folder = map_event(
        &roots,
        &ev(
            EventKind::Create(CreateKind::Folder),
            vec![PathBuf::from("/proj/src")],
        ),
    );
    assert_eq!(folder[0].kind, ChangeKind::Upsert);
    let any_rm = map_event(
        &roots,
        &ev(
            EventKind::Remove(RemoveKind::Any),
            vec![PathBuf::from("/proj/src/a.rs")],
        ),
    );
    assert_eq!(any_rm[0].kind, ChangeKind::Remove);
    let root_self = map_event(
        &roots,
        &ev(
            EventKind::Create(CreateKind::Any),
            vec![PathBuf::from("/proj")],
        ),
    );
    assert!(root_self.is_empty());
}

#[test]
fn spawn_watches_a_temp_root() {
    let dir = tempfile::TempDir::new().unwrap();
    let (tx, rx) = std::sync::mpsc::channel();
    let w = spawn(&[dir.path().to_path_buf()], tx);
    assert!(w.is_some(), "watcher should install on a temp dir");
    std::fs::write(dir.path().join("f.rs"), "x").unwrap();
    let _ = rx.recv_timeout(std::time::Duration::from_secs(2));
    drop(w);
}

#[test]
fn spawn_missing_root_returns_none() {
    let (tx, _rx) = std::sync::mpsc::channel();
    let w = spawn(&[PathBuf::from("/no/such/whycodes-index-root")], tx);
    assert!(w.is_none());
    log_watcher_unavailable(&"boom");
}