1
1
use cargo_platform:: { Cfg , CfgExpr , CfgRustVersion , Ident , Platform } ;
2
+ use semver:: { BuildMetadata , Prerelease } ;
2
3
use std:: fmt;
3
4
use std:: str:: FromStr ;
4
5
@@ -33,10 +34,16 @@ macro_rules! c {
33
34
$e. to_string( ) ,
34
35
)
35
36
} ;
37
+ ( version( $minor: literal) ) => {
38
+ Cfg :: Version ( CfgRustVersion {
39
+ minor: $minor,
40
+ patch: None ,
41
+ } )
42
+ } ;
36
43
( version( $minor: literal, $patch: literal) ) => {
37
44
Cfg :: Version ( CfgRustVersion {
38
45
minor: $minor,
39
- patch: $patch,
46
+ patch: Some ( $patch) ,
40
47
} )
41
48
} ;
42
49
}
@@ -51,6 +58,7 @@ macro_rules! e {
51
58
( $( $t: tt) * ) => ( CfgExpr :: Value ( c!( $( $t) * ) ) ) ;
52
59
}
53
60
61
+ #[ track_caller]
54
62
fn good < T > ( s : & str , expected : T )
55
63
where
56
64
T : FromStr + PartialEq + fmt:: Debug ,
63
71
assert_eq ! ( c, expected) ;
64
72
}
65
73
74
+ #[ track_caller]
66
75
fn bad < T > ( s : & str , err : & str )
67
76
where
68
77
T : FromStr + fmt:: Display ,
@@ -96,6 +105,7 @@ fn cfg_syntax() {
96
105
good ( "foo = \" 3 e\" " , c ! ( foo = "3 e" ) ) ;
97
106
good ( " r#foo = \" 3 e\" " , c ! ( r # foo = "3 e" ) ) ;
98
107
good ( "version(\" 1.23.4\" )" , c ! ( version( 23 , 4 ) ) ) ;
108
+ good ( "version(\" 1.23\" )" , c ! ( version( 23 ) ) ) ;
99
109
good ( "version(\" 1.234.56\" )" , c ! ( version( 234 , 56 ) ) ) ;
100
110
good ( " version(\" 1.23.4\" )" , c ! ( version( 23 , 4 ) ) ) ;
101
111
good ( "version(\" 1.23.4\" ) " , c ! ( version( 23 , 4 ) ) ) ;
@@ -172,34 +182,56 @@ fn cfg_expr_bad() {
172
182
173
183
#[ test]
174
184
fn cfg_matches ( ) {
175
- let rustc_version = semver:: Version :: new ( 0 , 0 , 0 ) ;
176
- assert ! ( e!( foo) . matches( & [ c!( bar) , c!( foo) , c!( baz) ] , & rustc_version ) ) ;
177
- assert ! ( e!( any( foo) ) . matches( & [ c!( bar) , c!( foo) , c!( baz) ] , & rustc_version ) ) ;
178
- assert ! ( e!( any( foo, bar) ) . matches( & [ c!( bar) ] , & rustc_version ) ) ;
179
- assert ! ( e!( any( foo, bar) ) . matches( & [ c!( foo) ] , & rustc_version ) ) ;
180
- assert ! ( e!( all( foo, bar) ) . matches( & [ c!( foo) , c!( bar) ] , & rustc_version ) ) ;
181
- assert ! ( e!( all( foo, bar) ) . matches( & [ c!( foo) , c!( bar) ] , & rustc_version ) ) ;
182
- assert ! ( e!( not( foo) ) . matches( & [ c!( bar) ] , & rustc_version ) ) ;
183
- assert ! ( e!( not( foo) ) . matches( & [ ] , & rustc_version ) ) ;
184
- assert ! ( e!( any( ( not( foo) ) , ( all( foo, bar) ) ) ) . matches( & [ c!( bar) ] , & rustc_version ) ) ;
185
- assert ! ( e!( any( ( not( foo) ) , ( all( foo, bar) ) ) ) . matches( & [ c!( foo) , c!( bar) ] , & rustc_version ) ) ;
186
- assert ! ( e!( foo) . matches( & [ c!( r # foo) ] , & rustc_version ) ) ;
187
- assert ! ( e!( r # foo) . matches( & [ c!( foo) ] , & rustc_version ) ) ;
188
- assert ! ( e!( r # foo) . matches( & [ c!( r # foo) ] , & rustc_version ) ) ;
185
+ let v87 = semver:: Version :: new ( 1 , 87 , 0 ) ;
186
+ assert ! ( e!( foo) . matches( & [ c!( bar) , c!( foo) , c!( baz) ] , & v87 ) ) ;
187
+ assert ! ( e!( any( foo) ) . matches( & [ c!( bar) , c!( foo) , c!( baz) ] , & v87 ) ) ;
188
+ assert ! ( e!( any( foo, bar) ) . matches( & [ c!( bar) ] , & v87 ) ) ;
189
+ assert ! ( e!( any( foo, bar) ) . matches( & [ c!( foo) ] , & v87 ) ) ;
190
+ assert ! ( e!( all( foo, bar) ) . matches( & [ c!( foo) , c!( bar) ] , & v87 ) ) ;
191
+ assert ! ( e!( all( foo, bar) ) . matches( & [ c!( foo) , c!( bar) ] , & v87 ) ) ;
192
+ assert ! ( e!( not( foo) ) . matches( & [ c!( bar) ] , & v87 ) ) ;
193
+ assert ! ( e!( not( foo) ) . matches( & [ ] , & v87 ) ) ;
194
+ assert ! ( e!( any( ( not( foo) ) , ( all( foo, bar) ) ) ) . matches( & [ c!( bar) ] , & v87 ) ) ;
195
+ assert ! ( e!( any( ( not( foo) ) , ( all( foo, bar) ) ) ) . matches( & [ c!( foo) , c!( bar) ] , & v87 ) ) ;
196
+ assert ! ( e!( foo) . matches( & [ c!( r # foo) ] , & v87 ) ) ;
197
+ assert ! ( e!( r # foo) . matches( & [ c!( foo) ] , & v87 ) ) ;
198
+ assert ! ( e!( r # foo) . matches( & [ c!( r # foo) ] , & v87 ) ) ;
189
199
190
- assert ! ( !e!( foo) . matches( & [ ] , & rustc_version) ) ;
191
- assert ! ( !e!( foo) . matches( & [ c!( bar) ] , & rustc_version) ) ;
192
- assert ! ( !e!( foo) . matches( & [ c!( fo) ] , & rustc_version) ) ;
193
- assert ! ( !e!( any( foo) ) . matches( & [ ] , & rustc_version) ) ;
194
- assert ! ( !e!( any( foo) ) . matches( & [ c!( bar) ] , & rustc_version) ) ;
195
- assert ! ( !e!( any( foo) ) . matches( & [ c!( bar) , c!( baz) ] , & rustc_version) ) ;
196
- assert ! ( !e!( all( foo) ) . matches( & [ c!( bar) , c!( baz) ] , & rustc_version) ) ;
197
- assert ! ( !e!( all( foo, bar) ) . matches( & [ c!( bar) ] , & rustc_version) ) ;
198
- assert ! ( !e!( all( foo, bar) ) . matches( & [ c!( foo) ] , & rustc_version) ) ;
199
- assert ! ( !e!( all( foo, bar) ) . matches( & [ ] , & rustc_version) ) ;
200
- assert ! ( !e!( not( bar) ) . matches( & [ c!( bar) ] , & rustc_version) ) ;
201
- assert ! ( !e!( not( bar) ) . matches( & [ c!( baz) , c!( bar) ] , & rustc_version) ) ;
202
- assert ! ( !e!( any( ( not( foo) ) , ( all( foo, bar) ) ) ) . matches( & [ c!( foo) ] , & rustc_version) ) ;
200
+ assert ! ( !e!( foo) . matches( & [ ] , & v87) ) ;
201
+ assert ! ( !e!( foo) . matches( & [ c!( bar) ] , & v87) ) ;
202
+ assert ! ( !e!( foo) . matches( & [ c!( fo) ] , & v87) ) ;
203
+ assert ! ( !e!( any( foo) ) . matches( & [ ] , & v87) ) ;
204
+ assert ! ( !e!( any( foo) ) . matches( & [ c!( bar) ] , & v87) ) ;
205
+ assert ! ( !e!( any( foo) ) . matches( & [ c!( bar) , c!( baz) ] , & v87) ) ;
206
+ assert ! ( !e!( all( foo) ) . matches( & [ c!( bar) , c!( baz) ] , & v87) ) ;
207
+ assert ! ( !e!( all( foo, bar) ) . matches( & [ c!( bar) ] , & v87) ) ;
208
+ assert ! ( !e!( all( foo, bar) ) . matches( & [ c!( foo) ] , & v87) ) ;
209
+ assert ! ( !e!( all( foo, bar) ) . matches( & [ ] , & v87) ) ;
210
+ assert ! ( !e!( not( bar) ) . matches( & [ c!( bar) ] , & v87) ) ;
211
+ assert ! ( !e!( not( bar) ) . matches( & [ c!( baz) , c!( bar) ] , & v87) ) ;
212
+ assert ! ( !e!( any( ( not( foo) ) , ( all( foo, bar) ) ) ) . matches( & [ c!( foo) ] , & v87) ) ;
213
+
214
+ assert ! ( e!( version( 87 ) ) . matches( & [ ] , & v87) ) ;
215
+ assert ! ( e!( version( 87 , 0 ) ) . matches( & [ ] , & v87) ) ;
216
+ assert ! ( e!( version( 86 ) ) . matches( & [ ] , & v87) ) ;
217
+ assert ! ( e!( version( 86 , 1 ) ) . matches( & [ ] , & v87) ) ;
218
+ assert ! ( !e!( version( 87 , 1 ) ) . matches( & [ ] , & v87) ) ;
219
+ assert ! ( !e!( version( 88 ) ) . matches( & [ ] , & v87) ) ;
220
+ assert ! ( !e!( version( 88 , 1 ) ) . matches( & [ ] , & v87) ) ;
221
+ assert ! ( e!( not( version( 88 ) ) ) . matches( & [ ] , & v87) ) ;
222
+ assert ! ( e!( not( version( 88 , 1 ) ) ) . matches( & [ ] , & v87) ) ;
223
+
224
+ let v89_nightly = semver:: Version {
225
+ major : 1 ,
226
+ minor : 89 ,
227
+ patch : 0 ,
228
+ pre : Prerelease :: new ( "nightly" ) . unwrap ( ) ,
229
+ build : BuildMetadata :: EMPTY ,
230
+ } ;
231
+ assert ! ( e!( version( 89 ) ) . matches( & [ ] , & v89_nightly) ) ;
232
+ assert ! ( !e!( version( 89 , 0 ) ) . matches( & [ ] , & v89_nightly) ) ;
233
+ assert ! ( e!( version( 88 ) ) . matches( & [ ] , & v89_nightly) ) ;
234
+ assert ! ( e!( version( 88 , 0 ) ) . matches( & [ ] , & v89_nightly) ) ;
203
235
}
204
236
205
237
#[ test]
0 commit comments