@@ -8,61 +8,70 @@ use std::ops::Deref;
8
8
9
9
use run_make_support:: rustc;
10
10
11
+ struct CheckCfg {
12
+ args : & ' static [ & ' static str ] ,
13
+ contains : Contains ,
14
+ }
15
+
16
+ enum Contains {
17
+ Some { contains : & ' static [ & ' static str ] , doesnt_contain : & ' static [ & ' static str ] } ,
18
+ Only ( & ' static str ) ,
19
+ }
20
+
11
21
fn main ( ) {
12
- check (
13
- /*args*/ & [ ] ,
14
- /*has_any*/ false ,
15
- /*has_any_any*/ true ,
16
- /*contains*/ & [ ] ,
17
- ) ;
18
- check (
19
- /*args*/ & [ "--check-cfg=cfg()" ] ,
20
- /*has_any*/ false ,
21
- /*has_any_any*/ false ,
22
- /*contains*/ & [ "unix" , "miri" ] ,
23
- ) ;
24
- check (
25
- /*args*/ & [ "--check-cfg=cfg(any())" ] ,
26
- /*has_any*/ true ,
27
- /*has_any_any*/ false ,
28
- /*contains*/ & [ "windows" , "test" ] ,
29
- ) ;
30
- check (
31
- /*args*/ & [ "--check-cfg=cfg(feature)" ] ,
32
- /*has_any*/ false ,
33
- /*has_any_any*/ false ,
34
- /*contains*/ & [ "unix" , "miri" , "feature" ] ,
35
- ) ;
36
- check (
37
- /*args*/ & [ r#"--check-cfg=cfg(feature, values(none(), "", "test", "lol"))"# ] ,
38
- /*has_any*/ false ,
39
- /*has_any_any*/ false ,
40
- /*contains*/ & [ "feature" , "feature=\" \" " , "feature=\" test\" " , "feature=\" lol\" " ] ,
41
- ) ;
42
- check (
43
- /*args*/
44
- & [
22
+ check ( CheckCfg { args : & [ ] , contains : Contains :: Only ( "any()=any()" ) } ) ;
23
+ check ( CheckCfg {
24
+ args : & [ "--check-cfg=cfg()" ] ,
25
+ contains : Contains :: Some {
26
+ contains : & [ "unix" , "miri" ] ,
27
+ doesnt_contain : & [ "any()" , "any()=any()" ] ,
28
+ } ,
29
+ } ) ;
30
+ check ( CheckCfg {
31
+ args : & [ "--check-cfg=cfg(any())" ] ,
32
+ contains : Contains :: Some {
33
+ contains : & [ "any()" , "unix" , r#"target_feature="crt-static""# ] ,
34
+ doesnt_contain : & [ "any()=any()" ] ,
35
+ } ,
36
+ } ) ;
37
+ check ( CheckCfg {
38
+ args : & [ "--check-cfg=cfg(feature)" ] ,
39
+ contains : Contains :: Some {
40
+ contains : & [ "unix" , "miri" , "feature" ] ,
41
+ doesnt_contain : & [ "any()" , "any()=any()" , "feature=none()" , "feature=" ] ,
42
+ } ,
43
+ } ) ;
44
+ check ( CheckCfg {
45
+ args : & [ r#"--check-cfg=cfg(feature, values(none(), "", "test", "lol"))"# ] ,
46
+ contains : Contains :: Some {
47
+ contains : & [ "feature" , "feature=\" \" " , "feature=\" test\" " , "feature=\" lol\" " ] ,
48
+ doesnt_contain : & [ "any()" , "any()=any()" , "feature=none()" , "feature=" ] ,
49
+ } ,
50
+ } ) ;
51
+ check ( CheckCfg {
52
+ args : & [
45
53
r#"--check-cfg=cfg(feature, values(any()))"# ,
46
54
r#"--check-cfg=cfg(feature, values("tmp"))"# ,
47
55
] ,
48
- /*has_any*/ false ,
49
- /*has_any_any*/ false ,
50
- /*contains*/ & [ "unix " , "miri " , "feature=any() " ] ,
51
- ) ;
52
- check (
53
- /*args*/
54
- & [
56
+ contains : Contains :: Some {
57
+ contains : & [ "unix" , "miri" , "feature=any()" ] ,
58
+ doesnt_contain : & [ "any() " , "any()=any() " , "feature" , "feature=" , "feature= \" tmp \" "] ,
59
+ } ,
60
+ } ) ;
61
+ check ( CheckCfg {
62
+ args : & [
55
63
r#"--check-cfg=cfg(has_foo, has_bar)"# ,
56
64
r#"--check-cfg=cfg(feature, values("tmp"))"# ,
57
65
r#"--check-cfg=cfg(feature, values("tmp"))"# ,
58
66
] ,
59
- /*has_any*/ false ,
60
- /*has_any_any*/ false ,
61
- /*contains*/ & [ "has_foo" , "has_bar" , "feature=\" tmp\" " ] ,
62
- ) ;
67
+ contains : Contains :: Some {
68
+ contains : & [ "has_foo" , "has_bar" , "feature=\" tmp\" " ] ,
69
+ doesnt_contain : & [ "any()" , "any()=any()" , "feature" ] ,
70
+ } ,
71
+ } ) ;
63
72
}
64
73
65
- fn check ( args : & [ & str ] , has_any : bool , has_any_any : bool , contains : & [ & str ] ) {
74
+ fn check ( CheckCfg { args , contains } : CheckCfg ) {
66
75
let output = rustc ( )
67
76
. input ( "lib.rs" )
68
77
. arg ( "-Zunstable-options" )
@@ -72,18 +81,11 @@ fn check(args: &[&str], has_any: bool, has_any_any: bool, contains: &[&str]) {
72
81
73
82
let stdout = String :: from_utf8 ( output. stdout ) . unwrap ( ) ;
74
83
75
- let mut found_any = false ;
76
- let mut found_any_any = false ;
77
84
let mut found = HashSet :: < String > :: new ( ) ;
78
- let mut recorded = HashSet :: < String > :: new ( ) ;
79
85
80
86
for l in stdout. lines ( ) {
81
87
assert ! ( l == l. trim( ) ) ;
82
- if l == "any()" {
83
- found_any = true ;
84
- } else if l == "any()=any()" {
85
- found_any_any = true ;
86
- } else if let Some ( ( left, right) ) = l. split_once ( '=' ) {
88
+ if let Some ( ( left, right) ) = l. split_once ( '=' ) {
87
89
if right != "any()" && right != "" {
88
90
assert ! ( right. starts_with( "\" " ) ) ;
89
91
assert ! ( right. ends_with( "\" " ) ) ;
@@ -92,17 +94,37 @@ fn check(args: &[&str], has_any: bool, has_any_any: bool, contains: &[&str]) {
92
94
} else {
93
95
assert ! ( !l. contains( "\" " ) ) ;
94
96
}
95
- assert ! ( recorded. insert( l. to_string( ) ) , "{}" , & l) ;
96
- if contains. contains ( & l) {
97
- assert ! ( found. insert( l. to_string( ) ) , "{}" , & l) ;
98
- }
97
+ assert ! ( found. insert( l. to_string( ) ) , "{}" , & l) ;
99
98
}
100
99
101
- let should_found = HashSet :: < String > :: from_iter ( contains. iter ( ) . map ( |s| s. to_string ( ) ) ) ;
102
- let diff: Vec < _ > = should_found. difference ( & found) . collect ( ) ;
103
-
104
- assert_eq ! ( found_any, has_any) ;
105
- assert_eq ! ( found_any_any, has_any_any) ;
106
- assert_eq ! ( found_any_any, recorded. len( ) == 1 ) ;
107
- assert ! ( diff. is_empty( ) , "{:?} != {:?} (~ {:?})" , & should_found, & found, & diff) ;
100
+ match contains {
101
+ Contains :: Some { contains, doesnt_contain } => {
102
+ {
103
+ let should_found =
104
+ HashSet :: < String > :: from_iter ( contains. iter ( ) . map ( |s| s. to_string ( ) ) ) ;
105
+ let diff: Vec < _ > = should_found. difference ( & found) . collect ( ) ;
106
+ assert ! (
107
+ diff. is_empty( ) ,
108
+ "should found: {:?}, didn't found {:?}" ,
109
+ & should_found,
110
+ & diff
111
+ ) ;
112
+ }
113
+ {
114
+ let should_not_find =
115
+ HashSet :: < String > :: from_iter ( doesnt_contain. iter ( ) . map ( |s| s. to_string ( ) ) ) ;
116
+ let diff: Vec < _ > = should_not_find. intersection ( & found) . collect ( ) ;
117
+ assert ! (
118
+ diff. is_empty( ) ,
119
+ "should not find {:?}, did found {:?}" ,
120
+ & should_not_find,
121
+ & diff
122
+ ) ;
123
+ }
124
+ }
125
+ Contains :: Only ( only) => {
126
+ assert ! ( found. contains( & only. to_string( ) ) , "{:?} != {:?}" , & only, & found) ;
127
+ assert ! ( found. len( ) == 1 , "len: {}, instead of 1" , found. len( ) ) ;
128
+ }
129
+ }
108
130
}
0 commit comments