protected void CheckTypes() { var types = _originalTypes .Where(t => !ExcludedTypes.Contains(t) && !(ExcludeTypeCallback?.Invoke(t) ?? false)) .ToList(); var abstractions = _abstractionTypes .Where(t => !ExcludedTypes.Contains(t) && !(ExcludeTypeCallback?.Invoke(t) ?? false)) .ToList(); var missingAbstractions = new List <Type>(); foreach (var t in GetTypes()) { types.Remove(t.Original); if (t.Abstraction == null) { missingAbstractions.Add(t.Original); } else { abstractions.Remove(t.Abstraction); } } missingAbstractions.Should().BeEmpty($"abstraction for following {missingAbstractions.Count} type(s) not found: {String.Join(", ", missingAbstractions.Select(t => t.FullName))}"); types.Should().BeEmpty(); abstractions.Should().BeEmpty(); }
protected void CheckConstructors(params Type[] skipTypes) { var adapterTypes = _adapterTypes .Where(t => !ExcludedTypes.Contains(t) && !(ExcludeTypeCallback?.Invoke(t) ?? false)) .ToList(); foreach (var types in GetTypes().Where(t => t.Abstraction != null)) { if (types.Abstraction != null && types.Original != null && !IsStatic(types.Original) && !skipTypes.Contains(types.Original)) { var adapter = FindAdapters(adapterTypes, types.Abstraction).FirstOrDefault(); if (adapter != null && !skipTypes.Contains(adapter)) { var adapterConstructors = adapter.GetConstructors(); var wrapperConstructor = FindConstructor(adapterConstructors, types.Original); wrapperConstructor.Should().NotBeNull($"The adapter {adapter.Name} of abstraction {types.Abstraction.Name} must have a ctor({types.Original.Name})"); var originalConstructors = types.Original.GetConstructors(); foreach (var originalCtor in originalConstructors) { if (originalCtor.GetCustomAttribute <ObsoleteAttribute>() == null) { var orginalParams = originalCtor.GetParameters().Select(p => p.ParameterType).ToArray(); var adapterCtor = FindConstructor(adapterConstructors, orginalParams); adapterCtor.Should().NotBeNull($"The adapter {adapter.Name} of abstraction {types.Abstraction.Name} must have a ctor({String.Join(", ", orginalParams.Select(p => p.Name))})"); } } } } } }
private IEnumerable <(Type Original, Type Abstraction)> GetTypes() { foreach (var originalType in _originalTypes) { if (CustomTypeMappings.TryGet(originalType, out var abstractionTypes)) { foreach (var abstractionType in abstractionTypes) { yield return(originalType, abstractionType); } } else { if (ExcludedTypes.Contains(originalType)) { continue; } if (ExcludeTypeCallback?.Invoke(originalType) == true) { continue; } var abstractionTypeName = BuildAbstractionTypeName(originalType); var abstractionType = _abstractionTypes.FirstOrDefault(t => t.FullName == abstractionTypeName); yield return(originalType, abstractionType); } } }
protected void CheckAdapters() { var abstractions = _abstractionTypes .Where(t => !ExcludedTypes.Contains(t) && !(ExcludeTypeCallback?.Invoke(t) ?? false)) .ToList(); var adapterTypes = _adapterTypes .Where(t => !ExcludedTypes.Contains(t) && !(ExcludeTypeCallback?.Invoke(t) ?? false)) .ToList(); foreach (var abstractionType in abstractions) { var adapters = FindAdapters(adapterTypes, abstractionType); adapters.Should().HaveCount(1, $"abstraction {abstractionType.Name} must have an adapter."); } }