diff options
| -rw-r--r-- | cli/src/search.rs | 53 |
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], + ); + } } |
