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; }
/// <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); }