public void ConstructorFuncOfTOfObject_should_use_specified_key_equality()
        {
            // Arrange
            var getHashCodeCalled = new List <bool>();
            var equalsCalled      = new List <bool>();
            var mock1             = new MockParent();

            mock1.Key.GetHashCodeProvider = () => { getHashCodeCalled.Add(true); return(0); };
            mock1.Key.EqualsProvider      = obj => { equalsCalled.Add(true); return(obj.Equals(null)); };

            var mock2 = new MockParent();

            mock2.Key.GetHashCodeProvider = () => { getHashCodeCalled.Add(true); return(0); };
            mock2.Key.EqualsProvider      = obj => { equalsCalled.Add(true); return(true); };


            // Act
            var comparer = new LambdaEqualityComparer <MockParent>(_ => _.Key);
            var hashCode = comparer.GetHashCode(mock1);
            var isEqual  = comparer.Equals(mock1, mock2);


            // Assert
            CollectionAssert.AreEqual(new[] { true }, getHashCodeCalled);
            CollectionAssert.AreEqual(new[] { true, true }, equalsCalled);
            Assert.AreEqual(0, hashCode);
            Assert.IsTrue(isEqual);
        }
        public void ConstructorFuncOfTOfObject_should_use_specified_key_equality()
        {
            // Arrange
            var getHashCodeCalled = new List<bool>();
            var equalsCalled = new List<bool>();
            var mock1 = new MockParent();
            mock1.Key.GetHashCodeProvider = () => { getHashCodeCalled.Add(true); return 0; };
            mock1.Key.EqualsProvider = obj => { equalsCalled.Add(true); return obj.Equals(null); };

            var mock2 = new MockParent();
            mock2.Key.GetHashCodeProvider = () => { getHashCodeCalled.Add(true); return 0; };
            mock2.Key.EqualsProvider = obj => { equalsCalled.Add(true); return true; };

            // Act
            var comparer = new LambdaEqualityComparer<MockParent>(_ => _.Key);
            var hashCode = comparer.GetHashCode(mock1);
            var isEqual = comparer.Equals(mock1, mock2);

            // Assert
            CollectionAssert.AreEqual(new[] { true }, getHashCodeCalled);
            CollectionAssert.AreEqual(new[] { true, true }, equalsCalled);
            Assert.AreEqual(0, hashCode);
            Assert.IsTrue(isEqual);
        }