diff options
-rw-r--r-- | src/lib.rs | 63 |
1 files changed, 62 insertions, 1 deletions
@@ -636,6 +636,7 @@ mod tests use std::any::TypeId; use std::mem::offset_of; use std::ptr::NonNull; + use std::sync::atomic::{AtomicUsize, Ordering}; use crate::{FieldMetadata, MultiVec, OwnedAnyPtr}; @@ -648,7 +649,6 @@ mod tests length = $length: literal ) => {{ #[repr(C)] - #[derive(Debug)] struct Data { $($field_name: [$field_type; $length],)* @@ -907,4 +907,65 @@ mod tests assert_eq!(multi_vec.get_field(2).as_slice::<u8>(), [120, 88, 54, 3, 7]); } + + #[test] + fn fields_are_dropped() + { + static THING_DROPPED_CNT: AtomicUsize = AtomicUsize::new(0); + + struct Thing + { + _num: u32, + } + + impl Drop for Thing + { + fn drop(&mut self) + { + THING_DROPPED_CNT.fetch_add(1, Ordering::Relaxed); + } + } + + let mut data; + let multi_vec = multi_vec_with_data!( + data = &mut data, + { + _a: Thing = [Thing { _num: 567}, Thing { _num: 890}, Thing { _num: 345}], + }, + length = 3 + ); + + drop(multi_vec); + + assert_eq!(THING_DROPPED_CNT.load(Ordering::Relaxed), 3); + } + + #[test] + fn zero_sized_fields_are_dropped() + { + static THING_DROPPED_CNT: AtomicUsize = AtomicUsize::new(0); + + struct Thing; + + impl Drop for Thing + { + fn drop(&mut self) + { + THING_DROPPED_CNT.fetch_add(1, Ordering::Relaxed); + } + } + + let mut data; + let multi_vec = multi_vec_with_data!( + data = &mut data, + { + _a: Thing = [const {Thing}; 3], + }, + length = 3 + ); + + drop(multi_vec); + + assert_eq!(THING_DROPPED_CNT.load(Ordering::Relaxed), 3); + } } |