internal static T SetupMethods <T>(this T mock, IDefaultData defaultData, ObjectCreationStrategy objectCreationStrategy)
        {
            var allMethods = typeof(T).GetAllMethods();

            foreach (var methodInfo in allMethods)
            {
                if (methodInfo.ReturnType == typeof(void))
                {
                    continue;
                }

                if (methodInfo.ReturnType.IsUndefined())
                {
                    if (objectCreationStrategy.UndefinedType == null)
                    {
                        continue;
                    }

                    var newMethodInfo = methodInfo.MakeGenericMethod(objectCreationStrategy.UndefinedType);
                    SetupMethod(mock, defaultData, objectCreationStrategy, newMethodInfo);
                }
                else
                {
                    SetupMethod(mock, defaultData, objectCreationStrategy, methodInfo);
                }
            }

            return(mock);
        }
示例#2
0
        internal static IDictionary <TKey, TValue> CreateDictionary <TKey, TValue>(IDefaultData defaultData,
                                                                                   ObjectCreationStrategy objectCreationStrategy)
        {
            var items = CreateDictionaryEntries <TKey, TValue>(defaultData, objectCreationStrategy);

            return(items.ToDictionary());
        }
示例#3
0
        internal static T CreateDynamicFrom <T>(Type type, IDefaultData defaultData,
                                                ObjectCreationStrategy objectCreationStrategy)
        {
            if (type.IsIEnumerable())
            {
                var enumerable = EnumerableCreator.Create <T>(type, defaultData, objectCreationStrategy);
                if (enumerable != null)
                {
                    return(enumerable);
                }
            }

            if (type.IsIEnumerator())
            {
                var enumerator = EnumeratorCreator.Create <T>(type, defaultData, objectCreationStrategy);
                if (enumerator != null)
                {
                    return(enumerator);
                }
            }

            var expectedObject = CreateDynamic <T>(type, defaultData, objectCreationStrategy);

            if (expectedObject == null)
            {
                return(default(T));
            }

            return(InitObject(defaultData, objectCreationStrategy, expectedObject));
        }
        public static object Create(this Type type, IDefaultData defaultData, ObjectCreationStrategy objectCreationStrategy)
        {
            if (type == null)
            {
                throw new ArgumentNullException(nameof(type));
            }

            if (type.IsStatic())
            {
                throw new Exception("Static class could not be constructed");
            }

            var result = type.GetDefaultValue(defaultData);

            if (result != null)
            {
                return(result);
            }

            if (type.IsUndefined())
            {
                return(UndefinedTypeCreator.Create(type, defaultData, objectCreationStrategy));
            }

            return(CreateFunc(new[] { type }, defaultData, objectCreationStrategy));
        }
示例#5
0
        //private static readonly Func<Type, object> ForFunc = genericType => Substitute.For(new Type[] { genericType }, new object[] { });



        internal static T Create <T>(Type type, IDefaultData defaultData, ObjectCreationStrategy objectCreationStrategy)
        {
            if (!type.IsInterface)
            {
                return(default(T));
            }

            if (type.IsIEnumerable())
            {
                var result = EnumerableCreator.Create <T>(type, defaultData, objectCreationStrategy);
                if (result != null)
                {
                    return(result);
                }
            }

            if (type.IsIEnumerator())
            {
                var result = EnumeratorCreator.Create <T>(type, defaultData, objectCreationStrategy);
                if (result != null)
                {
                    return(result);
                }
            }

            return(CreateProxy <T>(type, defaultData, objectCreationStrategy));
        }
        public void TestFor()
        {
            var objectCreationStrategy = new ObjectCreationStrategy(true, false, 0, null);
            var mock   = ObjectCreatorExtensions.Create <IPrimitivePropertyInterface>(CustomData, objectCreationStrategy);
            var errors = Analyze(mock, _dictionary).ToList();

            Assert.IsFalse(errors.Any(), ToErrorString(errors));
        }
示例#7
0
        internal static T Create <T>(IDefaultData defaultData, ObjectCreationStrategy objectCreationStrategy)
        {
            var type = typeof(T);

            return(type.IsInterface ?
                   (T)NonGenericInterfaceTypeCreator.GetValueOrDefault(type)?.Invoke(defaultData, objectCreationStrategy) :
                   (T)NonGenericTypeCreator.GetValueOrDefault(type)?.Invoke(defaultData, objectCreationStrategy));
        }
        internal static T Create <T>(Type type, IDefaultData defaultData, ObjectCreationStrategy objectCreationStrategy)
        {
            var args   = type.CreateCtorArguments(defaultData, objectCreationStrategy);
            var result = (T)ForPartsOfFunc(type, args);

            result.Init(defaultData, objectCreationStrategy);
            return(result);
        }
        private static T Init <T>(this T source, IDefaultData defaultData, ObjectCreationStrategy objectCreationStrategy)
        {
            if (objectCreationStrategy.SetupProperties)
            {
                source.InitProperties(defaultData, objectCreationStrategy);
            }

            return(source);
        }
示例#10
0
        private static T InitObject <T>(IDefaultData defaultData, ObjectCreationStrategy objectCreationStrategy, T expectedObject)
        {
            if (objectCreationStrategy.SetupProperties)
            {
                expectedObject.InitProperties(defaultData, objectCreationStrategy);
            }

            return(expectedObject);
        }
        public static void Init(TestContext testContext)
        {
            var privateObject = CustomData.ToPrivateObject();

            _dictionary = privateObject.GetField <Dictionary <Type, object> >("_defaultData");
            var objectCreationStrategy = new ObjectCreationStrategy(true, false, 0, null);

            _mock = ObjectCreatorExtensions.Create <IInterfaceWithInterfaces>(CustomData, objectCreationStrategy);
        }
示例#12
0
        internal static T Create <T>(IDefaultData defaultData, ObjectCreationStrategy objectCreationStrategy)
        {
            var expectedType = typeof(T);
            var genericType  = expectedType.GetGenericTypeDefinition();

            return(expectedType.IsInterface ?
                   (T)GenericInterfaceCollectionTypes.GetValueOrDefault(genericType)?.Invoke(expectedType, defaultData, objectCreationStrategy) :
                   (T)GenericCollectionTypes.GetValueOrDefault(genericType)?.Invoke(expectedType, defaultData, objectCreationStrategy));
        }
示例#13
0
        internal static IEnumerable <KeyValuePair <TKey, TValue> > CreateDictionaryEntries <TKey, TValue>(
            IDefaultData defaultData, ObjectCreationStrategy objectCreationStrategy)
        {
            var itemsCount = objectCreationStrategy.EnumerationCount;

            for (int i = 0; i < itemsCount; i++)
            {
                var key   = ObjectCreatorExtensions.Create <TKey>(defaultData, objectCreationStrategy);
                var value = ObjectCreatorExtensions.Create <TValue>(defaultData, objectCreationStrategy);
                yield return(new KeyValuePair <TKey, TValue>(key, value));
            }
        }
示例#14
0
        private static T CreateDictionary <T>(Type type, IDefaultData defaultData, ObjectCreationStrategy objectCreationStrategy)
        {
            var result = type.IsGenericType
                ? DictionaryCreatorGeneric.Create <T>(defaultData, objectCreationStrategy)
                : DictionaryCreatorNonGeneric.Create <T>(defaultData, objectCreationStrategy);

            if (result == null)
            {
                Debug.WriteLine($"Expected IEnumerble type: '{type.Name}' is unknown to create.");
            }

            return(result);
        }
        internal static T Create <T>(Type type, IDefaultData defaultData, ObjectCreationStrategy objectCreationStrategy)
        {
            if (!type.IsIEnumerator())
            {
                return(default(T));
            }

            var expectedType = typeof(T);

            return(expectedType.IsGenericType ?
                   EnumeratorCreatorGeneric.Create <T>(expectedType) :
                   EnumeratorCreatorNonGeneric.Create <T>(expectedType));
        }
示例#16
0
        public static object Create(Type type, IDefaultData defaultData, ObjectCreationStrategy objectCreationStrategy)
        {
            if (objectCreationStrategy.UndefinedType == null)
            {
                return(null);
            }

            if (type.IsGenericType)
            {
                return(type.MakeGenericType(objectCreationStrategy.UndefinedType).Create(defaultData, objectCreationStrategy));
            }

            return(objectCreationStrategy.UndefinedType.Create(defaultData, objectCreationStrategy));
        }
示例#17
0
        internal static object Create(Type type, IDefaultData defaultValue, ObjectCreationStrategy objectCreationStrategy)
        {
            if (!type.IsFunc())
            {
                return(null);
            }

            var parameterExpressions  = CreateParameterExpressions(type);
            var returnBlockExpression = CreateReturnBlockExpression(type, defaultValue, objectCreationStrategy);
            var lambda         = Expression.Lambda(returnBlockExpression, parameterExpressions);
            var compiledLambda = lambda.Compile();

            return(compiledLambda);
        }
示例#18
0
        internal static T Create <T>(Type type, IDefaultData defaultData, ObjectCreationStrategy objectCreationStrategy)
        {
            if (type.IsIDictionary())
            {
                return(CreateDictionary <T>(type, defaultData, objectCreationStrategy));
            }

            if (type.IsIEnumerable())
            {
                return(CreateEnumerable <T>(type, defaultData, objectCreationStrategy));
            }

            return(default(T));
        }
        private static IEnumerable <string> Analyze(Dictionary <Type, object> dictionary)
        {
            var objectCreationStrategy = new ObjectCreationStrategy();

            foreach (var keyValuePair in dictionary)
            {
                var result = typeof(ObjectCreatorExtensions).InvokeExpectedMethod(nameof(ObjectCreatorExtensions.Create),
                                                                                  new[] { keyValuePair.Key }, CustomData, objectCreationStrategy);

                if (CustomData.GetDefaultValue(keyValuePair.Key).NotEquals(result))
                {
                    yield return($"Expected type:{keyValuePair.Key} has not expected {result}");
                }
            }
        }
        internal static T SetupProperties <T>(this T mock, IDefaultData defaultData, ObjectCreationStrategy objectCreationStrategy)
        {
            var allProperties = typeof(T).GetAllProperties();

            foreach (var propertyInfo in allProperties)
            {
                var propertyType   = propertyInfo.PropertyType;
                var returnValue    = propertyType.Create(defaultData, objectCreationStrategy);
                var indexParameter = propertyInfo.GetIndexParameters().Select(p => p.ParameterType.Create()).ToArray();
                var propertyValue  = propertyInfo.GetValue(mock, indexParameter);
                var array          = Array.CreateInstance(propertyType, 0);
                ReturnsFunc(propertyType, propertyValue, returnValue, array);
            }

            return(mock);
        }
示例#21
0
        private static T CreateProxy <T>(Type type, IDefaultData defaultData, ObjectCreationStrategy objectCreationStrategy)
        {
            var proxy = (T)ForFunc(type);

            if (objectCreationStrategy.SetupProperties)
            {
                proxy.SetupProperties(defaultData, objectCreationStrategy);
            }

            if (objectCreationStrategy.SetupMethods)
            {
                proxy.SetupMethods(defaultData, objectCreationStrategy);
            }

            return(proxy);
        }
示例#22
0
        internal static T Create <T>(Type type, IDefaultData defaultData, ObjectCreationStrategy objectCreationStrategy)
        {
            if (!type.IsArray)
            {
                return(default(T));
            }

            var elementType = type.GetElementType();
            var array       = Array.CreateInstance(elementType, objectCreationStrategy.EnumerationCount);

            for (var i = 0; i < objectCreationStrategy.EnumerationCount; i++)
            {
                var arrayItem = elementType.Create(defaultData, objectCreationStrategy);
                array.SetValue(arrayItem, i);
            }
            return((T)(object)array);
        }
示例#23
0
        public static T Create <T>(Type type, IDefaultData defaultValue, ObjectCreationStrategy objectCreationStrategy)
        {
            if (type == null)
            {
                throw new ArgumentNullException(nameof(type));
            }

            var genericTypeParam = type.GetGenericArguments().FirstOrDefault();

            if (genericTypeParam != null)
            {
                var returnValue = FuncCreator.Create <T>(genericTypeParam, defaultValue, objectCreationStrategy);
                var result      = typeof(TaskCreator).InvokeGenericMethod(nameof(FromResult), new[] { genericTypeParam }, returnValue);
                return((T)result);
            }

            return((T)(object)Task.FromResult(0));
        }
        public static T Create <T>(IDefaultData defaultData, ObjectCreationStrategy objectCreationStrategy)
        {
            var type         = typeof(T);
            var defaultValue = type.GetDefaultValue(defaultData);

            if (defaultValue != null)
            {
                return((T)defaultValue);
            }

            if (type.IsInterface)
            {
                return(InterfaceCreator.Create <T>(type, defaultData, objectCreationStrategy));
            }

            if (type.IsAbstract)
            {
                return(AbstractClassCreator.Create <T>(type, defaultData, objectCreationStrategy));
            }

            if (type.IsArray)
            {
                return(ArrayCreator.Create <T>(type, defaultData, objectCreationStrategy));
            }

            if (type.IsAction())
            {
                return(ActionCreator.Create <T>(type));
            }

            if (type.IsFunc())
            {
                return(FuncCreator.Create <T>(type, defaultData, objectCreationStrategy));
            }

            if (type.IsTask())
            {
                return(TaskCreator.Create <T>(type, defaultData, objectCreationStrategy));
            }

            return(UnknownTypeCreator.CreateDynamicFrom <T>(type, defaultData, objectCreationStrategy));
        }
        private static void SetupMethod <T>(this T mock, IDefaultData defaultData, ObjectCreationStrategy objectCreationStrategy, MethodInfo methodInfo)
        {
            object returnValue;
            var    methodReturnType = methodInfo.ReturnType;

            if (methodReturnType.IsInterface)
            {
                returnValue = ForFunc(methodReturnType);
                returnValue.SetupProperties(defaultData, objectCreationStrategy);
            }
            else
            {
                returnValue = methodReturnType.Create(defaultData, objectCreationStrategy);
            }

            var arguments         = methodInfo.CreateAnyArgs();
            var methodReturnValue = methodInfo.Invoke(mock, arguments);
            var array             = methodReturnType.ToArray(0);

            ReturnsFunc(methodReturnType, methodReturnValue, returnValue, array);
        }
示例#26
0
        private static T CreateDynamic <T>(Type type, IDefaultData defaultData,
                                           ObjectCreationStrategy objectCreationStrategy)
        {
            var args = new object[] { };

            if (type.GetConstructors(ExpectedBindingFlags).Any())
            {
                args = type.CreateCtorArguments(defaultData, objectCreationStrategy);
            }

            T result = default(T);

            try
            {
                result = (T)Activator.CreateInstance(type, args);
            }
            catch (Exception)
            {
                Debug.WriteLine($"Could not create expected type: '{type.FullName}'");
            }

            return(result);
        }
示例#27
0
        internal static IEnumerable CreateEnumeration(Type enumerationType, IDefaultData defaultData, ObjectCreationStrategy objectCreationStrategy)
        {
            var enumerationItemType = enumerationType.GetGenericArguments()[0];
            var enumerationCount    = objectCreationStrategy.EnumerationCount;

            for (var i = 0; i < enumerationCount; i++)
            {
                var result = enumerationItemType.Create(defaultData, objectCreationStrategy);
                yield return(result);
            }
        }
示例#28
0
        internal static IEnumerable <T> CreateEnumerationWithObjects <T>(IDefaultData defaultData, ObjectCreationStrategy objectCreationStrategy)
        {
            var itemsCount = objectCreationStrategy.EnumerationCount;

            for (int i = 0; i < itemsCount; i++)
            {
                yield return(ObjectCreatorExtensions.Create <T>(defaultData, objectCreationStrategy));
            }
        }
示例#29
0
 internal static T Create <T>(Type type, IDefaultData defaultValue, ObjectCreationStrategy objectCreationStrategy)
 {
     return((T)Create(type, defaultValue, objectCreationStrategy));
 }
示例#30
0
        private static BlockExpression CreateReturnBlockExpression(Type funcType, IDefaultData defaultValue, ObjectCreationStrategy objectCreationStrategy)
        {
            var outputArgument  = funcType.GetGenericArguments().Last();
            var returnValue     = Expression.Constant(outputArgument.Create(defaultValue, objectCreationStrategy));
            var labelTarget     = Expression.Label(outputArgument);
            var expressionBlock = Expression.Block(Expression.Label(labelTarget, returnValue));

            return(expressionBlock);
        }