Skip to content

Commit 73ce746

Browse files
Make comparison between solvers first-class
That way, only the result of the first `SolverChoice` is used to "bless" the expected output. Others are simply compared with the first choice.
1 parent 1c4b1be commit 73ce746

File tree

2 files changed

+94
-15
lines changed

2 files changed

+94
-15
lines changed

tests/logging_db/util.rs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,12 +27,16 @@ macro_rules! logging_db_output_sufficient {
2727

2828
pub fn logging_db_output_sufficient(
2929
program_text: &str,
30-
goals: Vec<(&str, SolverChoice, TestGoal)>,
30+
goals: Vec<(&str, Vec<SolverChoice>, TestGoal)>,
3131
) {
3232
println!("program {}", program_text);
3333
assert!(program_text.starts_with("{"));
3434
assert!(program_text.ends_with("}"));
3535

36+
let goals = goals
37+
.iter()
38+
.flat_map(|(a, bs, c)| bs.into_iter().map(move |b| (a, b, c)));
39+
3640
let output_text = {
3741
let db = ChalkDatabase::with(
3842
&program_text[1..program_text.len() - 1],
@@ -41,6 +45,7 @@ pub fn logging_db_output_sufficient(
4145

4246
let program = db.program_ir().unwrap();
4347
let wrapped = LoggingRustIrDatabase::<_, Program, _>::new(program.clone());
48+
4449
chalk_integration::tls::set_current_program(&program, || {
4550
for (goal_text, solver_choice, expected) in goals.clone() {
4651
let mut solver = solver_choice.into_solver();

tests/test/mod.rs

Lines changed: 88 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
#![allow(non_snake_case)]
22

3-
use expect_test::{Expect, expect};
3+
use std::sync::Arc;
4+
5+
use chalk_integration::program::Program;
6+
use expect_test::{expect, Expect};
47

58
use crate::test_util::assert_same;
69
use chalk_integration::db::ChalkDatabase;
@@ -91,8 +94,7 @@ macro_rules! parse_test_data {
9194
parse_test_data!(@program[$program]
9295
@parsed_goals[
9396
$($parsed_goals)*
94-
(stringify!($goal), SolverChoice::slg_default(), TestGoal::Aggregated($expected))
95-
(stringify!($goal), SolverChoice::recursive_default(), TestGoal::Aggregated($expected))
97+
(stringify!($goal), vec![SolverChoice::slg_default(), SolverChoice::recursive_default()], TestGoal::Aggregated($expected))
9698
]
9799
@unparsed_goals[$($unparsed_goals)*])
98100
};
@@ -107,7 +109,7 @@ macro_rules! parse_test_data {
107109
parse_test_data!(@program[$program]
108110
@parsed_goals[
109111
$($parsed_goals)*
110-
(stringify!($goal), SolverChoice::slg_default(), TestGoal::All(vec![$($expected),*]))
112+
(stringify!($goal), vec![SolverChoice::slg_default()], TestGoal::All(vec![$($expected),*]))
111113
]
112114
@unparsed_goals[$($unparsed_goals)*])
113115
};
@@ -121,7 +123,7 @@ macro_rules! parse_test_data {
121123
parse_test_data!(@program[$program]
122124
@parsed_goals[
123125
$($parsed_goals)*
124-
(stringify!($goal), SolverChoice::default(), TestGoal::First(vec![$($expected),*]))
126+
(stringify!($goal), vec![SolverChoice::default()], TestGoal::First(vec![$($expected),*]))
125127
]
126128
@unparsed_goals[$($unparsed_goals)*])
127129
};
@@ -140,7 +142,7 @@ macro_rules! parse_test_data {
140142
parse_test_data!(@program[$program]
141143
@parsed_goals[
142144
$($parsed_goals)*
143-
(stringify!($goal), $C, TestGoal::Aggregated($expected))
145+
(stringify!($goal), vec![$C], TestGoal::Aggregated($expected))
144146
]
145147
@unparsed_goals[goal $($unparsed_goals)*])
146148
};
@@ -154,7 +156,7 @@ macro_rules! parse_test_data {
154156
parse_test_data!(@program[$program]
155157
@parsed_goals[
156158
$($parsed_goals)*
157-
(stringify!($goal), $C, TestGoal::Aggregated($expected))
159+
(stringify!($goal), vec![$C], TestGoal::Aggregated($expected))
158160
]
159161
@unparsed_goals[goal $goal yields $($unparsed_tail)*])
160162
};
@@ -166,7 +168,7 @@ macro_rules! parse_test_data {
166168
parse_test_data!(@program[$program]
167169
@parsed_goals[
168170
$($parsed_goals)*
169-
(stringify!($goal), $C, TestGoal::Aggregated($expected))
171+
(stringify!($goal), vec![$C], TestGoal::Aggregated($expected))
170172
]
171173
@unparsed_goals[])
172174
};
@@ -185,7 +187,7 @@ macro_rules! parse_test_data {
185187
parse_test_data!(@program[$program]
186188
@parsed_goals[
187189
$($parsed_goals)*
188-
(stringify!($goal), $C, TestGoal::All(vec![$($expected),*]))
190+
(stringify!($goal), vec![$C], TestGoal::All(vec![$($expected),*]))
189191
]
190192
@unparsed_goals[goal $($unparsed_goals)*])
191193
};
@@ -197,7 +199,7 @@ macro_rules! parse_test_data {
197199
parse_test_data!(@program[$program]
198200
@parsed_goals[
199201
$($parsed_goals)*
200-
(stringify!($goal), $C, TestGoal::All(vec![$($expected),*]))
202+
(stringify!($goal), vec![$C], TestGoal::All(vec![$($expected),*]))
201203
]
202204
@unparsed_goals[])
203205
};
@@ -216,7 +218,7 @@ macro_rules! parse_test_data {
216218
parse_test_data!(@program[$program]
217219
@parsed_goals[
218220
$($parsed_goals)*
219-
(stringify!($goal), $C, TestGoal::First(vec![$($expected),*]))
221+
(stringify!($goal), vec![$C], TestGoal::First(vec![$($expected),*]))
220222
]
221223
@unparsed_goals[goal $($unparsed_goals)*])
222224
};
@@ -228,13 +230,17 @@ macro_rules! parse_test_data {
228230
parse_test_data!(@program[$program]
229231
@parsed_goals[
230232
$($parsed_goals)*
231-
(stringify!($goal), $C, TestGoal::First(vec![$($expected),*]))
233+
(stringify!($goal), vec![$C], TestGoal::First(vec![$($expected),*]))
232234
]
233235
@unparsed_goals[])
234236
};
235237
}
236238

237-
fn solve_goal(program_text: &str, goals: Vec<(&str, SolverChoice, TestGoal)>, coherence: bool) {
239+
fn solve_goal(
240+
program_text: &str,
241+
goals: Vec<(&str, Vec<SolverChoice>, TestGoal)>,
242+
coherence: bool,
243+
) {
238244
with_tracing_logs(|| {
239245
println!("program {}", program_text);
240246
assert!(program_text.starts_with("{"));
@@ -251,7 +257,28 @@ fn solve_goal(program_text: &str, goals: Vec<(&str, SolverChoice, TestGoal)>, co
251257
db.program_ir().unwrap()
252258
};
253259

254-
for (goal_text, solver_choice, expected) in goals {
260+
for (goal_text, solver_choices, expected) in goals {
261+
let solver_choices = &*solver_choices;
262+
let solver_choice = match solver_choices {
263+
[] => panic!("No solvers?"),
264+
[x] => *x,
265+
_ => {
266+
let expected = match expected {
267+
TestGoal::Aggregated(x) => x,
268+
_ => todo!("solver comparison only supported for `Aggregated` goals"),
269+
};
270+
271+
solve_aggregated(
272+
&mut db,
273+
program.clone(),
274+
goal_text,
275+
solver_choices,
276+
expected,
277+
);
278+
continue;
279+
}
280+
};
281+
255282
match (&solver_choice, &expected) {
256283
(SolverChoice::Recursive { .. }, TestGoal::All(_))
257284
| (SolverChoice::Recursive { .. }, TestGoal::First(_)) => {
@@ -333,6 +360,53 @@ fn solve_goal(program_text: &str, goals: Vec<(&str, SolverChoice, TestGoal)>, co
333360
})
334361
}
335362

363+
fn solve_aggregated(
364+
db: &mut ChalkDatabase,
365+
program: Arc<Program>,
366+
goal_text: &str,
367+
choices: &[SolverChoice],
368+
expected: Expect,
369+
) {
370+
let mut solutions = vec![];
371+
372+
for solver_choice in choices.iter().copied() {
373+
if db.solver_choice() != solver_choice {
374+
db.set_solver_choice(solver_choice);
375+
}
376+
377+
chalk_integration::tls::set_current_program(&program, || {
378+
println!("----------------------------------------------------------------------");
379+
println!("goal {}", goal_text);
380+
assert!(goal_text.starts_with("{"));
381+
assert!(goal_text.ends_with("}"));
382+
let goal = lower_goal(
383+
&*chalk_parse::parse_goal(&goal_text[1..goal_text.len() - 1]).unwrap(),
384+
&*program,
385+
)
386+
.unwrap();
387+
388+
println!("using solver: {:?}", solver_choice);
389+
let peeled_goal = goal.into_peeled_goal(db.interner());
390+
let result = db.solve(&peeled_goal);
391+
solutions.push(format_solution(result, db.interner()));
392+
});
393+
}
394+
395+
let (head, tail) = solutions
396+
.split_first()
397+
.expect("Test requires at least one solver");
398+
for (i, other) in tail.iter().enumerate() {
399+
println!(
400+
"\ncomparing solvers:\n\tleft: {:?}\n\tright: {:?}\n",
401+
&choices[0],
402+
&choices[i + 1]
403+
);
404+
assert_same(head, other);
405+
}
406+
407+
expected.assert_eq(head);
408+
}
409+
336410
mod arrays;
337411
mod auto_traits;
338412
mod closures;

0 commit comments

Comments
 (0)