aboutsummaryrefslogtreecommitdiffstats
path: root/matcher/src/pattern
diff options
context:
space:
mode:
authorEllie Huxtable <ellie@elliehuxtable.com>2026-03-16 15:22:49 -0700
committerEllie Huxtable <ellie@elliehuxtable.com>2026-03-16 15:22:49 -0700
commit8f9777ce7aecfe1a163a915e3245466b9dd9ac2e (patch)
treea878a0495e5f84266b7e36918a9e1a9432b0ddd8 /matcher/src/pattern
downloadatuin-8f9777ce7aecfe1a163a915e3245466b9dd9ac2e.zip
Squashed 'crates/atuin-nucleo/' content from commit 4253de9f
git-subtree-dir: crates/atuin-nucleo git-subtree-split: 4253de9faabb4e5c6d81d946a5e35a90f87347ee
Diffstat (limited to 'matcher/src/pattern')
-rw-r--r--matcher/src/pattern/tests.rs149
1 files changed, 149 insertions, 0 deletions
diff --git a/matcher/src/pattern/tests.rs b/matcher/src/pattern/tests.rs
new file mode 100644
index 00000000..88880ba9
--- /dev/null
+++ b/matcher/src/pattern/tests.rs
@@ -0,0 +1,149 @@
+use crate::pattern::{Atom, AtomKind, CaseMatching, Normalization, Pattern};
+
+#[test]
+fn negative() {
+ let pat = Atom::parse("!foo", CaseMatching::Smart, Normalization::Smart);
+ assert!(pat.negative);
+ assert_eq!(pat.kind, AtomKind::Substring);
+ assert_eq!(pat.needle.to_string(), "foo");
+ let pat = Atom::parse("!^foo", CaseMatching::Smart, Normalization::Smart);
+ assert!(pat.negative);
+ assert_eq!(pat.kind, AtomKind::Prefix);
+ assert_eq!(pat.needle.to_string(), "foo");
+ let pat = Atom::parse("!foo$", CaseMatching::Smart, Normalization::Smart);
+ assert!(pat.negative);
+ assert_eq!(pat.kind, AtomKind::Postfix);
+ assert_eq!(pat.needle.to_string(), "foo");
+ let pat = Atom::parse("!^foo$", CaseMatching::Smart, Normalization::Smart);
+ assert!(pat.negative);
+ assert_eq!(pat.kind, AtomKind::Exact);
+ assert_eq!(pat.needle.to_string(), "foo");
+}
+
+#[test]
+fn pattern_kinds() {
+ let pat = Atom::parse("foo", CaseMatching::Smart, Normalization::Smart);
+ assert!(!pat.negative);
+ assert_eq!(pat.kind, AtomKind::Fuzzy);
+ assert_eq!(pat.needle.to_string(), "foo");
+ let pat = Atom::parse("'foo", CaseMatching::Smart, Normalization::Smart);
+ assert!(!pat.negative);
+ assert_eq!(pat.kind, AtomKind::Substring);
+ assert_eq!(pat.needle.to_string(), "foo");
+ let pat = Atom::parse("^foo", CaseMatching::Smart, Normalization::Smart);
+ assert!(!pat.negative);
+ assert_eq!(pat.kind, AtomKind::Prefix);
+ assert_eq!(pat.needle.to_string(), "foo");
+ let pat = Atom::parse("foo$", CaseMatching::Smart, Normalization::Smart);
+ assert!(!pat.negative);
+ assert_eq!(pat.kind, AtomKind::Postfix);
+ assert_eq!(pat.needle.to_string(), "foo");
+ let pat = Atom::parse("^foo$", CaseMatching::Smart, Normalization::Smart);
+ assert!(!pat.negative);
+ assert_eq!(pat.kind, AtomKind::Exact);
+ assert_eq!(pat.needle.to_string(), "foo");
+}
+
+#[test]
+fn case_matching() {
+ let pat = Atom::parse("foo", CaseMatching::Smart, Normalization::Smart);
+ assert!(pat.ignore_case);
+ assert_eq!(pat.needle.to_string(), "foo");
+ let pat = Atom::parse("Foo", CaseMatching::Smart, Normalization::Smart);
+ assert!(!pat.ignore_case);
+ assert_eq!(pat.needle.to_string(), "Foo");
+ let pat = Atom::parse("Foo", CaseMatching::Ignore, Normalization::Smart);
+ assert!(pat.ignore_case);
+ assert_eq!(pat.needle.to_string(), "foo");
+ let pat = Atom::parse("Foo", CaseMatching::Respect, Normalization::Smart);
+ assert!(!pat.ignore_case);
+ assert_eq!(pat.needle.to_string(), "Foo");
+ let pat = Atom::parse("Foo", CaseMatching::Respect, Normalization::Smart);
+ assert!(!pat.ignore_case);
+ assert_eq!(pat.needle.to_string(), "Foo");
+ let pat = Atom::parse("Äxx", CaseMatching::Ignore, Normalization::Smart);
+ assert!(pat.ignore_case);
+ assert_eq!(pat.needle.to_string(), "äxx");
+ let pat = Atom::parse("Äxx", CaseMatching::Respect, Normalization::Smart);
+ assert!(!pat.ignore_case);
+ let pat = Atom::parse("Axx", CaseMatching::Smart, Normalization::Smart);
+ assert!(!pat.ignore_case);
+ assert_eq!(pat.needle.to_string(), "Axx");
+ let pat = Atom::parse("你xx", CaseMatching::Smart, Normalization::Smart);
+ assert!(pat.ignore_case);
+ assert_eq!(pat.needle.to_string(), "你xx");
+ let pat = Atom::parse("你xx", CaseMatching::Ignore, Normalization::Smart);
+ assert!(pat.ignore_case);
+ assert_eq!(pat.needle.to_string(), "你xx");
+ let pat = Atom::parse("Ⲽxx", CaseMatching::Smart, Normalization::Smart);
+ assert!(!pat.ignore_case);
+ assert_eq!(pat.needle.to_string(), "Ⲽxx");
+ let pat = Atom::parse("Ⲽxx", CaseMatching::Ignore, Normalization::Smart);
+ assert!(pat.ignore_case);
+ assert_eq!(pat.needle.to_string(), "ⲽxx");
+}
+
+#[test]
+fn escape() {
+ let pat = Atom::parse("foo\\ bar", CaseMatching::Smart, Normalization::Smart);
+ assert_eq!(pat.needle.to_string(), "foo bar");
+ let pat = Atom::parse("\\!foo", CaseMatching::Smart, Normalization::Smart);
+ assert_eq!(pat.needle.to_string(), "!foo");
+ assert_eq!(pat.kind, AtomKind::Fuzzy);
+ let pat = Atom::parse("\\'foo", CaseMatching::Smart, Normalization::Smart);
+ assert_eq!(pat.needle.to_string(), "'foo");
+ assert_eq!(pat.kind, AtomKind::Fuzzy);
+ let pat = Atom::parse("\\^foo", CaseMatching::Smart, Normalization::Smart);
+ assert_eq!(pat.needle.to_string(), "^foo");
+ assert_eq!(pat.kind, AtomKind::Fuzzy);
+ let pat = Atom::parse("foo\\$", CaseMatching::Smart, Normalization::Smart);
+ assert_eq!(pat.needle.to_string(), "foo$");
+ assert_eq!(pat.kind, AtomKind::Fuzzy);
+ let pat = Atom::parse("^foo\\$", CaseMatching::Smart, Normalization::Smart);
+ assert_eq!(pat.needle.to_string(), "foo$");
+ assert_eq!(pat.kind, AtomKind::Prefix);
+ let pat = Atom::parse("\\^foo\\$", CaseMatching::Smart, Normalization::Smart);
+ assert_eq!(pat.needle.to_string(), "^foo$");
+ assert_eq!(pat.kind, AtomKind::Fuzzy);
+ let pat = Atom::parse("\\!^foo\\$", CaseMatching::Smart, Normalization::Smart);
+ assert_eq!(pat.needle.to_string(), "!^foo$");
+ assert_eq!(pat.kind, AtomKind::Fuzzy);
+ let pat = Atom::parse("!\\^foo\\$", CaseMatching::Smart, Normalization::Smart);
+ assert_eq!(pat.needle.to_string(), "^foo$");
+ assert_eq!(pat.kind, AtomKind::Substring);
+}
+
+#[test]
+fn pattern_atoms() {
+ assert_eq!(
+ Pattern::parse("a b", CaseMatching::Ignore, Normalization::Smart).atoms,
+ vec![
+ Atom::parse("a", CaseMatching::Ignore, Normalization::Smart),
+ Atom::parse("b", CaseMatching::Ignore, Normalization::Smart),
+ ]
+ );
+
+ assert_eq!(
+ Pattern::parse("a\n b", CaseMatching::Ignore, Normalization::Smart).atoms,
+ vec![
+ Atom::parse("a", CaseMatching::Ignore, Normalization::Smart),
+ Atom::parse("b", CaseMatching::Ignore, Normalization::Smart),
+ ]
+ );
+
+ assert_eq!(
+ Pattern::parse(" a b\r\n", CaseMatching::Ignore, Normalization::Smart).atoms,
+ vec![
+ Atom::parse("a", CaseMatching::Ignore, Normalization::Smart),
+ Atom::parse("b", CaseMatching::Ignore, Normalization::Smart),
+ ]
+ );
+
+ assert_eq!(
+ Pattern::parse("ほ げ", CaseMatching::Smart, Normalization::Smart).atoms,
+ vec![
+ Atom::parse("ほ", CaseMatching::Smart, Normalization::Smart),
+ Atom::parse("げ", CaseMatching::Smart, Normalization::Smart),
+ ],
+ )
+}