270 lines
4.9 KiB
Rust
270 lines
4.9 KiB
Rust
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! {
|
|
pub struct S;
|
|
impl<$life> S {
|
|
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;
|
|
}
|
|
};
|
|
}
|
|
|
|
doc_expr!(stringify!());
|
|
|
|
#[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);
|
|
}
|