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