use super::*;
tests_impls!
{
#[ test ]
fn implements_basic()
{
trait Trait1 {}
fn impl_trait1( _ : &impl Trait1 ) -> bool { true }
impl< T : Sized > Trait1 for &[ T ] {}
impl< T : Sized, const N : usize > Trait1 for [ T; N ] {}
impl< T : Sized, const N : usize > Trait1 for &[ T; N ] {}
let src : &[ i32 ] = &[ 1, 2, 3 ];
a_id!( TheModule::implements!( src => Trait1 ), true );
a_id!( impl_trait1( &src ), true );
a_id!( TheModule::implements!( &[ 1, 2, 3 ] => Trait1 ), true );
a_id!( impl_trait1( &[ 1, 2, 3 ] ), true );
a_id!( TheModule::implements!( [ 1, 2, 3 ] => Trait1 ), true );
impl< T : Sized > Trait1 for Vec< T > {}
a_id!( TheModule::implements!( vec!( 1, 2, 3 ) => Trait1 ), true );
impl Trait1 for f32 {}
a_id!( TheModule::implements!( 13_f32 => Trait1 ), true );
a_id!( TheModule::implements!( true => Copy ), true );
a_id!( TheModule::implements!( true => Clone ), true );
let src = true;
a_id!( TheModule::implements!( src => Copy ), true );
a_id!( TheModule::implements!( src => Clone ), true );
let src = Box::new( true );
a_id!( TheModule::implements!( src => Copy ), false );
a_id!( TheModule::implements!( src => Clone ), true );
a_id!( TheModule::implements!( Box::new( true ) => std::marker::Copy ), false );
a_id!( TheModule::implements!( Box::new( true ) => std::clone::Clone ), true );
}
#[ test ]
fn instance_of_basic()
{
let src = Box::new( true );
a_id!( TheModule::instance_of!( src => Copy ), false );
a_id!( TheModule::instance_of!( src => Clone ), true );
}
#[ test ]
fn implements_functions()
{
let _f = ||
{
println!( "hello" );
};
let fn_context = vec!( 1, 2, 3 );
let _fn = ||
{
println!( "hello {:?}", fn_context );
};
let mut fn_mut_context = vec!( 1, 2, 3 );
let _fn_mut = ||
{
fn_mut_context[ 0 ] = 3;
println!( "{:?}", fn_mut_context );
};
let mut fn_once_context = vec!( 1, 2, 3 );
let _fn_once = ||
{
fn_once_context[ 0 ] = 3;
let x = fn_once_context;
println!( "{:?}", x );
};
a_id!( TheModule::implements!( _fn => Copy ), true );
a_id!( TheModule::implements!( _fn => Clone ), true );
a_id!( TheModule::implements!( _fn => core::ops::Not ), false );
let _ = _fn.clone();
a_id!( TheModule::implements!( _fn => Fn() -> () ), true );
a_id!( TheModule::implements!( _fn => FnMut() -> () ), true );
a_id!( TheModule::implements!( _fn => FnOnce() -> () ), true );
a_id!( TheModule::implements!( _fn_mut => FnMut() -> () ), true );
a_id!( TheModule::implements!( _fn_mut => FnOnce() -> () ), true );
a_id!( TheModule::implements!( _fn_once => FnOnce() -> () ), true );
}
#[ test ]
fn pointer_experiment()
{
let pointer_size = std::mem::size_of::< &u8 >();
dbg!( &pointer_size );
a_id!( 2 * pointer_size, std::mem::size_of::< &[ u8 ] >() );
a_id!( 2 * pointer_size, std::mem::size_of::< *const [ u8 ] >() );
a_id!( 2 * pointer_size, std::mem::size_of::< Box< [ u8 ] > >() );
a_id!( 2 * pointer_size, std::mem::size_of::< std::rc::Rc< [ u8 ] > >() );
a_id!( 1 * pointer_size, std::mem::size_of::< &[ u8 ; 20 ] >() );
}
#[ test ]
fn fn_experiment()
{
fn function1() -> bool { true }
let _f = ||
{
println!( "hello" );
};
let fn_context = vec!( 1, 2, 3 );
let _fn = ||
{
println!( "hello {:?}", fn_context );
};
let mut fn_mut_context = vec!( 1, 2, 3 );
let _fn_mut = ||
{
fn_mut_context[ 0 ] = 3;
println!( "{:?}", fn_mut_context );
};
let mut fn_once_context = vec!( 1, 2, 3 );
let _fn_once = ||
{
fn_once_context[ 0 ] = 3;
let x = fn_once_context;
println!( "{:?}", x );
};
a_id!( is_f( function1 ), true );
a_id!( is_fn( &function1 ), true );
a_id!( is_fn_mut( &function1 ), true );
a_id!( is_fn_once( &function1 ), true );
a_id!( is_f( _f ), true );
a_id!( is_fn( &_f ), true );
a_id!( is_fn_mut( &_f ), true );
a_id!( is_fn_once( &_f ), true );
a_id!( is_fn( &_fn ), true );
a_id!( is_fn_mut( &_fn ), true );
a_id!( is_fn_once( &_fn ), true );
a_id!( is_fn_mut( &_fn_mut ), true );
a_id!( is_fn_once( &_fn_mut ), true );
a_id!( is_fn_once( &_fn_once ), true );
fn is_f < R > ( _x : fn() -> R ) -> bool { true }
fn is_fn < R, F : Fn() -> R > ( _x : &F ) -> bool { true }
fn is_fn_mut < R, F : FnMut() -> R > ( _x : &F ) -> bool { true }
fn is_fn_once < R, F : FnOnce() -> R > ( _x : &F ) -> bool { true }
}
}
tests_index!
{
implements_basic,
instance_of_basic,
implements_functions,
pointer_experiment,
fn_experiment,
}