use derive_tools_meta::*;
#[ test ]
fn test_deref_derefmut_together()
{
#[ derive( Deref, DerefMut ) ]
struct Wrapper( String );
let mut w = Wrapper( "hello".to_string() );
assert_eq!( &*w, "hello" );
assert_eq!( w.len(), 5 );
w.push_str( " world" );
assert_eq!( w.0, "hello world" );
}
#[ test ]
fn test_asref_asmut_together()
{
#[ derive( AsRef, AsMut ) ]
struct Container( Vec< i32 > );
let mut c = Container( vec![ 1, 2, 3 ] );
let v_ref: &Vec< i32 > = c.as_ref();
assert_eq!( v_ref.len(), 3 );
let v_mut: &mut Vec< i32 > = c.as_mut();
v_mut.push( 4 );
assert_eq!( c.0.len(), 4 );
}
#[ test ]
fn test_index_indexmut_together()
{
#[ derive( IndexMut ) ]
struct Wrapper( Vec< i32 > );
let mut w = Wrapper( vec![ 10, 20, 30 ] );
let vec_ref: &Vec< i32 > = &w[ 0 ];
assert_eq!( vec_ref[ 0 ], 10 );
let vec_mut: &mut Vec< i32 > = &mut w[ 0 ];
vec_mut[ 1 ] = 99;
assert_eq!( w.0[ 1 ], 99 );
}
#[ test ]
fn test_deref_from_new()
{
#[ derive( Deref, From, New ) ]
struct UserId
{
id: String
}
let user1 = UserId::new( "user123".to_string() );
assert_eq!( user1.id, "user123" );
let user2 = UserId::from( "user456".to_string() );
assert_eq!( user2.id, "user456" );
assert_eq!( user2.len(), 7 ); }
#[ test ]
fn test_with_std_derives()
{
#[ derive( Clone, Debug, PartialEq, Deref, DerefMut, From, New ) ]
struct Wrapper
{
value: i32
}
let w1 = Wrapper::new( 42 );
let w2 = Wrapper::from( 42 );
assert_eq!( w1, w2 ); let w3 = w1.clone(); assert_eq!( format!( "{w3:?}" ), "Wrapper { value: 42 }" );
assert_eq!( *w3, 42 ); }
#[ test ]
fn test_nested_derived_types()
{
#[ derive( Deref, From ) ]
struct Inner( String );
#[ derive( Deref, From ) ]
struct Outer( Inner );
let inner = Inner::from( "test".to_string() );
let outer = Outer::from( inner );
assert_eq!( &**outer, "test" );
assert_eq!( outer.len(), 4 );
}
#[ test ]
fn test_multi_field_multiple_markers()
{
#[ derive( Deref, DerefMut, AsRef, AsMut ) ]
struct MultiField
{
#[ deref ]
#[ deref_mut ]
#[ as_ref ]
#[ as_mut ]
primary: String,
secondary: i32,
}
let mut m = MultiField
{
primary: "hello".to_string(),
secondary: 42,
};
assert_eq!( &*m, "hello" );
let s: &String = m.as_ref(); assert_eq!( s, "hello" );
m.push_str( " world" ); assert_eq!( m.primary, "hello world" );
let s_mut: &mut String = m.as_mut(); s_mut.push( '!' );
assert_eq!( m.primary, "hello world!" );
assert_eq!( m.secondary, 42 );
}
#[ test ]
fn test_generic_multiple_derives()
{
#[ derive( Clone, Debug, PartialEq, Deref, From, New, AsRef, Index ) ]
struct GenericWrapper< T >
{
value: T
}
let w1: GenericWrapper< Vec< i32 >> = GenericWrapper::new( vec![ 1, 2, 3 ] );
let w2 = GenericWrapper::from( vec![ 1, 2, 3 ] );
assert_eq!( w1, w2 );
assert_eq!( w1.len(), 3 );
let v_from_index: &Vec< i32 > = &w1[ 0 ];
assert_eq!( v_from_index[ 0 ], 1 );
let v_ref: &Vec< i32 > = w1.as_ref(); assert_eq!( v_ref.len(), 3 );
}