summaryrefslogtreecommitdiffstats
path: root/vendor/derive_builder/tests/bounds_generation.rs
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/derive_builder/tests/bounds_generation.rs')
-rw-r--r--vendor/derive_builder/tests/bounds_generation.rs78
1 files changed, 78 insertions, 0 deletions
diff --git a/vendor/derive_builder/tests/bounds_generation.rs b/vendor/derive_builder/tests/bounds_generation.rs
new file mode 100644
index 000000000..b16716ec5
--- /dev/null
+++ b/vendor/derive_builder/tests/bounds_generation.rs
@@ -0,0 +1,78 @@
+#[macro_use]
+extern crate derive_builder;
+
+/// A struct that deliberately doesn't implement `Clone`.
+#[derive(Debug, Default, PartialEq, Eq)]
+pub struct Dolor(String);
+
+/// Notice that this type derives Builder without disallowing
+/// `Lorem<Dolor>`.
+#[derive(Debug, Clone, Builder, PartialEq, Eq, Default)]
+#[builder(field(private), setter(into))]
+pub struct Lorem<T> {
+ ipsum: T,
+}
+
+#[derive(Debug, Clone, Builder, PartialEq, Eq, Default)]
+#[builder(field(private))]
+pub struct VecLorem<T> {
+ ipsum: Vec<T>,
+}
+
+#[derive(Debug, Clone, Builder, PartialEq, Eq)]
+#[builder(pattern = "owned", field(private))]
+pub struct OwnedLorem<T> {
+ ipsum: T,
+}
+
+#[test]
+fn generic_field_with_clone_has_builder_impl() {
+ assert_eq!(
+ LoremBuilder::default().ipsum(10).build().unwrap(),
+ Lorem { ipsum: 10 }
+ );
+}
+
+/// The `LoremBuilder` type does not require that `T: Clone`, so we should
+/// be able to name a `LoremBuilder<Dolor>`. But all the methods are on an impl
+/// bound with `T: Clone`, so we can't do anything with it.
+#[test]
+fn builder_with_non_clone_generic_compiles() {
+ let _: LoremBuilder<Dolor>;
+}
+
+/// In this case, we're trying to emit something that converts into a thing that
+/// implements clone.
+#[test]
+fn builder_with_into_generic_compiles() {
+ assert_eq!(
+ LoremBuilder::<String>::default().ipsum("").build().unwrap(),
+ Lorem::default()
+ );
+}
+
+#[test]
+fn builder_with_vec_t_compiles() {
+ assert_eq!(
+ VecLoremBuilder::<String>::default()
+ .ipsum(vec!["Hello".to_string()])
+ .build()
+ .unwrap(),
+ VecLorem {
+ ipsum: vec!["Hello".to_string()],
+ }
+ );
+}
+
+#[test]
+fn generic_field_without_clone_has_owned_builder() {
+ assert_eq!(
+ OwnedLoremBuilder::default()
+ .ipsum(Dolor::default())
+ .build()
+ .unwrap(),
+ OwnedLorem {
+ ipsum: Dolor::default()
+ }
+ );
+}