]> git.proxmox.com Git - rustc.git/blob - library/core/tests/char.rs
New upstream version 1.54.0+dfsg1
[rustc.git] / library / core / tests / char.rs
1 use std::convert::TryFrom;
2 use std::str::FromStr;
3 use std::{char, str};
4
5 #[test]
6 fn test_convert() {
7 assert_eq!(u32::from('a'), 0x61);
8 assert_eq!(char::from(b'\0'), '\0');
9 assert_eq!(char::from(b'a'), 'a');
10 assert_eq!(char::from(b'\xFF'), '\u{FF}');
11 assert_eq!(char::try_from(0_u32), Ok('\0'));
12 assert_eq!(char::try_from(0x61_u32), Ok('a'));
13 assert_eq!(char::try_from(0xD7FF_u32), Ok('\u{D7FF}'));
14 assert!(char::try_from(0xD800_u32).is_err());
15 assert!(char::try_from(0xDFFF_u32).is_err());
16 assert_eq!(char::try_from(0xE000_u32), Ok('\u{E000}'));
17 assert_eq!(char::try_from(0x10FFFF_u32), Ok('\u{10FFFF}'));
18 assert!(char::try_from(0x110000_u32).is_err());
19 assert!(char::try_from(0xFFFF_FFFF_u32).is_err());
20 }
21
22 #[test]
23 fn test_from_str() {
24 assert_eq!(char::from_str("a").unwrap(), 'a');
25 assert_eq!(char::from_str("\0").unwrap(), '\0');
26 assert_eq!(char::from_str("\u{D7FF}").unwrap(), '\u{d7FF}');
27 assert!(char::from_str("").is_err());
28 assert!(char::from_str("abc").is_err());
29 }
30
31 #[test]
32 fn test_is_lowercase() {
33 assert!('a'.is_lowercase());
34 assert!('ö'.is_lowercase());
35 assert!('ß'.is_lowercase());
36 assert!(!'Ü'.is_lowercase());
37 assert!(!'P'.is_lowercase());
38 }
39
40 #[test]
41 fn test_is_uppercase() {
42 assert!(!'h'.is_uppercase());
43 assert!(!'ä'.is_uppercase());
44 assert!(!'ß'.is_uppercase());
45 assert!('Ö'.is_uppercase());
46 assert!('T'.is_uppercase());
47 }
48
49 #[test]
50 fn test_is_whitespace() {
51 assert!(' '.is_whitespace());
52 assert!('\u{2007}'.is_whitespace());
53 assert!('\t'.is_whitespace());
54 assert!('\n'.is_whitespace());
55 assert!(!'a'.is_whitespace());
56 assert!(!'_'.is_whitespace());
57 assert!(!'\u{0}'.is_whitespace());
58 }
59
60 #[test]
61 fn test_to_digit() {
62 assert_eq!('0'.to_digit(10), Some(0));
63 assert_eq!('1'.to_digit(2), Some(1));
64 assert_eq!('2'.to_digit(3), Some(2));
65 assert_eq!('9'.to_digit(10), Some(9));
66 assert_eq!('a'.to_digit(16), Some(10));
67 assert_eq!('A'.to_digit(16), Some(10));
68 assert_eq!('b'.to_digit(16), Some(11));
69 assert_eq!('B'.to_digit(16), Some(11));
70 assert_eq!('A'.to_digit(36), Some(10));
71 assert_eq!('z'.to_digit(36), Some(35));
72 assert_eq!('Z'.to_digit(36), Some(35));
73 assert_eq!('['.to_digit(36), None);
74 assert_eq!('`'.to_digit(36), None);
75 assert_eq!('{'.to_digit(36), None);
76 assert_eq!('$'.to_digit(36), None);
77 assert_eq!('@'.to_digit(16), None);
78 assert_eq!('G'.to_digit(16), None);
79 assert_eq!('g'.to_digit(16), None);
80 assert_eq!(' '.to_digit(10), None);
81 assert_eq!('/'.to_digit(10), None);
82 assert_eq!(':'.to_digit(10), None);
83 assert_eq!(':'.to_digit(11), None);
84 }
85
86 #[test]
87 fn test_to_lowercase() {
88 fn lower(c: char) -> String {
89 let to_lowercase = c.to_lowercase();
90 assert_eq!(to_lowercase.len(), to_lowercase.count());
91 let iter: String = c.to_lowercase().collect();
92 let disp: String = c.to_lowercase().to_string();
93 assert_eq!(iter, disp);
94 iter
95 }
96 assert_eq!(lower('A'), "a");
97 assert_eq!(lower('Ö'), "ö");
98 assert_eq!(lower('ß'), "ß");
99 assert_eq!(lower('Ü'), "ü");
100 assert_eq!(lower('💩'), "💩");
101 assert_eq!(lower('Σ'), "σ");
102 assert_eq!(lower('Τ'), "τ");
103 assert_eq!(lower('Ι'), "ι");
104 assert_eq!(lower('Γ'), "γ");
105 assert_eq!(lower('Μ'), "μ");
106 assert_eq!(lower('Α'), "α");
107 assert_eq!(lower('Σ'), "σ");
108 assert_eq!(lower('Dž'), "dž");
109 assert_eq!(lower('fi'), "fi");
110 assert_eq!(lower('İ'), "i\u{307}");
111 }
112
113 #[test]
114 fn test_to_uppercase() {
115 fn upper(c: char) -> String {
116 let to_uppercase = c.to_uppercase();
117 assert_eq!(to_uppercase.len(), to_uppercase.count());
118 let iter: String = c.to_uppercase().collect();
119 let disp: String = c.to_uppercase().to_string();
120 assert_eq!(iter, disp);
121 iter
122 }
123 assert_eq!(upper('a'), "A");
124 assert_eq!(upper('ö'), "Ö");
125 assert_eq!(upper('ß'), "SS"); // not ẞ: Latin capital letter sharp s
126 assert_eq!(upper('ü'), "Ü");
127 assert_eq!(upper('💩'), "💩");
128
129 assert_eq!(upper('σ'), "Σ");
130 assert_eq!(upper('τ'), "Τ");
131 assert_eq!(upper('ι'), "Ι");
132 assert_eq!(upper('γ'), "Γ");
133 assert_eq!(upper('μ'), "Μ");
134 assert_eq!(upper('α'), "Α");
135 assert_eq!(upper('ς'), "Σ");
136 assert_eq!(upper('Dž'), "DŽ");
137 assert_eq!(upper('fi'), "FI");
138 assert_eq!(upper('ᾀ'), "ἈΙ");
139 }
140
141 #[test]
142 fn test_is_control() {
143 assert!('\u{0}'.is_control());
144 assert!('\u{3}'.is_control());
145 assert!('\u{6}'.is_control());
146 assert!('\u{9}'.is_control());
147 assert!('\u{7f}'.is_control());
148 assert!('\u{92}'.is_control());
149 assert!(!'\u{20}'.is_control());
150 assert!(!'\u{55}'.is_control());
151 assert!(!'\u{68}'.is_control());
152 }
153
154 #[test]
155 fn test_is_numeric() {
156 assert!('2'.is_numeric());
157 assert!('7'.is_numeric());
158 assert!('¾'.is_numeric());
159 assert!(!'c'.is_numeric());
160 assert!(!'i'.is_numeric());
161 assert!(!'z'.is_numeric());
162 assert!(!'Q'.is_numeric());
163 }
164
165 #[test]
166 fn test_escape_debug() {
167 fn string(c: char) -> String {
168 let iter: String = c.escape_debug().collect();
169 let disp: String = c.escape_debug().to_string();
170 assert_eq!(iter, disp);
171 iter
172 }
173 assert_eq!(string('\n'), "\\n");
174 assert_eq!(string('\r'), "\\r");
175 assert_eq!(string('\''), "\\'");
176 assert_eq!(string('"'), "\\\"");
177 assert_eq!(string(' '), " ");
178 assert_eq!(string('a'), "a");
179 assert_eq!(string('~'), "~");
180 assert_eq!(string('é'), "é");
181 assert_eq!(string('文'), "");
182 assert_eq!(string('\x00'), "\\u{0}");
183 assert_eq!(string('\x1f'), "\\u{1f}");
184 assert_eq!(string('\x7f'), "\\u{7f}");
185 assert_eq!(string('\u{80}'), "\\u{80}");
186 assert_eq!(string('\u{ff}'), "\u{ff}");
187 assert_eq!(string('\u{11b}'), "\u{11b}");
188 assert_eq!(string('\u{1d4b6}'), "\u{1d4b6}");
189 assert_eq!(string('\u{301}'), "\\u{301}"); // combining character
190 assert_eq!(string('\u{200b}'), "\\u{200b}"); // zero width space
191 assert_eq!(string('\u{e000}'), "\\u{e000}"); // private use 1
192 assert_eq!(string('\u{100000}'), "\\u{100000}"); // private use 2
193 }
194
195 #[test]
196 fn test_escape_default() {
197 fn string(c: char) -> String {
198 let iter: String = c.escape_default().collect();
199 let disp: String = c.escape_default().to_string();
200 assert_eq!(iter, disp);
201 iter
202 }
203 assert_eq!(string('\n'), "\\n");
204 assert_eq!(string('\r'), "\\r");
205 assert_eq!(string('\''), "\\'");
206 assert_eq!(string('"'), "\\\"");
207 assert_eq!(string(' '), " ");
208 assert_eq!(string('a'), "a");
209 assert_eq!(string('~'), "~");
210 assert_eq!(string('é'), "\\u{e9}");
211 assert_eq!(string('\x00'), "\\u{0}");
212 assert_eq!(string('\x1f'), "\\u{1f}");
213 assert_eq!(string('\x7f'), "\\u{7f}");
214 assert_eq!(string('\u{80}'), "\\u{80}");
215 assert_eq!(string('\u{ff}'), "\\u{ff}");
216 assert_eq!(string('\u{11b}'), "\\u{11b}");
217 assert_eq!(string('\u{1d4b6}'), "\\u{1d4b6}");
218 assert_eq!(string('\u{200b}'), "\\u{200b}"); // zero width space
219 assert_eq!(string('\u{e000}'), "\\u{e000}"); // private use 1
220 assert_eq!(string('\u{100000}'), "\\u{100000}"); // private use 2
221 }
222
223 #[test]
224 fn test_escape_unicode() {
225 fn string(c: char) -> String {
226 let iter: String = c.escape_unicode().collect();
227 let disp: String = c.escape_unicode().to_string();
228 assert_eq!(iter, disp);
229 iter
230 }
231
232 assert_eq!(string('\x00'), "\\u{0}");
233 assert_eq!(string('\n'), "\\u{a}");
234 assert_eq!(string(' '), "\\u{20}");
235 assert_eq!(string('a'), "\\u{61}");
236 assert_eq!(string('\u{11b}'), "\\u{11b}");
237 assert_eq!(string('\u{1d4b6}'), "\\u{1d4b6}");
238 }
239
240 #[test]
241 fn test_encode_utf8() {
242 fn check(input: char, expect: &[u8]) {
243 let mut buf = [0; 4];
244 let ptr = buf.as_ptr();
245 let s = input.encode_utf8(&mut buf);
246 assert_eq!(s.as_ptr() as usize, ptr as usize);
247 assert!(str::from_utf8(s.as_bytes()).is_ok());
248 assert_eq!(s.as_bytes(), expect);
249 }
250
251 check('x', &[0x78]);
252 check('\u{e9}', &[0xc3, 0xa9]);
253 check('\u{a66e}', &[0xea, 0x99, 0xae]);
254 check('\u{1f4a9}', &[0xf0, 0x9f, 0x92, 0xa9]);
255 }
256
257 #[test]
258 fn test_encode_utf16() {
259 fn check(input: char, expect: &[u16]) {
260 let mut buf = [0; 2];
261 let ptr = buf.as_mut_ptr();
262 let b = input.encode_utf16(&mut buf);
263 assert_eq!(b.as_mut_ptr() as usize, ptr as usize);
264 assert_eq!(b, expect);
265 }
266
267 check('x', &[0x0078]);
268 check('\u{e9}', &[0x00e9]);
269 check('\u{a66e}', &[0xa66e]);
270 check('\u{1f4a9}', &[0xd83d, 0xdca9]);
271 }
272
273 #[test]
274 fn test_len_utf16() {
275 assert!('x'.len_utf16() == 1);
276 assert!('\u{e9}'.len_utf16() == 1);
277 assert!('\u{a66e}'.len_utf16() == 1);
278 assert!('\u{1f4a9}'.len_utf16() == 2);
279 }
280
281 #[test]
282 fn test_decode_utf16() {
283 fn check(s: &[u16], expected: &[Result<char, u16>]) {
284 let v = char::decode_utf16(s.iter().cloned())
285 .map(|r| r.map_err(|e| e.unpaired_surrogate()))
286 .collect::<Vec<_>>();
287 assert_eq!(v, expected);
288 }
289 check(&[0xD800, 0x41, 0x42], &[Err(0xD800), Ok('A'), Ok('B')]);
290 check(&[0xD800, 0], &[Err(0xD800), Ok('\0')]);
291 }
292
293 #[test]
294 fn ed_iterator_specializations() {
295 // Check counting
296 assert_eq!('\n'.escape_default().count(), 2);
297 assert_eq!('c'.escape_default().count(), 1);
298 assert_eq!(' '.escape_default().count(), 1);
299 assert_eq!('\\'.escape_default().count(), 2);
300 assert_eq!('\''.escape_default().count(), 2);
301
302 // Check nth
303
304 // Check that OoB is handled correctly
305 assert_eq!('\n'.escape_default().nth(2), None);
306 assert_eq!('c'.escape_default().nth(1), None);
307 assert_eq!(' '.escape_default().nth(1), None);
308 assert_eq!('\\'.escape_default().nth(2), None);
309 assert_eq!('\''.escape_default().nth(2), None);
310
311 // Check the first char
312 assert_eq!('\n'.escape_default().nth(0), Some('\\'));
313 assert_eq!('c'.escape_default().nth(0), Some('c'));
314 assert_eq!(' '.escape_default().nth(0), Some(' '));
315 assert_eq!('\\'.escape_default().nth(0), Some('\\'));
316 assert_eq!('\''.escape_default().nth(0), Some('\\'));
317
318 // Check the second char
319 assert_eq!('\n'.escape_default().nth(1), Some('n'));
320 assert_eq!('\\'.escape_default().nth(1), Some('\\'));
321 assert_eq!('\''.escape_default().nth(1), Some('\''));
322
323 // Check the last char
324 assert_eq!('\n'.escape_default().last(), Some('n'));
325 assert_eq!('c'.escape_default().last(), Some('c'));
326 assert_eq!(' '.escape_default().last(), Some(' '));
327 assert_eq!('\\'.escape_default().last(), Some('\\'));
328 assert_eq!('\''.escape_default().last(), Some('\''));
329 }
330
331 #[test]
332 fn eu_iterator_specializations() {
333 fn check(c: char) {
334 let len = c.escape_unicode().count();
335
336 // Check OoB
337 assert_eq!(c.escape_unicode().nth(len), None);
338
339 // For all possible in-bound offsets
340 let mut iter = c.escape_unicode();
341 for offset in 0..len {
342 // Check last
343 assert_eq!(iter.clone().last(), Some('}'));
344
345 // Check len
346 assert_eq!(iter.len(), len - offset);
347
348 // Check size_hint (= len in ExactSizeIterator)
349 assert_eq!(iter.size_hint(), (iter.len(), Some(iter.len())));
350
351 // Check counting
352 assert_eq!(iter.clone().count(), len - offset);
353
354 // Check nth
355 assert_eq!(c.escape_unicode().nth(offset), iter.next());
356 }
357
358 // Check post-last
359 assert_eq!(iter.clone().last(), None);
360 assert_eq!(iter.clone().count(), 0);
361 }
362
363 check('\u{0}');
364 check('\u{1}');
365 check('\u{12}');
366 check('\u{123}');
367 check('\u{1234}');
368 check('\u{12340}');
369 check('\u{10FFFF}');
370 }