1 #[macro_use]
2 extern crate pretty_assertions;
3 #[macro_use]
4 extern crate derive_builder;
5 
6 #[derive(Debug, PartialEq, Default, Builder, Clone)]
7 #[builder(pattern = "immutable")]
8 struct Lorem {
9     immutable: u32,
10     #[builder(pattern = "mutable")]
11     mutable_override: u32,
12 }
13 
14 #[derive(Debug, PartialEq, Default, Builder, Clone)]
15 #[builder(pattern = "mutable")]
16 struct Ipsum {
17     mutable: u32,
18     #[builder(pattern = "owned")]
19     owned_override: u32,
20 }
21 
22 #[derive(Debug, PartialEq, Default, Builder, Clone)]
23 #[builder(pattern = "owned")]
24 struct Dolor {
25     #[builder(pattern = "immutable")]
26     immutable_override: u32,
27     owned: u32,
28 }
29 
30 #[derive(Debug, PartialEq, Default, Builder, Clone)]
31 struct Sit {
32     default: u32,
33 }
34 
35 type ImmutableSetter<T, U> = fn(&T, U) -> T;
36 type OwnedSetter<T, U> = fn(T, U) -> T;
37 type MutableSetter<T, U> = fn(&mut T, U) -> &mut T;
38 
39 #[test]
40 fn mutable_by_default() {
41     // the setter must have the correct signature
42     let mutable_setter: MutableSetter<SitBuilder, u32> = SitBuilder::default;
43 
44     let mut old = <SitBuilder as Default>::default();
45     mutable_setter(&mut old, 42);
46     assert_eq!(old.default, Some(42));
47 }
48 
49 #[test]
50 fn mutable() {
51     // the setter must have the correct signature
52     let mutable_setter: MutableSetter<IpsumBuilder, u32> = IpsumBuilder::mutable;
53 
54     let mut old = IpsumBuilder::default();
55     mutable_setter(&mut old, 42);
56     assert_eq!(old.mutable, Some(42));
57 }
58 
59 #[test]
60 fn mutable_override() {
61     // the setter must have the correct signature
62     let mutable_setter: MutableSetter<LoremBuilder, u32> = LoremBuilder::mutable_override;
63 
64     let mut old = LoremBuilder::default();
65     mutable_setter(&mut old, 42);
66     assert_eq!(old.mutable_override, Some(42));
67 }
68 
69 #[test]
70 fn immutable() {
71     // the setter must have the correct signature
72     let immutable_setter: ImmutableSetter<LoremBuilder, u32> = LoremBuilder::immutable;
73 
74     let old = LoremBuilder::default();
75     let new = immutable_setter(&old, 42);
76     assert_eq!(new.immutable, Some(42));
77 }
78 
79 #[test]
80 fn immutable_override() {
81     // the setter must have the correct signature
82     let immutable_setter: ImmutableSetter<DolorBuilder, u32> = DolorBuilder::immutable_override;
83 
84     let old = DolorBuilder::default();
85     let new = immutable_setter(&old, 42);
86     assert_eq!(new.immutable_override, Some(42));
87 }
88 
89 #[test]
90 fn owned() {
91     // the setter must have the correct signature
92     let owned_setter: OwnedSetter<DolorBuilder, u32> = DolorBuilder::owned;
93 
94     let old = DolorBuilder::default();
95     let new = owned_setter(old, 42);
96     assert_eq!(new.owned, Some(42));
97 }
98 
99 #[test]
100 fn owned_override() {
101     // the setter must have the correct signature
102     let owned_setter: OwnedSetter<IpsumBuilder, u32> = IpsumBuilder::owned_override;
103 
104     let old = IpsumBuilder::default();
105     let new = owned_setter(old, 42);
106     assert_eq!(new.owned_override, Some(42));
107 }
108