]>
Commit | Line | Data |
---|---|---|
dfeec247 XL |
1 | // run-pass |
2 | ||
3 | // Test half-open range patterns against their expression equivalents | |
4 | // via `.contains(...)` and make sure the dynamic semantics match. | |
5 | ||
dfeec247 XL |
6 | #![feature(exclusive_range_pattern)] |
7 | #![allow(illegal_floating_point_literal_pattern)] | |
8 | #![allow(unreachable_patterns)] | |
9 | ||
10 | macro_rules! yes { | |
11 | ($scrutinee:expr, $($t:tt)+) => { | |
12 | { | |
13 | let m = match $scrutinee { $($t)+ => true, _ => false, }; | |
14 | let c = ($($t)+).contains(&$scrutinee); | |
15 | assert_eq!(m, c); | |
16 | m | |
17 | } | |
18 | } | |
19 | } | |
20 | ||
21 | fn range_to_inclusive() { | |
22 | // `..=X` (`RangeToInclusive`-equivalent): | |
23 | //--------------------------------------- | |
24 | ||
25 | // u8; `..=X` | |
fc512014 XL |
26 | assert!(yes!(u8::MIN, ..=u8::MIN)); |
27 | assert!(yes!(u8::MIN, ..=5)); | |
dfeec247 XL |
28 | assert!(yes!(5u8, ..=5)); |
29 | assert!(!yes!(6u8, ..=5)); | |
30 | ||
31 | // i16; `..=X` | |
fc512014 XL |
32 | assert!(yes!(i16::MIN, ..=i16::MIN)); |
33 | assert!(yes!(i16::MIN, ..=0)); | |
34 | assert!(yes!(i16::MIN, ..=-5)); | |
dfeec247 XL |
35 | assert!(yes!(-5, ..=-5)); |
36 | assert!(!yes!(-4, ..=-5)); | |
37 | ||
38 | // char; `..=X` | |
39 | assert!(yes!('\u{0}', ..='\u{0}')); | |
40 | assert!(yes!('\u{0}', ..='a')); | |
41 | assert!(yes!('a', ..='a')); | |
42 | assert!(!yes!('b', ..='a')); | |
43 | ||
44 | // f32; `..=X` | |
fc512014 XL |
45 | assert!(yes!(f32::NEG_INFINITY, ..=f32::NEG_INFINITY)); |
46 | assert!(yes!(f32::NEG_INFINITY, ..=1.0f32)); | |
dfeec247 XL |
47 | assert!(yes!(1.5f32, ..=1.5f32)); |
48 | assert!(!yes!(1.6f32, ..=-1.5f32)); | |
49 | ||
50 | // f64; `..=X` | |
fc512014 XL |
51 | assert!(yes!(f64::NEG_INFINITY, ..=f64::NEG_INFINITY)); |
52 | assert!(yes!(f64::NEG_INFINITY, ..=1.0f64)); | |
dfeec247 XL |
53 | assert!(yes!(1.5f64, ..=1.5f64)); |
54 | assert!(!yes!(1.6f64, ..=-1.5f64)); | |
55 | } | |
56 | ||
57 | fn range_to() { | |
58 | // `..X` (`RangeTo`-equivalent): | |
59 | //----------------------------- | |
60 | ||
61 | // u8; `..X` | |
62 | assert!(yes!(0u8, ..1)); | |
63 | assert!(yes!(0u8, ..5)); | |
64 | assert!(!yes!(5u8, ..5)); | |
65 | assert!(!yes!(6u8, ..5)); | |
66 | ||
67 | // u8; `..X` | |
fc512014 XL |
68 | const NU8: u8 = u8::MIN + 1; |
69 | assert!(yes!(u8::MIN, ..NU8)); | |
dfeec247 XL |
70 | assert!(yes!(0u8, ..5)); |
71 | assert!(!yes!(5u8, ..5)); | |
72 | assert!(!yes!(6u8, ..5)); | |
73 | ||
74 | // i16; `..X` | |
fc512014 XL |
75 | const NI16: i16 = i16::MIN + 1; |
76 | assert!(yes!(i16::MIN, ..NI16)); | |
77 | assert!(yes!(i16::MIN, ..5)); | |
dfeec247 XL |
78 | assert!(yes!(-6, ..-5)); |
79 | assert!(!yes!(-5, ..-5)); | |
80 | ||
81 | // char; `..X` | |
82 | assert!(yes!('\u{0}', ..'\u{1}')); | |
83 | assert!(yes!('\u{0}', ..'a')); | |
84 | assert!(yes!('a', ..'b')); | |
85 | assert!(!yes!('a', ..'a')); | |
86 | assert!(!yes!('b', ..'a')); | |
87 | ||
88 | // f32; `..X` | |
fc512014 | 89 | assert!(yes!(f32::NEG_INFINITY, ..1.0f32)); |
dfeec247 | 90 | assert!(!yes!(1.5f32, ..1.5f32)); |
fc512014 | 91 | const E32: f32 = 1.5f32 + f32::EPSILON; |
dfeec247 XL |
92 | assert!(yes!(1.5f32, ..E32)); |
93 | assert!(!yes!(1.6f32, ..1.5f32)); | |
94 | ||
95 | // f64; `..X` | |
fc512014 | 96 | assert!(yes!(f64::NEG_INFINITY, ..1.0f64)); |
dfeec247 | 97 | assert!(!yes!(1.5f64, ..1.5f64)); |
fc512014 | 98 | const E64: f64 = 1.5f64 + f64::EPSILON; |
dfeec247 XL |
99 | assert!(yes!(1.5f64, ..E64)); |
100 | assert!(!yes!(1.6f64, ..1.5f64)); | |
101 | } | |
102 | ||
103 | fn range_from() { | |
104 | // `X..` (`RangeFrom`-equivalent): | |
105 | //-------------------------------- | |
106 | ||
107 | // u8; `X..` | |
fc512014 XL |
108 | assert!(yes!(u8::MIN, u8::MIN..)); |
109 | assert!(yes!(u8::MAX, u8::MIN..)); | |
110 | assert!(!yes!(u8::MIN, 1..)); | |
dfeec247 XL |
111 | assert!(!yes!(4, 5..)); |
112 | assert!(yes!(5, 5..)); | |
113 | assert!(yes!(6, 5..)); | |
fc512014 | 114 | assert!(yes!(u8::MAX, u8::MAX..)); |
dfeec247 XL |
115 | |
116 | // i16; `X..` | |
fc512014 XL |
117 | assert!(yes!(i16::MIN, i16::MIN..)); |
118 | assert!(yes!(i16::MAX, i16::MIN..)); | |
119 | const NI16: i16 = i16::MIN + 1; | |
120 | assert!(!yes!(i16::MIN, NI16..)); | |
dfeec247 XL |
121 | assert!(!yes!(-4, 5..)); |
122 | assert!(yes!(-4, -4..)); | |
123 | assert!(yes!(-3, -4..)); | |
fc512014 | 124 | assert!(yes!(i16::MAX, i16::MAX..)); |
dfeec247 XL |
125 | |
126 | // char; `X..` | |
127 | assert!(yes!('\u{0}', '\u{0}'..)); | |
128 | assert!(yes!(core::char::MAX, '\u{0}'..)); | |
129 | assert!(yes!('a', 'a'..)); | |
130 | assert!(yes!('b', 'a'..)); | |
131 | assert!(!yes!('a', 'b'..)); | |
132 | assert!(yes!(core::char::MAX, core::char::MAX..)); | |
133 | ||
134 | // f32; `X..` | |
fc512014 XL |
135 | assert!(yes!(f32::NEG_INFINITY, f32::NEG_INFINITY..)); |
136 | assert!(yes!(f32::INFINITY, f32::NEG_INFINITY..)); | |
137 | assert!(!yes!(f32::NEG_INFINITY, 1.0f32..)); | |
138 | assert!(yes!(f32::INFINITY, 1.0f32..)); | |
139 | assert!(!yes!(1.0f32 - f32::EPSILON, 1.0f32..)); | |
dfeec247 | 140 | assert!(yes!(1.0f32, 1.0f32..)); |
fc512014 XL |
141 | assert!(yes!(f32::INFINITY, 1.0f32..)); |
142 | assert!(yes!(f32::INFINITY, f32::INFINITY..)); | |
dfeec247 XL |
143 | |
144 | // f64; `X..` | |
fc512014 XL |
145 | assert!(yes!(f64::NEG_INFINITY, f64::NEG_INFINITY..)); |
146 | assert!(yes!(f64::INFINITY, f64::NEG_INFINITY..)); | |
147 | assert!(!yes!(f64::NEG_INFINITY, 1.0f64..)); | |
148 | assert!(yes!(f64::INFINITY, 1.0f64..)); | |
149 | assert!(!yes!(1.0f64 - f64::EPSILON, 1.0f64..)); | |
dfeec247 | 150 | assert!(yes!(1.0f64, 1.0f64..)); |
fc512014 XL |
151 | assert!(yes!(f64::INFINITY, 1.0f64..)); |
152 | assert!(yes!(f64::INFINITY, f64::INFINITY..)); | |
dfeec247 XL |
153 | } |
154 | ||
155 | fn main() { | |
156 | range_to_inclusive(); | |
157 | range_to(); | |
158 | range_from(); | |
159 | } |