Esempio n. 1
0
        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)}]"));
                }
            }
        }