Ejemplo n.º 1
0
        /// <summary>
        /// Compares two objects for equality within a tolerance.
        /// </summary>
        public bool AreEqual(object x, object y, ref Tolerance tolerance)
        {
            this.failurePoints = new List <object>();

            if (x == null && y == null)
            {
                return(true);
            }

            if (x == null || y == null)
            {
                return(false);
            }

            if (object.ReferenceEquals(x, y))
            {
                return(true);
            }

            Type xType = x.GetType();
            Type yType = y.GetType();

            EqualityAdapter externalComparer = GetExternalComparer(x, y);

            if (externalComparer != null)
            {
                return(externalComparer.AreEqual(x, y));
            }

            if (xType.IsArray && yType.IsArray && !compareAsCollection)
            {
                return(ArraysEqual((Array)x, (Array)y, ref tolerance));
            }

            if (x is IDictionary && y is IDictionary)
            {
                return(DictionariesEqual((IDictionary)x, (IDictionary)y, ref tolerance));
            }

            //if (x is ICollection && y is ICollection)
            //    return CollectionsEqual((ICollection)x, (ICollection)y, ref tolerance);

            if (x is IEnumerable && y is IEnumerable && !(x is string && y is string))
            {
                return(EnumerablesEqual((IEnumerable)x, (IEnumerable)y, ref tolerance));
            }

            if (x is string && y is string)
            {
                return(StringsEqual((string)x, (string)y));
            }

            if (x is Stream && y is Stream)
            {
                return(StreamsEqual((Stream)x, (Stream)y));
            }

            if (Numerics.IsNumericType(x) && Numerics.IsNumericType(y))
            {
                return(Numerics.AreEqual(x, y, ref tolerance));
            }

            if (tolerance != null && tolerance.Value is TimeSpan)
            {
                TimeSpan amount = (TimeSpan)tolerance.Value;

                if (x is DateTime && y is DateTime)
                {
                    return(((DateTime)x - (DateTime)y).Duration() <= amount);
                }

                if (x is TimeSpan && y is TimeSpan)
                {
                    return(((TimeSpan)x - (TimeSpan)y).Duration() <= amount);
                }
            }


            if (FirstImplementsIEquatableOfSecond(xType, yType))
            {
                return(InvokeFirstIEquatableEqualsSecond(x, y));
            }
            else if (FirstImplementsIEquatableOfSecond(yType, xType))
            {
                return(InvokeFirstIEquatableEqualsSecond(y, x));
            }


            return(x.Equals(y));
        }
Ejemplo n.º 2
0
 /// <summary>
 /// Flag the constraint to use the supplied IEqualityComparer object.
 /// </summary>
 /// <param name="comparer">The IComparer object to use.</param>
 /// <returns>Self.</returns>
 public CollectionItemsEqualConstraint Using <T>(IEqualityComparer <T> comparer)
 {
     this.comparer.ExternalComparers.Add(EqualityAdapter.For(comparer));
     return(this);
 }
Ejemplo n.º 3
0
 /// <summary>
 /// Flag the constraint to use the supplied Comparison object.
 /// </summary>
 /// <param name="comparer">The IComparer object to use.</param>
 /// <returns>Self.</returns>
 public EqualConstraint Using <T>(Comparison <T> comparer)
 {
     this.comparer.ExternalComparers.Add(EqualityAdapter.For(comparer));
     return(this);
 }
Ejemplo n.º 4
0
 /// <summary>
 /// Flag the constraint to use the supplied IEqualityComparer object.
 /// </summary>
 /// <param name="comparer">The IComparer object to use.</param>
 /// <returns>Self.</returns>
 public EqualConstraint Using(IEqualityComparer comparer)
 {
     this.comparer.ExternalComparers.Add(EqualityAdapter.For(comparer));
     return(this);
 }
Ejemplo n.º 5
0
 /// <summary>
 /// Flag the constraint to use the supplied IEqualityComparer object.
 /// </summary>
 /// <param name="comparer">The IComparer object to use.</param>
 /// <returns>Self.</returns>
 public ContainsConstraint Using <T>(IEqualityComparer <T> comparer)
 {
     this.adapter = EqualityAdapter.For(comparer);
     return(this);
 }