private string[] ToConstructorNullArgsTestCaseSourceImp(ConstructorInfo[] constructors) { var lines = new List <string>(); var paramGroups = constructors.Select(i => i.GetParameters()).ToArray(); var havingTwoOrMoreNullableColumns = paramGroups.Where(g => g.Count(p => !p.ParameterType.IsValueType) > 1); var argTypes = havingTwoOrMoreNullableColumns.SelectMany(g => g) .Where(m_CSharpService.ShouldUseVariableForParameter); var variableDeclarations = argTypes .Distinct() .Select(c => m_CSharpService.GetLocalVariableDeclaration(c.ParameterType, false, false)) .ToArray(); foreach (var declaration in variableDeclarations) { lines.Add(declaration); } if (variableDeclarations.Any()) { lines.Add(string.Empty); } bool testCasesExist = false; int testCasesLineIndex = lines.Count; foreach (var ctor in constructors) { var typeName = ctor.DeclaringType?.Name; var parameterTypes = ctor.GetParameters(); var arguments = m_CSharpService.GetMethodArguments(ctor, true, false); for (int i = 0; i < parameterTypes.Length; i++) { if (parameterTypes[i].ParameterType.IsValueType) { continue; } testCasesExist = true; var name = parameterTypes[i].Name; var argumentsWithNulledParameter = new List <string>(arguments) { [i] = "null" }; lines.Add($"yield return new TestCaseData(new TestDelegate(() => new " + $"{typeName}({string.Join(", ", argumentsWithNulledParameter)}))).SetName(\"null {name}\");"); } } if (testCasesExist) { lines.Insert(testCasesLineIndex, "// ReSharper disable ObjectCreationAsStatement"); lines.Add("// ReSharper restore ObjectCreationAsStatement"); } return(lines.ToArray()); }
private string[] ToMethodNullArgsTestCaseSourceImp(MethodInfo[] infos, Type type) { var lines = new List <string>(); if (!infos.Any()) { return(lines.ToArray()); } var parametersForVars = infos.Select(i => i.GetParameters()) .Where(p => p.Length > 1) .SelectMany(p => p) .ToArray(); var variablesNeeded = parametersForVars.Where(p => !p.IsOut).ToArray(); var outVariablesNeeded = parametersForVars.Where(p => p.IsOut).Except(variablesNeeded).ToArray(); var variableDeclarations = m_CSharpService.GetVariableDeclarationsForParameters(variablesNeeded, setToNull: false, nonDefault: false); var outVariableDeclarations = m_CSharpService.GetVariableDeclarationsForParameters(outVariablesNeeded, setToNull: true, nonDefault: false); lines.AddRange(variableDeclarations); lines.AddRange(outVariableDeclarations); if (variableDeclarations.Union(outVariableDeclarations).Any()) { lines.Add(string.Empty); } var instanceName = m_CSharpService.GetNameForCSharp(type); bool testCasesExist = false; foreach (var info in infos) { var methodName = info.Name; var parameters = info.GetParameters(); var arguments = m_CSharpService.GetMethodArguments(info, true, false); for (var i = 0; i < parameters.Length; i++) { if (parameters[i].ParameterType.IsValueType) { continue; } if (m_CSharpService.HasParamKeyword(parameters[i])) { continue; } testCasesExist = true; var copyOfArguments = new List <string>(arguments) { [i] = "null" }; lines.Add($"yield return new TestCaseData(new TestDelegate(() => " + $"{instanceName}.{methodName}({string.Join(", ", copyOfArguments)})))" + $".SetName(\"{methodName} with null {parameters[i].Name}\");"); } } return(testCasesExist ? lines.ToArray() : new string[0]); }
private string[] GetTestCaseSource(Type type, Func <BindingFlags, MethodBase[]> methodGetter) { var hasArrayAssignables = methodGetter(BindingFlags.Public | BindingFlags.Instance) .Where(t => t.IsConstructor || type.IsMethodTestable(t)) .Where(m => m.GetParameters() .Select(p => p.ParameterType) .Any(t => m_CSharpService.IsArrayAssignable(t) && !m_CSharpService.GetArrayElementType(t).IsValueType)) .ToArray(); var hasDateTimeParameter = methodGetter(BindingFlags.Public | BindingFlags.Instance) .Where(t => t.IsConstructor || type.IsMethodTestable(t)) .Where(m => m.GetParameters() .Select(p => p.ParameterType) .Any(t => t == typeof(DateTime) || t == typeof(DateTime?))) .ToArray(); var testableMethods = hasArrayAssignables.Concat(hasDateTimeParameter).Distinct().ToArray(); var lines = new List <string>(); if (!testableMethods.Any()) { return(new string[0]); } var isCtor = testableMethods.Any(m => m.IsConstructor); var parametersNeedingVariables = testableMethods.Select(i => i.GetParameters()) .SelectMany(p => p) .Where(m_CSharpService.ShouldUseVariableForParameter) .GroupBy(p => p.ParameterType).Select(g => g.First()) .ToArray(); var inParameters = parametersNeedingVariables.Where(p => !p.IsOut).ToArray(); var outParamters = parametersNeedingVariables.Where(p => p.IsOut).Except(inParameters).ToArray(); var variableDeclarations = m_CSharpService.GetVariableDeclarationsForParameters(inParameters, setToNull: false, nonDefault: false); var outVariableDeclarations = m_CSharpService.GetVariableDeclarationsForParameters(outParamters, setToNull: true, nonDefault: false); lines.AddRange(variableDeclarations); lines.AddRange(outVariableDeclarations); if (variableDeclarations.Union(outVariableDeclarations).Any()) { lines.Add(string.Empty); } var instanceName = m_CSharpService.GetIdentifier(type, VarScope.Local); if (!isCtor) { lines.AddRange(m_CSharpService.GetStubbedInstantiation(type)); lines.Add(string.Empty); } bool testCasesExist = false; foreach (var info in testableMethods) { var methodName = info.Name; var parameters = info.GetParameters(); var arguments = m_CSharpService.GetMethodArguments(info, true, false); for (var i = 0; i < parameters.Length; i++) { if (m_CSharpService.HasParamKeyword(parameters[i])) { continue; } var pType = parameters[i].ParameterType; var copyOfArguments = new List <string>(arguments); string testNameSuffix; if (m_CSharpService.IsArrayAssignable(pType)) { var arrayElementType = m_CSharpService.GetArrayElementType(pType); if (arrayElementType.IsValueType) { continue; } var instance = m_CSharpService.GetNameForCSharp(arrayElementType); copyOfArguments[i] = $"new {instance}[] {{ null }}"; testNameSuffix = "contains null"; } else if (pType == typeof(DateTime) || pType == typeof(DateTime?)) { copyOfArguments[i] = $"DateTime.MinValue"; testNameSuffix = "not UTC"; } else { continue; } testCasesExist = true; var invocation = isCtor ? $"new {m_CSharpService.GetNameForCSharp(type)}" : $"{instanceName}.{methodName}"; lines.Add($"yield return new TestCaseData(new TestDelegate(() => " + $"{invocation}({string.Join(", ", copyOfArguments)})))" + $".SetName(\"{methodName} with {parameters[i].Name} {testNameSuffix}\");"); } } return(testCasesExist ? lines.ToArray() : new string[0]); }