devela 0.28.0

A development substrate of coherence.
Documentation
// devela::code::util::tests::symbols
//
// - https://doc.rust-lang.org/reference/macros-by-example.html

#[test]
/// Tests which non-alphanumeric tokens can prefix macro pattern variables.
// Note: for separating expressions only `;` and `,` are valid.
fn _macro_symbols_pattern() {
    let mut s = 0;
    _macro_symbols!(@s 1);
    _macro_symbols!(#s 1);
    _macro_symbols!(?s 1);
    _macro_symbols!(!s 1);
    _macro_symbols!(:s 1);
    _macro_symbols!(;s 1);
    _macro_symbols!(,s 1);
    _macro_symbols!(.s 1);
    //
    _macro_symbols!(~s 1);
    _macro_symbols!(|s 1);
    _macro_symbols!(^s 1);
    _macro_symbols!(&s 1);
    _macro_symbols!(>s 1);
    _macro_symbols!(<s 1);
    //
    _macro_symbols!(=s 1);
    _macro_symbols!(/s 1);
    _macro_symbols!(+s 1);
    _macro_symbols!(-s 1);
    _macro_symbols!(*s 1);
    _macro_symbols!(%s 1);
    //
    _macro_symbols!(()s 1);
    _macro_symbols!([]s 1);
    _macro_symbols!({}s 1);
    _macro_symbols!("" s 1);
    _macro_symbols!('a' s 1); // NOTE: has to contain exactly 1 character
    // don't work:
    // _macro_symbols!($ s 1);
    // _macro_symbols!(' s 1);
    // _macro_symbols!(` s 1);
    // _macro_symbols!(\ s 1);
    assert_eq![s, 25];

    #[rustfmt::skip]
    macro_rules! _macro_symbols {
        (@$id:ident $val:expr) => { $id += $val; };
        (#$id:ident $val:expr) => { $id += $val; };
        (?$id:ident $val:expr) => { $id += $val; };
        (!$id:ident $val:expr) => { $id += $val; };
        (:$id:ident $val:expr) => { $id += $val; };
        (;$id:ident $val:expr) => { $id += $val; };
        (,$id:ident $val:expr) => { $id += $val; };
        (.$id:ident $val:expr) => { $id += $val; };
        //
        (~$id:ident $val:expr) => { $id += $val; };
        (|$id:ident $val:expr) => { $id += $val; };
        (^$id:ident $val:expr) => { $id += $val; };
        (&$id:ident $val:expr) => { $id += $val; };
        (>$id:ident $val:expr) => { $id += $val; };
        (<$id:ident $val:expr) => { $id += $val; };
        //
        (=$id:ident $val:expr) => { $id += $val; };
        (/$id:ident $val:expr) => { $id += $val; };
        (+$id:ident $val:expr) => { $id += $val; };
        (-$id:ident $val:expr) => { $id += $val; };
        (*$id:ident $val:expr) => { $id += $val; };
        (%$id:ident $val:expr) => { $id += $val; };
        //
        (()$id:ident $val:expr) => { $id += $val; };
        ([]$id:ident $val:expr) => { $id += $val; };
        ({}$id:ident $val:expr) => { $id += $val; };
        (""$id:ident $val:expr) => { $id += $val; };
        ('a'$id:ident $val:expr) => { $id += $val; };
        // don't work:
        // ($ $id:ident $val:expr) => { $id += $val; };
        // (''$id:ident $val:expr) => { $id += $val; };
        // (`$id:ident $val:expr) => { $id += $val; };
        // (\$id:ident $val:expr) => { $id += $val; };
    }
    use _macro_symbols;
}