1
1
#![ allow( non_snake_case) ]
2
2
3
- use expect_test:: { Expect , expect} ;
3
+ use std:: sync:: Arc ;
4
+
5
+ use chalk_integration:: program:: Program ;
6
+ use expect_test:: { expect, Expect } ;
4
7
5
8
use crate :: test_util:: assert_same;
6
9
use chalk_integration:: db:: ChalkDatabase ;
@@ -91,8 +94,7 @@ macro_rules! parse_test_data {
91
94
parse_test_data!( @program[ $program]
92
95
@parsed_goals[
93
96
$( $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) )
96
98
]
97
99
@unparsed_goals[ $( $unparsed_goals) * ] )
98
100
} ;
@@ -107,7 +109,7 @@ macro_rules! parse_test_data {
107
109
parse_test_data!( @program[ $program]
108
110
@parsed_goals[
109
111
$( $parsed_goals) *
110
- ( stringify!( $goal) , SolverChoice :: slg_default( ) , TestGoal :: All ( vec![ $( $expected) ,* ] ) )
112
+ ( stringify!( $goal) , vec! [ SolverChoice :: slg_default( ) ] , TestGoal :: All ( vec![ $( $expected) ,* ] ) )
111
113
]
112
114
@unparsed_goals[ $( $unparsed_goals) * ] )
113
115
} ;
@@ -121,7 +123,7 @@ macro_rules! parse_test_data {
121
123
parse_test_data!( @program[ $program]
122
124
@parsed_goals[
123
125
$( $parsed_goals) *
124
- ( stringify!( $goal) , SolverChoice :: default ( ) , TestGoal :: First ( vec![ $( $expected) ,* ] ) )
126
+ ( stringify!( $goal) , vec! [ SolverChoice :: default ( ) ] , TestGoal :: First ( vec![ $( $expected) ,* ] ) )
125
127
]
126
128
@unparsed_goals[ $( $unparsed_goals) * ] )
127
129
} ;
@@ -140,7 +142,7 @@ macro_rules! parse_test_data {
140
142
parse_test_data!( @program[ $program]
141
143
@parsed_goals[
142
144
$( $parsed_goals) *
143
- ( stringify!( $goal) , $C , TestGoal :: Aggregated ( $expected) )
145
+ ( stringify!( $goal) , vec! [ $C ] , TestGoal :: Aggregated ( $expected) )
144
146
]
145
147
@unparsed_goals[ goal $( $unparsed_goals) * ] )
146
148
} ;
@@ -154,7 +156,7 @@ macro_rules! parse_test_data {
154
156
parse_test_data!( @program[ $program]
155
157
@parsed_goals[
156
158
$( $parsed_goals) *
157
- ( stringify!( $goal) , $C , TestGoal :: Aggregated ( $expected) )
159
+ ( stringify!( $goal) , vec! [ $C ] , TestGoal :: Aggregated ( $expected) )
158
160
]
159
161
@unparsed_goals[ goal $goal yields $( $unparsed_tail) * ] )
160
162
} ;
@@ -166,7 +168,7 @@ macro_rules! parse_test_data {
166
168
parse_test_data!( @program[ $program]
167
169
@parsed_goals[
168
170
$( $parsed_goals) *
169
- ( stringify!( $goal) , $C , TestGoal :: Aggregated ( $expected) )
171
+ ( stringify!( $goal) , vec! [ $C ] , TestGoal :: Aggregated ( $expected) )
170
172
]
171
173
@unparsed_goals[ ] )
172
174
} ;
@@ -185,7 +187,7 @@ macro_rules! parse_test_data {
185
187
parse_test_data!( @program[ $program]
186
188
@parsed_goals[
187
189
$( $parsed_goals) *
188
- ( stringify!( $goal) , $C , TestGoal :: All ( vec![ $( $expected) ,* ] ) )
190
+ ( stringify!( $goal) , vec! [ $C ] , TestGoal :: All ( vec![ $( $expected) ,* ] ) )
189
191
]
190
192
@unparsed_goals[ goal $( $unparsed_goals) * ] )
191
193
} ;
@@ -197,7 +199,7 @@ macro_rules! parse_test_data {
197
199
parse_test_data!( @program[ $program]
198
200
@parsed_goals[
199
201
$( $parsed_goals) *
200
- ( stringify!( $goal) , $C , TestGoal :: All ( vec![ $( $expected) ,* ] ) )
202
+ ( stringify!( $goal) , vec! [ $C ] , TestGoal :: All ( vec![ $( $expected) ,* ] ) )
201
203
]
202
204
@unparsed_goals[ ] )
203
205
} ;
@@ -216,7 +218,7 @@ macro_rules! parse_test_data {
216
218
parse_test_data!( @program[ $program]
217
219
@parsed_goals[
218
220
$( $parsed_goals) *
219
- ( stringify!( $goal) , $C , TestGoal :: First ( vec![ $( $expected) ,* ] ) )
221
+ ( stringify!( $goal) , vec! [ $C ] , TestGoal :: First ( vec![ $( $expected) ,* ] ) )
220
222
]
221
223
@unparsed_goals[ goal $( $unparsed_goals) * ] )
222
224
} ;
@@ -228,13 +230,17 @@ macro_rules! parse_test_data {
228
230
parse_test_data!( @program[ $program]
229
231
@parsed_goals[
230
232
$( $parsed_goals) *
231
- ( stringify!( $goal) , $C , TestGoal :: First ( vec![ $( $expected) ,* ] ) )
233
+ ( stringify!( $goal) , vec! [ $C ] , TestGoal :: First ( vec![ $( $expected) ,* ] ) )
232
234
]
233
235
@unparsed_goals[ ] )
234
236
} ;
235
237
}
236
238
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
+ ) {
238
244
with_tracing_logs ( || {
239
245
println ! ( "program {}" , program_text) ;
240
246
assert ! ( program_text. starts_with( "{" ) ) ;
@@ -251,7 +257,28 @@ fn solve_goal(program_text: &str, goals: Vec<(&str, SolverChoice, TestGoal)>, co
251
257
db. program_ir ( ) . unwrap ( )
252
258
} ;
253
259
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
+
255
282
match ( & solver_choice, & expected) {
256
283
( SolverChoice :: Recursive { .. } , TestGoal :: All ( _) )
257
284
| ( SolverChoice :: Recursive { .. } , TestGoal :: First ( _) ) => {
@@ -333,6 +360,53 @@ fn solve_goal(program_text: &str, goals: Vec<(&str, SolverChoice, TestGoal)>, co
333
360
} )
334
361
}
335
362
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
+ "\n comparing solvers:\n \t left: {:?}\n \t right: {:?}\n " ,
401
+ & choices[ 0 ] ,
402
+ & choices[ i + 1 ]
403
+ ) ;
404
+ assert_same ( head, other) ;
405
+ }
406
+
407
+ expected. assert_eq ( head) ;
408
+ }
409
+
336
410
mod arrays;
337
411
mod auto_traits;
338
412
mod closures;
0 commit comments