public void Factory_creates_expected_comparer(Type expectedComparer, string property)
        {
            using var context = new GodzillaContext();

            var factory = new CurrentValueComparerFactory();

            Assert.IsType(expectedComparer, factory.Create(context.Model.FindEntityType(typeof(Godzilla)).FindProperty(property)));
        }
        public void Factory_throws_if_model_and_provider_type_are_not_comparable()
        {
            using var context = new GodzillaContext();

            var factory = new CurrentValueComparerFactory();

            Assert.Equal(
                CoreStrings.NonComparableKeyTypes(
                    nameof(Godzilla), nameof(Godzilla.NotComparableConverted), nameof(NotComparable), nameof(NotComparable)),
                Assert.Throws <InvalidOperationException>(
                    () => factory.Create(
                        context.Model.FindEntityType(typeof(Godzilla)).FindProperty(nameof(Godzilla.NotComparableConverted)))).Message);
        }
        private void CanSortNullable(
            string propertyName,
            Func <byte[], Godzilla> generator,
            Func <Godzilla, byte[]> selector)
        {
            using var context = new GodzillaContext();

            context.AttachRange(
                generator(null), generator(new byte[] { 9 }),
                generator(null), generator(new byte[] { 3, 3, 3 }),
                generator(new byte[] { 1, 1 }), generator(new byte[] { 9 }), generator(new byte[] { 7 }), generator(new byte[] { 3, 3 }));

            var comparer = context.Model
                           .FindEntityType(typeof(Godzilla))
                           .FindProperty(propertyName)
                           .GetCurrentValueComparer();

            var entries = context.ChangeTracker.Entries <Godzilla>()
                          .OrderBy(e => e.GetInfrastructure(), comparer)
                          .Select(e => selector(e.Entity))
                          .ToList();

            Assert.Equal(
                new[]
            {
                null,
                null,
                new byte[] { 7 },
                new byte[] { 9 },
                new byte[] { 9 },
                new byte[] { 1, 1 },
                new byte[] { 3, 3 },
                new byte[] { 3, 3, 3 }
            },
                entries);
        }
        private void CanSort(
            string propertyName,
            Func <int, Godzilla> generator,
            Func <Godzilla, int> selector)
        {
            using var context = new GodzillaContext();

            context.AttachRange(
                generator(0), generator(9),
                generator(0), generator(3),
                generator(1), generator(9), generator(7), generator(3));

            var comparer = context.Model
                           .FindEntityType(typeof(Godzilla))
                           .FindProperty(propertyName)
                           .GetCurrentValueComparer();

            var entries = context.ChangeTracker.Entries <Godzilla>()
                          .OrderBy(e => e.GetInfrastructure(), comparer)
                          .Select(e => selector(e.Entity))
                          .ToList();

            Assert.Equal(new[] { 0, 0, 1, 3, 3, 7, 9, 9 }, entries);
        }