use ::quickcheck::{Arbitrary, Gen};
macro_rules! arb_via_code {
($($fn:ident => $ty:path),* $(,)?) => { $(
#[inline]
pub(crate) fn $fn(g: &mut Gen) -> $ty {
<$ty>::from_u32(u32::arbitrary(g))
}
)* };
}
macro_rules! qc_via_named_variants {
($($fn:ident => $ty:path, [$($variant:ident),+ $(,)?]);* $(;)?) => { $(
#[inline]
pub(crate) fn $fn(g: &mut Gen) -> $ty {
const NAMED: &[$ty] = &[$(<$ty>::$variant),+];
*g.choose(NAMED).expect("non-empty NAMED slice")
}
)* };
}
macro_rules! qc_via_code_weighted {
($($fn:ident => $ty:path, [$($variant:ident),+ $(,)?]);* $(;)?) => { $(
#[inline]
pub(crate) fn $fn(g: &mut Gen) -> $ty {
if bool::arbitrary(g) {
const NAMED: &[$ty] = &[$(<$ty>::$variant),+];
*g.choose(NAMED).expect("non-empty NAMED slice")
} else {
<$ty>::from_u32(u32::arbitrary(g))
}
}
)* };
}
macro_rules! qc_via_code_weighted_range {
($($fn:ident => $ty:path, max_named = $max:expr);* $(;)?) => { $(
#[inline]
pub(crate) fn $fn(g: &mut Gen) -> $ty {
let code = if bool::arbitrary(g) {
u32::arbitrary(g) % ($max + 1)
} else {
u32::arbitrary(g)
};
<$ty>::from_u32(code)
}
)* };
}
arb_via_code! {
track_disposition => crate::disposition::TrackDisposition,
}
qc_via_code_weighted_range! {
primaries => crate::color::Primaries, max_named = 22;
transfer => crate::color::Transfer, max_named = 18;
pixel_format => crate::pixel_format::PixelFormat, max_named = 947;
}
#[inline]
pub(crate) fn matrix(g: &mut Gen) -> crate::color::Matrix {
let code = match *g.choose(&[0u8, 1, 2]).expect("non-empty arm-tag slice") {
0 => u32::arbitrary(g) % 18, 1 => crate::color::DOMAIN_EXT_BASE, _ => u32::arbitrary(g),
};
crate::color::Matrix::from_u32(code)
}
qc_via_named_variants! {
bit_rate_mode => crate::audio::BitRateMode, [Cbr, Vbr, Abr];
track_origin => crate::subtitle::TrackOrigin, [Embedded, Sidecar, External];
}
qc_via_code_weighted! {
rotation => crate::frame::Rotation, [D0, D90, D180, D270];
field_order => crate::frame::FieldOrder, [Progressive, Tt, Bb, Tb, Bt];
stereo_mode => crate::frame::StereoMode,
[Mono, SideBySide, TopBottom, FrameSequence, Checkerboard, SideBySideQuincunx, Lines, Columns];
dynamic_range => crate::color::DynamicRange, [Unspecified, Limited, Full];
chroma_location => crate::color::ChromaLocation,
[Unspecified, Left, Center, TopLeft, Top, BottomLeft, Bottom];
dcp_target_gamut => crate::color::DcpTargetGamut, [DciP3, Rec709, Rec2020];
}
#[inline]
pub(crate) fn info(g: &mut Gen) -> crate::color::Info {
crate::color::Info::new(
primaries(g),
transfer(g),
matrix(g),
dynamic_range(g),
chroma_location(g),
)
}
#[inline]
pub(crate) fn content_light_level(g: &mut Gen) -> crate::color::ContentLightLevel {
crate::color::ContentLightLevel::new(u32::arbitrary(g), u32::arbitrary(g))
}
#[inline]
pub(crate) fn chroma_coord(g: &mut Gen) -> crate::color::ChromaCoord {
crate::color::ChromaCoord::new(u32::arbitrary(g), u32::arbitrary(g))
}
#[inline]
pub(crate) fn mastering_display(g: &mut Gen) -> crate::color::MasteringDisplay {
let primaries = [chroma_coord(g), chroma_coord(g), chroma_coord(g)];
let white_point = chroma_coord(g);
crate::color::MasteringDisplay::new(primaries, white_point, u32::arbitrary(g), u32::arbitrary(g))
}
#[inline]
pub(crate) fn hdr_static_metadata(g: &mut Gen) -> crate::color::HdrStaticMetadata {
let md = if bool::arbitrary(g) {
Some(mastering_display(g))
} else {
None
};
let cll = if bool::arbitrary(g) {
Some(content_light_level(g))
} else {
None
};
crate::color::HdrStaticMetadata::new(md, cll)
}
#[inline]
pub(crate) fn dolby_vision_config(g: &mut Gen) -> crate::color::DolbyVisionConfig {
crate::color::DolbyVisionConfig::new(
u8::arbitrary(g),
u8::arbitrary(g),
bool::arbitrary(g),
bool::arbitrary(g),
u8::arbitrary(g),
)
}
#[inline]
pub(crate) fn dimensions(g: &mut Gen) -> crate::frame::Dimensions {
crate::frame::Dimensions::new(u32::arbitrary(g), u32::arbitrary(g))
}
#[inline]
pub(crate) fn rect(g: &mut Gen) -> crate::frame::Rect {
crate::frame::Rect::new(
u32::arbitrary(g),
u32::arbitrary(g),
u32::arbitrary(g),
u32::arbitrary(g),
)
}
#[inline]
pub(crate) fn rational(g: &mut Gen) -> crate::frame::Rational {
crate::frame::Rational::new(u32::arbitrary(g), ::core::num::NonZeroU32::arbitrary(g))
}
#[inline]
pub(crate) fn sample_aspect_ratio(g: &mut Gen) -> crate::frame::SampleAspectRatio {
crate::frame::SampleAspectRatio::new(u32::arbitrary(g), ::core::num::NonZeroU32::arbitrary(g))
}
#[inline]
pub(crate) fn frame_rate(g: &mut Gen) -> crate::frame::FrameRate {
crate::frame::FrameRate::new(rational(g), bool::arbitrary(g))
}