예제 #1
0
        private ObjectComparisonResult AreObjectsInEnumerablesEqual(object value1, object value2)
        {
            var enumerator1 = ((IEnumerable)value1).GetEnumerator();
            var enumerator2 = ((IEnumerable)value2).GetEnumerator();

            bool hasNext1 = enumerator1.MoveNext();
            bool hasNext2 = enumerator2.MoveNext();

            while (hasNext1 && hasNext2)
            {
                var result = AreEqual(enumerator1.Current, enumerator2.Current);
                if (!result.AreEqual)
                {
                    return(result);
                }

                hasNext1 = enumerator1.MoveNext();
                hasNext2 = enumerator2.MoveNext();
            }

            if (hasNext1 != hasNext2)
            {
                return(ObjectComparisonResult.Fail(_propertyComparisonStack, "Enumerable properties have different lengths."));
            }

            return(ObjectComparisonResult.Success());
        }
예제 #2
0
        private ObjectComparisonResult ArePrimitivesEqual(object value2, object value1)
        {
            if (!value2.Equals(value1))
            {
                return(ObjectComparisonResult.Fail(_propertyComparisonStack, "Primitive values differ. Value1: {0}, Value2: {1}.", value1, value2));
            }

            return(ObjectComparisonResult.Success());
        }
예제 #3
0
        private ObjectComparisonResult AreComplexObjectsEqual(object object1, object object2)
        {
            var typeBeingCompared = object1.GetType();
            var properties        = typeBeingCompared.GetProperties(BindingFlags.Public | BindingFlags.Instance);

            if (false == properties.Any())
            {
                return(ObjectComparisonResult.Success());
            }

            foreach (var property in properties)
            {
                if (false == _ignores.Contains(typeBeingCompared, property.Name))
                {
                    _propertyComparisonStack.Push(property.Name);
                    try
                    {
                        var value1 = property.GetValue(object1, null);

                        if (_circularReferenceChecklist.Contains(value1))
                        {
                            return(ObjectComparisonResult.Success());
                        }

                        _circularReferenceChecklist.Add(value1);

                        var value2 = property.GetValue(object2, null);

                        // NOTE: Recursion
                        var result = AreEqual(value1, value2);

                        if (!result.AreEqual)
                        {
                            return(result);
                        }
                    }
                    finally
                    {
                        _propertyComparisonStack.Pop();
                    }
                }
            }

            return(ObjectComparisonResult.Success());
        }
예제 #4
0
        public ObjectComparisonResult AreEqual(object object1, object object2)
        {
            if (object1 == null && object2 == null)
            {
                return(ObjectComparisonResult.Success());
            }

            var type = (object1 ?? object2).GetType();

            if (_propertyComparisonStack.Count == 0)
            {
                _propertyComparisonStack.Push(type.Name);
            }

            if ((object1 == null) != (object2 == null))
            {
                return(ObjectComparisonResult.Fail(_propertyComparisonStack, "Nullity differs. Object1 is {0} while Object2 is {1}.", object1 ?? "null", object2 ?? "null"));
            }

            var object1Type = object1.GetType();
            var object2Type = object2.GetType();

            if (object1Type != object2Type)
            {
                // Let the type check go if they're both at least enumerable
                if (false == (object1.GetType().IsEnumerable() && object2.GetType().IsEnumerable()))
                {
                    return(ObjectComparisonResult.Fail(_propertyComparisonStack, "Objects are of different type. Object1 is {0} while Object2 is {1}.", object1Type, object2Type));
                }
            }

            if (object1Type.IsPrimitive())
            {
                return(ArePrimitivesEqual(object1, object2));
            }

            if (object1Type.IsEnumerable())
            {
                return(AreObjectsInEnumerablesEqual(object1, object2));
            }

            return(AreComplexObjectsEqual(object1, object2));
        }