Просмотр исходного кода

Add some tests for split_equals

Benjamin Sago 8 лет назад
Родитель
Сommit
62b85e3e93
1 измененных файлов с 54 добавлено и 6 удалено
  1. 54 6
      src/options/parser.rs

+ 54 - 6
src/options/parser.rs

@@ -168,17 +168,65 @@ fn parse<'a>(args: Args, inputs: &'a [OsString]) -> Result<Matches<'a>, ParseErr
 }
 
 
-fn split_on_equals<'a>(input: &OsStr) -> Option<(&OsStr, &OsStr)> {
+/// Splits a string on its `=` character, returning the two substrings on
+/// either side. Returns `None` if there’s no equals or a string is missing.
+fn split_on_equals(input: &OsStr) -> Option<(&OsStr, &OsStr)> {
     use std::os::unix::ffi::OsStrExt;
 
-    input.as_bytes()
-         .iter()
-         .position(|elem| *elem == b'=')
-         .map(|index| input.as_bytes().split_at(index))
-         .map(|(b,a)| (OsStr::from_bytes(b), OsStr::from_bytes(&a[1..])))
+    if let Some(index) = input.as_bytes().iter().position(|elem| *elem == b'=') {
+        let (before, after) = input.as_bytes().split_at(index);
+
+        // The after string contains the = that we need to remove.
+        if before.len() >= 1 && after.len() >= 2 {
+            return Some((OsStr::from_bytes(before),
+                         OsStr::from_bytes(&after[1..])))
+        }
+    }
+
+    None
 }
 
 
+#[cfg(test)]
+mod split_test {
+    use super::split_on_equals;
+    use std::ffi::OsString;
+
+    fn os(input: &'static str) -> OsString {
+        let mut os = OsString::new();
+        os.push(input);
+        os
+    }
+
+    macro_rules! test_split {
+        ($name:ident: $input:expr => None) => {
+            #[test]
+            fn $name() {
+                assert_eq!(split_on_equals(&os($input)),
+                           None);
+            }
+        };
+
+        ($name:ident: $input:expr => $before:expr, $after:expr) => {
+            #[test]
+            fn $name() {
+                assert_eq!(split_on_equals(&os($input)),
+                           Some((&*os($before), &*os($after))));
+            }
+        };
+    }
+
+    test_split!(empty:   ""   => None);
+    test_split!(letter:  "a"  => None);
+
+    test_split!(just:      "="    => None);
+    test_split!(intro:     "=bbb" => None);
+    test_split!(denou:  "aaa="    => None);
+    test_split!(equals: "aaa=bbb" => "aaa", "bbb");
+
+    test_split!(sort: "--sort=size"     => "--sort", "size");
+    test_split!(more: "this=that=other" => "this",   "that=other");
+}
 
 
 #[cfg(test)]