-
Notifications
You must be signed in to change notification settings - Fork 180
/
test_util.rs
110 lines (95 loc) · 3.07 KB
/
test_util.rs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
#![cfg(test)]
use diff;
use chalk_parse;
use itertools::Itertools;
use std::fmt::Write;
use rust_ir::lowering::{LowerProgram, LowerGoal};
use chalk_ir::Goal;
use rust_ir::Program;
use chalk_solve::solve::SolverChoice;
use errors::Result;
pub fn parse_and_lower_program(text: &str, solver_choice: SolverChoice) -> Result<Program> {
chalk_parse::parse_program(text)?.lower(solver_choice)
}
pub fn parse_and_lower_goal(program: &Program, text: &str) -> Result<Box<Goal>> {
chalk_parse::parse_goal(text)?.lower(program)
}
macro_rules! lowering_success {
(program $program:tt) => {
let program_text = stringify!($program);
assert!(program_text.starts_with("{"));
assert!(program_text.ends_with("}"));
let result = parse_and_lower_program(
&program_text[1..program_text.len()-1],
chalk_solve::solve::SolverChoice::default()
);
if let Err(ref e) = result {
println!("lowering error: {}", e);
}
assert!(
result.is_ok()
);
}
}
macro_rules! lowering_error {
(program $program:tt error_msg { $expected:expr }) => {
let program_text = stringify!($program);
assert!(program_text.starts_with("{"));
assert!(program_text.ends_with("}"));
let error = parse_and_lower_program(
&program_text[1..program_text.len()-1],
chalk_solve::solve::SolverChoice::default()
).unwrap_err();
let expected = $crate::errors::Error::from($expected);
assert_eq!(
error.to_string(),
expected.to_string()
);
}
}
crate fn assert_test_result_eq(expected: &str, actual: &str) {
let expected_trimmed: String = expected
.lines()
.map(|l| l.trim())
.intersperse("\n")
.collect();
let actual_trimmed: String = actual
.lines()
.map(|l| l.trim())
.intersperse("\n")
.collect();
if expected_trimmed == actual_trimmed {
return;
}
println!("expected:\n{}", expected);
println!("actual:\n{}", actual);
let diff = diff::lines(
&expected_trimmed,
&actual_trimmed,
);
// Skip to the first error:
let diff = diff.iter().skip_while(|r| match r {
diff::Result::Both(..) => true,
_ => false,
});
let mut final_diff = String::new();
let mut accumulator = vec![];
for result in diff {
let (prefix, s) = match result {
diff::Result::Both(a, _b) => {
// When we see things that are the same, don't print
// them right away; wait until we see another line of
// diff.
accumulator.push(a);
continue;
}
diff::Result::Left(a) => ("- ", a),
diff::Result::Right(a) => ("+ ", a),
};
for l in accumulator.drain(..) {
writeln!(&mut final_diff, " {}", l).unwrap();
}
writeln!(&mut final_diff, "{}{}", prefix, s).unwrap();
}
assert!(false, "expected did not match actual, diff:\n{}", final_diff);
}