]>
git.proxmox.com Git - rustc.git/blob - src/libcollectionstest/string.rs
d4e2ebf4fd137e31a49fb1caa967bae1347f1d8c
1 // Copyright 2014 The Rust Project Developers. See the COPYRIGHT
2 // file at the top-level directory of this distribution and at
3 // http://rust-lang.org/COPYRIGHT.
5 // Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
6 // http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
7 // <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
8 // option. This file may not be copied, modified, or distributed
9 // except according to those terms.
11 use std
::borrow
::{IntoCow, Cow}
;
12 use std
::iter
::repeat
;
13 use std
::str::Utf8Error
;
14 use std
::string
::as_string
;
21 assert_eq
!(x
, &**as_string(x
));
26 let owned
: Option
<::std
::string
::String
> = "string".parse().ok();
27 assert_eq
!(owned
.as_ref().map(|s
| &**s
), Some("string"));
31 fn test_unsized_to_string() {
33 let _
: String
= (*s
).to_string();
38 let xs
= b
"hello".to_vec();
39 assert_eq
!(String
::from_utf8(xs
).unwrap(),
40 String
::from_str("hello"));
42 let xs
= "ศไทย中华Việt Nam".as_bytes().to_vec();
43 assert_eq
!(String
::from_utf8(xs
).unwrap(),
44 String
::from_str("ศไทย中华Việt Nam"));
46 let xs
= b
"hello\xFF".to_vec();
47 let err
= String
::from_utf8(xs
).err().unwrap();
48 assert_eq
!(err
.into_bytes(), b
"hello\xff".to_vec());
52 fn test_from_utf8_lossy() {
54 let ys
: Cow
<str> = "hello".into_cow();
55 assert_eq
!(String
::from_utf8_lossy(xs
), ys
);
57 let xs
= "ศไทย中华Việt Nam".as_bytes();
58 let ys
: Cow
<str> = "ศไทย中华Việt Nam".into_cow();
59 assert_eq
!(String
::from_utf8_lossy(xs
), ys
);
61 let xs
= b
"Hello\xC2 There\xFF Goodbye";
62 assert_eq
!(String
::from_utf8_lossy(xs
),
63 String
::from_str("Hello\u{FFFD} There\u{FFFD} Goodbye").into_cow());
65 let xs
= b
"Hello\xC0\x80 There\xE6\x83 Goodbye";
66 assert_eq
!(String
::from_utf8_lossy(xs
),
67 String
::from_str("Hello\u{FFFD}\u{FFFD} There\u{FFFD} Goodbye").into_cow());
69 let xs
= b
"\xF5foo\xF5\x80bar";
70 assert_eq
!(String
::from_utf8_lossy(xs
),
71 String
::from_str("\u{FFFD}foo\u{FFFD}\u{FFFD}bar").into_cow());
73 let xs
= b
"\xF1foo\xF1\x80bar\xF1\x80\x80baz";
74 assert_eq
!(String
::from_utf8_lossy(xs
),
75 String
::from_str("\u{FFFD}foo\u{FFFD}bar\u{FFFD}baz").into_cow());
77 let xs
= b
"\xF4foo\xF4\x80bar\xF4\xBFbaz";
78 assert_eq
!(String
::from_utf8_lossy(xs
),
79 String
::from_str("\u{FFFD}foo\u{FFFD}bar\u{FFFD}\u{FFFD}baz").into_cow());
81 let xs
= b
"\xF0\x80\x80\x80foo\xF0\x90\x80\x80bar";
82 assert_eq
!(String
::from_utf8_lossy(xs
), String
::from_str("\u{FFFD}\u{FFFD}\u{FFFD}\u{FFFD}\
83 foo\u{10000}bar").into_cow());
86 let xs
= b
"\xED\xA0\x80foo\xED\xBF\xBFbar";
87 assert_eq
!(String
::from_utf8_lossy(xs
), String
::from_str("\u{FFFD}\u{FFFD}\u{FFFD}foo\
88 \u{FFFD}\u{FFFD}\u{FFFD}bar").into_cow());
92 fn test_from_utf16() {
94 [(String
::from_str("𐍅𐌿𐌻𐍆𐌹𐌻𐌰\n"),
95 vec
![0xd800, 0xdf45, 0xd800, 0xdf3f,
96 0xd800, 0xdf3b, 0xd800, 0xdf46,
97 0xd800, 0xdf39, 0xd800, 0xdf3b,
98 0xd800, 0xdf30, 0x000a]),
100 (String
::from_str("𐐒𐑉𐐮𐑀𐐲𐑋 𐐏𐐲𐑍\n"),
101 vec
![0xd801, 0xdc12, 0xd801,
102 0xdc49, 0xd801, 0xdc2e, 0xd801,
103 0xdc40, 0xd801, 0xdc32, 0xd801,
104 0xdc4b, 0x0020, 0xd801, 0xdc0f,
105 0xd801, 0xdc32, 0xd801, 0xdc4d,
108 (String
::from_str("𐌀𐌖𐌋𐌄𐌑𐌉·𐌌𐌄𐌕𐌄𐌋𐌉𐌑\n"),
109 vec
![0xd800, 0xdf00, 0xd800, 0xdf16,
110 0xd800, 0xdf0b, 0xd800, 0xdf04,
111 0xd800, 0xdf11, 0xd800, 0xdf09,
112 0x00b7, 0xd800, 0xdf0c, 0xd800,
113 0xdf04, 0xd800, 0xdf15, 0xd800,
114 0xdf04, 0xd800, 0xdf0b, 0xd800,
115 0xdf09, 0xd800, 0xdf11, 0x000a ]),
117 (String
::from_str("𐒋𐒘𐒈𐒑𐒛𐒒 𐒕𐒓 𐒈𐒚𐒍 𐒏𐒜𐒒𐒖𐒆 𐒕𐒆\n"),
118 vec
![0xd801, 0xdc8b, 0xd801, 0xdc98,
119 0xd801, 0xdc88, 0xd801, 0xdc91,
120 0xd801, 0xdc9b, 0xd801, 0xdc92,
121 0x0020, 0xd801, 0xdc95, 0xd801,
122 0xdc93, 0x0020, 0xd801, 0xdc88,
123 0xd801, 0xdc9a, 0xd801, 0xdc8d,
124 0x0020, 0xd801, 0xdc8f, 0xd801,
125 0xdc9c, 0xd801, 0xdc92, 0xd801,
126 0xdc96, 0xd801, 0xdc86, 0x0020,
127 0xd801, 0xdc95, 0xd801, 0xdc86,
129 // Issue #12318, even-numbered non-BMP planes
130 (String
::from_str("\u{20000}"),
131 vec
![0xD840, 0xDC00])];
134 let (s
, u
) = (*p
).clone();
135 let s_as_utf16
= s
.utf16_units().collect
::<Vec
<u16>>();
136 let u_as_string
= String
::from_utf16(&u
).unwrap();
138 assert
!(::rustc_unicode
::str::is_utf16(&u
));
139 assert_eq
!(s_as_utf16
, u
);
141 assert_eq
!(u_as_string
, s
);
142 assert_eq
!(String
::from_utf16_lossy(&u
), s
);
144 assert_eq
!(String
::from_utf16(&s_as_utf16
).unwrap(), s
);
145 assert_eq
!(u_as_string
.utf16_units().collect
::<Vec
<u16>>(), u
);
150 fn test_utf16_invalid() {
151 // completely positive cases tested above.
153 assert
!(String
::from_utf16(&[0xD800]).is_err());
155 assert
!(String
::from_utf16(&[0xD800, 0xD800]).is_err());
158 assert
!(String
::from_utf16(&[0x0061, 0xDC00]).is_err());
161 assert
!(String
::from_utf16(&[0xD800, 0xd801, 0xdc8b, 0xD800]).is_err());
165 fn test_from_utf16_lossy() {
166 // completely positive cases tested above.
168 assert_eq
!(String
::from_utf16_lossy(&[0xD800]), String
::from_str("\u{FFFD}"));
170 assert_eq
!(String
::from_utf16_lossy(&[0xD800, 0xD800]),
171 String
::from_str("\u{FFFD}\u{FFFD}"));
174 assert_eq
!(String
::from_utf16_lossy(&[0x0061, 0xDC00]), String
::from_str("a\u{FFFD}"));
177 assert_eq
!(String
::from_utf16_lossy(&[0xD800, 0xd801, 0xdc8b, 0xD800]),
178 String
::from_str("\u{FFFD}𐒋\u{FFFD}"));
182 fn test_push_bytes() {
183 let mut s
= String
::from_str("ABC");
185 let mv
= s
.as_mut_vec();
186 mv
.push_all(&[b'D'
]);
188 assert_eq
!(s
, "ABCD");
193 let mut s
= String
::new();
195 assert_eq
!(&s
[0..], "");
197 assert_eq
!(&s
[0..], "abc");
198 s
.push_str("ประเทศไทย中华Việt Nam");
199 assert_eq
!(&s
[0..], "abcประเทศไทย中华Việt Nam");
204 let mut data
= String
::from_str("ประเทศไทย中");
206 data
.push('b'
); // 1 byte
207 data
.push('¢'
); // 2 byte
208 data
.push('€'
); // 3 byte
209 data
.push('𤭢'
); // 4 byte
210 assert_eq
!(data
, "ประเทศไทย中华b¢€𤭢");
215 let mut data
= String
::from_str("ประเทศไทย中华b¢€𤭢");
216 assert_eq
!(data
.pop().unwrap(), '𤭢'
); // 4 bytes
217 assert_eq
!(data
.pop().unwrap(), '€'
); // 3 bytes
218 assert_eq
!(data
.pop().unwrap(), '¢'
); // 2 bytes
219 assert_eq
!(data
.pop().unwrap(), 'b'
); // 1 bytes
220 assert_eq
!(data
.pop().unwrap(), '华'
);
221 assert_eq
!(data
, "ประเทศไทย中");
225 fn test_str_truncate() {
226 let mut s
= String
::from_str("12345");
228 assert_eq
!(s
, "12345");
230 assert_eq
!(s
, "123");
234 let mut s
= String
::from_str("12345");
244 fn test_str_truncate_invalid_len() {
245 let mut s
= String
::from_str("12345");
251 fn test_str_truncate_split_codepoint() {
252 let mut s
= String
::from_str("\u{FC}"); // ü
257 fn test_str_clear() {
258 let mut s
= String
::from_str("12345");
260 assert_eq
!(s
.len(), 0);
266 let a
= String
::from_str("12345");
269 assert_eq
!(b
.len(), 7);
270 assert_eq
!(b
, "1234522");
275 let mut s
= "ศไทย中华Việt Nam; foobar".to_string();;
276 assert_eq
!(s
.remove(0), 'ศ'
);
277 assert_eq
!(s
.len(), 33);
278 assert_eq
!(s
, "ไทย中华Việt Nam; foobar");
279 assert_eq
!(s
.remove(17), 'ệ'
);
280 assert_eq
!(s
, "ไทย中华Vit Nam; foobar");
283 #[test] #[should_panic]
285 "ศ".to_string().remove(1);
290 let mut s
= "foobar".to_string();
292 assert_eq
!(s
, "ệfoobar");
294 assert_eq
!(s
, "ệfooยbar");
297 #[test] #[should_panic] fn insert_bad1() { "".to_string().insert(1, 't'); }
298 #[test] #[should_panic] fn insert_bad2() { "ệ".to_string().insert(1, 't'); }
302 let s
= "foobar".to_string();
303 assert_eq
!("foobar", &s
[..]);
304 assert_eq
!("foo", &s
[..3]);
305 assert_eq
!("bar", &s
[3..]);
306 assert_eq
!("oob", &s
[1..4]);
310 fn test_simple_types() {
311 assert_eq
!(1.to_string(), "1");
312 assert_eq
!((-1).to_string(), "-1");
313 assert_eq
!(200.to_string(), "200");
314 assert_eq
!(2.to_string(), "2");
315 assert_eq
!(true.to_string(), "true");
316 assert_eq
!(false.to_string(), "false");
317 assert_eq
!(("hi".to_string()).to_string(), "hi");
322 let x
: Vec
<i32> = vec
![];
323 assert_eq
!(format
!("{:?}", x
), "[]");
324 assert_eq
!(format
!("{:?}", vec
![1]), "[1]");
325 assert_eq
!(format
!("{:?}", vec
![1, 2, 3]), "[1, 2, 3]");
326 assert
!(format
!("{:?}", vec
![vec
![], vec
![1], vec
![1, 1]]) ==
327 "[[], [1], [1, 1]]");
331 fn test_from_iterator() {
332 let s
= "ศไทย中华Việt Nam".to_string();
336 let a
: String
= s
.chars().collect();
339 let mut b
= t
.to_string();
343 let c
: String
= vec
![t
, u
].into_iter().collect();
346 let mut d
= t
.to_string();
347 d
.extend(vec
![u
].into_iter());
353 let mut s
= String
::from("αβγ");
354 assert_eq
!(s
.drain(2..4).collect
::<String
>(), "β");
357 let mut t
= String
::from("abcd");
359 assert_eq
!(t
, "abcd");
361 assert_eq
!(t
, "bcd");
363 assert_eq
!(t
, "bcd");
369 fn bench_with_capacity(b
: &mut Bencher
) {
371 String
::with_capacity(100)
376 fn bench_push_str(b
: &mut Bencher
) {
377 let s
= "ศไทย中华Việt Nam; Mary had a little lamb, Little lamb";
379 let mut r
= String
::new();
384 const REPETITIONS
: u64 = 10_000;
387 fn bench_push_str_one_byte(b
: &mut Bencher
) {
388 b
.bytes
= REPETITIONS
;
390 let mut r
= String
::new();
391 for _
in 0..REPETITIONS
{
398 fn bench_push_char_one_byte(b
: &mut Bencher
) {
399 b
.bytes
= REPETITIONS
;
401 let mut r
= String
::new();
402 for _
in 0..REPETITIONS
{
409 fn bench_push_char_two_bytes(b
: &mut Bencher
) {
410 b
.bytes
= REPETITIONS
* 2;
412 let mut r
= String
::new();
413 for _
in 0..REPETITIONS
{
420 fn from_utf8_lossy_100_ascii(b
: &mut Bencher
) {
421 let s
= b
"Hello there, the quick brown fox jumped over the lazy dog! \
422 Lorem ipsum dolor sit amet, consectetur. ";
424 assert_eq
!(100, s
.len());
426 let _
= String
::from_utf8_lossy(s
);
431 fn from_utf8_lossy_100_multibyte(b
: &mut Bencher
) {
432 let s
= "𐌀𐌖𐌋𐌄𐌑𐌉ปรدولة الكويتทศไทย中华𐍅𐌿𐌻𐍆𐌹𐌻𐌰".as_bytes();
433 assert_eq
!(100, s
.len());
435 let _
= String
::from_utf8_lossy(s
);
440 fn from_utf8_lossy_invalid(b
: &mut Bencher
) {
441 let s
= b
"Hello\xC0\x80 There\xE6\x83 Goodbye";
443 let _
= String
::from_utf8_lossy(s
);
448 fn from_utf8_lossy_100_invalid(b
: &mut Bencher
) {
449 let s
= repeat(0xf5).take(100).collect
::<Vec
<_
>>();
451 let _
= String
::from_utf8_lossy(&s
);
456 fn bench_exact_size_shrink_to_fit(b
: &mut Bencher
) {
457 let s
= "Hello there, the quick brown fox jumped over the lazy dog! \
458 Lorem ipsum dolor sit amet, consectetur. ";
459 // ensure our operation produces an exact-size string before we benchmark it
460 let mut r
= String
::with_capacity(s
.len());
462 assert_eq
!(r
.len(), r
.capacity());
464 let mut r
= String
::with_capacity(s
.len());
472 fn bench_from_str(b
: &mut Bencher
) {
473 let s
= "Hello there, the quick brown fox jumped over the lazy dog! \
474 Lorem ipsum dolor sit amet, consectetur. ";
481 fn bench_from(b
: &mut Bencher
) {
482 let s
= "Hello there, the quick brown fox jumped over the lazy dog! \
483 Lorem ipsum dolor sit amet, consectetur. ";
490 fn bench_to_string(b
: &mut Bencher
) {
491 let s
= "Hello there, the quick brown fox jumped over the lazy dog! \
492 Lorem ipsum dolor sit amet, consectetur. ";