summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorHampusM <hampus@hampusmat.com>2025-03-27 21:46:04 +0100
committerHampusM <hampus@hampusmat.com>2025-03-28 11:52:56 +0100
commitc16401f478f0c2745198fe27563b28746052d527 (patch)
tree25b4583c90987c472d513aed76b8f30ba9ca4599 /src
parent714c62e9833f0ebb18d838dd44d6d8ec8d01717f (diff)
test: add drop tests
Diffstat (limited to 'src')
-rw-r--r--src/lib.rs63
1 files changed, 62 insertions, 1 deletions
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::<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);
+ }
}