public static DeltaGroup GetDeltaObjects <T>(T originalObject, JObject jObject)
        {
            var deltaProperties             = TypeCache.GetDeltaPropertyInfo <T>();
            var propertiesToIgnoreOnDefault = TypeCache.GetPropertiesToIgnoreOnDefault <T>();
            var ignorePropertiesOnDefault   = TypeCache.IgnorePropertiesOnDefault <T>();

            return(deltaProperties.Select(deltaProperty =>
                                          GetDeltaObject(deltaProperty, originalObject, jObject,
                                                         propertiesToIgnoreOnDefault, ignorePropertiesOnDefault))
                   .Aggregate(new DeltaGroup(), (deltaGroup, deltaObject) =>
            {
                if (deltaObject == null)
                {
                    return deltaGroup;
                }

                switch (deltaObject.ValueConversionStatus)
                {
                case ValueConversionStatus.Success:
                    deltaGroup.DeltaObjects.Add(deltaObject);
                    return deltaGroup;

                case ValueConversionStatus.Fail:
                    deltaGroup.DeltaObjectsValueConversionFail.Add(deltaObject);
                    return deltaGroup;

                default:
                    return deltaGroup;
                }
            }));
        }
            public void CachesPropertyInfo_WhenNewTypeProvided()
            {
                var propertyInfoCache = typeof(TypeCache)
                                        .GetProperty("DeltaPropertiesByType",
                                                     BindingFlags.NonPublic | BindingFlags.Static)
                                        .GetValue(null) as ConcurrentDictionary <Type, List <DeltaProperty> >;

                Assert.NotNull(propertyInfoCache);

                var customerPropertiesFirstCall = TypeCache.GetDeltaPropertyInfo <TestCustomer>();

                Assert.True(propertyInfoCache.TryGetValue(typeof(TestCustomer), out _));

                var customerPropertiesSecondCall = TypeCache.GetDeltaPropertyInfo <TestCustomer>();

                Assert.True(propertyInfoCache.TryGetValue(typeof(TestCustomer), out _));

                var comparedResult = GetCompareLogic().Compare(customerPropertiesFirstCall,
                                                               customerPropertiesSecondCall);

                Assert.True(comparedResult.AreEqual);

                var accountProperties = TypeCache.GetDeltaPropertyInfo <TestAccount>();

                Assert.True(propertyInfoCache.TryGetValue(typeof(TestCustomer), out _));
                Assert.True(propertyInfoCache.TryGetValue(typeof(TestAccount), out _));
            }
        public static List <DeltaObject> GetDeltaObjects <T>(T originalObject, T newObject)
        {
            var deltaProperties             = TypeCache.GetDeltaPropertyInfo <T>();
            var propertiesToIgnoreOnDefault = TypeCache.GetPropertiesToIgnoreOnDefault <T>();
            var ignorePropertiesOnDefault   = TypeCache.IgnorePropertiesOnDefault <T>();

            return(deltaProperties.Select(deltaProperty =>
                                          GetDeltaObject(deltaProperty, originalObject, newObject,
                                                         propertiesToIgnoreOnDefault, ignorePropertiesOnDefault))
                   .Where(d => d != null)
                   .ToList());
        }
            public void DoesNotIncludeNonAcceptedTypes_WhenProvidedTypeIncludedNonAcceptedTypes()
            {
                var customerProperties = TypeCache.GetDeltaPropertyInfo <TestCustomer>();

                Assert.NotNull(customerProperties);
                Assert.IsType <List <DeltaProperty> >(customerProperties);
                Assert.NotEmpty(customerProperties);
                Assert.True(customerProperties.TrueForAll(p =>
                                                          p.PropertyInfo.PropertyType.IsPrimitive ||
                                                          p.PropertyInfo.PropertyType.IsEnum ||
                                                          AcceptedNonPrimitiveTypes.Contains(p.PropertyInfo.PropertyType)));
            }