From c16401f478f0c2745198fe27563b28746052d527 Mon Sep 17 00:00:00 2001 From: HampusM Date: Thu, 27 Mar 2025 21:46:04 +0100 Subject: test: add drop tests --- src/lib.rs | 63 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 62 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/lib.rs b/src/lib.rs index 0f49968..e63c462 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -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::(), [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); + } } -- cgit v1.2.3-18-g5258