From 1ed8a016c1639903e274a81326f7286d7e031dc4 Mon Sep 17 00:00:00 2001 From: Zachary Dremann Date: Mon, 29 Apr 2019 21:32:28 -0400 Subject: [PATCH 1/4] Add tests for signals (including failing test for `is_signal` --- src/uucore/signals.rs | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/src/uucore/signals.rs b/src/uucore/signals.rs index 8887ddfe1..a4a7551e8 100644 --- a/src/uucore/signals.rs +++ b/src/uucore/signals.rs @@ -343,3 +343,39 @@ pub fn signal_by_name_or_value(signal_name_or_value: &str) -> Option { pub fn is_signal(num: usize) -> bool { 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)); + } +} From 8378c28242da262c7e38b45fe4f2861ee35d34cc Mon Sep 17 00:00:00 2001 From: Zachary Dremann Date: Mon, 29 Apr 2019 21:35:07 -0400 Subject: [PATCH 2/4] Fix is_signal --- src/uucore/signals.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/uucore/signals.rs b/src/uucore/signals.rs index a4a7551e8..ee7bcac99 100644 --- a/src/uucore/signals.rs +++ b/src/uucore/signals.rs @@ -341,7 +341,8 @@ pub fn signal_by_name_or_value(signal_name_or_value: &str) -> Option { #[inline(always)] pub fn is_signal(num: usize) -> bool { - num < ALL_SIGNALS.len() + // Named signals start at 1 + num <= ALL_SIGNALS.len() } #[test] From 34eceae2efecd3f4e4cf65b91c375f55c3296c56 Mon Sep 17 00:00:00 2001 From: Zachary Dremann Date: Mon, 29 Apr 2019 21:53:14 -0400 Subject: [PATCH 3/4] Don't allocate in signal_by_name_or_value --- src/uucore/signals.rs | 35 +++++++++++++++++++++++------------ 1 file changed, 23 insertions(+), 12 deletions(-) diff --git a/src/uucore/signals.rs b/src/uucore/signals.rs index ee7bcac99..cbaf580d5 100644 --- a/src/uucore/signals.rs +++ b/src/uucore/signals.rs @@ -325,18 +325,23 @@ 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 = if signal_name_or_value.starts_with("SIG") { + &signal_name_or_value[3..] + } else { + &signal_name_or_value[..] + }; + + ALL_SIGNALS + .iter() + .find(|s| s.name == signal_name) + .map(|s| s.value) } #[inline(always)] @@ -363,7 +368,10 @@ fn signals_all_are_signal() { 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)); + assert_eq!( + signal_by_name_or_value(&signal.value.to_string()), + Some(signal.value) + ); } } @@ -377,6 +385,9 @@ fn signal_by_short_name() { #[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)); + assert_eq!( + signal_by_name_or_value(&format!("SIG{}", signal.name)), + Some(signal.value) + ); } } From 6fe687c84b08fdb5f5c5e771d71f571652b26728 Mon Sep 17 00:00:00 2001 From: Zachary Dremann Date: Tue, 30 Apr 2019 21:02:29 -0400 Subject: [PATCH 4/4] Replace starts_with and slice with trim_left_matches --- src/uucore/signals.rs | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/uucore/signals.rs b/src/uucore/signals.rs index cbaf580d5..76a153a03 100644 --- a/src/uucore/signals.rs +++ b/src/uucore/signals.rs @@ -332,11 +332,7 @@ pub fn signal_by_name_or_value(signal_name_or_value: &str) -> Option { return None; } } - let signal_name = if signal_name_or_value.starts_with("SIG") { - &signal_name_or_value[3..] - } else { - &signal_name_or_value[..] - }; + let signal_name = signal_name_or_value.trim_left_matches("SIG"); ALL_SIGNALS .iter()