public void AddComparerByNameWhenNameEmpty(string memberName)
        {
            var valueComparer = Substitute.For <IValueComparer>();
            var collection    = new ComparerOverridesCollection();

            Assert.Throws <ArgumentException>(() => collection.AddComparer(memberName, valueComparer));
        }
        public void AddComparerByTypeWhenTypeNull()
        {
            var valueComparer = Substitute.For <IValueComparer>();
            var collection    = new ComparerOverridesCollection();

            Assert.Throws <ArgumentNullException>(() => collection.AddComparer((Type)null, valueComparer));
        }
        public void AddComparerByMemberInfoWhenComparerNull()
        {
            var memberInfo = Substitute.ForPartsOf <MemberInfo>();
            var collection = new ComparerOverridesCollection();

            Assert.Throws <ArgumentNullException>(() => collection.AddComparer(memberInfo, null));
        }
        public void AddComparerByMemberInfoWhenMemberNull()
        {
            var valueComparer = Substitute.For <IValueComparer>();
            var collection    = new ComparerOverridesCollection();

            // ReSharper disable once RedundantCast
            Assert.Throws <ArgumentNullException>(() => collection.AddComparer((MemberInfo)null, valueComparer));
        }
        public void GetOverrideByNameComparerByMemberName()
        {
            var valueComparer = Substitute.For <IValueComparer>();
            var collection    = new ComparerOverridesCollection();

            collection.AddComparer("Prop1", valueComparer);

            var valueComparerFromCollection = collection.GetComparer("Prop1");

            Assert.AreEqual(valueComparer, valueComparerFromCollection);
        }
        public void GetOverrideByTypeWhenNoComparerMatchCriteria()
        {
            var valueComparer1 = Substitute.For <IValueComparer>();
            var collection     = new ComparerOverridesCollection();

            collection.AddComparer(typeof(string), valueComparer1);

            var valueComparerFromCollection = collection.GetComparer(typeof(int));

            Assert.IsNull(valueComparerFromCollection);
        }
        public void GetOverrideByNameComparerByMemberNameWhenTwoComparersMatchCriteria()
        {
            var valueComparer1 = Substitute.For <IValueComparer>();
            var valueComparer2 = Substitute.For <IValueComparer>();
            var collection     = new ComparerOverridesCollection();

            collection.AddComparer("Prop1", valueComparer1);
            collection.AddComparer("Prop1", valueComparer2);

            Assert.Throws <AmbiguousComparerOverrideResolutionException>(() => collection.GetComparer("Prop1"));
        }
        public void AddComparerByMemberInfoWhenExists()
        {
            var memberInfo    = Substitute.ForPartsOf <MemberInfo>();
            var valueComparer = Substitute.For <IValueComparer>();
            var collection    = new ComparerOverridesCollection();

            collection.AddComparer(memberInfo, valueComparer);

            var exception = Assert.Throws <ValueComparerExistsException>(() => collection.AddComparer(memberInfo, valueComparer));

            Assert.AreEqual(memberInfo, exception.MemberInfo);
        }
        public void GetOverrideByNameComparerByMemberNameWhenNoComparerMatchCriteria()
        {
            var valueComparer1 = Substitute.For <IValueComparer>();
            var valueComparer2 = Substitute.For <IValueComparer>();
            var collection     = new ComparerOverridesCollection();

            collection.AddComparer("Prop1", valueComparer1, mi => false);
            collection.AddComparer("Prop1", valueComparer2, mi => false);

            var valueComparerFromCollection = collection.GetComparer("Prop1");

            Assert.IsNull(valueComparerFromCollection);
        }
        public void GetOverrideByTypeWhenAllComparersHaveFilters()
        {
            var valueComparer1 = Substitute.For <IValueComparer>();
            var valueComparer2 = Substitute.For <IValueComparer>();
            var collection     = new ComparerOverridesCollection();

            collection.AddComparer(typeof(string), valueComparer1, mi => true);
            collection.AddComparer(typeof(string), valueComparer2, mi => true);

            var valueComparerFromCollection = collection.GetComparer(typeof(string));

            Assert.IsNull(valueComparerFromCollection);
        }
        public void GetOverrideByTypeWhenMoreThanOneComparerMatchCriteria()
        {
            var valueComparer1 = Substitute.For <IValueComparer>();
            var valueComparer2 = Substitute.For <IValueComparer>();
            var collection     = new ComparerOverridesCollection();

            collection.AddComparer(typeof(string), valueComparer1);
            collection.AddComparer(typeof(string), valueComparer2);

            var exception = Assert.Throws <AmbiguousComparerOverrideResolutionException>(() => collection.GetComparer(typeof(string)));

            Assert.AreEqual(typeof(string), exception.Type);
        }
        public void GetOverrideByTypeWhenOnlyOneComparerDoNotHaveFilter()
        {
            var valueComparer1 = Substitute.For <IValueComparer>();
            var valueComparer2 = Substitute.For <IValueComparer>();
            var collection     = new ComparerOverridesCollection();

            collection.AddComparer(typeof(string), valueComparer1, mi => true);
            collection.AddComparer(typeof(string), valueComparer2);

            var valueComparerFromCollection = collection.GetComparer(typeof(string));

            Assert.AreEqual(valueComparer2, valueComparerFromCollection);
        }
        public void GetOverrideByTypeComparerByType()
        {
            var valueComparer = Substitute.For <IValueComparer>();
            var collection    = new ComparerOverridesCollection();
            var memberInfo    = Substitute.ForPartsOf <PropertyInfo>();

            memberInfo.PropertyType.Returns(typeof(string));
            collection.AddComparer(typeof(string), valueComparer);

            var valueComparerFromCollection = collection.GetComparer(typeof(string));

            Assert.AreEqual(valueComparer, valueComparerFromCollection);
        }
        public void GetOverrideByNameComparerByMemberInfoWhenTwoComparersMatchCriteria()
        {
            var valueComparer1 = Substitute.For <IValueComparer>();
            var valueComparer2 = Substitute.For <IValueComparer>();
            var collection     = new ComparerOverridesCollection();
            var memberInfo     = Substitute.ForPartsOf <PropertyInfo>();

            memberInfo.PropertyType.Returns(typeof(string));
            memberInfo.Name.Returns("Prop1");
            collection.AddComparer("Prop1", valueComparer1);
            collection.AddComparer("Prop1", valueComparer2, mi => true);

            Assert.Throws <AmbiguousComparerOverrideResolutionException>(() => collection.GetComparer(memberInfo));
        }
        public void GetOverrideByNameComparerByMemberInfoWhenOneComparerMatchCriteria()
        {
            var valueComparer1 = Substitute.For <IValueComparer>();
            var valueComparer2 = Substitute.For <IValueComparer>();
            var collection     = new ComparerOverridesCollection();
            var memberInfo     = Substitute.ForPartsOf <PropertyInfo>();

            memberInfo.PropertyType.Returns(typeof(string));
            memberInfo.Name.Returns("Prop1");
            collection.AddComparer("Prop1", valueComparer1, mi => false);
            collection.AddComparer("Prop1", valueComparer2, mi => true);

            var valueComparerFromCollection = collection.GetComparer(memberInfo);

            Assert.AreEqual(valueComparer2, valueComparerFromCollection);
        }
        public void GetComparerByMemberInfoWhenNotExists()
        {
            var memberInfo1 = Substitute.ForPartsOf <PropertyInfo>();

            memberInfo1.PropertyType.Returns(typeof(string));
            var valueComparer1 = Substitute.For <IValueComparer>();
            var memberInfo2    = Substitute.ForPartsOf <PropertyInfo>();

            memberInfo2.PropertyType.Returns(typeof(string));
            var collection = new ComparerOverridesCollection();

            collection.AddComparer(memberInfo1, valueComparer1);

            var valueComparer2FromCollection = collection.GetComparer(memberInfo2);

            Assert.IsNull(valueComparer2FromCollection);
        }
        public void AddComparerByTypeWhenComparerNull()
        {
            var collection = new ComparerOverridesCollection();

            Assert.Throws <ArgumentNullException>(() => collection.AddComparer(typeof(string), null));
        }
        public void AddComparerByNameWhenComparerNull()
        {
            var collection = new ComparerOverridesCollection();

            Assert.Throws <ArgumentNullException>(() => collection.AddComparer("Name", null));
        }
        public void GetComparerByMemberNameWhenNull()
        {
            var collection = new ComparerOverridesCollection();

            Assert.Throws <ArgumentNullException>(() => collection.GetComparer((string)null));
        }