#![cfg_attr(not(feature = "std"), no_std)] #![allow(dead_code)] // some code is tested for type checking only #[cfg(not(feature = "std"))] extern crate alloc; mod structs { mod structural { #[cfg(not(feature = "std"))] use ::alloc::{boxed::Box, vec::Vec}; use derive_more::{Eq, __private::AssertParamIsEq}; #[test] fn unit() { #[derive(Eq, PartialEq)] struct Baz; let _: AssertParamIsEq; } #[test] fn empty_tuple() { #[derive(Eq, PartialEq)] struct Foo(); let _: AssertParamIsEq; } #[test] fn empty_struct() { #[derive(Eq, PartialEq)] struct Bar {} let _: AssertParamIsEq; } #[test] fn multi_field_tuple() { #[derive(Eq, PartialEq)] struct Foo(bool, i32); let _: AssertParamIsEq; } #[test] fn multi_field_struct() { #[derive(Eq, PartialEq)] struct Bar { b: bool, i: i32, } let _: AssertParamIsEq; } #[test] fn recursive_tuple() { #[derive(Eq, PartialEq)] struct Foo(Box, Vec); let _: AssertParamIsEq; } #[test] fn recursive_struct() { #[derive(Eq, PartialEq)] struct Bar { b: Box, i: Vec, } let _: AssertParamIsEq; } mod skip { use derive_more::{Eq, PartialEq, __private::AssertParamIsEq}; struct NoEq; #[test] fn fields() { #[derive(Eq, PartialEq)] struct Foo(#[eq(skip)] NoEq, bool, #[eq(skip)] i32); #[derive(Eq, PartialEq)] struct Bar { #[partial_eq(skip)] a: NoEq, i: i32, #[partial_eq(skip)] b: bool, } let _: AssertParamIsEq; let _: AssertParamIsEq; } #[test] fn all_fields() { #[derive(Eq, PartialEq)] struct Foo(#[eq(skip)] NoEq, #[eq(skip)] i32); #[derive(Eq, PartialEq)] struct Bar { #[partial_eq(skip)] a: NoEq, #[partial_eq(skip)] b: bool, } let _: AssertParamIsEq; let _: AssertParamIsEq; } #[test] fn empty_struct() { #[derive(Eq, PartialEq)] #[eq(skip)] struct Foo; #[derive(Eq, PartialEq)] #[partial_eq(skip)] struct Bar {} let _: AssertParamIsEq; let _: AssertParamIsEq; } #[test] fn multifield_struct() { #[derive(Eq, PartialEq)] #[eq(skip)] struct Foo(NoEq, bool); #[derive(Eq, PartialEq)] #[partial_eq(skip)] struct Bar { a: NoEq, b: bool, } let _: AssertParamIsEq; let _: AssertParamIsEq; } #[test] fn mixed() { #[derive(Eq, PartialEq)] #[eq(skip)] struct Foo(NoEq, #[eq(skip)] bool); #[derive(Eq, PartialEq)] #[partial_eq(skip)] struct Bar { a: NoEq, #[partial_eq(skip)] b: bool, } let _: AssertParamIsEq; let _: AssertParamIsEq; } } mod generic { #[cfg(not(feature = "std"))] use ::alloc::{boxed::Box, vec::Vec}; use derive_more::{Eq, PartialEq, __private::AssertParamIsEq}; trait Some { type Assoc; } impl Some for T { type Assoc = bool; } #[test] fn multi_field_tuple() { #[derive(Eq, PartialEq)] struct Foo(A::Assoc, B); let _: AssertParamIsEq>; } #[test] fn multi_field_struct() { #[derive(Eq, PartialEq)] struct Bar { b: B::Assoc, i: A, } let _: AssertParamIsEq>; } #[test] fn lifetime() { #[derive(Eq, PartialEq)] struct Foo<'a>(&'a str, i32); #[derive(Eq, PartialEq)] struct Bar<'a> { b: Foo<'a>, i: i32, } let _: AssertParamIsEq; let _: AssertParamIsEq; } #[test] fn const_param() { #[derive(Eq, PartialEq)] struct Baz; #[derive(Eq, PartialEq)] struct Foo([i32; N], i8); #[derive(Eq, PartialEq)] struct Bar { b: Foo, i: Baz, } let _: AssertParamIsEq>; let _: AssertParamIsEq>; let _: AssertParamIsEq>; } #[test] fn mixed() { #[derive(Eq, PartialEq)] struct Foo<'a, T, const N: usize>([&'a T; N]); let _: AssertParamIsEq>; } #[test] fn recursive() { #[derive(Eq, PartialEq)] struct Foo(A::Assoc, B, Vec>, Box); let _: AssertParamIsEq>; } mod skip { use derive_more::{Eq, PartialEq, __private::AssertParamIsEq}; struct NoEq; #[test] fn fields() { #[derive(Eq, PartialEq)] struct Foo(#[eq(skip)] A, B, #[eq(skip)] C); #[derive(Eq, PartialEq)] struct Bar { #[partial_eq(skip)] a: A, i: B, #[partial_eq(skip)] b: C, } let _: AssertParamIsEq>; let _: AssertParamIsEq>; } #[test] fn all_fields() { #[derive(Eq, PartialEq)] struct Foo(#[eq(skip)] A, #[eq(skip)] B); #[derive(Eq, PartialEq)] struct Bar { #[partial_eq(skip)] a: A, #[partial_eq(skip)] b: B, } let _: AssertParamIsEq>; let _: AssertParamIsEq>; } #[test] fn multifield_struct() { #[derive(Eq, PartialEq)] #[eq(skip)] struct Foo(A, B); #[derive(Eq, PartialEq)] #[partial_eq(skip)] struct Bar { a: A, b: B, } let _: AssertParamIsEq>; let _: AssertParamIsEq>; } #[test] fn mixed() { #[derive(Eq, PartialEq)] #[eq(skip)] struct Foo(A, #[eq(skip)] B); #[derive(Eq, PartialEq)] #[partial_eq(skip)] struct Bar { a: A, #[partial_eq(skip)] b: B, } let _: AssertParamIsEq>; let _: AssertParamIsEq>; } } } } } mod enums { mod structural { #[cfg(not(feature = "std"))] use ::alloc::{boxed::Box, vec::Vec}; use derive_more::{Eq, __private::AssertParamIsEq}; #[test] fn empty() { #[derive(Eq, PartialEq)] enum E {} let _: AssertParamIsEq; } #[test] fn single_variant_unit() { #[derive(Eq, PartialEq)] enum E { Baz, } let _: AssertParamIsEq; } #[test] fn single_variant_empty_tuple() { #[derive(Eq, PartialEq)] enum E { Foo(), } let _: AssertParamIsEq; } #[test] fn single_variant_empty_struct() { #[derive(Eq, PartialEq)] enum E { Bar {}, } let _: AssertParamIsEq; } #[test] fn single_variant_multi_field_tuple() { #[derive(Eq, PartialEq)] enum E { Foo(bool, i32), } let _: AssertParamIsEq; } #[test] fn single_variant_multi_field_struct() { #[derive(Eq, PartialEq)] enum E { Bar { b: bool, i: i32 }, } let _: AssertParamIsEq; } #[test] fn multi_variant_empty_field() { #[derive(Eq, PartialEq)] enum E { Foo(), Bar {}, Baz, } let _: AssertParamIsEq; } #[test] fn multi_variant_multi_field() { #[derive(Eq, PartialEq)] enum E { Foo(bool, i32), Bar { b: bool, i: i32 }, } let _: AssertParamIsEq; } #[test] fn multi_variant_empty_and_multi_field() { #[derive(Eq, PartialEq)] enum E { Foo(bool, i32), Baz, } let _: AssertParamIsEq; } #[test] fn recursive() { #[derive(Eq, PartialEq)] enum E { Foo(Box), Bar { b: Vec }, Baz, } let _: AssertParamIsEq; } mod skip { use derive_more::{Eq, PartialEq, __private::AssertParamIsEq}; struct NoEq; #[test] fn fields() { #[derive(Eq, PartialEq)] enum E { Foo(#[eq(skip)] NoEq, bool, #[eq(skip)] i32), Bar { #[partial_eq(skip)] a: NoEq, i: i32, #[partial_eq(skip)] b: bool, }, } let _: AssertParamIsEq; } #[test] fn all_fields() { #[derive(Eq, PartialEq)] enum E { Foo(#[partial_eq(skip)] NoEq, #[partial_eq(skip)] i32), Bar { #[partial_eq(skip)] a: NoEq, #[partial_eq(skip)] b: bool, }, } let _: AssertParamIsEq; } #[test] fn variants() { #[derive(Eq, PartialEq)] enum E { Foo(bool, i32), #[eq(skip)] Bar { a: NoEq, b: bool, }, } let _: AssertParamIsEq; } #[test] fn all_variants() { #[derive(Eq, PartialEq)] enum E { #[eq(skip)] Foo(bool, i32), #[partial_eq(skip)] Bar { a: NoEq, b: bool }, #[eq(skip)] Baz, } let _: AssertParamIsEq; } #[test] fn single_variant() { #[derive(Eq, PartialEq)] enum E { #[eq(skip)] Bar { a: NoEq, b: bool }, } let _: AssertParamIsEq; } #[test] fn all_but_single_empty_variant() { #[derive(Eq, PartialEq)] enum E { #[eq(skip)] Foo(bool, i32), #[partial_eq(skip)] Bar { a: NoEq, b: bool, }, Baz, } let _: AssertParamIsEq; } #[test] fn mixed() { #[derive(Eq, PartialEq)] enum E { #[eq(skip)] Foo(bool, i32), Bar { #[partial_eq(skip)] a: NoEq, b: bool, }, Baz, } let _: AssertParamIsEq; } } mod generic { #[cfg(not(feature = "std"))] use ::alloc::{boxed::Box, vec::Vec}; use derive_more::{Eq, PartialEq, __private::AssertParamIsEq}; trait Some { type Assoc; } impl Some for T { type Assoc = bool; } #[test] fn single_variant_multi_field_tuple() { #[derive(Eq, PartialEq)] enum E { Foo(A::Assoc, B), } let _: AssertParamIsEq>; } #[test] fn single_variant_multi_field_struct() { #[derive(Eq, PartialEq)] enum E { Bar { b: B::Assoc, i: A }, } let _: AssertParamIsEq>; } #[test] fn multi_variant_empty_and_multi_field() { #[derive(Eq, PartialEq)] enum E { Foo(B::Assoc, A), Bar { b: B::Assoc, i: A }, Baz, } let _: AssertParamIsEq>; } #[test] fn lifetime() { #[derive(Eq, PartialEq)] enum E1<'a> { Foo(&'a str, i32), } #[derive(Eq, PartialEq)] enum E2<'a> { Bar { b: E1<'a>, i: i32 }, } let _: AssertParamIsEq; let _: AssertParamIsEq; } #[test] fn const_param() { #[derive(Eq, PartialEq)] enum E3 { Baz, } #[derive(Eq, PartialEq)] enum E1 { Foo([i32; N], i8), } #[derive(Eq, PartialEq)] enum E2 { Bar { b: E1, i: E3 }, } let _: AssertParamIsEq>; let _: AssertParamIsEq>; let _: AssertParamIsEq>; } #[test] fn mixed() { #[derive(Eq, PartialEq)] enum E<'a, A, B: Some, const N: usize> { Foo([&'a A; N]), Baz([B::Assoc; N]), } let _: AssertParamIsEq>; } #[test] fn recursive() { #[derive(Eq, PartialEq)] enum E { Foo(B::Assoc, Vec), Bar { b: Box>, i: A }, Baz, } let _: AssertParamIsEq>; } mod skip { use derive_more::{Eq, PartialEq, __private::AssertParamIsEq}; struct NoEq; #[test] fn fields() { #[derive(Eq, PartialEq)] enum E { Foo(#[partial_eq(skip)] A, B, #[partial_eq(skip)] C), Bar { #[partial_eq(skip)] a: A, i: C, #[partial_eq(skip)] b: B, }, } let _: AssertParamIsEq>; } #[test] fn all_fields() { #[derive(Eq, PartialEq)] enum E { Foo(#[partial_eq(skip)] A, #[partial_eq(skip)] B), Bar { #[partial_eq(skip)] a: A, #[partial_eq(skip)] b: C, }, } let _: AssertParamIsEq>; } #[test] fn variants() { #[derive(Eq, PartialEq)] enum E { Foo(A, B), #[eq(skip)] Bar { a: C, b: A, }, } let _: AssertParamIsEq>; } #[test] fn all_variants() { #[derive(Eq, PartialEq)] enum E { #[eq(skip)] Foo(A, B), #[partial_eq(skip)] Bar { a: C, b: A }, #[eq(skip)] Baz, } let _: AssertParamIsEq>; } #[test] fn single_variant() { #[derive(Eq, PartialEq)] enum E { #[eq(skip)] Bar { a: A, b: B }, } let _: AssertParamIsEq>; } #[test] fn all_but_single_empty_variant() { #[derive(Eq, PartialEq)] enum E { #[eq(skip)] Foo(A, B), #[partial_eq(skip)] Bar { a: C, b: A, }, Baz, } let _: AssertParamIsEq>; } #[test] fn mixed() { #[derive(Eq, PartialEq)] enum E { #[eq(skip)] Foo(A, B), Bar { #[partial_eq(skip)] a: C, b: A, }, Baz, } let _: AssertParamIsEq>; } } } } }