#[derive(Debug, Default, Clone, Copy, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum RoboticsMotif {
StribeckGap,
BacklashRing,
BpfiGrowth,
GrfDesync,
MpcStanceLag,
CoMDrift,
#[default]
Unknown,
}
impl RoboticsMotif {
#[inline]
#[must_use]
pub const fn label(self) -> &'static str {
match self {
Self::StribeckGap => "StribeckGap",
Self::BacklashRing => "BacklashRing",
Self::BpfiGrowth => "BpfiGrowth",
Self::GrfDesync => "GrfDesync",
Self::MpcStanceLag => "MpcStanceLag",
Self::CoMDrift => "CoMDrift",
Self::Unknown => "Unknown",
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn default_is_unknown() {
assert_eq!(RoboticsMotif::default(), RoboticsMotif::Unknown);
}
#[test]
fn labels_are_unique() {
let all = [
RoboticsMotif::StribeckGap,
RoboticsMotif::BacklashRing,
RoboticsMotif::BpfiGrowth,
RoboticsMotif::GrfDesync,
RoboticsMotif::MpcStanceLag,
RoboticsMotif::CoMDrift,
RoboticsMotif::Unknown,
];
for (i, a) in all.iter().enumerate() {
for (j, b) in all.iter().enumerate() {
if i != j {
assert_ne!(a.label(), b.label(), "duplicate label");
}
}
}
}
}