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) { var r = new EnumerableComparisonReport(); var report = r.Generate("Expected", value1, "Actual", value2); return(ObjectComparisonResult.Fail(_propertyComparisonStack, "Enumerable properties have different lengths:\r\n" + report)); } return(ObjectComparisonResult.Success()); }
private ObjectComparisonResult ArePrimitivesEqual(object expected, object actual) { if (!actual.Equals(expected)) { return(ObjectComparisonResult.Fail(_propertyComparisonStack, "Primitive values differ. expected: {0}, actual: {1}.", expected, actual)); } return(ObjectComparisonResult.Success()); }
public ObjectComparisonResult AreEqual(object expected, object actual) { if (expected == null && actual == null) { return(ObjectComparisonResult.Success()); } var type = (expected ?? actual).GetType(); if (_propertyComparisonStack.Count == 0) { _propertyComparisonStack.Push(type.Name); } if ((expected == null) != (actual == null)) { return(ObjectComparisonResult.Fail(_propertyComparisonStack, "Nullity differs. expected is {0} while actual is {1}.", expected ?? "null", actual ?? "null")); } var expectedType = expected.GetType(); var actualType = actual.GetType(); if (expectedType != actualType) { // Let the type check go if they're both at least enumerable if (false == (expected.GetType().IsEnumerable() && actual.GetType().IsEnumerable())) { return(ObjectComparisonResult.Fail(_propertyComparisonStack, "Objects are of different type. expected is {0} while actual is {1}.", expectedType, actualType)); } } if (expectedType.IsPrimitive()) { return(ArePrimitivesEqual(expected, actual)); } if (expectedType.IsEnumerable()) { return(AreObjectsInEnumerablesEqual(expected, actual)); } return(AreComplexObjectsEqual(expected, actual)); }