(
source: &RelationDesc,
)
| 2012 | /// Generates a set of [`PropRelationDescDiff`]s based on some source [`RelationDesc`]. |
| 2013 | #[cfg(any(test, feature = "proptest"))] |
| 2014 | pub fn arb_relation_desc_diff( |
| 2015 | source: &RelationDesc, |
| 2016 | ) -> impl Strategy<Value = Vec<PropRelationDescDiff>> + use<> { |
| 2017 | let source = Rc::new(source.clone()); |
| 2018 | let num_source_columns = source.typ.columns().len(); |
| 2019 | |
| 2020 | let num_add_columns = Union::new_weighted(vec![(100, Just(0..8)), (1, Just(8..64))]); |
| 2021 | let add_columns_strat = num_add_columns |
| 2022 | .prop_flat_map(|num_columns| { |
| 2023 | proptest::collection::vec((any::<ColumnName>(), any::<SqlColumnType>()), num_columns) |
| 2024 | }) |
| 2025 | .prop_map(|cols| { |
| 2026 | cols.into_iter() |
| 2027 | .map(|(name, typ)| PropRelationDescDiff::AddColumn { name, typ }) |
| 2028 | .collect::<Vec<_>>() |
| 2029 | }); |
| 2030 | |
| 2031 | // If the source RelationDesc is empty there is nothing else to do. |
| 2032 | if num_source_columns == 0 { |
| 2033 | return add_columns_strat.boxed(); |
| 2034 | } |
| 2035 | |
| 2036 | let source_ = Rc::clone(&source); |
| 2037 | let drop_columns_strat = (0..num_source_columns).prop_perturb(move |num_columns, mut rng| { |
| 2038 | let mut set = BTreeSet::default(); |
| 2039 | for _ in 0..num_columns { |
| 2040 | let col_idx = rng.random_range(0..num_source_columns); |
| 2041 | set.insert(source_.get_name(col_idx).clone()); |
| 2042 | } |
| 2043 | set.into_iter() |
| 2044 | .map(|name| PropRelationDescDiff::DropColumn { name }) |
| 2045 | .collect::<Vec<_>>() |
| 2046 | }); |
| 2047 | |
| 2048 | let source_ = Rc::clone(&source); |
| 2049 | let toggle_nullability_strat = |
| 2050 | (0..num_source_columns).prop_perturb(move |num_columns, mut rng| { |
| 2051 | let mut set = BTreeSet::default(); |
| 2052 | for _ in 0..num_columns { |
| 2053 | let col_idx = rng.random_range(0..num_source_columns); |
| 2054 | set.insert(source_.get_name(col_idx).clone()); |
| 2055 | } |
| 2056 | set.into_iter() |
| 2057 | .map(|name| PropRelationDescDiff::ToggleNullability { name }) |
| 2058 | .collect::<Vec<_>>() |
| 2059 | }); |
| 2060 | |
| 2061 | let source_ = Rc::clone(&source); |
| 2062 | let change_type_strat = (0..num_source_columns) |
| 2063 | .prop_perturb(move |num_columns, mut rng| { |
| 2064 | let mut set = BTreeSet::default(); |
| 2065 | for _ in 0..num_columns { |
| 2066 | let col_idx = rng.random_range(0..num_source_columns); |
| 2067 | set.insert(source_.get_name(col_idx).clone()); |
| 2068 | } |
| 2069 | set |
| 2070 | }) |
| 2071 | .prop_flat_map(|cols| { |
no test coverage detected