orchestra-proc-macro 0.2.1

Generate the actor pattern connectivity graph from a single annotated struct definition - proc-macro
Documentation
// Copyright (C) 2022 Parity Technologies (UK) Ltd.
// SPDX-License-Identifier: Apache-2.0

// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

use super::*;
use crate::{SubSysAttrItem, SubSystemAttrItems};
use assert_matches::assert_matches;
use quote::quote;
use syn::parse_quote;

mod attr {
	use super::*;

	#[test]
	fn attr_full_works() {
		let attr: OrchestraAttrArgs = parse_quote! {
			gen=AllMessage, event=::some::why::ExternEvent, signal=SigSigSig, signal_capacity=111, message_capacity=222,
			error=OrchestraError,
		};
		assert_matches!(attr, OrchestraAttrArgs {
			message_channel_capacity,
			signal_channel_capacity,
			..
		} => {
			assert_eq!(message_channel_capacity, 222);
			assert_eq!(signal_channel_capacity, 111);
		});
	}

	#[test]
	fn attr_partial_works() {
		let attr: OrchestraAttrArgs = parse_quote! {
			gen=AllMessage, event=::some::why::ExternEvent, signal=::foo::SigSigSig,
			error=OrchestraError,
		};
		assert_matches!(attr, OrchestraAttrArgs {
			message_channel_capacity: _,
			signal_channel_capacity: _,
			..
		} => {
		});
	}
}

mod strukt {

	use super::*;

	#[test]
	fn parse_subsystem_attr_item_works_00_wip() {
		assert_matches!(
		syn::parse2::<SubSysAttrItem>(quote! {
			wip
		}), Ok(SubSysAttrItem::Wip(_)) => {
		});
	}

	#[test]
	fn parse_subsystem_attr_item_works_02_sends() {
		assert_matches!(
		syn::parse2::<SubSysAttrItem>(quote! {
			sends: [A, B, C]
		}), Ok(SubSysAttrItem::Sends(sends)) => {
			assert_eq!(sends.sends.len(), 3);
		});
	}

	#[test]
	fn parse_subsystem_attr_item_works_03_sends() {
		assert_matches!(
		syn::parse2::<SubSysAttrItem>(quote! {
			sends: [A]
		}), Ok(SubSysAttrItem::Sends(sends)) => {
			assert_eq!(sends.sends.len(), 1);
		});
	}

	#[test]
	fn parse_subsystem_attr_item_works_04_sends() {
		assert_matches!(
		syn::parse2::<SubSysAttrItem>(quote! {
			sends: [A,]
		}), Ok(SubSysAttrItem::Sends(sends)) => {
			assert_eq!(sends.sends.len(), 1);
		});
	}

	#[test]
	fn parse_subsystem_attr_item_works_05_sends() {
		assert_matches!(
		syn::parse2::<SubSysAttrItem>(quote! {
			sends: []
		}), Ok(SubSysAttrItem::Sends(sends)) => {
			assert_eq!(sends.sends.len(), 0);
		});
	}

	#[test]
	fn parse_subsystem_attr_item_works_06_consumes() {
		assert_matches!(
		syn::parse2::<SubSysAttrItem>(quote! {
			consumes: Foo
		}), Ok(SubSysAttrItem::Consumes(_consumes)) => {
		});
	}

	#[test]
	fn parse_subsystem_attr_item_works_07_consumes() {
		assert_matches!(
		syn::parse2::<SubSysAttrItem>(quote! {
			Foo
		}), Ok(SubSysAttrItem::Consumes(_consumes)) => {
		});
	}

	#[test]
	fn parse_subsystem_attributes_works_00() {
		syn::parse2::<SubSystemAttrItems>(quote! {
			(wip, blocking, consumes: Foo, sends: [])
		})
		.unwrap();
	}

	#[test]
	fn parse_subsystem_attributes_works_01() {
		assert_matches!(
		syn::parse2::<SubSystemAttrItems>(quote! {
			(blocking, Foo, sends: [])
		}), Ok(_) => {
		});
	}

	#[test]
	fn parse_subsystem_attributes_works_02() {
		assert_matches!(
		syn::parse2::<SubSystemAttrItems>(quote! {
			(consumes: Foo, sends: [Bar])
		}), Ok(_) => {
		});
	}

	#[test]
	fn parse_subsystem_attributes_works_03() {
		assert_matches!(
		syn::parse2::<SubSystemAttrItems>(quote! {
			(blocking, consumes: Foo, sends: [Bar])
		}), Ok(_) => {
		});
	}

	#[test]
	fn parse_subsystem_attributes_works_04() {
		assert_matches!(
		syn::parse2::<SubSystemAttrItems>(quote! {
			(wip, consumes: Foo, sends: [Bar])
		}), Ok(_) => {
		});
	}

	#[test]
	fn parse_subsystem_attributes_works_05() {
		assert_matches!(
		syn::parse2::<SubSystemAttrItems>(quote! {
			(consumes: Foo)
		}), Ok(_) => {
		});
	}

	#[test]
	fn parse_subsystem_attributes_works_06() {
		assert_matches!(
		syn::parse2::<SubSystemAttrItems>(quote! {
			(sends: [Foo], consumes: Bar)
		}), Ok(_) => {
		});
	}

	#[test]
	fn parse_subsystem_attributes_works_07() {
		assert_matches!(
		syn::parse2::<SubSystemAttrItems>(quote! {
			(message_capacity: 32768, sends: [Foo], consumes: Bar)
		}), Ok(_) => {
		});
	}

	#[test]
	fn parse_subsystem_attributes_works_07_duplicate_send() {
		assert_matches!(
		syn::parse2::<SubSystemAttrItems>(quote! {
			(sends: [Foo], Bar, Y)
		}), Err(e) => {
			dbg!(e)
		});
	}

	#[test]
	fn parse_subsystem_attributes_works_08() {
		assert_matches!(
		syn::parse2::<SubSystemAttrItems>(quote! {
			(sends: [Foo], consumes: Bar)
		}), Ok(_) => {
		});
	}

	#[test]
	fn parse_subsystem_attributes_works_09_neither_consumes_nor_sends() {
		assert_matches!(
		syn::parse2::<SubSystemAttrItems>(quote! {
			(sends: [])
		}), Err(e) => {
			// must either consume smth or sends smth, neither is NOK
			dbg!(e)
		});
	}

	#[test]
	fn parse_subsystem_attributes_works_10_empty_with_braces() {
		assert_matches!(
		syn::parse2::<SubSystemAttrItems>(quote! {
			()
		}), Err(e) => {
			dbg!(e)
		});
	}

	#[test]
	fn parse_subsystem_attributes_works_11_empty() {
		assert_matches!(
		syn::parse2::<SubSystemAttrItems>(quote! {

		}), Err(e) => {
			dbg!(e)
		});
	}

	#[test]
	fn parse_subsystem_attributes_works_12_duplicate_consumes_different_fmt() {
		assert_matches!(
		syn::parse2::<SubSystemAttrItems>(quote! {
			(Foo, consumes = Foo)
		}), Err(e) => {
			dbg!(e)
		});
	}

	#[test]
	fn struct_parse_baggage() {
		let item: OrchestraGuts = parse_quote! {
			pub struct Ooooh<X = Pffffffft> where X: Secrit {
				#[subsystem(consumes: Foo, sends: [])]
				sub0: FooSubsystem,

				metrics: Metrics,
			}
		};
		let _ = dbg!(item);
	}

	#[test]
	fn struct_parse_full() {
		let item: OrchestraGuts = parse_quote! {
			pub struct Ooooh<X = Pffffffft> where X: Secrit {
				#[subsystem(consumes: Foo, sends: [])]
				sub0: FooSubsystem,

				#[subsystem(blocking, consumes: Bar, sends: [])]
				yyy: BaersBuyBilliardBalls,

				#[subsystem(blocking, consumes: Twain, sends: [])]
				fff: Beeeeep,

				#[subsystem(consumes: Rope)]
				mc: MountainCave,

				metrics: Metrics,
			}
		};
		let _ = dbg!(item);
	}

	#[test]
	fn struct_parse_basic() {
		let item: OrchestraGuts = parse_quote! {
			pub struct Ooooh {
				#[subsystem(consumes: Foo, sends: [])]
				sub0: FooSubsystem,
			}
		};
		let _ = dbg!(item);
	}
}