diff options
author | HampusM <hampus@hampusmat.com> | 2025-03-27 21:46:04 +0100 |
---|---|---|
committer | HampusM <hampus@hampusmat.com> | 2025-03-28 11:52:56 +0100 |
commit | c16401f478f0c2745198fe27563b28746052d527 (patch) | |
tree | 25b4583c90987c472d513aed76b8f30ba9ca4599 /src | |
parent | 714c62e9833f0ebb18d838dd44d6d8ec8d01717f (diff) |
test: add drop tests
Diffstat (limited to 'src')
-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); + } } |