summaryrefslogtreecommitdiffstats
path: root/vendor/derive_builder/tests/custom_default.rs
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/derive_builder/tests/custom_default.rs')
-rw-r--r--vendor/derive_builder/tests/custom_default.rs138
1 files changed, 138 insertions, 0 deletions
diff --git a/vendor/derive_builder/tests/custom_default.rs b/vendor/derive_builder/tests/custom_default.rs
new file mode 100644
index 000000000..8fd6d215f
--- /dev/null
+++ b/vendor/derive_builder/tests/custom_default.rs
@@ -0,0 +1,138 @@
+#[macro_use]
+extern crate pretty_assertions;
+#[macro_use]
+extern crate derive_builder;
+
+mod field_level {
+ use derive_builder::UninitializedFieldError;
+ #[derive(Debug, PartialEq, Default, Builder, Clone)]
+ struct Lorem {
+ required: String,
+ #[builder(default)]
+ explicit_default: String,
+ #[builder(default = "\"foo\".to_string()")]
+ escaped_default: String,
+ #[builder(default = r#"format!("Hello {}!", "World")"#)]
+ raw_default: String,
+ #[builder(default = r#"format!("{}-{}-{}-{}",
+ Clone::clone(self.required
+ .as_ref()
+ .ok_or_else(|| UninitializedFieldError::new("required"))?),
+ match self.explicit_default { Some(ref x) => x, None => "EMPTY" },
+ self.escaped_default.as_ref().map(|x| x.as_ref()).unwrap_or("EMPTY"),
+ if let Some(ref x) = self.raw_default { x } else { "EMPTY" })"#)]
+ computed_default: String,
+ }
+
+ #[test]
+ fn error_if_uninitialized() {
+ let error = LoremBuilder::default().build().unwrap_err();
+ assert_eq!(&error.to_string(), "`required` must be initialized");
+ }
+
+ #[test]
+ fn custom_default() {
+ let x = LoremBuilder::default()
+ .required("ipsum".to_string())
+ .build()
+ .unwrap();
+
+ assert_eq!(
+ x,
+ Lorem {
+ required: "ipsum".to_string(),
+ explicit_default: "".to_string(),
+ escaped_default: "foo".to_string(),
+ raw_default: "Hello World!".to_string(),
+ computed_default: "ipsum-EMPTY-EMPTY-EMPTY".to_string(),
+ }
+ );
+ }
+
+ #[test]
+ fn builder_test() {
+ let x = LoremBuilder::default()
+ .required("ipsum".to_string())
+ .explicit_default("lorem".to_string())
+ .escaped_default("dolor".to_string())
+ .raw_default("sit".to_string())
+ .build()
+ .unwrap();
+
+ assert_eq!(
+ x,
+ Lorem {
+ required: "ipsum".to_string(),
+ explicit_default: "lorem".to_string(),
+ escaped_default: "dolor".to_string(),
+ raw_default: "sit".to_string(),
+ computed_default: "ipsum-lorem-dolor-sit".to_string(),
+ }
+ );
+ }
+}
+
+mod struct_level {
+ #[derive(Debug, Clone, PartialEq, Eq, Builder)]
+ #[builder(default = "explicit_default()")]
+ struct Lorem {
+ #[builder(default = "true")]
+ overwritten: bool,
+ not_type_default: Option<&'static str>,
+ }
+
+ fn explicit_default() -> Lorem {
+ Lorem {
+ overwritten: false,
+ not_type_default: Some("defined on struct-level"),
+ }
+ }
+
+ #[derive(Debug, Clone, PartialEq, Eq, Builder)]
+ #[builder(default)]
+ struct Ipsum {
+ not_type_default: Option<u16>,
+ also_custom: bool,
+ is_type_default: String,
+ }
+
+ impl Default for Ipsum {
+ fn default() -> Self {
+ Ipsum {
+ not_type_default: Some(20),
+ also_custom: true,
+ is_type_default: Default::default(),
+ }
+ }
+ }
+
+ #[test]
+ fn explicit_defaults_are_equal() {
+ let lorem = LoremBuilder::default().build().unwrap();
+
+ assert_eq!(
+ lorem,
+ Lorem {
+ overwritten: true,
+ ..explicit_default()
+ }
+ );
+ }
+
+ #[test]
+ fn implicit_defaults_are_equal() {
+ let ipsum = IpsumBuilder::default().build().unwrap();
+
+ assert_eq!(ipsum, Ipsum::default());
+ }
+
+ #[test]
+ fn overrides_work() {
+ let ipsum = IpsumBuilder::default()
+ .not_type_default(None)
+ .build()
+ .expect("Struct-level default makes all fields optional");
+
+ assert_eq!(ipsum.not_type_default, None);
+ }
+}