private static IGen <object> ResolveGen(IGenFactory genFactory, IGen?customGen, ParameterInfo parameterInfo) { if (customGen == null) { var configuredGenFactory = ConfigureGenFactory(genFactory, parameterInfo); var createGenMethodInfo = typeof(IGenFactory) .GetMethod(nameof(IGenFactory.Create)) .MakeGenericMethod(parameterInfo.ParameterType); var gen = (IGen)createGenMethodInfo.Invoke(configuredGenFactory, new object[] { }); return(gen .Cast <object>() .SelectError(error => SelectParameterError(parameterInfo, error))); } else { var genTypeArgument = customGen.ReflectGenTypeArgument(); if (parameterInfo.ParameterType.IsAssignableFrom(genTypeArgument) == false) { return(Gen.Advanced.Error <object>( nameof(ParametersGen), $"generator of type '{genTypeArgument.FullName}' is not compatible with parameter of type '{parameterInfo.ParameterType.FullName}'")); } return(customGen.Cast <object>()); } }
private static IGenFactory ConfigureGenFactory(IGenFactory genFactory, ParameterInfo parameterInfo) { if (TryCreateGenFromAttribute(parameterInfo, out IGen? gen)) { return(genFactory.RegisterType(parameterInfo.ParameterType, gen !)); } return(genFactory); }
private static IGen <object[]> CreateGen( MethodInfo methodInfo, IGenFactory genFactory, IReadOnlyDictionary <int, IGen> customGens) { var parameters = methodInfo.GetParameters(); var invalidIndicies = customGens.Keys.Except(Enumerable.Range(0, parameters.Length)); if (invalidIndicies.Any()) { return(Gen.Advanced.Error <object[]>( nameof(ParametersGen), $"parameter index '{invalidIndicies.First()}' of custom generator was not valid")); } var gens = parameters.Select((parameterInfo, parameterIndex) => { var customGen = customGens.ContainsKey(parameterIndex) ? customGens[parameterIndex] : null; return(ResolveGen(genFactory, customGen, parameterInfo)); }); return(Gen.Zip(gens).Select(xs => xs.ToArray())); }
public ParametersGen(MethodInfo methodInfo, IGenFactory genFactory, IReadOnlyDictionary <int, IGen> customGens) { _lazyGen = new Lazy <IGen <object[]> >(() => CreateGen(methodInfo, genFactory, customGens)); }
public GenEmail(params string[] availableDomains) { this.domainGenerator = new GenDomain(availableDomains); }
public GenEmail() { this.firstNameGenerator = new GenFirstName(); this.lastNameGenerator = new GenLastName(); this.domainGenerator = new GenDomain(); }