cgp-component-macro-lib 0.3.0

Context-generic programming core component macros implemented as a library.
Documentation
use quote::quote;

use crate::for_each_replace::{handle_for_each_replace, handle_replace};
use crate::tests::helper::equal::equal_token_stream;

#[test]
fn test_for_each_replace() {
    let source = quote! {
        [
            FooComponent,
            BarComponent,
            BazComponent,
        ],
        [
            BarComponent,
        ],
        | Name | {
            impl DelegateComponent<Name> for MyComponents {
                type Delegate = ParentComponents;
            }
        }
    };

    let expected = quote! {
        impl DelegateComponent<FooComponent> for MyComponents {
            type Delegate = ParentComponents;
        }

        impl DelegateComponent<BazComponent> for MyComponents {
            type Delegate = ParentComponents;
        }
    };

    let derived = handle_for_each_replace(source).unwrap();

    assert!(equal_token_stream(&derived, &expected));
}

#[test]
fn test_for_each_replace_without_exclude() {
    let source = quote! {
        [
            FooComponent,
            BarComponent,
        ],
        | Name | {
            impl DelegateComponent<Name> for MyComponents {
                type Delegate = ParentComponents;
            }
        }
    };

    let expected = quote! {
        impl DelegateComponent<FooComponent> for MyComponents {
            type Delegate = ParentComponents;
        }

        impl DelegateComponent<BarComponent> for MyComponents {
            type Delegate = ParentComponents;
        }
    };

    let derived = handle_for_each_replace(source).unwrap();

    assert!(equal_token_stream(&derived, &expected));
}

#[test]
fn test_for_each_replace_with_generics() {
    let source = quote! {
        [
            FooComponent,
            <A> BarComponent<A>,
            <'b, B> BazComponent<'b, B>,
        ],
        [
            BarComponent<A>,
        ],
        | Name | {
            delegate_components! {
                MyComponents {
                    Name: ParentComponents,
                }
            }
        }
    };

    let expected = quote! {
        delegate_components! {
            MyComponents {
                FooComponent: ParentComponents,
            }
        }

        delegate_components! {
            MyComponents {
                <'b, B> BazComponent<'b, B>: ParentComponents,
            }
        }
    };

    let derived = handle_for_each_replace(source).unwrap();

    assert!(equal_token_stream(&derived, &expected));
}

#[test]
fn test_replace_tokens_with_generics() {
    let source = quote! {
        [
            FooComponent,
            <A> BarComponent<A>,
            <'b, B> BazComponent<'b, B>,
        ],
        [
            BarComponent<A>,
        ],
        | Name | {
            delegate_components! {
                MyComponents {
                    Name: ParentComponents,
                }
            }
        }
    };

    let expected = quote! {
        delegate_components! {
            MyComponents {
                [
                    FooComponent,
                    <'b, B> BazComponent<'b, B>
                ]: ParentComponents,
            }
        }
    };

    let derived = handle_replace(source).unwrap();

    assert!(equal_token_stream(&derived, &expected));
}