Something went wrong. Try again.
forked from tvlfyi/tvix
Something went wrong. Try again.
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697//! Support for configurable generation of arbitrary nix values
use proptest::collection::{hash_map, vec};use proptest::{prelude::*, strategy::BoxedStrategy};use rustc_hash::FxHashMap;use std::ffi::OsString;
use super::{NixAttrs, NixList, NixString, Value};
#[derive(Clone)]pub enum Parameters { Strategy(BoxedStrategy<Value>), Parameters { generate_internal_values: bool, generate_functions: bool, generate_nested: bool, },}
impl Default for Parameters { fn default() -> Self { Self::Parameters { generate_internal_values: false, generate_functions: false, generate_nested: true, } }}
impl Arbitrary for NixAttrs { type Parameters = Parameters; type Strategy = BoxedStrategy<Self>;
fn arbitrary_with(args: Self::Parameters) -> Self::Strategy { hash_map(NixString::arbitrary(), Value::arbitrary_with(args), 0..100) .prop_map(|map| FxHashMap::from_iter(map).into()) .boxed() }}
impl Arbitrary for NixList { type Parameters = <Value as Arbitrary>::Parameters; type Strategy = BoxedStrategy<Self>;
fn arbitrary_with(args: Self::Parameters) -> Self::Strategy { vec(<Value as Arbitrary>::arbitrary_with(args), 0..100) .prop_map(NixList::from) .boxed() }}
impl Arbitrary for Value { type Parameters = Parameters; type Strategy = BoxedStrategy<Self>;
fn arbitrary_with(args: Self::Parameters) -> Self::Strategy { match args { Parameters::Strategy(s) => s, Parameters::Parameters { generate_internal_values, generate_functions, generate_nested, } => { if generate_internal_values || generate_functions { todo!("Generating internal values and functions not implemented yet") } else if generate_nested { non_internal_value().boxed() } else { leaf_value().boxed() } } } }}
fn leaf_value() -> impl Strategy<Value = Value> { use Value::*;
prop_oneof![ Just(Null), any::<bool>().prop_map(Bool), any::<i64>().prop_map(Integer), any::<f64>().prop_map(Float), any::<NixString>().prop_map(String), any::<OsString>().prop_map(|s| Path(Box::new(s.into()))), ]}
fn non_internal_value() -> impl Strategy<Value = Value> { leaf_value().prop_recursive(3, 5, 5, |inner| { prop_oneof![ NixAttrs::arbitrary_with(Parameters::Strategy(inner.clone())).prop_map(Value::attrs), any_with::<NixList>(Parameters::Strategy(inner)).prop_map(Value::List) ] })}