Skip to content

Commit eec833f

Browse files
authored
Merge pull request #2028 from wada314/win-test-crlf
Fix the test framework is failing in CRLF env.
2 parents 802df67 + fe1619b commit eec833f

File tree

1 file changed

+39
-1
lines changed

1 file changed

+39
-1
lines changed

tests/system.rs

Lines changed: 39 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,9 @@ extern crate term;
1717
use std::collections::HashMap;
1818
use std::fs;
1919
use std::io::{self, BufRead, BufReader, Read};
20+
use std::iter::Peekable;
2021
use std::path::{Path, PathBuf};
22+
use std::str::Chars;
2123

2224
use rustfmt::*;
2325
use rustfmt::filemap::{write_system_newlines, FileMap};
@@ -369,7 +371,8 @@ fn handle_result(
369371
let read_error = format!("Failed reading target {:?}", &target);
370372
f.read_to_string(&mut text).expect(&read_error);
371373

372-
if fmt_text != text {
374+
// Ignore LF and CRLF difference for Windows.
375+
if !string_eq_ignore_newline_repr(&fmt_text, &text) {
373376
let diff = make_diff(&text, &fmt_text, DIFF_CONTEXT_SIZE);
374377
assert!(
375378
!diff.is_empty(),
@@ -430,3 +433,38 @@ fn rustfmt_diff_no_diff_test() {
430433
let diff = make_diff("a\nb\nc\nd", "a\nb\nc\nd", 3);
431434
assert_eq!(diff, vec![]);
432435
}
436+
437+
// Compare strings without distinguishing between CRLF and LF
438+
fn string_eq_ignore_newline_repr(left: &str, right: &str) -> bool {
439+
let left = CharsIgnoreNewlineRepr(left.chars().peekable());
440+
let right = CharsIgnoreNewlineRepr(right.chars().peekable());
441+
left.eq(right)
442+
}
443+
444+
struct CharsIgnoreNewlineRepr<'a>(Peekable<Chars<'a>>);
445+
446+
impl<'a> Iterator for CharsIgnoreNewlineRepr<'a> {
447+
type Item = char;
448+
fn next(&mut self) -> Option<char> {
449+
self.0.next().map(|c| if c == '\r' {
450+
if *self.0.peek().unwrap_or(&'\0') == '\n' {
451+
self.0.next();
452+
'\n'
453+
} else {
454+
'\r'
455+
}
456+
} else {
457+
c
458+
})
459+
}
460+
}
461+
462+
#[test]
463+
fn string_eq_ignore_newline_repr_test() {
464+
assert!(string_eq_ignore_newline_repr("", ""));
465+
assert!(!string_eq_ignore_newline_repr("", "abc"));
466+
assert!(!string_eq_ignore_newline_repr("abc", ""));
467+
assert!(string_eq_ignore_newline_repr("a\nb\nc\rd", "a\nb\r\nc\rd"));
468+
assert!(string_eq_ignore_newline_repr("a\r\n\r\n\r\nb", "a\n\n\nb"));
469+
assert!(!string_eq_ignore_newline_repr("a\r\nbcd", "a\nbcdefghijk"));
470+
}

0 commit comments

Comments
 (0)