diff options
Diffstat (limited to 'src/external/arbitrary.rs')
-rw-r--r-- | src/external/arbitrary.rs | 33 |
1 files changed, 33 insertions, 0 deletions
diff --git a/src/external/arbitrary.rs b/src/external/arbitrary.rs new file mode 100644 index 0000000..ae59677 --- /dev/null +++ b/src/external/arbitrary.rs @@ -0,0 +1,33 @@ +//! Specialized fuzzing for flags types using `arbitrary`. + +use crate::Flags; + +/// Get a random known flags value. +pub fn arbitrary<'a, B: Flags>( + u: &mut arbitrary::Unstructured<'a>, +) -> arbitrary::Result<B> +where + B::Bits: arbitrary::Arbitrary<'a> +{ + B::from_bits(u.arbitrary()?).ok_or_else(|| arbitrary::Error::IncorrectFormat) +} + +#[cfg(test)] +mod tests { + use arbitrary::Arbitrary; + + bitflags! { + #[derive(Arbitrary)] + struct Color: u32 { + const RED = 0x1; + const GREEN = 0x2; + const BLUE = 0x4; + } + } + + #[test] + fn test_arbitrary() { + let mut unstructured = arbitrary::Unstructured::new(&[0_u8; 256]); + let _color = Color::arbitrary(&mut unstructured); + } +} |