#[cfg(feature = "derive")] #[cfg(test)] macro_rules! build_metadata_registration_test { ($modname: ident, $testname: ident, $serializer: tt, $structname: ty, $metadata_marker: ident) => { #[cfg(test)] mod $modname { #[derive( Copy, Clone, Debug, Eq, PartialEq, Ord, PartialOrd, serde::Serialize, serde::Deserialize, )] struct N(i32); #[derive( Copy, Clone, Debug, PartialEq, PartialOrd, serde::Serialize, serde::Deserialize, )] struct F(f64); #[derive(serde::Serialize, serde::Deserialize, tskit::metadata::$metadata_marker)] #[serializer($serializer)] struct GenericMetadata { a: N, b: Vec, } impl Default for GenericMetadata { fn default() -> Self { GenericMetadata { a: N(-1), b: vec![F(1.0), F(-2.0)], } } } fn dispatch_metadata(_: &T) where T: tskit::metadata::$metadata_marker, { } #[test] fn $testname() { dispatch_metadata(&<$structname>::default()); } #[test] fn test_roundtrip() { use tskit::metadata::MetadataRoundtrip; let d = GenericMetadata::default(); let encoded = d.encode().unwrap(); let decoded = GenericMetadata::decode(&encoded).unwrap(); assert_eq!(d.a, decoded.a); assert_eq!(d.b.len(), decoded.b.len()); for (i, j) in d.b.iter().zip(decoded.b.iter()) { match i.partial_cmp(j) { Some(std::cmp::Ordering::Equal) => (), Some(std::cmp::Ordering::Less) => panic!("expected Equal"), Some(std::cmp::Ordering::Greater) => panic!("expected Equal"), None => panic!("expected Equal"), }; } } } }; } #[cfg(feature = "derive")] build_metadata_registration_test!( test_json_metadata_registration, test_register_mutation_metadata, "serde_json", GenericMetadata, MutationMetadata ); #[cfg(feature = "derive")] build_metadata_registration_test!( test_json_node_registration, test_register_node_metadata, "serde_json", GenericMetadata, NodeMetadata ); #[cfg(feature = "derive")] build_metadata_registration_test!( test_json_site_registration, test_register_site_metadata, "serde_json", GenericMetadata, SiteMetadata ); #[cfg(feature = "derive")] build_metadata_registration_test!( test_json_edge_registration, test_register_edge_metadata, "serde_json", GenericMetadata, EdgeMetadata ); #[cfg(feature = "derive")] build_metadata_registration_test!( test_json_individual_registration, test_register_individual_metadata, "serde_json", GenericMetadata, IndividualMetadata ); #[cfg(feature = "derive")] build_metadata_registration_test!( test_json_migration_registration, test_register_migration_metadata, "serde_json", GenericMetadata, MigrationMetadata ); #[cfg(feature = "derive")] build_metadata_registration_test!( test_json_population_registration, test_register_population_metadata, "serde_json", GenericMetadata, PopulationMetadata ); #[cfg(feature = "derive")] build_metadata_registration_test!( test_bincode_metadata_registration, test_register_mutation_metadata, "bincode", GenericMetadata, MutationMetadata ); #[cfg(feature = "derive")] build_metadata_registration_test!( test_bincode_node_registration, test_register_node_metadata, "bincode", GenericMetadata, NodeMetadata ); #[cfg(feature = "derive")] build_metadata_registration_test!( test_bincode_site_registration, test_register_site_metadata, "bincode", GenericMetadata, SiteMetadata ); #[cfg(feature = "derive")] build_metadata_registration_test!( test_bincode_edge_registration, test_register_edge_metadata, "bincode", GenericMetadata, EdgeMetadata ); #[cfg(feature = "derive")] build_metadata_registration_test!( test_bincode_individual_registration, test_register_individual_metadata, "bincode", GenericMetadata, IndividualMetadata ); #[cfg(feature = "derive")] build_metadata_registration_test!( test_bincode_migration_registration, test_register_migration_metadata, "bincode", GenericMetadata, MigrationMetadata ); #[cfg(feature = "derive")] build_metadata_registration_test!( test_bincode_population_registration, test_register_population_metadata, "bincode", GenericMetadata, PopulationMetadata );