composable_indexes/testutils/props/
prop_assert_reference.rs

1use alloc::vec::Vec;
2use proptest::prelude::*;
3
4use super::test_ops::TestOps;
5use crate::core::{Collection, Index};
6
7pub fn prop_assert_reference<
8    In: Clone + Arbitrary + 'static,
9    Ix: Index<In>,
10    T: core::fmt::Debug + PartialEq + 'static,
11>(
12    mk_index: impl Fn() -> Ix,
13    query: impl Fn(Collection<In, Ix>) -> T,
14    reference_impl: impl Fn(Vec<In>) -> T,
15    config: Option<proptest::test_runner::Config>,
16) {
17    let mut runner = proptest::test_runner::TestRunner::new(config.unwrap_or_default());
18
19    runner
20        .run(&any::<TestOps<In>>(), |ops| {
21            let ref_xs = ops.end_state().values().cloned().collect::<Vec<_>>();
22            let actual = reference_impl(ref_xs);
23
24            let mut db = Collection::new(mk_index());
25            ops.apply(&mut db);
26            let expected = query(db);
27
28            pretty_assertions::assert_eq!(&actual, &expected);
29
30            Ok(())
31        })
32        .unwrap();
33}