#[cfg(test)] mod usage_test { use rt_write_lock::Reader; #[test] fn create_two_times() { let mut reader: Reader = Reader::default(); let writer = reader.get_writer().unwrap(); assert!(reader.get_writer().is_none()); drop(writer); reader.get_writer().unwrap(); } #[test] fn single_thread() { let mut reader: Reader = Reader::default(); let mut writer = reader.get_writer().unwrap(); let mut write = writer.write(); assert!(reader.get_writer().is_none()); let read = reader.try_read().unwrap(); assert!(*read == 0); assert!(*write == 0); *write = 2; assert!(*read == 0); assert!(*write == 2); drop(write); let write = writer.write(); assert!(*read == 0); assert!(*write == 2); drop(read); assert!(reader.try_read().is_none()); } #[test] fn drop_reader_first() { let mut reader: Reader = Reader::default(); let writer = reader.get_writer().unwrap(); // drop order opposite of normal drop(reader); drop(writer); } #[test] #[should_panic] fn double_write() { let mut reader: Reader = Reader::default(); let mut writer = reader.get_writer().unwrap(); let write = writer.write(); core::mem::forget(write); writer.write(); } #[test] fn threads() { let mut reader: Reader = Reader::default(); let mut writer = reader.get_writer().unwrap(); std::thread::scope(|s| { let read = reader.try_read().unwrap(); assert!(*read == 0); s.spawn(move || { let mut write = writer.write(); *write = 15; }); assert!(*read == 0); drop(read); let read = reader.try_read().unwrap(); assert!(*read == 0 || *read == 15); }); let read = reader.try_read().unwrap(); assert!(*read == 15); } }