bb7f8ae79d
Explorer: foldable calendar, hand-laid toolbar, no empty Bookmarks block, Move to... picker, folder notes, Trash tab. Menu bar as flat text, title bar drawn whole each frame. New Outline pane, scrolling Related tab, performance overlay (fps, frame time, memory, CPU), first-run UI scale from the desktop on Linux. Editor: Extract to a new note, Merge into..., reading mode, indent settings, table row/column controls, tags in notes searchable, search order and collapse, excluded search folders, user themes in the settings folder. Engine: note.extract, note.merge, trash.list/restore/empty. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
46 lines
2.4 KiB
Rust
46 lines
2.4 KiB
Rust
//! The `/pattern/` search form.
|
|
|
|
mod common;
|
|
|
|
use common::temp_vault;
|
|
use notescraft_engine::Session;
|
|
|
|
#[test]
|
|
fn a_slash_query_matches_lines_by_regular_expression() {
|
|
let vault = temp_vault("regex-search");
|
|
std::fs::write(vault.path().join("a.md"), "intro\nid: AB-123 and AB-9\n").expect("write");
|
|
std::fs::write(vault.path().join("b.md"), "nothing here\n").expect("write");
|
|
std::fs::write(vault.path().join("c.md"), "ab-45\n").expect("write");
|
|
let session = Session::open(vault.path()).expect("open");
|
|
let hits = session.search("/AB-\\d+/", 10).expect("search");
|
|
assert_eq!(hits.iter().map(|hit| hit.path.as_str()).collect::<Vec<_>>(), ["a.md", "c.md"], "most matches first, case-insensitive");
|
|
assert_eq!(hits.first().and_then(|hit| hit.snippets.first()).map(|snippet| (snippet.line, snippet.ranges.len())), Some((2, 2)));
|
|
assert!(session.search_matching("/AB-\\d+/", 10, true).expect("case").iter().all(|hit| hit.path == "a.md"));
|
|
assert!(session.search("/(/", 10).is_err(), "a bad pattern is an error, not a crash");
|
|
}
|
|
|
|
#[test]
|
|
fn excluded_folders_hide_notes_from_plain_and_regex_search() {
|
|
let vault = common::temp_vault("excluded-search");
|
|
let config = common::temp_config("excluded-search");
|
|
for (path, text) in [("Archive/old.md", "zebrafish old\n"), ("live.md", "zebrafish live\n"), ("Archived.md", "zebrafish name\n")] {
|
|
if let Some((folder, _)) = path.rsplit_once('/') {
|
|
std::fs::create_dir_all(vault.path().join(folder)).expect("folder");
|
|
}
|
|
std::fs::write(vault.path().join(path), text).expect("seed");
|
|
}
|
|
let mut registry = notescraft_engine::Registry::new();
|
|
notescraft_engine::register_core(&mut registry).expect("register");
|
|
let mut session = notescraft_engine::Session::open(vault.path()).expect("open");
|
|
session.use_settings_dir(config.path());
|
|
let paths = |session: ¬escraft_engine::Session, query: &str| {
|
|
let mut found: Vec<String> = session.search(query, 10).expect("search").into_iter().map(|hit| hit.path).collect();
|
|
found.sort();
|
|
found
|
|
};
|
|
assert_eq!(paths(&session, "zebrafish"), ["Archive/old.md", "Archived.md", "live.md"]);
|
|
registry.run("settings.set", &mut session, &serde_json::json!({"key": "session.files.excluded_folders", "value": ["Archive"]})).expect("set");
|
|
assert_eq!(paths(&session, "zebrafish"), ["Archived.md", "live.md"]);
|
|
assert_eq!(paths(&session, "/zebra.*/"), ["Archived.md", "live.md"]);
|
|
}
|