diff --git a/src/uucore/signals.rs b/src/uucore/signals.rs index 8887ddfe1..76a153a03 100644 --- a/src/uucore/signals.rs +++ b/src/uucore/signals.rs @@ -325,21 +325,65 @@ pub static ALL_SIGNALS: [Signal<'static>; 31] = [ ]; pub fn signal_by_name_or_value(signal_name_or_value: &str) -> Option { - if signal_name_or_value == "0" { - return Some(0); - } - for signal in &ALL_SIGNALS { - let long_name = format!("SIG{}", signal.name); - if signal.name == signal_name_or_value || (signal_name_or_value == signal.value.to_string()) - || (long_name == signal_name_or_value) - { - return Some(signal.value); + if let Ok(value) = signal_name_or_value.parse() { + if is_signal(value) { + return Some(value); + } else { + return None; } } - None + let signal_name = signal_name_or_value.trim_left_matches("SIG"); + + ALL_SIGNALS + .iter() + .find(|s| s.name == signal_name) + .map(|s| s.value) } #[inline(always)] pub fn is_signal(num: usize) -> bool { - num < ALL_SIGNALS.len() + // Named signals start at 1 + num <= ALL_SIGNALS.len() +} + +#[test] +fn signals_all_contiguous() { + for (i, signal) in ALL_SIGNALS.iter().enumerate() { + assert_eq!(signal.value, i + 1); + } +} + +#[test] +fn signals_all_are_signal() { + for signal in &ALL_SIGNALS { + assert!(is_signal(signal.value)); + } +} + +#[test] +fn signal_by_value() { + assert_eq!(signal_by_name_or_value("0"), Some(0)); + for signal in &ALL_SIGNALS { + assert_eq!( + signal_by_name_or_value(&signal.value.to_string()), + Some(signal.value) + ); + } +} + +#[test] +fn signal_by_short_name() { + for signal in &ALL_SIGNALS { + assert_eq!(signal_by_name_or_value(signal.name), Some(signal.value)); + } +} + +#[test] +fn signal_by_long_name() { + for signal in &ALL_SIGNALS { + assert_eq!( + signal_by_name_or_value(&format!("SIG{}", signal.name)), + Some(signal.value) + ); + } }