public void CustomFactoryNongenericMethod() { var factory = new CustomFactory(_comparerB); var comparer = factory.GetObjectsComparer(typeof(B)); var b1 = new B(); var b2 = new B(); _comparerB.CalculateDifferences(b1, b2).Returns(new List <Difference>()); var isEqual = comparer.Compare(typeof(B), b1, b2); Assert.IsTrue(isEqual); _comparerB.Received().CalculateDifferences(b1, b2); }
public override IEnumerable <Difference> CalculateDifferences(Type type, object obj1, object obj2) { if (!type.InheritsFrom(typeof(IEnumerable <>))) { throw new ArgumentException("Invalid type"); } if (!Settings.EmptyAndNullEnumerablesEqual && (obj1 == null || obj2 == null) && obj1 != obj2) { yield break; } obj1 = obj1 ?? Enumerable.Empty <T>(); obj2 = obj2 ?? Enumerable.Empty <T>(); if (!obj1.GetType().InheritsFrom(typeof(IEnumerable <T>))) { throw new ArgumentException(nameof(obj1)); } if (!obj2.GetType().InheritsFrom(typeof(IEnumerable <T>))) { throw new ArgumentException(nameof(obj2)); } var list1 = ((IEnumerable <T>)obj1).ToList(); var list2 = ((IEnumerable <T>)obj2).ToList(); if (list1.Count != list2.Count) { if (!type.InheritsFrom(typeof(ICollection <>)) && !type.GetTypeInfo().IsArray) { yield return(new Difference("", list1.Count.ToString(), list2.Count.ToString(), DifferenceTypes.NumberOfElementsMismatch)); } yield break; } for (var i = 0; i < list2.Count; i++) { foreach (var failure in _comparer.CalculateDifferences(list1[i], list2[i])) { yield return(failure.InsertPath($"[{i}]")); } } }
public override IEnumerable <Difference> CalculateDifferences(Type type, object obj1, object obj2) { if (!type.InheritsFrom(typeof(Array))) { throw new ArgumentException("Invalid type"); } if (!Settings.EmptyAndNullEnumerablesEqual && (obj1 == null || obj2 == null) && obj1 != obj2) { yield break; } if (obj1 != null && !obj1.GetType().InheritsFrom(typeof(Array))) { throw new ArgumentException(nameof(obj1)); } if (obj2 != null && !obj2.GetType().InheritsFrom(typeof(Array))) { throw new ArgumentException(nameof(obj2)); } var array1 = (Array)obj1 ?? Array.CreateInstance(typeof(T), new int[type.GetArrayRank()]); var array2 = (Array)obj2 ?? Array.CreateInstance(typeof(T), new int[type.GetArrayRank()]); if (array1.Rank != array2.Rank) { yield return(new Difference("Rank", array1.Rank.ToString(), array2.Rank.ToString())); yield break; } var dimensionsFailure = false; for (var i = 0; i < array1.Rank; i++) { var length1 = array1.GetLength(i); var length2 = array2.GetLength(i); // ReSharper disable once InvertIf if (length1 != length2) { dimensionsFailure = true; yield return(new Difference($"Dimension{i}", length1.ToString(), length2.ToString())); } } if (dimensionsFailure) { yield break; } for (var i = 0; i < array1.Length; i++) { var indecies = IndexToCoordinates(array1, i); foreach (var failure in _comparer.CalculateDifferences((T)array1.GetValue(indecies), (T)array2.GetValue(indecies))) { yield return(failure.InsertPath($"[{string.Join(",", indecies)}]")); } } }