beancount-parser-lima 0.16.2

A zero-copy parser for Beancount
Documentation
#![cfg(test)]
use std::collections::HashSet;

use super::*;
use proptest::prelude::*;
use test_case::test_case;

#[test_case(vec![(2, 'a'), (2, 'b'), (3, 'c'), (1, 'd'), (3, 'e')], vec![(1, 'd'), (2, 'a'), (2, 'b'), (3, 'c'), (3, 'e')])]
fn test_sort_iterator_adapter_manually(unsorted: Vec<(u8, char)>, expected: Vec<(u8, char)>) {
    let sorted = unsorted.into_iter().sort(|(i, _)| *i);

    println!("{:?}", sorted);
    assert_eq!(sorted.collect::<Vec<_>>(), expected);
}

prop_compose! {
    fn arb_key_value(n_keys: u8)(key in 0..n_keys, value in any::<i32>()) -> (u8, i32) {
         (key, value)
    }
}

proptest! {
    #[test]
    fn test_sort_iterator_adapter(unsorted in proptest::collection::vec(arb_key_value(10), 0..100)) {
        let sorted = unsorted.iter().sort(|(i, _)| *i).map(|(k, v)| (*k, *v)).collect::<Vec<_>>();

        assert_eq!(sorted.len(), unsorted.len());

        let keys = unsorted.iter().map(|(k, _v)| *k).collect::<HashSet<_>>();
        for key in keys {
            let matches_key = |(k, v): &(u8, i32)| (*k == key).then_some(*v);
            let unsorted_values = unsorted.iter().filter_map(matches_key).collect::<Vec<_>>();
            let sorted_values = sorted.iter().filter_map(matches_key).collect::<Vec<_>>();

            assert_eq!(&sorted_values, &unsorted_values);
        }
    }
}