anodized-core 0.5.1

Core interoperability for the Anodized specification system
Documentation
use crate::{DataSpec, instrument::Config, test_util::assert_tokens_eq};

use proc_macro2::TokenStream;
use syn::{ItemEnum, ItemStruct, parse_quote};

#[test]
fn embed_spec_item_struct() {
    let struct_spec: DataSpec = parse_quote! {
        maintains: [
            COND_1,
            COND_2,
        ],
    };
    let item_struct: ItemStruct = parse_quote! {
        struct STRUCT<'LT_1, TYPE_1: BOUND_1 = DEFAULT_1, const CONST_1: TYPE_2 = DEFAULT_2>
        where
            'LT_1: 'LT_2,
        {
            FIELD_1: &'LT_1 TYPE_3,
            FIELD_2: TYPE_1,
            FIELD_3: [TYPE_4; CONST_1],
        }
    };

    let expected: TokenStream = parse_quote! {
        struct STRUCT<'LT_1, TYPE_1: BOUND_1 = DEFAULT_1, const CONST_1: TYPE_2 = DEFAULT_2>
        where
            'LT_1: 'LT_2,
        {
            FIELD_1: &'LT_1 TYPE_3,
            FIELD_2: TYPE_1,
            FIELD_3: [TYPE_4; CONST_1],
        }

        #[doc(hidden)]
        #[allow(warnings)]
        impl<'LT_1, TYPE_1: BOUND_1, const CONST_1: TYPE_2> STRUCT<'LT_1, TYPE_1, CONST_1>
        where
            'LT_1: 'LT_2,
        {
            fn __anodized_data_maintains(&self) {
                let _ = | | COND_1;
                let _ = | | COND_2;
            }
        }
    };

    let observed = Config::DEFAULT
        .instrument_item_struct(struct_spec, item_struct)
        .unwrap();
    assert_tokens_eq(&observed, &expected);
}

#[test]
fn embed_spec_item_enum() {
    let struct_spec: DataSpec = parse_quote! {
        maintains: [
            COND_1,
            COND_2,
        ],
    };
    let item_enum: ItemEnum = parse_quote! {
        enum ENUM<'LT_1, TYPE_1: BOUND_1 = DEFAULT_1, const CONST_1: TYPE_2 = DEFAULT_2>
        where
            'LT_1: 'LT_2,
        {
            VARIANT_1(&'LT_1 TYPE_2),
            VARIANT_2 { FIELD_2: TYPE_1 },
            VARIANT_3,
            VARIANT_4([TYPE_4; CONST_1]),
        }
    };

    let expected: TokenStream = parse_quote! {
        enum ENUM<'LT_1, TYPE_1: BOUND_1 = DEFAULT_1, const CONST_1: TYPE_2 = DEFAULT_2>
        where
            'LT_1: 'LT_2,
        {
            VARIANT_1(&'LT_1 TYPE_2),
            VARIANT_2 { FIELD_2: TYPE_1 },
            VARIANT_3,
            VARIANT_4([TYPE_4; CONST_1]),
        }

        #[doc(hidden)]
        #[allow(warnings)]
        impl<'LT_1, TYPE_1: BOUND_1, const CONST_1: TYPE_2> ENUM<'LT_1, TYPE_1, CONST_1>
        where
            'LT_1: 'LT_2,
        {
            fn __anodized_data_maintains(&self) {
                use ENUM::*;
                let _ = | | COND_1;
                let _ = | | COND_2;
            }
        }
    };

    let observed = Config::DEFAULT
        .instrument_item_enum(struct_spec, item_enum)
        .unwrap();
    assert_tokens_eq(&observed, &expected);
}