#[derive(Debug, Clone, PartialEq, Eq)]
pub enum XizageSize {
Fixed(u16),
Variable,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct Xizage {
pub hs: u8,
pub ss: u8,
pub os: u8,
pub fs: XizageSize,
pub ls: u8,
}
impl Xizage {
#[must_use]
pub const fn new(hs: u8, ss: u8, os: u8, fs: XizageSize, ls: u8) -> Self {
Self { hs, ss, os, fs, ls }
}
#[inline]
#[must_use]
#[allow(clippy::as_conversions, reason = "From::from() is not const-stable")]
pub const fn hs(&self) -> usize {
self.hs as usize
}
#[inline]
#[must_use]
#[allow(clippy::as_conversions, reason = "From::from() is not const-stable")]
pub const fn ss(&self) -> usize {
self.ss as usize
}
#[inline]
#[must_use]
#[allow(clippy::as_conversions, reason = "From::from() is not const-stable")]
pub const fn os(&self) -> usize {
self.os as usize
}
#[inline]
#[must_use]
#[allow(clippy::as_conversions, reason = "From::from() is not const-stable")]
pub const fn ls(&self) -> usize {
self.ls as usize
}
#[inline]
#[must_use]
pub const fn fs(&self) -> &XizageSize {
&self.fs
}
}
#[cfg(test)]
mod tests {
use super::*;
use rstest::rstest;
#[test]
fn xizage_construction_and_accessors() {
let x = Xizage::new(1, 1, 0, XizageSize::Fixed(88), 0);
assert_eq!(x.hs(), 1);
assert_eq!(x.ss(), 1);
assert_eq!(x.os(), 0);
assert_eq!(x.ls(), 0);
assert_eq!(*x.fs(), XizageSize::Fixed(88));
}
#[test]
fn xizage_variable_size() {
let x = Xizage::new(2, 2, 0, XizageSize::Variable, 0);
assert_eq!(*x.fs(), XizageSize::Variable);
}
#[rstest]
#[case(1, 1, 0, XizageSize::Fixed(88), 0)]
#[case(2, 2, 1, XizageSize::Fixed(88), 1)]
#[case(2, 4, 2, XizageSize::Variable, 0)]
fn xizage_parameterized(
#[case] hs: u8,
#[case] ss: u8,
#[case] os: u8,
#[case] fs: XizageSize,
#[case] ls: u8,
) {
let x = Xizage::new(hs, ss, os, fs.clone(), ls);
assert_eq!(x.hs(), usize::from(hs));
assert_eq!(x.ss(), usize::from(ss));
assert_eq!(x.os(), usize::from(os));
assert_eq!(x.ls(), usize::from(ls));
assert_eq!(*x.fs(), fs);
}
#[test]
fn xizage_equality() {
let a = Xizage::new(1, 1, 0, XizageSize::Fixed(88), 0);
let b = Xizage::new(1, 1, 0, XizageSize::Fixed(88), 0);
let c = Xizage::new(2, 2, 1, XizageSize::Fixed(88), 0);
assert_eq!(a, b);
assert_ne!(a, c);
}
#[test]
fn xizage_clone() {
let original = Xizage::new(1, 1, 0, XizageSize::Fixed(88), 0);
let cloned = original.clone();
assert_eq!(original, cloned);
}
}