summaryrefslogtreecommitdiffstats
path: root/cli/src/search.rs
diff options
context:
space:
mode:
Diffstat (limited to 'cli/src/search.rs')
-rw-r--r--cli/src/search.rs53
1 files changed, 53 insertions, 0 deletions
diff --git a/cli/src/search.rs b/cli/src/search.rs
index e838271..d140caf 100644
--- a/cli/src/search.rs
+++ b/cli/src/search.rs
@@ -37,6 +37,7 @@ impl DateIsh {
}
}
+#[derive(Clone)]
pub enum Comparison {
Equal,
Greater,
@@ -61,6 +62,7 @@ fn parse_comparison(s: &str) -> Option<(Decimal, Comparison)> {
}
}
+#[derive(Clone)]
pub enum Constraint {
Category(Category),
Before(DateIsh),
@@ -98,6 +100,7 @@ impl Constraint {
}
}
+#[derive(Clone)]
pub enum Filter {
Union(Constraint),
Intersect(Constraint),
@@ -366,4 +369,54 @@ mod test {
vec![1, 2, 3],
);
}
+
+ #[test]
+ fn filters_constraint() {
+ let transactions = vec![
+ Transaction {
+ category: "C1".to_string(),
+ amount: 150.into(),
+ ..transaction(0)
+ },
+ Transaction {
+ category: "C2".to_string(),
+ amount: 150.into(),
+ ..transaction(1)
+ },
+ Transaction {
+ category: "C1".to_string(),
+ amount: 160.into(),
+ ..transaction(2)
+ },
+ Transaction {
+ category: "C2".to_string(),
+ amount: 160.into(),
+ ..transaction(3)
+ },
+ ];
+ let search = Search::new(&transactions);
+
+ let c1 = Constraint::Category("C1".to_string());
+ let amount_150 = Constraint::AmountCompare(150.into(), Comparison::Equal);
+
+ let mut search_filters_1 = search.clone();
+ search_filters_1 = search_filters_1.apply(Filter::Intersect(c1.clone()));
+ search_filters_1 = search_filters_1.apply(Filter::Union(amount_150.clone()));
+ assert_eq!(search_filters_1.get().len(), 3);
+ assert_eq!(
+ search_filters_1.get().iter().map(|t| transaction_id(t)).collect::<Vec<_>>(),
+ vec![0, 1, 2],
+ );
+
+ // Wrap an intersect in a union.
+ let mut search_filters_2 = search.clone();
+ let inner_filters = Constraint::Filters(vec![Filter::Intersect(amount_150)]);
+ search_filters_2 = search_filters_2.apply(Filter::Intersect(c1));
+ search_filters_2 = search_filters_2.apply(Filter::Union(inner_filters));
+ assert_eq!(search_filters_2.get().len(), 3);
+ assert_eq!(
+ search_filters_2.get().iter().map(|t| transaction_id(t)).collect::<Vec<_>>(),
+ vec![0, 1, 2],
+ );
+ }
}