public void FormatValueToFilter_FileTimeDateTimeCollection_ThrowsNotSupportedException()
        {
            //prepare
            var dates = new Collection <DateTime>(new[] { DateTime.Now, DateTime.Now.AddDays(1) });

            _mappingArguments.PropertyType = typeof(Collection <DateTime>);
            var propertyMapping = new DateCollectionPropertyMapping <DateCollectionPropertyMappingTest>(_mappingArguments, null);

            //act
            Executing.This(() => propertyMapping.FormatValueToFilter(dates))
            .Should().Throw <NotSupportedException>();
        }
        public void FormatValueFromDirectory_Null_ReturnsNull()
        {
            //prepare
            _mappingArguments.PropertyType = typeof(Collection <DateTime>);
            var propertyMapping = new DateCollectionPropertyMapping <DateCollectionPropertyMappingTest>(_mappingArguments, null);

            //act
            var value = propertyMapping.FormatValueFromDirectory(null, "dn");

            //assert
            value.Should().Be.Null();
        }
        public void FormatValueFromDirectory_NullableFileTimeDateTimeCollection_ReturnsDateTimesCollection()
        {
            //prepare
            var dates = new Collection <DateTime?>(new DateTime?[] { DateTime.Now, DateTime.Now.AddDays(1) });

            _mappingArguments.PropertyType = typeof(Collection <DateTime?>);
            var propertyMapping = new DateCollectionPropertyMapping <DateCollectionPropertyMappingTest>(_mappingArguments, null);

            //act
            var value = propertyMapping.FormatValueFromDirectory(new DirectoryAttribute("names", dates.Select(d => d.Value.ToFileTime().ToString()).ToArray()), "dn");

            //assert
            value.As <Collection <DateTime?> >().Should().Have.SameSequenceAs(dates);
        }
        public void IsEqual_OneNull_ReturnsFalse()
        {
            //prepare
            _mappingArguments.Getter       = t => null;
            _mappingArguments.PropertyType = typeof(ICollection <DateTime>);
            var propertyMapping = new DateCollectionPropertyMapping <DateCollectionPropertyMappingTest>(_mappingArguments, null);
            DirectoryAttributeModification modification;
            //act
            var value = propertyMapping.IsEqual(this, new Collection <DateTime>(new[] { DateTime.Now }), out modification);

            //assert
            value.Should().Be.False();
            modification.Should().Not.Be.Null();
        }
        public void FormatValueFromDirectory_SingleDateTime_ReturnsAsDateTimeCollection()
        {
            //prepare
            var now = DateTime.Now;

            _mappingArguments.PropertyType = typeof(Collection <DateTime>);
            var propertyMapping = new DateCollectionPropertyMapping <DateCollectionPropertyMappingTest>(_mappingArguments, null);

            //act
            var value = propertyMapping.FormatValueFromDirectory(new DirectoryAttribute("name", now.ToFileTime().ToString()), "dn");

            //assert
            value.As <Collection <DateTime> >().Should().Contain(now);
        }
        public void FormatValueFromDirectory_DateTimeCollection_ReturnsDateTimesCollection()
        {
            //prepare
            var now      = DateTime.Now;
            var tomorrow = now.AddDays(1);
            var dates    = new Collection <DateTime>(new[] { new DateTime(now.Year, now.Month, now.Day, now.Hour, now.Minute, now.Second),
                                                             new DateTime(tomorrow.Year, tomorrow.Month, tomorrow.Day, tomorrow.Hour, tomorrow.Minute, tomorrow.Second) });

            _mappingArguments.PropertyType = typeof(Collection <DateTime>);
            var propertyMapping = new DateCollectionPropertyMapping <DateCollectionPropertyMappingTest>(_mappingArguments, "yyyyMMddHHmmss.0Z");

            //act
            var value = propertyMapping.FormatValueFromDirectory(new DirectoryAttribute("names", dates.Select(d => d.FormatLdapDateTime("yyyyMMddHHmmss.0Z")).ToArray()), "dn");

            //assert
            value.As <Collection <DateTime> >().Should().Have.SameSequenceAs(dates);
        }
        public void IsEqual_DifferentLengths_ReturnsFalse()
        {
            //prepare
            var date1 = DateTime.Now;
            var date2 = DateTime.Now.AddDays(1);
            var date3 = DateTime.Now.AddDays(2);

            _mappingArguments.PropertyType = typeof(Collection <DateTime>);
            _mappingArguments.Getter       = t => new Collection <DateTime>(new[] { date1, date2, date3 });
            var propertyMapping = new DateCollectionPropertyMapping <DateCollectionPropertyMappingTest>(_mappingArguments, null);
            DirectoryAttributeModification modification;
            //act
            var value = propertyMapping.IsEqual(this, new Collection <DateTime>(new[] { date1, date2 }), out modification);

            //assert
            value.Should().Be.False();
            modification.Should().Not.Be.Null();
        }
        public virtual IPropertyMapping ToPropertyMapping()
        {
            IPropertyMapping mapping;

            var type      = typeof(T);
            var arguments = new PropertyMappingArguments <T>
            {
                PropertyName  = PropertyInfo.Name,
                PropertyType  = PropertyInfo.PropertyType,
                AttributeName = AttributeName ?? PropertyInfo.Name.Replace('_', '-'),
                Getter        = DelegateBuilder.BuildGetter <T>(PropertyInfo),
                Setter        = !type.IsAnonymous()
                                                 ? DelegateBuilder.BuildSetter <T>(PropertyInfo)
                                                 : null,
                IsDistinguishedName = IsDistinguishedName,
                ReadOnly            = IsDistinguishedName ? ReadOnly.Always : ReadOnlyConfiguration.GetValueOrDefault(ReadOnly.Never),
                DirectoryMappings   = null,
                InstanceMappings    = null
            };

            if (PropertyInfo.PropertyType == typeof(DateTime) || PropertyInfo.PropertyType == typeof(DateTime?))
            {
                mapping = new DatePropertyMapping <T>(arguments, DateTimeFormat);
            }
            else if (PropertyInfo.PropertyType.IsEnum || (Nullable.GetUnderlyingType(PropertyInfo.PropertyType) != null &&
                                                          Nullable.GetUnderlyingType(PropertyInfo.PropertyType).IsEnum))
            {
                mapping = new EnumPropertyMapping <T>(arguments, IsEnumStoredAsInt);
            }
            else if (PropertyInfo.PropertyType == typeof(byte[]))
            {
                mapping = new ByteArrayPropertyMapping <T>(arguments);
            }
            else if (PropertyInfo.PropertyType == typeof(Guid) || PropertyInfo.PropertyType == typeof(Guid?))
            {
                mapping = new GuidPropertyMapping <T>(arguments);
            }
            else if (PropertyInfo.PropertyType == typeof(string))
            {
                mapping = new StringPropertyMapping <T>(arguments);
            }
            else if (PropertyInfo.PropertyType == typeof(string[]))
            {
                mapping = new StringArrayPropertyMapping <T>(arguments);
            }
            else if (PropertyInfo.PropertyType == typeof(DateTime[]) || PropertyInfo.PropertyType == typeof(DateTime?[]))
            {
                mapping = new DateArrayPropertyMapping <T>(arguments, DateTimeFormat);
            }
            else if (PropertyInfo.PropertyType == typeof(ICollection <DateTime>) || PropertyInfo.PropertyType == typeof(Collection <DateTime>) ||
                     PropertyInfo.PropertyType == typeof(ICollection <DateTime?>) || PropertyInfo.PropertyType == typeof(Collection <DateTime?>))
            {
                mapping = new DateCollectionPropertyMapping <T>(arguments, DateTimeFormat);
            }
            else if (PropertyInfo.PropertyType == typeof(Collection <string>) || PropertyInfo.PropertyType == typeof(ICollection <string>))
            {
                mapping = new StringCollectionPropertyMapping <T>(arguments);
            }
            else if (PropertyInfo.PropertyType == typeof(Collection <byte[]>) || PropertyInfo.PropertyType == typeof(ICollection <byte[]>))
            {
                mapping = new ByteArrayCollectionPropertyMapping <T>(arguments);
            }
            else if (PropertyInfo.PropertyType == typeof(bool) || PropertyInfo.PropertyType == typeof(bool?))
            {
                mapping = new BooleanPropertyMapping <T>(arguments);
            }
            else if (PropertyInfo.PropertyType == typeof(SecurityIdentifier))
            {
                mapping = new SecurityIdentifierPropertyMapping <T>(arguments);
            }
            else if (PropertyInfo.PropertyType == typeof(SecurityIdentifier[]))
            {
                mapping = new SecurityIdentifierArrayPropertyMapping <T>(arguments);
            }
            else if (PropertyInfo.PropertyType == typeof(ICollection <SecurityIdentifier>) || PropertyInfo.PropertyType == typeof(Collection <SecurityIdentifier>))
            {
                mapping = new SecurityIdentifierCollectionPropertyMapping <T>(arguments);
            }
            else if (PropertyInfo.PropertyType == typeof(X509Certificate2) || PropertyInfo.PropertyType == typeof(X509Certificate))
            {
                mapping = new X509Certificate2PropertyMapping <T>(arguments);
            }
            else if (PropertyInfo.PropertyType == typeof(byte[][]))
            {
                mapping = new ByteArrayArrayPropertyMapping <T>(arguments);
            }
            else if (PropertyInfo.PropertyType == typeof(ICollection <X509Certificate>) || PropertyInfo.PropertyType == typeof(Collection <X509Certificate>) ||
                     PropertyInfo.PropertyType == typeof(ICollection <X509Certificate2>) || PropertyInfo.PropertyType == typeof(Collection <X509Certificate2>))
            {
                mapping = new X509Certificate2CollectionPropertyMapping <T>(arguments);
            }
            else if (PropertyInfo.PropertyType == typeof(X509Certificate[]) || PropertyInfo.PropertyType == typeof(X509Certificate2[]))
            {
                mapping = new X509Certificate2ArrayPropertyMapping <T>(arguments);
            }
            else if (PropertyInfo.PropertyType.IsValueType || (Nullable.GetUnderlyingType(PropertyInfo.PropertyType) != null))
            {
                mapping = new NumericPropertyMapping <T>(arguments);
            }
            else if (typeof(IDirectoryAttributes).IsAssignableFrom(PropertyInfo.PropertyType))
            {
                mapping = new CatchAllPropertyMapping <T>(arguments);
            }
            else
            {
                throw new MappingException(string.Format("Type '{0}' could not be mapped.", PropertyInfo.PropertyType.FullName));
            }

            return(mapping);
        }