]> git.lizzy.rs Git - rust.git/commitdiff
Make sure windows newlines don't gain an extra carriage return
authorRuben Schmidmeister <ruben.schmidmeister@icloud.com>
Thu, 9 May 2019 15:44:52 +0000 (17:44 +0200)
committerRuben Schmidmeister <ruben.schmidmeister@icloud.com>
Thu, 9 May 2019 15:44:52 +0000 (17:44 +0200)
src/formatting/newline_style.rs

index 02aab9b024b0122ed98573b83a3b5abf0793d054..d46aabe97615fa47042d92e345c95e7c3fa7cdf8 100644 (file)
@@ -65,10 +65,13 @@ fn native_newline_style() -> EffectiveNewlineStyle {
 
 fn convert_to_windows_newlines(formatted_text: &String) -> String {
     let mut transformed = String::with_capacity(2 * formatted_text.capacity());
-    for c in formatted_text.chars() {
-        match c {
+    let mut chars = formatted_text.chars().peekable();
+    while let Some(current_char) = chars.next() {
+        let next_char = chars.peek();
+        match current_char {
             LINE_FEED => transformed.push_str(WINDOWS_NEWLINE),
-            c => transformed.push(c),
+            CARRIAGE_RETURN if next_char == Some(&LINE_FEED) => {}
+            current_char => transformed.push(current_char),
         }
     }
     transformed
@@ -162,34 +165,63 @@ fn auto_detects_and_applies_native_newlines() {
 
     #[test]
     fn applies_unix_newlines() {
-        let formatted_text = "One\r\nTwo\nThree";
-        let raw_input_text = formatted_text;
+        test_newlines_are_applied_correctly(
+            "One\r\nTwo\nThree",
+            "One\nTwo\nThree",
+            NewlineStyle::Unix,
+        );
+    }
 
-        let mut out = String::from(formatted_text);
-        apply_newline_style(NewlineStyle::Unix, &mut out, raw_input_text);
+    #[test]
+    fn applying_windows_newlines_changes_nothing_for_windows_newlines() {
+        let formatted_text = "One\r\nTwo\r\nThree";
 
-        assert_eq!("One\nTwo\nThree", &out);
+        test_newlines_are_applied_correctly(formatted_text, formatted_text, NewlineStyle::Windows);
     }
 
     #[test]
-    fn preserves_standalone_carriage_returns_when_applying_windows_newlines() {
-        let formatted_text = "One\nTwo\nThree\rDrei";
-        let raw_input_text = "One\nTwo\nThree\rDrei";
-
-        let mut out = String::from(formatted_text);
-        apply_newline_style(NewlineStyle::Windows, &mut out, raw_input_text);
+    fn keeps_carriage_returns_when_applying_windows_newlines_to_str_with_unix_newlines() {
+        test_newlines_are_applied_correctly(
+            "One\nTwo\nThree\rDrei",
+            "One\r\nTwo\r\nThree\rDrei",
+            NewlineStyle::Windows,
+        );
+    }
 
-        assert_eq!("One\r\nTwo\r\nThree\rDrei", &out);
+    #[test]
+    fn keeps_carriage_returns_when_applying_unix_newlines_to_str_with_unix_newlines() {
+        test_newlines_are_applied_correctly(
+            "One\nTwo\nThree\rDrei",
+            "One\nTwo\nThree\rDrei",
+            NewlineStyle::Unix,
+        );
     }
 
     #[test]
-    fn preserves_standalone_carriage_returns_when_applying_unix_newlines() {
-        let formatted_text = "One\nTwo\nThree\rDrei";
-        let raw_input_text = "One\nTwo\nThree\rDrei";
+    fn keeps_carriage_returns_when_applying_windows_newlines_to_str_with_windows_newlines() {
+        test_newlines_are_applied_correctly(
+            "One\r\nTwo\r\nThree\rDrei",
+            "One\r\nTwo\r\nThree\rDrei",
+            NewlineStyle::Windows,
+        );
+    }
 
-        let mut out = String::from(formatted_text);
-        apply_newline_style(NewlineStyle::Unix, &mut out, raw_input_text);
+    #[test]
+    fn keeps_carriage_returns_when_applying_unix_newlines_to_str_with_windows_newlines() {
+        test_newlines_are_applied_correctly(
+            "One\r\nTwo\r\nThree\rDrei",
+            "One\nTwo\nThree\rDrei",
+            NewlineStyle::Unix,
+        );
+    }
 
-        assert_eq!("One\nTwo\nThree\rDrei", &out);
+    fn test_newlines_are_applied_correctly(
+        input: &str,
+        expected: &str,
+        newline_style: NewlineStyle,
+    ) {
+        let mut out = String::from(input);
+        apply_newline_style(newline_style, &mut out, input);
+        assert_eq!(expected, &out);
     }
 }