Skip to content

Commit cb501a6

Browse files
Move items related to computing diffs to a separate file
1 parent d14731c commit cb501a6

File tree

3 files changed

+109
-106
lines changed

3 files changed

+109
-106
lines changed
+106
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
1+
use std::collections::VecDeque;
2+
3+
#[derive(Debug, PartialEq)]
4+
pub enum DiffLine {
5+
Context(String),
6+
Expected(String),
7+
Resulting(String),
8+
}
9+
10+
#[derive(Debug, PartialEq)]
11+
pub struct Mismatch {
12+
pub line_number: u32,
13+
pub lines: Vec<DiffLine>,
14+
}
15+
16+
impl Mismatch {
17+
fn new(line_number: u32) -> Mismatch {
18+
Mismatch { line_number, lines: Vec::new() }
19+
}
20+
}
21+
22+
// Produces a diff between the expected output and actual output.
23+
pub fn make_diff(expected: &str, actual: &str, context_size: usize) -> Vec<Mismatch> {
24+
let mut line_number = 1;
25+
let mut context_queue: VecDeque<&str> = VecDeque::with_capacity(context_size);
26+
let mut lines_since_mismatch = context_size + 1;
27+
let mut results = Vec::new();
28+
let mut mismatch = Mismatch::new(0);
29+
30+
for result in diff::lines(expected, actual) {
31+
match result {
32+
diff::Result::Left(str) => {
33+
if lines_since_mismatch >= context_size && lines_since_mismatch > 0 {
34+
results.push(mismatch);
35+
mismatch = Mismatch::new(line_number - context_queue.len() as u32);
36+
}
37+
38+
while let Some(line) = context_queue.pop_front() {
39+
mismatch.lines.push(DiffLine::Context(line.to_owned()));
40+
}
41+
42+
mismatch.lines.push(DiffLine::Expected(str.to_owned()));
43+
line_number += 1;
44+
lines_since_mismatch = 0;
45+
}
46+
diff::Result::Right(str) => {
47+
if lines_since_mismatch >= context_size && lines_since_mismatch > 0 {
48+
results.push(mismatch);
49+
mismatch = Mismatch::new(line_number - context_queue.len() as u32);
50+
}
51+
52+
while let Some(line) = context_queue.pop_front() {
53+
mismatch.lines.push(DiffLine::Context(line.to_owned()));
54+
}
55+
56+
mismatch.lines.push(DiffLine::Resulting(str.to_owned()));
57+
lines_since_mismatch = 0;
58+
}
59+
diff::Result::Both(str, _) => {
60+
if context_queue.len() >= context_size {
61+
let _ = context_queue.pop_front();
62+
}
63+
64+
if lines_since_mismatch < context_size {
65+
mismatch.lines.push(DiffLine::Context(str.to_owned()));
66+
} else if context_size > 0 {
67+
context_queue.push_back(str);
68+
}
69+
70+
line_number += 1;
71+
lines_since_mismatch += 1;
72+
}
73+
}
74+
}
75+
76+
results.push(mismatch);
77+
results.remove(0);
78+
79+
results
80+
}
81+
82+
pub(crate) fn write_diff(expected: &str, actual: &str, context_size: usize) -> String {
83+
use std::fmt::Write;
84+
let mut output = String::new();
85+
let diff_results = make_diff(expected, actual, context_size);
86+
for result in diff_results {
87+
let mut line_number = result.line_number;
88+
for line in result.lines {
89+
match line {
90+
DiffLine::Expected(e) => {
91+
writeln!(output, "-\t{}", e).unwrap();
92+
line_number += 1;
93+
}
94+
DiffLine::Context(c) => {
95+
writeln!(output, "{}\t{}", line_number, c).unwrap();
96+
line_number += 1;
97+
}
98+
DiffLine::Resulting(r) => {
99+
writeln!(output, "+\t{}", r).unwrap();
100+
}
101+
}
102+
}
103+
writeln!(output).unwrap();
104+
}
105+
output
106+
}

src/tools/compiletest/src/main.rs

+1
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ use self::header::{make_test_description, EarlyProps};
2828
mod tests;
2929

3030
pub mod common;
31+
pub mod compute_diff;
3132
pub mod errors;
3233
pub mod header;
3334
mod json;

src/tools/compiletest/src/runtest.rs

+2-106
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ use crate::common::{CompareMode, FailMode, PassMode};
88
use crate::common::{Config, TestPaths};
99
use crate::common::{Pretty, RunPassValgrind};
1010
use crate::common::{UI_RUN_STDERR, UI_RUN_STDOUT};
11+
use crate::compute_diff::write_diff;
1112
use crate::errors::{self, Error, ErrorKind};
1213
use crate::header::TestProps;
1314
use crate::json;
@@ -18,7 +19,7 @@ use regex::{Captures, Regex};
1819
use rustfix::{apply_suggestions, get_suggestions_from_json, Filter};
1920

2021
use std::collections::hash_map::DefaultHasher;
21-
use std::collections::{HashMap, HashSet, VecDeque};
22+
use std::collections::{HashMap, HashSet};
2223
use std::env;
2324
use std::ffi::{OsStr, OsString};
2425
use std::fs::{self, create_dir_all, File, OpenOptions};
@@ -100,111 +101,6 @@ pub fn get_lib_name(lib: &str, dylib: bool) -> String {
100101
}
101102
}
102103

103-
#[derive(Debug, PartialEq)]
104-
pub enum DiffLine {
105-
Context(String),
106-
Expected(String),
107-
Resulting(String),
108-
}
109-
110-
#[derive(Debug, PartialEq)]
111-
pub struct Mismatch {
112-
pub line_number: u32,
113-
pub lines: Vec<DiffLine>,
114-
}
115-
116-
impl Mismatch {
117-
fn new(line_number: u32) -> Mismatch {
118-
Mismatch { line_number, lines: Vec::new() }
119-
}
120-
}
121-
122-
// Produces a diff between the expected output and actual output.
123-
pub fn make_diff(expected: &str, actual: &str, context_size: usize) -> Vec<Mismatch> {
124-
let mut line_number = 1;
125-
let mut context_queue: VecDeque<&str> = VecDeque::with_capacity(context_size);
126-
let mut lines_since_mismatch = context_size + 1;
127-
let mut results = Vec::new();
128-
let mut mismatch = Mismatch::new(0);
129-
130-
for result in diff::lines(expected, actual) {
131-
match result {
132-
diff::Result::Left(str) => {
133-
if lines_since_mismatch >= context_size && lines_since_mismatch > 0 {
134-
results.push(mismatch);
135-
mismatch = Mismatch::new(line_number - context_queue.len() as u32);
136-
}
137-
138-
while let Some(line) = context_queue.pop_front() {
139-
mismatch.lines.push(DiffLine::Context(line.to_owned()));
140-
}
141-
142-
mismatch.lines.push(DiffLine::Expected(str.to_owned()));
143-
line_number += 1;
144-
lines_since_mismatch = 0;
145-
}
146-
diff::Result::Right(str) => {
147-
if lines_since_mismatch >= context_size && lines_since_mismatch > 0 {
148-
results.push(mismatch);
149-
mismatch = Mismatch::new(line_number - context_queue.len() as u32);
150-
}
151-
152-
while let Some(line) = context_queue.pop_front() {
153-
mismatch.lines.push(DiffLine::Context(line.to_owned()));
154-
}
155-
156-
mismatch.lines.push(DiffLine::Resulting(str.to_owned()));
157-
lines_since_mismatch = 0;
158-
}
159-
diff::Result::Both(str, _) => {
160-
if context_queue.len() >= context_size {
161-
let _ = context_queue.pop_front();
162-
}
163-
164-
if lines_since_mismatch < context_size {
165-
mismatch.lines.push(DiffLine::Context(str.to_owned()));
166-
} else if context_size > 0 {
167-
context_queue.push_back(str);
168-
}
169-
170-
line_number += 1;
171-
lines_since_mismatch += 1;
172-
}
173-
}
174-
}
175-
176-
results.push(mismatch);
177-
results.remove(0);
178-
179-
results
180-
}
181-
182-
fn write_diff(expected: &str, actual: &str, context_size: usize) -> String {
183-
use std::fmt::Write;
184-
let mut output = String::new();
185-
let diff_results = make_diff(expected, actual, context_size);
186-
for result in diff_results {
187-
let mut line_number = result.line_number;
188-
for line in result.lines {
189-
match line {
190-
DiffLine::Expected(e) => {
191-
writeln!(output, "-\t{}", e).unwrap();
192-
line_number += 1;
193-
}
194-
DiffLine::Context(c) => {
195-
writeln!(output, "{}\t{}", line_number, c).unwrap();
196-
line_number += 1;
197-
}
198-
DiffLine::Resulting(r) => {
199-
writeln!(output, "+\t{}", r).unwrap();
200-
}
201-
}
202-
}
203-
writeln!(output).unwrap();
204-
}
205-
output
206-
}
207-
208104
pub fn run(config: Config, testpaths: &TestPaths, revision: Option<&str>) {
209105
match &*config.target {
210106
"arm-linux-androideabi"

0 commit comments

Comments
 (0)