using System;
using System.Collections.Generic;
namespace UnityEngine.TestTools.Utils
{
///
/// Use this utility to compare two Quaternion objects for equality
/// with NUnit assertion constraints.
/// Use the static instance QuaternionEqualityComparer.Instance
/// to have the default calculation error value set to 0.00001f.
/// For any other custom error value, use the one argument constructor.
///
public class QuaternionEqualityComparer : IEqualityComparer
{
private const float k_DefaultError = 0.00001f;
private readonly float AllowedError;
private static readonly QuaternionEqualityComparer m_Instance = new QuaternionEqualityComparer();
///
///A comparer instance with the default error value 0.00001f.
///
public static QuaternionEqualityComparer Instance { get { return m_Instance; } }
private QuaternionEqualityComparer() : this(k_DefaultError) {}
///
/// Creates an instance of the comparer with a custom allowed error value.
///
/// Describes the custom allowed error value
public QuaternionEqualityComparer(float allowedError)
{
AllowedError = allowedError;
}
///
/// Compares the actual and expected Quaternion objects
/// for equality using the method.
///
/// Expected Quaternion value used for comparison
/// Actual Quaternion value to test
/// True if the quaternion are equals, false otherwise.
///
/// The following example shows how to verify if two Quaternion are equals
///
/// [TestFixture]
/// public class QuaternionTest
/// {
/// [Test]
/// public void VerifyThat_TwoQuaternionsAreEqual()
/// {
/// var actual = new Quaternion(10f, 0f, 0f, 0f);
/// var expected = new Quaternion(1f, 10f, 0f, 0f);
/// var comparer = new QuaternionEqualityComparer(10e-6f);
///
/// Assert.That(actual, Is.EqualTo(expected).Using(comparer));
///
/// //Using default error 0.00001f
/// actual = new Quaternion(10f, 0f, 0.1f, 0f);
/// expected = new Quaternion(1f, 10f, 0.1f, 0f);
///
/// Assert.That(actual, Is.EqualTo(expected).Using(QuaternionEqualityComparer.Instance));
/// }
/// }
///
///
public bool Equals(Quaternion expected, Quaternion actual)
{
return Mathf.Abs(Quaternion.Dot(expected, actual)) > (1.0f - AllowedError);
}
///
/// Serves as the default hash function.
///
/// A not null Quaternion
/// Returns 0
public int GetHashCode(Quaternion quaternion)
{
return 0;
}
}
}