public void TestReferenceEquals()
        {
            var comparer   = new CountingEqualityComparer <string>();
            var collection = new[] { "a", "b" };

            collection.CollectionEquals(collection, comparer).ShouldEqual(true);
            Assert.Equal(0, comparer.EqualsCount);
            Assert.Equal(0, comparer.HashCount);
        }
        private static ProfilingResult Profile <T>(
            bool expectedResult,
            IEnumerable <T> a,
            IEnumerable <T> b,
            Func <IEnumerable <T>, IEnumerable <T>, IEqualityComparer <T>, bool> equals)
        {
            // capture base stats
            var  wrappedA = a is IReadOnlyCollection <T>?new CountingEnumerableCollection <T>((IReadOnlyCollection <T>)a) : new CountingEnumerable <T>(a);
            var  wrappedB = b is IReadOnlyCollection <T>?new CountingEnumerableCollection <T>((IReadOnlyCollection <T>)b) : new CountingEnumerable <T>(b);
            var  comparer = new CountingEqualityComparer <T>();
            bool result   = equals(wrappedA, wrappedB, comparer);
            bool fail     = false;

            if (expectedResult != result)
            {
                fail = true;
            }

            // capture timing stats
            const int Trials = 100;
            var       originalThreadPriority = Thread.CurrentThread.Priority;

            try
            {
                Thread.CurrentThread.Priority = ThreadPriority.Highest;

                var stopwatch = Stopwatch.StartNew();
                for (var i = 0; i < Trials; ++i)
                {
                    if (expectedResult != equals(a, b, EqualityComparer <T> .Default))
                    {
                        fail = true;
                    }
                }

                return(new ProfilingResult
                {
                    Duration = stopwatch.Elapsed,
                    EnumerateCount = wrappedA.EnumerateCount + wrappedB.EnumerateCount,
                    EqualsCount = comparer.EqualsCount,
                    HashCount = comparer.HashCount,
                    Result = result,
                    Fail = fail
                });
            }
            finally
            {
                Thread.CurrentThread.Priority = originalThreadPriority;
            }
        }
Example #3
0
        private static ProfilingResult Profile <T>(
            IEnumerable <T> a,
            IEnumerable <T> b,
            Func <IEnumerable <T>, IEnumerable <T>, IEqualityComparer <T>, bool> equals)
        {
            // capture base stats
            var wrappedA = a is IReadOnlyCollection <T>?new CountingEnumerableCollection <T>((IReadOnlyCollection <T>)a) : new CountingEnumerable <T>(a);
            var wrappedB = b is IReadOnlyCollection <T>?new CountingEnumerableCollection <T>((IReadOnlyCollection <T>)b) : new CountingEnumerable <T>(b);
            var comparer = new CountingEqualityComparer <T>();

            equals(wrappedA, wrappedB, comparer);

            // capture timing stats
            const int Trials = 1000;

            GC.Collect();
            GC.WaitForPendingFinalizers();
            var originalThreadPriority = Thread.CurrentThread.Priority;

            try
            {
                Thread.CurrentThread.Priority = ThreadPriority.Highest;

                var stopwatch = Stopwatch.StartNew();
                for (var i = 0; i < Trials; ++i)
                {
                    equals(a, b, EqualityComparer <T> .Default);
                }

                return(new ProfilingResult
                {
                    Duration = stopwatch.Elapsed,
                    EnumerateCount = wrappedA.EnumerateCount + wrappedB.EnumerateCount,
                    EqualsCount = comparer.EqualsCount,
                    HashCount = comparer.HashCount,
                });
            }
            finally
            {
                Thread.CurrentThread.Priority = originalThreadPriority;
            }
        }