@@ -572,6 +572,8 @@ pub fn rstest(args: proc_macro::TokenStream,
572
572
if errors. is_empty ( ) {
573
573
if info. data . has_cases ( ) {
574
574
render_parametrize_cases ( test, info)
575
+ } else if info. data . has_list_values ( ) {
576
+ render_matrix_cases ( test, info)
575
577
} else {
576
578
render_single_case ( test, info)
577
579
}
@@ -602,7 +604,7 @@ fn missed_arguments_errors<'a, I: MaybeIdent + Spanned + 'a>(test: &'a ItemFn, a
602
604
. filter_map ( |it| it. maybe_ident ( ) . map ( |ident| ( it, ident) ) )
603
605
. filter ( move |( _, ident) | !fn_args_has_ident ( test, ident) )
604
606
. map ( |( missed, ident) | syn:: Error :: new ( missed. span ( ) ,
605
- & format ! ( "Missed argument: '{}' should be a test function argument." , ident) ,
607
+ & format ! ( "Missed argument: '{}' should be a test function argument." , ident) ,
606
608
) )
607
609
)
608
610
}
@@ -644,22 +646,14 @@ fn invalid_case_errors(params: &RsTestData) -> Errors {
644
646
fn case_args_without_cases ( params : & RsTestData ) -> Errors {
645
647
if !params. has_cases ( ) {
646
648
return Box :: new ( params. case_args ( ) . map ( |a|
647
- syn:: Error :: new ( a. span ( ) , "No cases for this argument." ) )
649
+ syn:: Error :: new ( a. span ( ) , "No cases for this argument." ) )
648
650
) ;
649
651
}
650
652
Box :: new (
651
653
std:: iter:: empty ( )
652
654
)
653
655
}
654
656
655
- fn errors_in_matrix ( test : & ItemFn , info : & parse:: matrix:: MatrixInfo ) -> TokenStream {
656
- missed_arguments_errors ( test, info. args . list_values ( ) )
657
- . chain ( missed_arguments_errors ( test, info. args . fixtures ( ) ) )
658
- . chain ( duplicate_arguments_errors ( info. args . items . iter ( ) ) )
659
- . map ( |e| e. to_compile_error ( ) )
660
- . collect ( )
661
- }
662
-
663
657
fn errors_in_rstest ( test : & ItemFn , info : & parse:: rstest:: RsTestInfo ) -> TokenStream {
664
658
missed_arguments_errors ( test, info. data . items . iter ( ) )
665
659
. chain ( duplicate_arguments_errors ( info. data . items . iter ( ) ) )
@@ -751,15 +745,15 @@ fn render_parametrize_cases(test: ItemFn, info: RsTestInfo) -> TokenStream {
751
745
render_cases ( test, cases, attributes. into ( ) )
752
746
}
753
747
754
- fn render_matrix_cases ( test : ItemFn , params : parse:: matrix :: MatrixInfo ) -> TokenStream {
755
- let parse:: matrix :: MatrixInfo { args , attributes, .. } = params ;
748
+ fn render_matrix_cases ( test : ItemFn , info : parse:: rstest :: RsTestInfo ) -> TokenStream {
749
+ let parse:: rstest :: RsTestInfo { data , attributes, .. } = info ;
756
750
let span = test. sig . ident . span ( ) ;
757
751
758
752
// Steps:
759
753
// 1. pack data P=(ident, expr, (pos, max_len)) in one iterator for each variable
760
754
// 2. do a cartesian product of iterators to build all cases (every case is a vector of P)
761
755
// 3. format case by packed data vector
762
- let cases = args . list_values ( )
756
+ let cases = data . list_values ( )
763
757
. map ( |group|
764
758
group. values . iter ( )
765
759
. enumerate ( )
@@ -774,7 +768,7 @@ fn render_matrix_cases(test: ItemFn, params: parse::matrix::MatrixInfo) -> Token
774
768
. collect :: < Vec < _ > > ( )
775
769
. join ( "_" ) ;
776
770
let name = format ! ( "case_{}" , args_indexes) ;
777
- let resolver_fixture = resolver:: fixture_resolver ( args . fixtures ( ) ) ;
771
+ let resolver_fixture = resolver:: fixture_resolver ( data . fixtures ( ) ) ;
778
772
let resolver_case = c. into_iter ( )
779
773
. map ( |( a, e, _) | ( a. to_string ( ) , e) )
780
774
. collect :: < HashMap < _ , _ > > ( ) ;
@@ -783,7 +777,7 @@ fn render_matrix_cases(test: ItemFn, params: parse::matrix::MatrixInfo) -> Token
783
777
}
784
778
) ;
785
779
786
- render_cases ( test, cases, attributes. into ( ) )
780
+ render_cases ( test, cases, attributes)
787
781
}
788
782
789
783
/// Write table-based tests: you must indicate the arguments that you want use in your cases
@@ -944,16 +938,7 @@ pub fn rstest_parametrize(args: proc_macro::TokenStream, input: proc_macro::Toke
944
938
pub fn rstest_matrix ( args : proc_macro:: TokenStream , input : proc_macro:: TokenStream )
945
939
-> proc_macro:: TokenStream
946
940
{
947
- let info = parse_macro_input ! ( args as parse:: matrix:: MatrixInfo ) ;
948
- let test = parse_macro_input ! ( input as ItemFn ) ;
949
-
950
- let errors = errors_in_matrix ( & test, & info) ;
951
-
952
- if errors. is_empty ( ) {
953
- render_matrix_cases ( test, info) . into ( )
954
- } else {
955
- errors
956
- } . into ( )
941
+ rstest ( args, input)
957
942
}
958
943
959
944
#[ cfg( test) ]
@@ -1130,35 +1115,31 @@ mod render {
1130
1115
1131
1116
use crate :: parse:: {
1132
1117
rstest:: { RsTestInfo , RsTestData , RsTestItem } ,
1133
- testcase:: TestCase
1118
+ testcase:: TestCase ,
1134
1119
} ;
1135
1120
1136
1121
use super :: { * , assert_eq} ;
1137
1122
1138
- impl < ' a > From < & ' a ItemFn > for RsTestData {
1139
- fn from ( item_fn : & ' a ItemFn ) -> Self {
1140
- RsTestData {
1141
- items : fn_args_idents ( item_fn)
1142
- . cloned ( )
1143
- . map ( RsTestItem :: CaseArgName )
1144
- . collect ( ) ,
1145
- }
1123
+ fn into_rstest_data ( item_fn : & ItemFn ) -> RsTestData {
1124
+ RsTestData {
1125
+ items : fn_args_idents ( item_fn)
1126
+ . cloned ( )
1127
+ . map ( RsTestItem :: CaseArgName )
1128
+ . collect ( ) ,
1146
1129
}
1147
1130
}
1148
1131
1149
- impl < ' a > From < & ' a ItemFn > for RsTestInfo {
1150
- fn from ( item_fn : & ' a ItemFn ) -> Self {
1151
- RsTestInfo {
1152
- data : item_fn. into ( ) ,
1153
- attributes : Default :: default ( ) ,
1154
- }
1132
+ fn into_rstest_info ( item_fn : & ItemFn ) -> RsTestInfo {
1133
+ RsTestInfo {
1134
+ data : into_rstest_data ( item_fn) ,
1135
+ attributes : Default :: default ( ) ,
1155
1136
}
1156
1137
}
1157
1138
1158
1139
#[ test]
1159
1140
fn should_create_a_module_named_as_test_function ( ) {
1160
1141
let item_fn = parse_str :: < ItemFn > ( "fn should_be_the_module_name(mut fix: String) {}" ) . unwrap ( ) ;
1161
- let info = ( & item_fn) . into ( ) ;
1142
+ let info = into_rstest_info ( & item_fn) ;
1162
1143
let tokens = render_parametrize_cases ( item_fn. clone ( ) , info) ;
1163
1144
1164
1145
let output = TestsGroup :: from ( tokens) ;
@@ -1171,7 +1152,7 @@ mod render {
1171
1152
let item_fn = parse_str :: < ItemFn > (
1172
1153
r#"fn should_be_the_module_name(mut fix: String) { println!("user code") }"#
1173
1154
) . unwrap ( ) ;
1174
- let info = ( & item_fn) . into ( ) ;
1155
+ let info = into_rstest_info ( & item_fn) ;
1175
1156
let tokens = render_parametrize_cases ( item_fn. clone ( ) , info) ;
1176
1157
1177
1158
let mut output = TestsGroup :: from ( tokens) ;
@@ -1185,7 +1166,7 @@ mod render {
1185
1166
let item_fn = parse_str :: < ItemFn > (
1186
1167
r#"fn should_be_the_module_name(mut fix: String) { println!("user code") }"#
1187
1168
) . unwrap ( ) ;
1188
- let info = ( & item_fn) . into ( ) ;
1169
+ let info = into_rstest_info ( & item_fn) ;
1189
1170
let tokens = render_parametrize_cases ( item_fn. clone ( ) , info) ;
1190
1171
1191
1172
let output = TestsGroup :: from ( tokens) ;
@@ -1203,7 +1184,7 @@ mod render {
1203
1184
let item_fn = parse_str :: < ItemFn > (
1204
1185
r#"fn should_be_the_module_name(mut fix: String) { println!("user code") }"#
1205
1186
) . unwrap ( ) ;
1206
- let info = ( & item_fn) . into ( ) ;
1187
+ let info = into_rstest_info ( & item_fn) ;
1207
1188
let tokens = render_parametrize_cases ( item_fn. clone ( ) , info) ;
1208
1189
1209
1190
let output = TestsGroup :: from ( tokens) ;
@@ -1247,7 +1228,7 @@ mod render {
1247
1228
let item_fn = parse_str :: < ItemFn > (
1248
1229
r#"fn test(mut fix: String) { println!("user code") }"#
1249
1230
) . unwrap ( ) ;
1250
- let mut info: RsTestInfo = ( & item_fn) . into ( ) ;
1231
+ let mut info: RsTestInfo = into_rstest_info ( & item_fn) ;
1251
1232
info. push_case ( TestCase :: from ( r#"String::from("3")"# ) ) ;
1252
1233
( item_fn, info)
1253
1234
}
@@ -1256,7 +1237,7 @@ mod render {
1256
1237
let item_fn = parse_str :: < ItemFn > (
1257
1238
r#"fn test(mut fix: String) { println!("user code") }"#
1258
1239
) . unwrap ( ) ;
1259
- let mut info: RsTestInfo = ( & item_fn) . into ( ) ;
1240
+ let mut info: RsTestInfo = into_rstest_info ( & item_fn) ;
1260
1241
info. extend ( ( 0 ..cases) . map ( |_| TestCase :: from ( r#"String::from("3")"# ) ) ) ;
1261
1242
( item_fn, info)
1262
1243
}
@@ -1338,39 +1319,34 @@ mod render {
1338
1319
mod matrix_cases {
1339
1320
use unindent:: Unindent ;
1340
1321
1341
- use crate :: parse:: matrix:: { MatrixData , MatrixInfo , ValueList } ;
1342
-
1343
1322
/// Should test matrix tests render without take in account MatrixInfo to RsTestInfo
1344
- /// transformation
1323
+ /// transformation
1345
1324
1346
1325
use super :: { * , assert_eq} ;
1347
-
1348
- impl < ' a > From < & ' a ItemFn > for MatrixData {
1349
- fn from ( item_fn : & ' a ItemFn ) -> Self {
1350
- MatrixData {
1351
- items : fn_args_idents ( item_fn)
1352
- . cloned ( )
1353
- . map ( |it|
1354
- ValueList { arg : it, values : vec ! [ ] } . into ( )
1355
- )
1356
- . collect ( )
1357
- }
1326
+ use crate :: parse:: vlist:: ValueList ;
1327
+
1328
+ fn into_rstest_data ( item_fn : & ItemFn ) -> RsTestData {
1329
+ RsTestData {
1330
+ items : fn_args_idents ( item_fn)
1331
+ . cloned ( )
1332
+ . map ( |it|
1333
+ ValueList { arg : it, values : vec ! [ ] } . into ( )
1334
+ )
1335
+ . collect ( ) ,
1358
1336
}
1359
1337
}
1360
1338
1361
- impl < ' a > From < & ' a ItemFn > for MatrixInfo {
1362
- fn from ( item_fn : & ' a ItemFn ) -> Self {
1363
- MatrixInfo {
1364
- args : item_fn. into ( ) ,
1365
- attributes : Default :: default ( ) ,
1366
- }
1339
+ fn into_rstest_info ( item_fn : & ItemFn ) -> RsTestInfo {
1340
+ RsTestInfo {
1341
+ data : into_rstest_data ( item_fn) ,
1342
+ attributes : Default :: default ( ) ,
1367
1343
}
1368
1344
}
1369
1345
1370
1346
#[ test]
1371
1347
fn should_create_a_module_named_as_test_function ( ) {
1372
1348
let item_fn = parse_str :: < ItemFn > ( "fn should_be_the_module_name(mut fix: String) {}" ) . unwrap ( ) ;
1373
- let info = ( & item_fn) . into ( ) ;
1349
+ let info = into_rstest_info ( & item_fn) ;
1374
1350
let tokens = render_matrix_cases ( item_fn. clone ( ) , info) ;
1375
1351
1376
1352
let output = TestsGroup :: from ( tokens) ;
@@ -1383,7 +1359,7 @@ mod render {
1383
1359
let item_fn = parse_str :: < ItemFn > (
1384
1360
r#"fn should_be_the_module_name(mut fix: String) { println!("user code") }"#
1385
1361
) . unwrap ( ) ;
1386
- let info = ( & item_fn) . into ( ) ;
1362
+ let info = into_rstest_info ( & item_fn) ;
1387
1363
let tokens = render_matrix_cases ( item_fn. clone ( ) , info) ;
1388
1364
1389
1365
let mut output = TestsGroup :: from ( tokens) ;
@@ -1397,7 +1373,7 @@ mod render {
1397
1373
let item_fn = parse_str :: < ItemFn > (
1398
1374
r#"fn should_be_the_module_name(mut fix: String) { println!("user code") }"#
1399
1375
) . unwrap ( ) ;
1400
- let info = ( & item_fn) . into ( ) ;
1376
+ let info = into_rstest_info ( & item_fn) ;
1401
1377
let tokens = render_matrix_cases ( item_fn. clone ( ) , info) ;
1402
1378
1403
1379
let output = TestsGroup :: from ( tokens) ;
@@ -1415,7 +1391,7 @@ mod render {
1415
1391
let item_fn = parse_str :: < ItemFn > (
1416
1392
r#"fn should_be_the_module_name(mut fix: String) { println!("user code") }"#
1417
1393
) . unwrap ( ) ;
1418
- let info = ( & item_fn) . into ( ) ;
1394
+ let info = into_rstest_info ( & item_fn) ;
1419
1395
let tokens = render_matrix_cases ( item_fn. clone ( ) , info) ;
1420
1396
1421
1397
let output = TestsGroup :: from ( tokens) ;
@@ -1428,12 +1404,12 @@ mod render {
1428
1404
assert_eq ! ( expected, output. module. attrs) ;
1429
1405
}
1430
1406
1431
- fn one_simple_case ( ) -> ( ItemFn , MatrixInfo ) {
1407
+ fn one_simple_case ( ) -> ( ItemFn , RsTestInfo ) {
1432
1408
let item_fn = parse_str :: < ItemFn > (
1433
1409
r#"fn test(mut fix: String) { println!("user code") }"#
1434
1410
) . unwrap ( ) ;
1435
- let info = MatrixInfo {
1436
- args : MatrixData {
1411
+ let info = RsTestInfo {
1412
+ data : RsTestData {
1437
1413
items : vec ! [
1438
1414
ValueList { arg: ident( "fix" ) , values: vec![ expr( r#""value""# ) ] } . into( )
1439
1415
]
@@ -1460,8 +1436,8 @@ mod render {
1460
1436
let item_fn = parse_str :: < ItemFn > (
1461
1437
r#"fn test(first: u32, second: u32, third: u32) { println!("user code") }"#
1462
1438
) . unwrap ( ) ;
1463
- let info = MatrixInfo {
1464
- args : MatrixData {
1439
+ let info = RsTestInfo {
1440
+ data : RsTestData {
1465
1441
items : vec ! [
1466
1442
values_list( "first" , [ "1" , "2" ] . as_ref( ) ) . into( ) ,
1467
1443
values_list( "second" , [ "3" , "4" ] . as_ref( ) ) . into( ) ,
@@ -1498,8 +1474,8 @@ mod render {
1498
1474
r#"fn test(first: u32, second: u32, third: u32) { println!("user code") }"#
1499
1475
) . unwrap ( ) ;
1500
1476
let values = ( 1 ..=100 ) . map ( |i| i. to_string ( ) ) . collect :: < Vec < _ > > ( ) ;
1501
- let info = MatrixInfo {
1502
- args : MatrixData {
1477
+ let info = RsTestInfo {
1478
+ data : RsTestData {
1503
1479
items : vec ! [
1504
1480
values_list( "first" , values. as_ref( ) ) . into( ) ,
1505
1481
values_list( "second" , values[ ..10 ] . as_ref( ) ) . into( ) ,
0 commit comments