From 69d810bb850c9bacdd7dc528ed98dda0bf001e47 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gustav=20S=C3=B6rn=C3=A4s?= Date: Mon, 2 Aug 2021 21:53:27 +0200 Subject: simple filter_constraints test --- cli/src/search.rs | 53 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) (limited to 'cli/src') 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![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![0, 1, 2], + ); + } } -- cgit v1.2.1