use num_enum::{IntoPrimitive, TryFromPrimitive};
use strum::VariantArray;
#[derive(
Clone, Copy, PartialEq, Eq, Hash, Debug, TryFromPrimitive, IntoPrimitive, VariantArray,
)]
#[repr(i32)]
pub enum SigWriteCode {
Ok = 0,
NoPrototype = 1,
ArgRange = 2,
Build = 3,
Apply = 4,
}
#[derive(
Clone, Copy, PartialEq, Eq, Hash, Debug, TryFromPrimitive, IntoPrimitive, VariantArray,
)]
#[repr(i32)]
pub enum TypeApplyCode {
Ok = 0,
ErrInput = 1,
ErrApply = 2,
}
#[cfg(test)]
mod tests {
use assert2::assert;
use rstest::rstest;
use super::*;
#[test]
fn sig_write_code_round_trips() {
for &code in SigWriteCode::VARIANTS {
assert!(SigWriteCode::try_from(i32::from(code)) == Ok(code));
}
}
#[rstest]
#[case::just_past_the_set(5)]
#[case::far_past_the_set(100)]
#[case::negative(-1)]
#[case::i32_min(i32::MIN)]
#[case::i32_max(i32::MAX)]
fn sig_write_code_rejects_values_outside_the_set(#[case] raw: i32) {
assert!(SigWriteCode::try_from(raw).is_err());
}
#[rstest]
#[case::ok(SigWriteCode::Ok, crate::SIG_OK)]
#[case::no_prototype(SigWriteCode::NoPrototype, crate::SIG_NO_PROTOTYPE)]
#[case::arg_range(SigWriteCode::ArgRange, crate::SIG_ARG_RANGE)]
#[case::build(SigWriteCode::Build, crate::SIG_BUILD)]
#[case::apply(SigWriteCode::Apply, crate::SIG_APPLY)]
fn sig_write_code_pins_the_generated_facade_values(
#[case] code: SigWriteCode,
#[case] raw: i32,
) {
assert!(i32::from(code) == raw);
}
#[test]
fn type_apply_code_round_trips() {
for &code in TypeApplyCode::VARIANTS {
assert!(TypeApplyCode::try_from(i32::from(code)) == Ok(code));
}
}
#[rstest]
#[case::just_past_the_set(3)]
#[case::far_past_the_set(100)]
#[case::negative(-1)]
#[case::i32_min(i32::MIN)]
#[case::i32_max(i32::MAX)]
fn type_apply_code_rejects_values_outside_the_set(#[case] raw: i32) {
assert!(TypeApplyCode::try_from(raw).is_err());
}
#[rstest]
#[case::ok(TypeApplyCode::Ok, crate::TYPE_OK)]
#[case::err_input(TypeApplyCode::ErrInput, crate::TYPE_ERR_INPUT)]
#[case::err_apply(TypeApplyCode::ErrApply, crate::TYPE_ERR_APPLY)]
fn type_apply_code_pins_the_generated_facade_values(
#[case] code: TypeApplyCode,
#[case] raw: i32,
) {
assert!(i32::from(code) == raw);
}
}