summaryrefslogtreecommitdiffstats
path: root/library/alloc/tests
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-05-30 03:59:24 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-05-30 03:59:24 +0000
commit023939b627b7dc93b01471f7d41fb8553ddb4ffa (patch)
tree60fc59477c605c72b0a1051409062ddecc43f877 /library/alloc/tests
parentAdding debian version 1.72.1+dfsg1-1. (diff)
downloadrustc-023939b627b7dc93b01471f7d41fb8553ddb4ffa.tar.xz
rustc-023939b627b7dc93b01471f7d41fb8553ddb4ffa.zip
Merging upstream version 1.73.0+dfsg1.
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'library/alloc/tests')
-rw-r--r--library/alloc/tests/str.rs31
-rw-r--r--library/alloc/tests/string.rs48
-rw-r--r--library/alloc/tests/vec.rs65
3 files changed, 136 insertions, 8 deletions
diff --git a/library/alloc/tests/str.rs b/library/alloc/tests/str.rs
index 0ba5d088f..cb59a9d4a 100644
--- a/library/alloc/tests/str.rs
+++ b/library/alloc/tests/str.rs
@@ -1,4 +1,4 @@
-#![cfg_attr(not(bootstrap), allow(invalid_from_utf8))]
+#![allow(invalid_from_utf8)]
use std::assert_matches::assert_matches;
use std::borrow::Cow;
@@ -1739,6 +1739,28 @@ fn test_utf16_code_units() {
}
#[test]
+fn test_utf16_size_hint() {
+ assert_eq!("".encode_utf16().size_hint(), (0, Some(0)));
+ assert_eq!("123".encode_utf16().size_hint(), (1, Some(3)));
+ assert_eq!("1234".encode_utf16().size_hint(), (2, Some(4)));
+ assert_eq!("12345678".encode_utf16().size_hint(), (3, Some(8)));
+
+ fn hint_vec(src: &str) -> Vec<(usize, Option<usize>)> {
+ let mut it = src.encode_utf16();
+ let mut result = Vec::new();
+ result.push(it.size_hint());
+ while it.next().is_some() {
+ result.push(it.size_hint())
+ }
+ result
+ }
+
+ assert_eq!(hint_vec("12"), [(1, Some(2)), (1, Some(1)), (0, Some(0))]);
+ assert_eq!(hint_vec("\u{101234}"), [(2, Some(4)), (1, Some(1)), (0, Some(0))]);
+ assert_eq!(hint_vec("\u{101234}a"), [(2, Some(5)), (2, Some(2)), (1, Some(1)), (0, Some(0))]);
+}
+
+#[test]
fn starts_with_in_unicode() {
assert!(!"├── Cargo.toml".starts_with("# "));
}
@@ -2416,10 +2438,7 @@ fn ceil_char_boundary() {
check_many("🇯🇵", 0..=0, 0);
check_many("🇯🇵", 1..=4, 4);
check_many("🇯🇵", 5..=8, 8);
-}
-#[test]
-#[should_panic]
-fn ceil_char_boundary_above_len_panic() {
- let _ = "x".ceil_char_boundary(2);
+ // above len
+ check_many("hello", 5..=10, 5);
}
diff --git a/library/alloc/tests/string.rs b/library/alloc/tests/string.rs
index 17d56d491..711e4eef2 100644
--- a/library/alloc/tests/string.rs
+++ b/library/alloc/tests/string.rs
@@ -368,29 +368,73 @@ fn remove_bad() {
#[test]
fn test_remove_matches() {
+ // test_single_pattern_occurrence
let mut s = "abc".to_string();
-
s.remove_matches('b');
assert_eq!(s, "ac");
+ // repeat_test_single_pattern_occurrence
s.remove_matches('b');
assert_eq!(s, "ac");
+ // test_single_character_pattern
let mut s = "abcb".to_string();
-
s.remove_matches('b');
assert_eq!(s, "ac");
+ // test_pattern_with_special_characters
let mut s = "ศไทย中华Việt Nam; foobarศ".to_string();
s.remove_matches('ศ');
assert_eq!(s, "ไทย中华Việt Nam; foobar");
+ // test_pattern_empty_text_and_pattern
let mut s = "".to_string();
s.remove_matches("");
assert_eq!(s, "");
+ // test_pattern_empty_text
+ let mut s = "".to_string();
+ s.remove_matches("something");
+ assert_eq!(s, "");
+
+ // test_empty_pattern
+ let mut s = "Testing with empty pattern.".to_string();
+ s.remove_matches("");
+ assert_eq!(s, "Testing with empty pattern.");
+
+ // test_multiple_consecutive_patterns_1
let mut s = "aaaaa".to_string();
s.remove_matches('a');
assert_eq!(s, "");
+
+ // test_multiple_consecutive_patterns_2
+ let mut s = "Hello **world****today!**".to_string();
+ s.remove_matches("**");
+ assert_eq!(s, "Hello worldtoday!");
+
+ // test_case_insensitive_pattern
+ let mut s = "CASE ** SeNsItIvE ** PaTtErN.".to_string();
+ s.remove_matches("sEnSiTiVe");
+ assert_eq!(s, "CASE ** SeNsItIvE ** PaTtErN.");
+
+ // test_pattern_with_digits
+ let mut s = "123 ** 456 ** 789".to_string();
+ s.remove_matches("**");
+ assert_eq!(s, "123 456 789");
+
+ // test_pattern_occurs_after_empty_string
+ let mut s = "abc X defXghi".to_string();
+ s.remove_matches("X");
+ assert_eq!(s, "abc defghi");
+
+ // test_large_pattern
+ let mut s = "aaaXbbbXcccXdddXeee".to_string();
+ s.remove_matches("X");
+ assert_eq!(s, "aaabbbcccdddeee");
+
+ // test_pattern_at_multiple_positions
+ let mut s = "Pattern ** found ** multiple ** times ** in ** text.".to_string();
+ s.remove_matches("**");
+ assert_eq!(s, "Pattern found multiple times in text.");
}
#[test]
diff --git a/library/alloc/tests/vec.rs b/library/alloc/tests/vec.rs
index ddd93e9a4..183dd8e6e 100644
--- a/library/alloc/tests/vec.rs
+++ b/library/alloc/tests/vec.rs
@@ -2498,3 +2498,68 @@ fn test_into_flattened_size_overflow() {
let v = vec![[(); usize::MAX]; 2];
let _ = v.into_flattened();
}
+
+#[cfg(not(bootstrap))]
+#[test]
+fn test_box_zero_allocator() {
+ use core::{alloc::AllocError, cell::RefCell};
+ use std::collections::HashSet;
+
+ // Track ZST allocations and ensure that they all have a matching free.
+ struct ZstTracker {
+ state: RefCell<(HashSet<usize>, usize)>,
+ }
+ unsafe impl Allocator for ZstTracker {
+ fn allocate(&self, layout: Layout) -> Result<NonNull<[u8]>, AllocError> {
+ let ptr = if layout.size() == 0 {
+ let mut state = self.state.borrow_mut();
+ let addr = state.1;
+ assert!(state.0.insert(addr));
+ state.1 += 1;
+ std::println!("allocating {addr}");
+ std::ptr::invalid_mut(addr)
+ } else {
+ unsafe { std::alloc::alloc(layout) }
+ };
+ Ok(NonNull::slice_from_raw_parts(NonNull::new(ptr).ok_or(AllocError)?, layout.size()))
+ }
+
+ unsafe fn deallocate(&self, ptr: NonNull<u8>, layout: Layout) {
+ if layout.size() == 0 {
+ let addr = ptr.as_ptr() as usize;
+ let mut state = self.state.borrow_mut();
+ std::println!("freeing {addr}");
+ assert!(state.0.remove(&addr), "ZST free that wasn't allocated");
+ } else {
+ unsafe { std::alloc::dealloc(ptr.as_ptr(), layout) }
+ }
+ }
+ }
+
+ // Start the state at 100 to avoid returning null pointers.
+ let alloc = ZstTracker { state: RefCell::new((HashSet::new(), 100)) };
+
+ // Ensure that unsizing retains the same behavior.
+ {
+ let b1: Box<[u8; 0], &ZstTracker> = Box::new_in([], &alloc);
+ let b2: Box<[u8], &ZstTracker> = b1.clone();
+ let _b3: Box<[u8], &ZstTracker> = b2.clone();
+ }
+
+ // Ensure that shrinking doesn't leak a ZST allocation.
+ {
+ let mut v1: Vec<u8, &ZstTracker> = Vec::with_capacity_in(100, &alloc);
+ v1.shrink_to_fit();
+ }
+
+ // Ensure that conversion to/from vec works.
+ {
+ let v1: Vec<(), &ZstTracker> = Vec::with_capacity_in(100, &alloc);
+ let _b1: Box<[()], &ZstTracker> = v1.into_boxed_slice();
+ let b2: Box<[()], &ZstTracker> = Box::new_in([(), (), ()], &alloc);
+ let _v2: Vec<(), &ZstTracker> = b2.into();
+ }
+
+ // Ensure all ZSTs have been freed.
+ assert!(alloc.state.borrow().0.is_empty());
+}