#[cfg(all(target_family = "wasm", not(target_os = "wasi")))] use wasm_bindgen_test::wasm_bindgen_test as test;
use std::sync::Arc; use tokio::sync::Semaphore;
#[test]
fn no_permits() { // this should not panic
Semaphore::new(0);
}
#[test]
fn try_acquire() { let sem = Semaphore::new(1);
{ let p1 = sem.try_acquire();
assert!(p1.is_ok()); let p2 = sem.try_acquire();
assert!(p2.is_err());
} let p3 = sem.try_acquire();
assert!(p3.is_ok());
}
#[tokio::test] #[cfg(feature = "full")] async fn acquire() { let sem = Arc::new(Semaphore::new(1)); let p1 = sem.try_acquire().unwrap(); let sem_clone = sem.clone(); let j = tokio::spawn(asyncmove { let _p2 = sem_clone.acquire().await;
});
drop(p1);
j.await.unwrap();
}
#[tokio::test] #[cfg(feature = "full")] async fn add_permits() { let sem = Arc::new(Semaphore::new(0)); let sem_clone = sem.clone(); let j = tokio::spawn(asyncmove { let _p2 = sem_clone.acquire().await;
});
sem.add_permits(1);
j.await.unwrap();
}
#[test]
fn add_permits_open() {
for size in 0..4 {
for add in 0..4 { let sem = Arc::new(Semaphore::new(size));
sem.add_permits(add);
assert_eq!(sem.available_permits(), size + add);
assert!(!sem.is_closed());
}
}
}
#[test]
fn add_permits_closed() {
for size in 0..4 {
for add in 0..4 { let sem = Arc::new(Semaphore::new(size));
sem.close();
sem.add_permits(add);
assert_eq!(sem.available_permits(), size + add);
assert!(sem.is_closed());
}
}
}
#[test]
fn forget() { let sem = Arc::new(Semaphore::new(1));
{ let p = sem.try_acquire().unwrap();
assert_eq!(sem.available_permits(), 0);
p.forget();
assert_eq!(sem.available_permits(), 0);
}
assert_eq!(sem.available_permits(), 0);
assert!(sem.try_acquire().is_err());
}
#[test]
fn forget_open() {
for size in 0..4 {
for sub in 0..4 { let sem = Arc::new(Semaphore::new(size)); let actual_sub = sem.forget_permits(sub); let expected = size.saturating_sub(sub);
assert_eq!(sem.available_permits(), expected, "case: {size}-{sub}");
assert_eq!(actual_sub, size - expected);
assert!(!sem.is_closed());
}
}
}
#[test]
fn forget_closed() {
for size in 0..4 {
for sub in 0..4 { let sem = Arc::new(Semaphore::new(size));
sem.close(); let actual_sub = sem.forget_permits(sub); let expected = size.saturating_sub(sub);
assert_eq!(sem.available_permits(), expected, "case: {size}-{sub}");
assert_eq!(actual_sub, size - expected);
assert!(sem.is_closed());
}
}
}
#[test]
fn merge() { let sem = Arc::new(Semaphore::new(3));
{ letmut p1 = sem.try_acquire().unwrap();
assert_eq!(sem.available_permits(), 2); let p2 = sem.try_acquire_many(2).unwrap();
assert_eq!(sem.available_permits(), 0);
p1.merge(p2);
assert_eq!(sem.available_permits(), 0);
}
assert_eq!(sem.available_permits(), 3);
}
#[test] #[cfg(not(target_family = "wasm"))] // No stack unwinding on wasm targets #[should_panic]
fn merge_unrelated_permits() { let sem1 = Arc::new(Semaphore::new(3)); let sem2 = Arc::new(Semaphore::new(3)); letmut p1 = sem1.try_acquire().unwrap(); let p2 = sem2.try_acquire().unwrap();
p1.merge(p2);
}
#[tokio::test] #[cfg(feature = "full")] async fn stress_test() { let sem = Arc::new(Semaphore::new(5)); letmut join_handles = Vec::new();
for _ in 0..1000 { let sem_clone = sem.clone();
join_handles.push(tokio::spawn(asyncmove { let _p = sem_clone.acquire().await;
}));
}
for j in join_handles {
j.await.unwrap();
} // there should be exactly 5 semaphores available now let _p1 = sem.try_acquire().unwrap(); let _p2 = sem.try_acquire().unwrap(); let _p3 = sem.try_acquire().unwrap(); let _p4 = sem.try_acquire().unwrap(); let _p5 = sem.try_acquire().unwrap();
assert!(sem.try_acquire().is_err());
}
#[test]
fn add_max_amount_permits() { let s = tokio::sync::Semaphore::new(0);
s.add_permits(tokio::sync::Semaphore::MAX_PERMITS);
assert_eq!(s.available_permits(), tokio::sync::Semaphore::MAX_PERMITS);
}
#[cfg(not(target_family = "wasm"))] // wasm currently doesn't support unwinding #[test] #[should_panic]
fn add_more_than_max_amount_permits1() { let s = tokio::sync::Semaphore::new(1);
s.add_permits(tokio::sync::Semaphore::MAX_PERMITS);
}
#[cfg(not(target_family = "wasm"))] // wasm currently doesn't support unwinding #[test] #[should_panic]
fn add_more_than_max_amount_permits2() { let s = Semaphore::new(Semaphore::MAX_PERMITS - 1);
s.add_permits(1);
s.add_permits(1);
}
#[cfg(not(target_family = "wasm"))] // wasm currently doesn't support unwinding #[test] #[should_panic]
fn panic_when_exceeds_maxpermits() { let _ = Semaphore::new(Semaphore::MAX_PERMITS + 1);
}
#[test]
fn no_panic_at_maxpermits() { let _ = Semaphore::new(Semaphore::MAX_PERMITS); let s = Semaphore::new(Semaphore::MAX_PERMITS - 1);
s.add_permits(1);
}
Messung V0.5 in Prozent
¤ Dauer der Verarbeitung: 0.9 Sekunden
(vorverarbeitet am 2026-10-11)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.