// Copyright (C) Stichting Deltares 2017. All rights reserved.
//
// This file is part of Ringtoets.
//
// Ringtoets is free software: you can redistribute it and/or modify
// it under the terms of the GNU Lesser General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public License
// along with this program. If not, see .
//
// All names, logos, and references to "Deltares" are registered trademarks of
// Stichting Deltares and remain full property of Stichting Deltares at all times.
// All rights reserved.
using NUnit.Framework;
namespace Core.Common.TestUtil
{
///
/// Testfixture that asserts overrides of the Equals() function
/// which follows the guidelines specified at
/// https://msdn.microsoft.com/en-us/library/ms173147(v=vs.90).aspx
///
/// The class to assert.
/// The directly derived class from
/// without any modifications.
/// Derived classes must implement a static function named GetUnequalTestCases
/// which returns object configurations that are different from the values in .
///
///
/// private class ConcreteEqualGuideLines : EqualsGuidelinesTestFixture<T, TDerived>
/// {
/// protected override T CreateObject()
/// {
/// // Returns a base configuration
/// }
///
/// protected override TDerived CreateDerivedObject()
/// {
/// // Returns a derived object with the same properties and values as CreateObject()
/// }
///
/// private static IEnumerable<TestCaseData> GetUnequalTestCases()
/// {
/// // Returns object configurations that differ from CreateObject()
/// }
/// }
///
///
[TestFixture]
public abstract class EqualsGuidelinesTestFixture where T : class
where TDerived : T
{
[Test]
public void Equals_ToNull_ReturnsFalse()
{
// Setup
T item = CreateObject();
// Call
bool equalToNull = item.Equals(null);
// Assert
Assert.IsFalse(equalToNull);
}
[Test]
public void Equals_ToItself_ReturnsTrue()
{
// Setup
T item1 = CreateObject();
T item2 = item1;
// Call
bool item1EqualToItem2 = item1.Equals(item2);
bool item2EqualToItem1 = item1.Equals(item2);
// Assert
Assert.IsTrue(item1EqualToItem2);
Assert.IsTrue(item2EqualToItem1);
}
[Test]
public void Equals_ToDifferentObject_ReturnsFalse()
{
// Setup
T item1 = CreateObject();
// Call
bool itemEqualToDifferentObject = item1.Equals(new object());
// Assert
Assert.IsFalse(itemEqualToDifferentObject);
}
[Test]
public void Equals_ToDerivedObject_ReturnsFalse()
{
// Setup
T item1 = CreateObject();
TDerived deriveditem = CreateDerivedObject();
// Call
bool itemEqualToDerivedItem = item1.Equals(deriveditem);
// Assert
Assert.IsFalse(itemEqualToDerivedItem);
}
[Test]
public void Equals_AllPropertiesEqual_ReturnsTrue()
{
// Setup
T item1 = CreateObject();
T item2 = CreateObject();
// Call
bool item1EqualToItem2 = item1.Equals(item2);
bool item2EqualToItem1 = item1.Equals(item2);
// Assert
Assert.IsTrue(item1EqualToItem2);
Assert.IsTrue(item2EqualToItem1);
}
[Test]
public void Equals_TransitiveProperty_ReturnsTrue()
{
// Setup
T item1 = CreateObject();
T item2 = CreateObject();
T item3 = CreateObject();
// Call
bool item1EqualToItem2 = item1.Equals(item2);
bool item2EqualToItem3 = item2.Equals(item3);
bool item1EqualToItem3 = item1.Equals(item3);
// Assert
Assert.IsTrue(item1EqualToItem2);
Assert.IsTrue(item2EqualToItem3);
Assert.IsTrue(item1EqualToItem3);
}
[Test]
[TestCaseSource("GetUnequalTestCases")]
public void Equals_DifferentProperty_ReturnsFalse(T item2)
{
// Setup
T item1 = CreateObject();
// Call
bool item1EqualToItem2 = item1.Equals(item2);
bool item2EqualToItem1 = item2.Equals(item1);
// Assert
Assert.IsFalse(item1EqualToItem2);
Assert.IsFalse(item2EqualToItem1);
}
[Test]
public void GetHashCode_EqualObjects_ReturnsSameHashCode()
{
// Setup
T item1 = CreateObject();
T item2 = CreateObject();
// Precondition
Assert.AreEqual(item1, item2);
// Call
int hashCode1 = item1.GetHashCode();
int hashCode2 = item2.GetHashCode();
// Assert
Assert.AreEqual(hashCode1, hashCode2);
}
///
/// Creates a fully configured object with set values that determine
/// an object's equality.
///
/// A fully configured object of type
protected abstract T CreateObject();
///
/// Creates a fully configured derived object with the same properties and values as
/// .
///
/// A fully configured derived object of
protected abstract TDerived CreateDerivedObject();
}
}