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}