use std::time::{Duration, Instant}; use only_every::only_every; #[test] fn simple() { let mut counter: u64 = 0; let now = Instant::now(); while Instant::now() - now < Duration::from_millis(1100) { only_every!(Duration::from_millis(200), counter += 1); std::thread::yield_now(); } assert_eq!(counter, 6); } #[test] fn test_many_threads() { use std::sync::atomic::{AtomicU64, Ordering}; let unshared_counter = &*Box::leak(Box::new(AtomicU64::new(0))); let unshared_start = Instant::now(); let mut threads = vec![]; for _ in 0..100 { let start = unshared_start; let counter = unshared_counter.clone(); let handle = std::thread::spawn(move || { while Instant::now() - start < Duration::from_millis(1100) { only_every!( Duration::from_millis(200), counter.fetch_add(1, Ordering::Relaxed) ); std::thread::yield_now(); } }); threads.push(handle); } for i in threads { i.join().unwrap(); } assert_eq!(unshared_counter.load(Ordering::Relaxed), 6); } #[test] fn limiters_are_distinct() { let mut c1 = 0; let mut c2 = 0; for _ in 0..2 { only_every!(Duration::from_secs(1), c1 += 1); only_every!(Duration::from_secs(1), c2 += 1); } assert_eq!(c1, 1); assert_eq!(c2, 1); }