@@ -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