use std::env;
use std::ffi::OsString;
use test_runner::FailurePersistence;
const CASES: &str = "PROPTEST_CASES";
const MAX_LOCAL_REJECTS: &str = "PROPTEST_MAX_LOCAL_REJECTS";
const MAX_GLOBAL_REJECTS: &str = "PROPTEST_MAX_GLOBAL_REJECTS";
const MAX_FLAT_MAP_REGENS: &str = "PROPTEST_MAX_FLAT_MAP_REGENS";
lazy_static! {
static ref DEFAULT_CONFIG: Config = {
let mut result = Config {
cases: 256,
max_local_rejects: 65_536,
max_global_rejects: 1024,
max_flat_map_regens: 1_000_000,
failure_persistence: FailurePersistence::default(),
_non_exhaustive: (),
};
fn parse_or_warn(src: &OsString, dst: &mut u32, var: &str) {
if let Some(src) = src.to_str() {
if let Ok(value) = src.parse() {
*dst = value;
} else {
eprintln!(
"proptest: The env-var {}={} can't be parsed as u32, \
using default of {}.", var, src, *dst);
}
} else {
eprintln!(
"proptest: The env-var {} is not valid, using \
default of {}.", var, *dst);
}
}
for (var, value) in env::vars_os() {
if let Some(var) = var.to_str() {
match var {
CASES => parse_or_warn(&value,
&mut result.cases, CASES),
MAX_LOCAL_REJECTS => parse_or_warn(&value,
&mut result.max_local_rejects, MAX_LOCAL_REJECTS),
MAX_GLOBAL_REJECTS => parse_or_warn(&value,
&mut result.max_global_rejects, MAX_GLOBAL_REJECTS),
MAX_FLAT_MAP_REGENS => parse_or_warn(&value,
&mut result.max_flat_map_regens, MAX_FLAT_MAP_REGENS),
_ => if var.starts_with("PROPTEST_") {
eprintln!("proptest: Ignoring unknown env-var {}.",
var);
},
}
}
}
result
};
}
#[derive(Clone, Debug, PartialEq)]
pub struct Config {
pub cases: u32,
pub max_local_rejects: u32,
pub max_global_rejects: u32,
pub max_flat_map_regens: u32,
pub failure_persistence: FailurePersistence,
#[doc(hidden)]
pub _non_exhaustive: (),
}
impl Config {
pub fn with_cases(cases: u32) -> Self {
Self { cases, .. Config::default() }
}
}
impl Default for Config {
fn default() -> Self {
DEFAULT_CONFIG.clone()
}
}