using System; using System.Reflection; using AutoFixture; using AutoFixture.Kernel; using AutoFixture.Xunit2; using Elsa.Testing.Shared.AutoFixture.Specifications; using Elsa.Testing.Shared.Helpers; namespace Elsa.Testing.Shared.AutoFixture.Attributes { public abstract class ElsaHostBuilderBuilderCustomizeAttributeBase : CustomizeAttribute { public abstract Action GetBuilderCustomizer(); public override ICustomization GetCustomization(ParameterInfo parameter) => new ElsaHostBuilderBuilderCustomization(GetBuilderCustomizer()); class ElsaHostBuilderBuilderCustomization : ICustomization { readonly Action builderCustomizer; public void Customize(IFixture fixture) { fixture.Behaviors.Add(new ElsaHostBuilderBuilderTransformation(builderCustomizer)); } public ElsaHostBuilderBuilderCustomization(Action builderCustomizer) { this.builderCustomizer = builderCustomizer ?? throw new ArgumentNullException(nameof(builderCustomizer)); } } class ElsaHostBuilderBuilderTransformation : ISpecimenBuilderTransformation { readonly Action builderCustomizer; public ISpecimenBuilderNode Transform(ISpecimenBuilder builder) { return new Postprocessor(builder, new ElsaHostBuilderBuilderCommand(builderCustomizer), IsInstanceOf.Type()); } public ElsaHostBuilderBuilderTransformation(Action builderCustomizer) { this.builderCustomizer = builderCustomizer ?? throw new ArgumentNullException(nameof(builderCustomizer)); } } class ElsaHostBuilderBuilderCommand : ISpecimenCommand { readonly Action builderCustomizer; public void Execute(object specimen, ISpecimenContext context) { var builder = (ElsaHostBuilderBuilder) specimen; builderCustomizer(builder); } public ElsaHostBuilderBuilderCommand(Action builderCustomizer) { this.builderCustomizer = builderCustomizer ?? throw new ArgumentNullException(nameof(builderCustomizer)); } } } }