1use jgenesis_common::frontend::PartialClone; 2 3#[derive(Debug, PartialEq, PartialClone)] 4struct UnitStruct; 5 6#[test] 7fn unit_struct() { 8 assert_eq!(UnitStruct, UnitStruct.partial_clone()); 9} 10 11#[derive(Debug, PartialEq, PartialClone)] 12struct NestedNamed { 13 a: Vec<u8>, 14 #[partial_clone(default)] 15 b: Vec<u16>, 16 c: String, 17} 18 19#[derive(Debug, PartialEq, PartialClone)] 20struct NamedFields { 21 d: Vec<u8>, 22 #[partial_clone(default)] 23 e: Vec<u16>, 24 #[partial_clone(partial)] 25 f: NestedNamed, 26} 27 28#[test] 29fn nested_named_fields() { 30 let inner = NestedNamed { a: vec![1, 2, 3], b: vec![4, 5, 6], c: "hello".into() }; 31 let outer = NamedFields { d: vec![7, 8, 9], e: vec![10, 11, 12], f: inner }; 32 33 let expected = NamedFields { 34 d: vec![7, 8, 9], 35 e: vec![], 36 f: NestedNamed { a: vec![1, 2, 3], b: vec![], c: "hello".into() }, 37 }; 38 assert_eq!(outer.partial_clone(), expected); 39} 40 41#[derive(Debug, PartialEq, PartialClone)] 42struct NestedUnnamed(Vec<u8>, #[partial_clone(default)] String); 43 44#[derive(Debug, PartialEq, PartialClone)] 45struct GenericUnnamed<T>(#[partial_clone(partial)] T, Vec<u8>); 46 47#[test] 48fn nested_unnamed_fields_generic() { 49 let inner = NestedUnnamed(vec![1, 2, 3], "hello".into()); 50 let outer = GenericUnnamed(inner, vec![4, 5, 6]); 51 52 let expected_inner = NestedUnnamed(vec![1, 2, 3], String::new()); 53 let expected_outer = GenericUnnamed(expected_inner, vec![4, 5, 6]); 54 assert_eq!(outer.partial_clone(), expected_outer); 55} 56 57#[derive(Debug, PartialEq, PartialClone)] 58enum Enum { 59 Unit, 60 Unnamed(Vec<u8>, #[partial_clone(default)] String, #[partial_clone(partial)] NestedUnnamed), 61 Named { 62 a: Vec<u8>, 63 #[partial_clone(default)] 64 b: String, 65 #[partial_clone(partial)] 66 c: NestedUnnamed, 67 }, 68} 69 70#[test] 71fn enum_unit() { 72 assert_eq!(Enum::Unit, Enum::Unit.partial_clone()); 73} 74 75#[test] 76fn enum_unnamed() { 77 let inner = NestedUnnamed(vec![1, 2, 3], "hello".into()); 78 let outer = Enum::Unnamed(vec![4, 5, 6], "world".into(), inner); 79 80 let expected_inner = NestedUnnamed(vec![1, 2, 3], String::new()); 81 let expected_outer = Enum::Unnamed(vec![4, 5, 6], String::new(), expected_inner); 82 assert_eq!(outer.partial_clone(), expected_outer); 83} 84 85#[test] 86fn enum_named() { 87 let inner = NestedUnnamed(vec![1, 2, 3], "hello".into()); 88 let outer = Enum::Named { a: vec![4, 5, 6], b: "world".into(), c: inner }; 89 90 let expected_inner = NestedUnnamed(vec![1, 2, 3], String::new()); 91 let expected_outer = Enum::Named { a: vec![4, 5, 6], b: String::new(), c: expected_inner }; 92 assert_eq!(outer.partial_clone(), expected_outer); 93}