summaryrefslogtreecommitdiffstats
path: root/library/std/src/collections/hash/set/tests.rs
diff options
context:
space:
mode:
Diffstat (limited to 'library/std/src/collections/hash/set/tests.rs')
-rw-r--r--library/std/src/collections/hash/set/tests.rs42
1 files changed, 32 insertions, 10 deletions
diff --git a/library/std/src/collections/hash/set/tests.rs b/library/std/src/collections/hash/set/tests.rs
index 941a0450c..e0cd80b44 100644
--- a/library/std/src/collections/hash/set/tests.rs
+++ b/library/std/src/collections/hash/set/tests.rs
@@ -3,6 +3,7 @@ use super::HashSet;
use crate::panic::{catch_unwind, AssertUnwindSafe};
use crate::sync::atomic::{AtomicU32, Ordering};
+use crate::sync::Arc;
#[test]
fn test_zero_capacities() {
@@ -418,18 +419,18 @@ fn test_retain() {
}
#[test]
-fn test_drain_filter() {
+fn test_extract_if() {
let mut x: HashSet<_> = [1].iter().copied().collect();
let mut y: HashSet<_> = [1].iter().copied().collect();
- x.drain_filter(|_| true);
- y.drain_filter(|_| false);
+ x.extract_if(|_| true).for_each(drop);
+ y.extract_if(|_| false).for_each(drop);
assert_eq!(x.len(), 0);
assert_eq!(y.len(), 1);
}
#[test]
-fn test_drain_filter_drop_panic_leak() {
+fn test_extract_if_drop_panic_leak() {
static PREDS: AtomicU32 = AtomicU32::new(0);
static DROPS: AtomicU32 = AtomicU32::new(0);
@@ -446,19 +447,20 @@ fn test_drain_filter_drop_panic_leak() {
let mut set = (0..3).map(|i| D(i)).collect::<HashSet<_>>();
catch_unwind(move || {
- drop(set.drain_filter(|_| {
+ set.extract_if(|_| {
PREDS.fetch_add(1, Ordering::SeqCst);
true
- }))
+ })
+ .for_each(drop)
})
.ok();
- assert_eq!(PREDS.load(Ordering::SeqCst), 3);
+ assert_eq!(PREDS.load(Ordering::SeqCst), 2);
assert_eq!(DROPS.load(Ordering::SeqCst), 3);
}
#[test]
-fn test_drain_filter_pred_panic_leak() {
+fn test_extract_if_pred_panic_leak() {
static PREDS: AtomicU32 = AtomicU32::new(0);
static DROPS: AtomicU32 = AtomicU32::new(0);
@@ -473,10 +475,11 @@ fn test_drain_filter_pred_panic_leak() {
let mut set: HashSet<_> = (0..3).map(|_| D).collect();
catch_unwind(AssertUnwindSafe(|| {
- drop(set.drain_filter(|_| match PREDS.fetch_add(1, Ordering::SeqCst) {
+ set.extract_if(|_| match PREDS.fetch_add(1, Ordering::SeqCst) {
0 => true,
_ => panic!(),
- }))
+ })
+ .for_each(drop)
}))
.ok();
@@ -502,3 +505,22 @@ fn const_with_hasher() {
const X: HashSet<(), ()> = HashSet::with_hasher(());
assert_eq!(X.len(), 0);
}
+
+#[test]
+fn test_insert_does_not_overwrite_the_value() {
+ let first_value = Arc::new(17);
+ let second_value = Arc::new(17);
+
+ let mut set = HashSet::new();
+ let inserted = set.insert(first_value.clone());
+ assert!(inserted);
+
+ let inserted = set.insert(second_value);
+ assert!(!inserted);
+
+ assert!(
+ Arc::ptr_eq(set.iter().next().unwrap(), &first_value),
+ "Insert must not overwrite the value, so the contained value pointer \
+ must be the same as first value pointer we inserted"
+ );
+}