Пример #1
0
        /// <inheritdoc/>
        protected override int GetHashCode(object item, ValuerChainer valuer)
        {
            if (item == null)
            {
                throw new ArgumentNullException(nameof(item));
            }
            if (valuer == null)
            {
                throw new ArgumentNullException(nameof(valuer));
            }

            Type type = item.GetType();
            int  hash = ValueComparer.BaseHash + type.GetHashCode();

            foreach (PropertyInfo property in type.GetProperties(_scope).Where(p => p.CanRead))
            {
                hash = hash * ValueComparer.HashMultiplier + valuer.GetHashCode(property.GetValue(item));
            }

            foreach (FieldInfo field in type.GetFields(_scope))
            {
                hash = hash * ValueComparer.HashMultiplier + valuer.GetHashCode(field.GetValue(item));
            }

            return(hash);
        }
Пример #2
0
        /// <inheritdoc cref="Compare"/>
        private static IEnumerable <Difference> LazyCompare(
            IEnumerable expected, IEnumerable actual, ValuerChainer valuer)
        {
            IEnumerator expectedEnumerator = expected.GetEnumerator();
            IEnumerator actualEnumerator   = actual.GetEnumerator();
            int         index = 0;

            while (expectedEnumerator.MoveNext())
            {
                if (actualEnumerator.MoveNext())
                {
                    foreach (Difference diff in valuer.Compare(expectedEnumerator.Current, actualEnumerator.Current))
                    {
                        yield return(new Difference(index, diff));
                    }
                }
                else
                {
                    yield return(new Difference(index, new Difference(expectedEnumerator.Current, "'outofbounds'")));
                }
                index++;
            }
            while (actualEnumerator.MoveNext())
            {
                yield return(new Difference(index++, new Difference("'outofbounds'", actualEnumerator.Current)));
            }
        }
Пример #3
0
        /// <inheritdoc cref="Compare"/>
        /// <typeparam name="T">Item type being compared.</typeparam>
        private static async Task <IEnumerable <Difference> > CompareAsync <T>(
            IAsyncEnumerable <T> expected, IAsyncEnumerable <T> actual, ValuerChainer valuer)
        {
            await using IAsyncEnumerator <T> expectedEnumerator = expected.GetAsyncEnumerator();
            await using IAsyncEnumerator <T> actualEnumerator   = actual.GetAsyncEnumerator();
            int index = 0;

            List <Difference> differences = new();

            while (await expectedEnumerator.MoveNextAsync().ConfigureAwait(false))
            {
                if (await actualEnumerator.MoveNextAsync().ConfigureAwait(false))
                {
                    differences.AddRange(valuer
                                         .Compare(expectedEnumerator.Current, actualEnumerator.Current)
                                         .Select(diff => new Difference(index, diff)));
                }
                else
                {
                    differences.Add(new Difference(index, new Difference(expectedEnumerator.Current, "'outofbounds'")));
                }
                index++;
            }
            while (await actualEnumerator.MoveNextAsync().ConfigureAwait(false))
            {
                differences.Add(new Difference(index++, new Difference("'outofbounds'", actualEnumerator.Current)));
            }

            return(differences);
        }
        /// <inheritdoc cref="Compare"/>
        private static IEnumerable <Difference> LazyCompare(
            IDictionary expected, IDictionary actual, ValuerChainer valuer)
        {
            object[] expectedKeys = expected.Keys.Cast <object>().ToArray();
            object[] actualKeys   = actual.Keys.Cast <object>().ToArray();

            foreach (object key in expectedKeys)
            {
                object match = actualKeys.FirstOrDefault(k => valuer.Equals(key, k));
                if (match != null)
                {
                    foreach (Difference diff in valuer.Compare(expected[key], actual[match]))
                    {
                        yield return(new Difference($"[{key}]", diff));
                    }
                }
                else
                {
                    yield return(new Difference($"[{key}]", new Difference(expected[key], "'null'")));
                }
            }

            foreach (object key in actualKeys)
            {
                if (!expectedKeys.Any(k => valuer.Equals(key, k)))
                {
                    yield return(new Difference($"[{key}]", new Difference("'null'", actual[key])));
                }
            }
        }
Пример #5
0
        /// <inheritdoc/>
        protected override int GetHashCode(IFaked item, ValuerChainer valuer)
        {
            if (valuer == null)
            {
                throw new ArgumentNullException(nameof(valuer));
            }

            return(valuer.GetHashCode(item?.FakeMeta));
        }
Пример #6
0
        /// <inheritdoc/>
        protected override int GetHashCode(Task item, ValuerChainer valuer)
        {
            if (valuer == null)
            {
                throw new ArgumentNullException(nameof(valuer));
            }

            return(valuer.GetHashCode(ExtractResult(item)));
        }
        /// <inheritdoc/>
        protected override int GetHashCode(object item, ValuerChainer valuer)
        {
            if (item == null)
            {
                throw new ArgumentNullException(nameof(item));
            }

            return(item.GetType().GetHashCode());
        }
        /// <inheritdoc/>
        protected override int GetHashCode(StringDictionary item, ValuerChainer valuer)
        {
            if (valuer == null)
            {
                throw new ArgumentNullException(nameof(valuer));
            }

            return(valuer.GetHashCode(Convert(item)));
        }
        /// <inheritdoc/>
        protected override IEnumerable <Difference> Compare(
            StringDictionary expected, StringDictionary actual, ValuerChainer valuer)
        {
            if (valuer == null)
            {
                throw new ArgumentNullException(nameof(valuer));
            }

            return(valuer.Compare(Convert(expected), Convert(actual)));
        }
Пример #10
0
        /// <inheritdoc/>
        protected override bool Supports(object expected, object actual, ValuerChainer valuer)
        {
            if (expected == null)
            {
                throw new ArgumentNullException(nameof(expected));
            }
            if (actual == null)
            {
                throw new ArgumentNullException(nameof(actual));
            }

            return(expected.GetType().Inherits(typeof(IAsyncEnumerable <>)) &&
                   actual.GetType().Inherits(typeof(IAsyncEnumerable <>)));
        }
Пример #11
0
        /// <inheritdoc/>
        protected override bool Supports(object expected, object actual, ValuerChainer valuer)
        {
            if (expected == null)
            {
                throw new ArgumentNullException(nameof(expected));
            }
            if (actual == null)
            {
                throw new ArgumentNullException(nameof(actual));
            }

            return(expected.GetType().Inherits(typeof(IEquatable <>).MakeGenericType(expected.GetType())) &&
                   !(expected is IStructuralEquatable));
        }
Пример #12
0
        /// <inheritdoc/>
        protected override bool Supports(object expected, object actual, ValuerChainer valuer)
        {
            Type objectType = expected?.GetType();

            return(objectType == null ||
                   actual == null ||
                   (objectType != actual.GetType() &&
                    !objectType.Inherits(typeof(IAsyncEnumerable <>))) ||
                   objectType.IsPrimitive ||
                   objectType.IsEnum ||
                   objectType == typeof(string) ||
                   objectType == typeof(object) ||
                   expected is Delegate ||
                   expected is Type);
        }
        /// <inheritdoc/>
        protected override bool Supports(object expected, object actual, ValuerChainer valuer)
        {
            if (expected == null)
            {
                throw new ArgumentNullException(nameof(expected));
            }
            if (actual == null)
            {
                throw new ArgumentNullException(nameof(actual));
            }

            Type type = expected.GetType();

            return(!type.GetProperties(_Scope).Any(p => p.CanRead) &&
                   !type.GetFields(_Scope).Any());
        }
Пример #14
0
        /// <inheritdoc/>
        protected override int GetHashCode(object item, ValuerChainer valuer)
        {
            if (item == null)
            {
                throw new ArgumentNullException(nameof(item));
            }
            if (valuer == null)
            {
                throw new ArgumentNullException(nameof(valuer));
            }

            return(Task.Run(() => ((Task <int>)GetType()
                                   .GetMethod(nameof(GetHashCodeAsync), BindingFlags.Static | BindingFlags.NonPublic)
                                   .MakeGenericMethod(item.GetType().GetGenericArguments().Single())
                                   .Invoke(null, new object[] { item, valuer }))).Result);
        }
        /// <inheritdoc/>
        protected override IEnumerable <Difference> Compare(
            IDictionary expected, IDictionary actual, ValuerChainer valuer)
        {
            if (expected == null)
            {
                throw new ArgumentNullException(nameof(expected));
            }
            if (actual == null)
            {
                throw new ArgumentNullException(nameof(actual));
            }
            if (valuer == null)
            {
                throw new ArgumentNullException(nameof(valuer));
            }

            return(LazyCompare(expected, actual, valuer));
        }
Пример #16
0
        /// <inheritdoc/>
        protected override int GetHashCode(IEnumerable item, ValuerChainer valuer)
        {
            if (item == null)
            {
                throw new ArgumentNullException(nameof(item));
            }
            if (valuer == null)
            {
                throw new ArgumentNullException(nameof(valuer));
            }

            int hash = ValueComparer.BaseHash;

            foreach (object value in item)
            {
                hash = hash * ValueComparer.HashMultiplier + valuer.GetHashCode(value);
            }
            return(hash);
        }
        /// <inheritdoc/>
        protected override int GetHashCode(IDictionary item, ValuerChainer valuer)
        {
            if (item == null)
            {
                throw new ArgumentNullException(nameof(item));
            }
            if (valuer == null)
            {
                throw new ArgumentNullException(nameof(valuer));
            }

            int hash = ValueComparer.BaseHash;

            foreach (DictionaryEntry entry in item)
            {
                hash += valuer.GetHashCode(entry.Key, entry.Value);
            }
            return(hash);
        }
Пример #18
0
        /// <inheritdoc cref="Compare"/>
        private IEnumerable <Difference> LazyCompare(object expected, object actual, ValuerChainer valuer)
        {
            Type type = expected.GetType();

            foreach (PropertyInfo property in type.GetProperties(_scope).Where(p => p.CanRead))
            {
                foreach (Difference diff in valuer.Compare(property.GetValue(expected), property.GetValue(actual)))
                {
                    yield return(new Difference(property, diff));
                }
            }

            foreach (FieldInfo field in expected.GetType().GetFields(_scope))
            {
                foreach (Difference diff in valuer.Compare(field.GetValue(expected), field.GetValue(actual)))
                {
                    yield return(new Difference(field, diff));
                }
            }
        }
Пример #19
0
        /// <inheritdoc/>
        protected override IEnumerable <Difference> Compare(
            object expected, object actual, ValuerChainer valuer)
        {
            if (expected == null)
            {
                throw new ArgumentNullException(nameof(expected));
            }
            if (actual == null)
            {
                throw new ArgumentNullException(nameof(actual));
            }
            if (valuer == null)
            {
                throw new ArgumentNullException(nameof(valuer));
            }

            return(Task.Run(() => ((Task <IEnumerable <Difference> >)GetType()
                                   .GetMethod(nameof(CompareAsync), BindingFlags.Static | BindingFlags.NonPublic)
                                   .MakeGenericMethod(expected.GetType().GetGenericArguments().Single())
                                   .Invoke(null, new object[] { expected, actual, valuer }))).Result);
        }
Пример #20
0
        /// <inheritdoc/>
        protected override IEnumerable <Difference> Compare(IFaked expected, IFaked actual, ValuerChainer valuer)
        {
            if (valuer == null)
            {
                throw new ArgumentNullException(nameof(valuer));
            }

            return(valuer.Compare(expected?.FakeMeta, actual?.FakeMeta));
        }
Пример #21
0
        /// <inheritdoc/>
        protected override IEnumerable <Difference> Compare(object expected, object actual, ValuerChainer valuer)
        {
            if (expected == null)
            {
                throw new ArgumentNullException(nameof(expected));
            }

            if (!expected.Equals(actual))
            {
                return(new[] { new Difference(expected, actual) });
            }
            else
            {
                return(Enumerable.Empty <Difference>());
            }
        }
Пример #22
0
        /// <inheritdoc cref="GetHashCode"/>
        /// <typeparam name="T">Item type being compared.</typeparam>
        private static async Task <int> GetHashCodeAsync <T>(IAsyncEnumerable <T> item, ValuerChainer valuer)
        {
            int hash = ValueComparer.BaseHash;

            await foreach (T current in item)
            {
                hash = hash * ValueComparer.HashMultiplier + valuer.GetHashCode(current);
            }
            return(hash);
        }
Пример #23
0
        /// <inheritdoc/>
        protected override IEnumerable <Difference> Compare(object expected, object actual, ValuerChainer valuer)
        {
            if (expected == null && actual == null)
            {
                yield break;
            }

            if (expected == null || actual == null)
            {
                yield return(new Difference(expected, actual));
            }
            else if (expected.GetType() != actual.GetType())
            {
                yield return(new Difference(expected.GetType(), actual.GetType()));
            }
            else if (!expected.Equals(actual))
            {
                yield return(new Difference(expected, actual));
            }
        }
Пример #24
0
 /// <inheritdoc/>
 protected override int GetHashCode(object item, ValuerChainer valuer)
 {
     return(ValueComparer.Use.GetHashCode(item));
 }
 /// <inheritdoc/>
 protected override IEnumerable <Difference> Compare(object expected, object actual, ValuerChainer valuer)
 {
     return(Enumerable.Empty <Difference>());
 }
Пример #26
0
        /// <inheritdoc/>
        protected override IEnumerable <Difference> Compare(Task expected, Task actual, ValuerChainer valuer)
        {
            if (valuer == null)
            {
                throw new ArgumentNullException(nameof(valuer));
            }

            return(valuer.Compare(ExtractResult(expected), ExtractResult(actual)));
        }