diff options
| author | Michael Woerister <michaelwoerister@posteo.net> | 2016-05-03 15:00:24 -0400 |
|---|---|---|
| committer | Michael Woerister <michaelwoerister@posteo.net> | 2016-05-03 15:00:24 -0400 |
| commit | bb0e5254ae59ef135f3feb82964a918b36d6d13d (patch) | |
| tree | e504d35f4ef7dfb8b97a0d3ee6d598ee6a3af4a1 | |
| parent | 42303536c23ecc27e5571efd87d7116fff712bb8 (diff) | |
| download | rust-bb0e5254ae59ef135f3feb82964a918b36d6d13d.tar.gz rust-bb0e5254ae59ef135f3feb82964a918b36d6d13d.zip | |
Make runtest::check_debugger_output() handle wildcards at end.
| -rw-r--r-- | src/tools/compiletest/src/runtest.rs | 98 |
1 files changed, 51 insertions, 47 deletions
diff --git a/src/tools/compiletest/src/runtest.rs b/src/tools/compiletest/src/runtest.rs index fb296d57ebf..e0b7531f7dc 100644 --- a/src/tools/compiletest/src/runtest.rs +++ b/src/tools/compiletest/src/runtest.rs @@ -880,58 +880,62 @@ fn cleanup_debug_info_options(options: &Option<String>) -> Option<String> { fn check_debugger_output(debugger_run_result: &ProcRes, check_lines: &[String]) { let num_check_lines = check_lines.len(); - if num_check_lines > 0 { + + let mut check_line_index = 0; + for line in debugger_run_result.stdout.lines() { + if check_line_index >= num_check_lines { + break; + } + + if check_single_line(line, &(check_lines[check_line_index])[..]) { + check_line_index += 1; + } + } + if check_line_index != num_check_lines && num_check_lines > 0 { + fatal_proc_rec(None, &format!("line not found in debugger output: {}", + check_lines[check_line_index]), + debugger_run_result); + } + + fn check_single_line(line: &str, check_line: &str) -> bool { // Allow check lines to leave parts unspecified (e.g., uninitialized - // bits in the wrong case of an enum) with the notation "[...]". - let check_fragments: Vec<Vec<String>> = - check_lines.iter().map(|s| { - s - .trim() - .split("[...]") - .map(str::to_owned) - .collect() - }).collect(); - // check if each line in props.check_lines appears in the - // output (in order) - let mut i = 0; - for line in debugger_run_result.stdout.lines() { - let mut rest = line.trim(); - let mut first = true; - let mut failed = false; - for frag in &check_fragments[i] { - let found = if first { - if rest.starts_with(frag) { - Some(0) - } else { - None - } - } else { - rest.find(frag) - }; - match found { - None => { - failed = true; - break; - } - Some(i) => { - rest = &rest[(i + frag.len())..]; - } - } - first = false; - } - if !failed && rest.is_empty() { - i += 1; + // bits in the wrong case of an enum) with the notation "[...]". + let line = line.trim(); + let check_line = check_line.trim(); + let can_start_anywhere = check_line.starts_with("[...]"); + let can_end_anywhere = check_line.ends_with("[...]"); + + let check_fragments: Vec<&str> = check_line.split("[...]") + .filter(|frag| !frag.is_empty()) + .collect(); + if check_fragments.is_empty() { + return true; + } + + let (mut rest, first_fragment) = if can_start_anywhere { + match line.find(check_fragments[0]) { + Some(pos) => (&line[pos + check_fragments[0].len() ..], 1), + None => return false } - if i == num_check_lines { - // all lines checked - break; + } else { + (line, 0) + }; + + for fragment_index in first_fragment .. check_fragments.len() { + let current_fragment = check_fragments[fragment_index]; + match rest.find(current_fragment) { + Some(pos) => { + rest = &rest[pos + current_fragment.len() .. ]; + } + None => return false } } - if i != num_check_lines { - fatal_proc_rec(None, &format!("line not found in debugger output: {}", - check_lines.get(i).unwrap()), - debugger_run_result); + + if !can_end_anywhere && !rest.is_empty() { + return false; } + + return true; } } |
