2024-10-16 14:15:33 +03:00
#![ allow(clippy::let_underscore_untyped) ]
mod test_basic {
use paste ::paste ;
struct Struct ;
paste! {
impl Struct {
fn [ < a b c > ] ( ) { }
}
}
#[ test ]
fn test ( ) {
Struct ::abc ( ) ;
}
}
mod test_in_impl {
use paste ::paste ;
struct Struct ;
impl Struct {
paste! {
fn [ < a b c > ] ( ) { }
}
}
#[ test ]
fn test ( ) {
Struct ::abc ( ) ;
}
}
mod test_none_delimited_single_ident {
use paste ::paste ;
macro_rules ! m {
( $id :ident ) = > {
paste! {
fn f ( ) -> & 'static str {
stringify! ( $id )
}
}
} ;
}
m! ( i32x4 ) ;
#[ test ]
fn test ( ) {
assert_eq! ( f ( ) , " i32x4 " ) ;
}
}
mod test_none_delimited_single_lifetime {
use paste ::paste ;
macro_rules ! m {
( $life :lifetime ) = > {
paste! {
2024-10-16 15:19:37 +03:00
pub struct S < $life > ( #[ allow(dead_code) ] pub & $life ( ) ) ;
2024-10-16 14:15:33 +03:00
impl < $life > S < $life > {
fn f ( ) { }
}
}
} ;
}
m! ( ' a ) ;
#[ test ]
fn test ( ) {
S ::f ( ) ;
}
}
mod test_to_lower {
use paste ::paste ;
macro_rules ! m {
( $id :ident ) = > {
paste! {
fn [ < my_ $id :lower _here > ] ( _arg : u8 ) -> & 'static str {
stringify! ( [ < $id :lower > ] )
}
}
} ;
}
m! ( Test ) ;
#[ test ]
fn test_to_lower ( ) {
assert_eq! ( my_test_here ( 0 ) , " test " ) ;
}
}
mod test_to_upper {
use paste ::paste ;
macro_rules ! m {
( $id :ident ) = > {
paste! {
const [ < MY_ $id :upper _HERE > ] : & str = stringify! ( [ < $id :upper > ] ) ;
}
} ;
}
m! ( Test ) ;
#[ test ]
fn test_to_upper ( ) {
assert_eq! ( MY_TEST_HERE , " TEST " ) ;
}
}
mod test_to_snake {
use paste ::paste ;
macro_rules ! m {
( $id :ident ) = > {
paste! {
const DEFAULT_SNAKE : & str = stringify! ( [ < $id :snake > ] ) ;
const LOWER_SNAKE : & str = stringify! ( [ < $id :snake :lower > ] ) ;
const UPPER_SNAKE : & str = stringify! ( [ < $id :snake :upper > ] ) ;
}
} ;
}
m! ( ThisIsButATest ) ;
#[ test ]
fn test_to_snake ( ) {
assert_eq! ( DEFAULT_SNAKE , " this_is_but_a_test " ) ;
assert_eq! ( LOWER_SNAKE , " this_is_but_a_test " ) ;
assert_eq! ( UPPER_SNAKE , " THIS_IS_BUT_A_TEST " ) ;
}
}
mod test_to_camel {
use paste ::paste ;
macro_rules ! m {
( $id :ident ) = > {
paste! {
const DEFAULT_CAMEL : & str = stringify! ( [ < $id :camel > ] ) ;
const LOWER_CAMEL : & str = stringify! ( [ < $id :camel :lower > ] ) ;
const UPPER_CAMEL : & str = stringify! ( [ < $id :camel :upper > ] ) ;
}
} ;
}
m! ( this_is_but_a_test ) ;
#[ test ]
fn test_to_camel ( ) {
assert_eq! ( DEFAULT_CAMEL , " ThisIsButATest " ) ;
assert_eq! ( LOWER_CAMEL , " thisisbutatest " ) ;
assert_eq! ( UPPER_CAMEL , " THISISBUTATEST " ) ;
}
}
mod test_doc_expr {
// https://github.com/dtolnay/paste/issues/29
use paste ::paste ;
macro_rules ! doc_expr {
( $doc :expr ) = > {
paste! {
#[ doc = $doc ]
pub struct S ;
}
} ;
}
2024-10-16 15:19:37 +03:00
doc_expr! ( stringify! ( .. . ) ) ;
2024-10-16 14:15:33 +03:00
#[ test ]
fn test_doc_expr ( ) {
let _ : S ;
}
}
mod test_type_in_path {
// https://github.com/dtolnay/paste/issues/31
use paste ::paste ;
mod keys {
#[ derive(Default) ]
pub struct Mib < T = ( ) > ( std ::marker ::PhantomData < T > ) ;
}
macro_rules ! types {
( $mib :ty ) = > {
paste! {
#[ derive(Default) ]
pub struct S ( pub keys ::$mib ) ;
}
} ;
}
macro_rules ! write {
( $fn :ident , $field :ty ) = > {
paste! {
pub fn $fn ( ) -> $field {
$field ::default ( )
}
}
} ;
}
types! { Mib < [ usize ; 2 ] > }
write! { get_a , keys ::Mib }
write! { get_b , usize }
#[ test ]
fn test_type_in_path ( ) {
let _ : S ;
let _ = get_a ;
let _ = get_b ;
}
}
mod test_type_in_fn_arg {
// https://github.com/dtolnay/paste/issues/38
use paste ::paste ;
fn _jit_address ( _node : ( ) ) { }
macro_rules ! jit_reexport {
( $fn :ident , $arg :ident : $typ :ty ) = > {
paste! {
pub fn $fn ( $arg : $typ ) {
[ < _jit_ $fn > ] ( $arg ) ;
}
}
} ;
}
jit_reexport! ( address , node : ( ) ) ;
#[ test ]
fn test_type_in_fn_arg ( ) {
let _ = address ;
}
}
mod test_pat_in_expr_position {
// https://github.com/xiph/rav1e/pull/2324/files
use paste ::paste ;
macro_rules ! rav1e_bad {
( $e :pat ) = > {
paste! {
#[ test ]
fn test ( ) {
let _ = $e ;
}
}
} ;
}
rav1e_bad! ( std ::fmt ::Error ) ;
}