예제 #1
0
파일: Cache.cs 프로젝트: imintsystems/Kean
 public ISerializer Find(Reflect.Type type, bool deserialize)
 {
     ISerializer result = null;
     if (type.NotNull())
     {
         if (this.cache[deserialize ? 1 : 0].Contains(type))
             result = this.cache[deserialize ? 1 : 0][type];
         else
         {
             MethodAttribute[] attributes;
             if (type.Category != Reflect.TypeCategory.Primitive && (attributes = type.GetAttributes<MethodAttribute>()).Length == 1)
                 result = attributes[0].Serializer;
             else
                 result = serializer.Find(type, deserialize);
             if (result.NotNull())
                 this.cache[deserialize ? 1 : 0][type] = result;
         }
     }
     return result;
 }
예제 #2
0
        /// <summary>
        /// Return an IEnumerable providing test cases for use in
        /// running a parameterized test.
        /// </summary>
        /// <param name="method"></param>
        /// <returns></returns>
        public IEnumerable GetTestCasesFor(MethodInfo method)
        {
            ArrayList list = new ArrayList();

            Attribute[] attrs = Reflect.GetAttributes(method, NUnitFramework.TestCaseAttribute, false);

            ParameterInfo[] parameters = method.GetParameters();
            int             argsNeeded = parameters.Length;

            foreach (Attribute attr in attrs)
            {
                ParameterSet parms;

                try
                {
                    parms = ParameterSet.FromDataSource(attr);
                    int argsProvided = parms.Arguments.Length;

                    // Special handling for params arguments
                    if (argsNeeded > 0 && argsProvided >= argsNeeded - 1)
                    {
                        ParameterInfo lastParameter     = parameters[argsNeeded - 1];
                        Type          lastParameterType = lastParameter.ParameterType;
                        Type          elementType       = lastParameterType.GetElementType();

                        if (lastParameterType.IsArray && lastParameter.IsDefined(typeof(ParamArrayAttribute), false))
                        {
                            if (argsProvided == argsNeeded)
                            {
                                Type lastArgumentType = parms.Arguments[argsProvided - 1].GetType();
                                if (!lastParameterType.IsAssignableFrom(lastArgumentType))
                                {
                                    Array array = Array.CreateInstance(elementType, 1);
                                    array.SetValue(parms.Arguments[argsProvided - 1], 0);
                                    parms.Arguments[argsProvided - 1] = array;
                                }
                            }
                            else
                            {
                                object[] newArglist = new object[argsNeeded];
                                for (int i = 0; i < argsNeeded && i < argsProvided; i++)
                                {
                                    newArglist[i] = parms.Arguments[i];
                                }

                                int   length = argsProvided - argsNeeded + 1;
                                Array array  = Array.CreateInstance(elementType, length);
                                for (int i = 0; i < length; i++)
                                {
                                    array.SetValue(parms.Arguments[argsNeeded + i - 1], i);
                                }

                                newArglist[argsNeeded - 1] = array;
                                parms.Arguments            = newArglist;
                                argsProvided = argsNeeded;
                            }
                        }
                    }

                    //if (method.GetParameters().Length == 1 && method.GetParameters()[0].ParameterType == typeof(object[]))
                    //    parms.Arguments = new object[]{parms.Arguments};

                    // Special handling when sole argument is an object[]
                    if (argsNeeded == 1 && method.GetParameters()[0].ParameterType == typeof(object[]))
                    {
                        if (argsProvided > 1 ||
                            argsProvided == 1 && parms.Arguments[0].GetType() != typeof(object[]))
                        {
                            parms.Arguments = new object[] { parms.Arguments };
                        }
                    }


                    if (argsProvided == argsNeeded)
                    {
                        PerformSpecialConversions(parms.Arguments, parameters);
                    }
                }
                catch (Exception ex)
                {
                    parms = new ParameterSet(ex);
                }

                list.Add(parms);
            }

            return(list);
        }