From c99eb2f84ac69fb00f10400183555c0b26fea389 Mon Sep 17 00:00:00 2001 From: Nilstrieb <48135649+Nilstrieb@users.noreply.github.com> Date: Sun, 3 Apr 2022 14:44:42 +0200 Subject: [PATCH] more tests --- src/lib.rs | 40 +++++++++++++++++++++++++++++++++------- src/strategies.rs | 6 +++++- 2 files changed, 38 insertions(+), 8 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 8c66a02..d5830f8 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -4,7 +4,7 @@ //! A crate for stuffing things into a pointer. -mod strategies; +pub mod strategies; use std::fmt::{Debug, Formatter}; use std::marker::PhantomData; @@ -203,10 +203,6 @@ where } } -// pointers are `Eq` -fn _assert_eq() {} -const _: fn() = _assert_eq::<*mut ()>; - impl Eq for StuffedPtr where S: StuffingStrategy, @@ -283,6 +279,9 @@ mod tests { use crate::StuffedPtr; use std::mem; + // note: the tests mostly use the `PanicsInDrop` type and strategy, to make sure that no + // extra is ever dropped accidentally. + #[test] fn set_get_ptr_no_extra() { unsafe { @@ -325,6 +324,34 @@ mod tests { drop(stuffed_ptr); } + #[test] + fn clone() { + let mut unit = (); + let stuffed_ptr1: StuffedPtr<(), PanicsInDrop> = StuffedPtr::new_ptr(&mut unit); + let _ = stuffed_ptr1.clone(); + + let stuffed_ptr1: StuffedPtr<(), PanicsInDrop> = StuffedPtr::new_extra(PanicsInDrop); + let stuffed_ptr2 = stuffed_ptr1.clone(); + + mem::forget((stuffed_ptr1, stuffed_ptr2)); + } + + #[test] + fn eq() { + // two pointers + let mut unit = (); + let stuffed_ptr1: StuffedPtr<(), PanicsInDrop> = StuffedPtr::new_ptr(&mut unit); + let stuffed_ptr2: StuffedPtr<(), PanicsInDrop> = StuffedPtr::new_ptr(&mut unit); + + assert_eq!(stuffed_ptr1, stuffed_ptr2); + + let stuffed_ptr1: StuffedPtr<(), PanicsInDrop> = StuffedPtr::new_ptr(&mut unit); + let stuffed_ptr2: StuffedPtr<(), PanicsInDrop> = StuffedPtr::new_extra(PanicsInDrop); + + assert_ne!(stuffed_ptr1, stuffed_ptr2); + mem::forget(stuffed_ptr2); + } + #[test] fn dont_drop_extra_when_pointer() { let mut unit = (); @@ -345,7 +372,6 @@ mod tests { // Debug let _ = format!("{stuffed_ptr1:?}"); - mem::forget(stuffed_ptr1); - mem::forget(stuffed_ptr2); + mem::forget((stuffed_ptr1, stuffed_ptr2)); } } diff --git a/src/strategies.rs b/src/strategies.rs index 6b906ed..52f9f08 100644 --- a/src/strategies.rs +++ b/src/strategies.rs @@ -1,3 +1,7 @@ +//! Several pre-defined strategies to use with `StuffedPtr`. +//! +//! * `()`: An empty strategy, is always the pointer + use crate::StuffingStrategy; unsafe impl StuffingStrategy for () { @@ -17,7 +21,7 @@ unsafe impl StuffingStrategy for () { } #[cfg(test)] -pub mod test_strategies { +pub(crate) mod test_strategies { use crate::StuffingStrategy; use std::fmt::{Debug, Formatter};