use ::quickcheck::Arbitrary;
pub(crate) fn channel_spec(g: &mut ::quickcheck::Gen) -> crate::audio::ChannelSpec {
crate::audio::ChannelSpec::new(u32::arbitrary(g), u32::arbitrary(g)).with_label(
::smol_str::SmolStr::from(<::std::string::String as Arbitrary>::arbitrary(g)),
)
}
pub(crate) fn channel_layout_description(
g: &mut ::quickcheck::Gen,
) -> crate::audio::ChannelLayoutDescription {
crate::audio::ChannelLayoutDescription::new(u32::arbitrary(g))
.with_order(Arbitrary::arbitrary(g))
.with_known_kind(Arbitrary::arbitrary(g))
.with_native_mask(<::core::option::Option<u64> as Arbitrary>::arbitrary(g))
.with_custom_channels(<::std::vec::Vec<crate::audio::ChannelSpec> as Arbitrary>::arbitrary(g))
.with_text(::smol_str::SmolStr::from(
<::std::string::String as Arbitrary>::arbitrary(g),
))
}
pub(crate) fn loudness(g: &mut ::quickcheck::Gen) -> crate::audio::Loudness {
fn finite(g: &mut ::quickcheck::Gen) -> f32 {
(i32::arbitrary(g).rem_euclid(20_000_001) - 10_000_000) as f32 / 100.0
}
crate::audio::Loudness::new(finite(g), finite(g), finite(g), finite(g))
}
pub(crate) fn replay_gain(g: &mut ::quickcheck::Gen) -> crate::audio::ReplayGain {
fn finite(g: &mut ::quickcheck::Gen) -> f32 {
(i32::arbitrary(g).rem_euclid(20_000_001) - 10_000_000) as f32 / 100.0
}
let album_gain = if bool::arbitrary(g) {
Some(finite(g))
} else {
None
};
let album_peak = if bool::arbitrary(g) {
Some(finite(g))
} else {
None
};
crate::audio::ReplayGain::new(finite(g), finite(g), album_gain, album_peak)
}
pub(crate) fn fingerprint(g: &mut ::quickcheck::Gen) -> crate::audio::Fingerprint {
let algo_s = <::std::string::String as Arbitrary>::arbitrary(g);
let algo: ::smol_str::SmolStr = if algo_s.is_empty() {
::smol_str::SmolStr::new_inline("x")
} else {
algo_s.into()
};
let value = ::bytes::Bytes::from(<::std::vec::Vec<u8> as Arbitrary>::arbitrary(g));
crate::audio::Fingerprint::try_new(algo, value).expect("algo non-empty by construction")
}
pub(crate) fn cover_art(g: &mut ::quickcheck::Gen) -> crate::audio::CoverArt {
let mime_s = <::std::string::String as Arbitrary>::arbitrary(g);
let mime: ::smol_str::SmolStr = if mime_s.is_empty() {
::smol_str::SmolStr::new_static("application/octet-stream")
} else {
mime_s.into()
};
let data_v = <::std::vec::Vec<u8> as Arbitrary>::arbitrary(g);
let data = ::bytes::Bytes::from(if data_v.is_empty() {
::std::vec![0u8]
} else {
data_v
});
crate::audio::CoverArt::try_new(mime, data).expect("mime + data non-empty by construction")
}
pub(crate) fn tags(g: &mut ::quickcheck::Gen) -> crate::audio::Tags {
crate::audio::Tags::new()
.with_title(::smol_str::SmolStr::from(
<::std::string::String as Arbitrary>::arbitrary(g),
))
.with_artist(::smol_str::SmolStr::from(
<::std::string::String as Arbitrary>::arbitrary(g),
))
.with_album_artist(::smol_str::SmolStr::from(
<::std::string::String as Arbitrary>::arbitrary(g),
))
.with_album(::smol_str::SmolStr::from(
<::std::string::String as Arbitrary>::arbitrary(g),
))
.with_composer(::smol_str::SmolStr::from(
<::std::string::String as Arbitrary>::arbitrary(g),
))
.with_genre(::smol_str::SmolStr::from(
<::std::string::String as Arbitrary>::arbitrary(g),
))
.with_comment(::smol_str::SmolStr::from(
<::std::string::String as Arbitrary>::arbitrary(g),
))
.with_year(<u16 as Arbitrary>::arbitrary(g))
.with_track_number(<u16 as Arbitrary>::arbitrary(g))
.with_track_total(<u16 as Arbitrary>::arbitrary(g))
.with_disc_number(<u16 as Arbitrary>::arbitrary(g))
.with_disc_total(<u16 as Arbitrary>::arbitrary(g))
.maybe_language(if bool::arbitrary(g) {
Some(language(g))
} else {
None
})
}
pub(crate) fn capture_device(g: &mut ::quickcheck::Gen) -> crate::capture::Device {
crate::capture::Device::new()
.with_make(::smol_str::SmolStr::from(
<::std::string::String as Arbitrary>::arbitrary(g),
))
.with_model(::smol_str::SmolStr::from(
<::std::string::String as Arbitrary>::arbitrary(g),
))
}
pub(crate) fn geo_location(g: &mut ::quickcheck::Gen) -> crate::capture::GeoLocation {
let lat = (i32::arbitrary(g).rem_euclid(18_001) - 9_000) as f64 / 100.0;
let lon = (i32::arbitrary(g).rem_euclid(36_001) - 18_000) as f64 / 100.0;
let altitude = if bool::arbitrary(g) {
Some((i32::arbitrary(g).rem_euclid(101_001) - 1_000) as f32)
} else {
None
};
crate::capture::GeoLocation::try_new(lat, lon, altitude)
.expect("lat/lon in-range and altitude finite by construction")
}
pub(crate) fn language(g: &mut ::quickcheck::Gen) -> crate::lang::LanguageId {
const TAGS: &[&str] = &[
"und",
"en",
"en-US",
"es",
"fr",
"de",
"ja",
"zh-Hant-TW",
"pt-BR",
"ar",
"ru",
"ko",
"de-CH-1901",
"en-US-x-lorem",
];
let tag: &&str = g.choose(TAGS).expect("non-empty curated TAGS slice");
crate::lang::LanguageId::new(tag).expect("curated BCP 47 tag must parse")
}
pub(crate) fn language_subtag(g: &mut ::quickcheck::Gen) -> crate::lang::Language {
const SUBTAGS: &[&str] = &[
"und", "en", "de", "fr", "es", "zh", "ja", "yue", "ar", "qaa",
];
let subtag: &&str = g.choose(SUBTAGS).expect("non-empty curated slice");
crate::lang::Language::new(subtag).expect("curated language subtag must parse")
}
pub(crate) fn script_subtag(g: &mut ::quickcheck::Gen) -> crate::lang::ScriptSubtag {
const SUBTAGS: &[&str] = &[
"Latn", "Hans", "Hant", "Cyrl", "Arab", "Jpan", "Zxxx", "Zzzz",
];
let subtag: &&str = g.choose(SUBTAGS).expect("non-empty curated slice");
crate::lang::ScriptSubtag::new(subtag).expect("curated script subtag must parse")
}
pub(crate) fn region(g: &mut ::quickcheck::Gen) -> crate::lang::Region {
const SUBTAGS: &[&str] = &["US", "DE", "TW", "CN", "BR", "ZZ", "419", "001", "150"];
let subtag: &&str = g.choose(SUBTAGS).expect("non-empty curated slice");
crate::lang::Region::new(subtag).expect("curated region subtag must parse")
}