use super::*;
use std::env::*;
use std::iter::once;
use std::ffi::OsString;
use proptest::collection::vec;
gen_strat!(
Args, args;
ArgsOs, args_os;
Vars, vars;
VarsOs, vars_os;
JoinPathsError, jpe
);
#[cfg(not(target_os = "windows"))]
fn jpe() -> JoinPathsError {
join_paths(once(":")).unwrap_err()
}
#[cfg(target_os = "windows")]
fn jpe() -> JoinPathsError {
join_paths(once("\"")).unwrap_err()
}
#[cfg(target_os = "windows")]
fn make_utf16_invalid(buf: &mut Vec<u16>, p: usize) {
let len = buf.len();
assert!(len > 0);
let gen_trail = (0 == p) || (0xd800 != buf[p - 1] & 0xfc00);
let gen_lead = (p == buf.len() - 1) || (0xdc00 != buf[p + 1] & 0xfc00);
let (force_bits_mask, force_bits_value) = if gen_trail {
if gen_lead {
(0xf800, 0xd800)
} else {
(0xfc00, 0xdc00)
}
} else {
debug_assert!(gen_lead);
(0xfc00, 0xd800)
};
debug_assert_eq!(0, (force_bits_value & !force_bits_mask));
buf[p] = (buf[p] & !force_bits_mask) | force_bits_value;
}
#[cfg(target_os = "windows")]
fn osstring_invalid_string() -> BoxedStrategy<OsString> {
use std::os::windows::ffi::OsStringExt;
any::<u16>().prop_flat_map(|vlen| {
let len = vlen as usize;
let sbuf = vec(..std::u16::MAX, len..len + 1);
static_map((sbuf, 0..len - 1), |(mut buf, p)| {
make_utf16_invalid(&mut buf, p);
OsString::from_wide(buf.as_slice()).into_string().unwrap_err()
})
}).boxed()
}
#[cfg(not(target_os = "windows"))]
fn osstring_invalid_string() -> BoxedStrategy<OsString> {
use std::os::unix::ffi::OsStringExt;
not_utf8_bytes().prop_map(OsString::from_vec).boxed()
}
impl_arbitrary!(VarError,
TupleUnion<(
W<Just<Self>>,
W<SFnPtrMap<BoxedStrategy<OsString>, Self>>
)>,
prop_oneof![
Just(VarError::NotPresent),
static_map(osstring_invalid_string(), VarError::NotUnicode)
]
);
#[cfg(test)]
mod tests {
use any; use any_with;
use super::super::*;
use proptest::collection::vec;
use std::ops::Range;
use super::*;
fn size(r: Range<usize>) -> SizeBounds {
r.into()
}
proptest! {
#[test]
fn foo(ref s in any_with::<Vec<u8>>( size_bounds(0..5).lift_into() )) {
}
#[test]
fn bar(ref s in any_with::<VarError>(())) {
}
}
}