#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum RobotContext {
ArmCommissioning,
ArmOperating,
LeggedStance,
LeggedSwing,
Maintenance,
}
impl RobotContext {
#[inline]
#[must_use]
pub const fn is_suppressed(self) -> bool {
matches!(self, Self::ArmCommissioning | Self::Maintenance)
}
#[inline]
#[must_use]
pub fn admissibility_multiplier(self) -> f64 {
match self {
Self::ArmOperating | Self::LeggedStance => 1.0,
Self::LeggedSwing => 1.5,
Self::ArmCommissioning | Self::Maintenance => f64::INFINITY,
}
}
#[inline]
#[must_use]
pub const fn label(self) -> &'static str {
match self {
Self::ArmCommissioning => "ArmCommissioning",
Self::ArmOperating => "ArmOperating",
Self::LeggedStance => "LeggedStance",
Self::LeggedSwing => "LeggedSwing",
Self::Maintenance => "Maintenance",
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn suppressed_contexts_are_commissioning_and_maintenance() {
assert!(RobotContext::ArmCommissioning.is_suppressed());
assert!(RobotContext::Maintenance.is_suppressed());
assert!(!RobotContext::ArmOperating.is_suppressed());
assert!(!RobotContext::LeggedStance.is_suppressed());
assert!(!RobotContext::LeggedSwing.is_suppressed());
}
#[test]
fn multiplier_matches_contract() {
assert_eq!(RobotContext::ArmOperating.admissibility_multiplier(), 1.0);
assert_eq!(RobotContext::LeggedStance.admissibility_multiplier(), 1.0);
assert_eq!(RobotContext::LeggedSwing.admissibility_multiplier(), 1.5);
assert!(RobotContext::ArmCommissioning.admissibility_multiplier().is_infinite());
assert!(RobotContext::Maintenance.admissibility_multiplier().is_infinite());
}
#[test]
fn labels_are_stable_and_unique() {
let labels = [
RobotContext::ArmCommissioning.label(),
RobotContext::ArmOperating.label(),
RobotContext::LeggedStance.label(),
RobotContext::LeggedSwing.label(),
RobotContext::Maintenance.label(),
];
for (i, a) in labels.iter().enumerate() {
for (j, b) in labels.iter().enumerate() {
if i != j {
assert_ne!(a, b, "labels must be unique");
}
}
}
}
}