diff --git a/Common.Test.props b/Common.Test.props index 81c96ec..f0100ac 100644 --- a/Common.Test.props +++ b/Common.Test.props @@ -21,11 +21,10 @@ - - - + + - + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/Common.props b/Common.props index 40704ef..5cebd21 100644 --- a/Common.props +++ b/Common.props @@ -70,6 +70,6 @@ - + diff --git a/build/_build.csproj b/build/_build.csproj index 5e49830..f422706 100644 --- a/build/_build.csproj +++ b/build/_build.csproj @@ -16,8 +16,8 @@ - - + + diff --git a/global.json b/global.json index 75a80e9..3c3c26a 100644 --- a/global.json +++ b/global.json @@ -1,6 +1,9 @@ { "sdk": { - "version": "8.0.0", + "version": "10.0.0", "rollForward": "latestMinor" + }, + "test": { + "runner": "Microsoft.Testing.Platform" } } \ No newline at end of file diff --git a/src/AutoFixture.TUnit/AutoArgumentsAttribute.cs b/src/AutoFixture.TUnit/AutoArgumentsAttribute.cs index cb031d4..9d41b0b 100644 --- a/src/AutoFixture.TUnit/AutoArgumentsAttribute.cs +++ b/src/AutoFixture.TUnit/AutoArgumentsAttribute.cs @@ -43,10 +43,9 @@ protected AutoArgumentsAttribute(Func fixtureFactory, params object?[] public object?[] Values { get; } /// - public override IEnumerable GetData(DataGeneratorMetadata dataGeneratorMetadata) + public override IAsyncEnumerable>> GetData(DataGeneratorMetadata dataGeneratorMetadata) { return new AutoDataSource(this.FixtureFactory, new InlineDataSource(this.Values)) - .GenerateDataSources(dataGeneratorMetadata) - .Select(x => x()); + .GetDataRowsAsync(dataGeneratorMetadata); } } \ No newline at end of file diff --git a/src/AutoFixture.TUnit/AutoClassDataSourceAttribute.cs b/src/AutoFixture.TUnit/AutoClassDataSourceAttribute.cs index 267303c..ff575a7 100644 --- a/src/AutoFixture.TUnit/AutoClassDataSourceAttribute.cs +++ b/src/AutoFixture.TUnit/AutoClassDataSourceAttribute.cs @@ -83,11 +83,11 @@ protected AutoClassDataSourceAttribute(Func fixtureFactory, Type sourc public object?[] Parameters { get; } /// - public override IEnumerable GetData(DataGeneratorMetadata dataGeneratorMetadata) + public override IAsyncEnumerable>> GetData(DataGeneratorMetadata dataGeneratorMetadata) { var source = new AutoDataSource(this.FixtureFactory, new ClassDataSource(this.SourceType, this.Parameters)); - return source.GenerateDataSources(dataGeneratorMetadata).Select(x => x()); + return source.GetDataRowsAsync(dataGeneratorMetadata); } } \ No newline at end of file diff --git a/src/AutoFixture.TUnit/AutoDataSourceAttribute.cs b/src/AutoFixture.TUnit/AutoDataSourceAttribute.cs index 08ab7f0..a09281f 100644 --- a/src/AutoFixture.TUnit/AutoDataSourceAttribute.cs +++ b/src/AutoFixture.TUnit/AutoDataSourceAttribute.cs @@ -42,10 +42,10 @@ protected AutoDataSourceAttribute(Func fixtureFactory) public Func FixtureFactory { get; } /// - public override IEnumerable GetData(DataGeneratorMetadata dataGeneratorMetadata) + public override IAsyncEnumerable>> GetData(DataGeneratorMetadata dataGeneratorMetadata) { var source = new AutoDataSource(this.FixtureFactory); - return source.GenerateDataSources(dataGeneratorMetadata).Select(x => x()); + return source.GetDataRowsAsync(dataGeneratorMetadata); } } \ No newline at end of file diff --git a/src/AutoFixture.TUnit/AutoFixture.TUnit.csproj b/src/AutoFixture.TUnit/AutoFixture.TUnit.csproj index f945639..c5515f8 100644 --- a/src/AutoFixture.TUnit/AutoFixture.TUnit.csproj +++ b/src/AutoFixture.TUnit/AutoFixture.TUnit.csproj @@ -3,7 +3,7 @@ - netstandard2.0;net8.0 + netstandard2.0;net8.0;net10.0 AutoFixture.TUnit @@ -12,7 +12,11 @@ - + + runtime; build; native; contentfiles; analyzers; buildtransitive + all + + diff --git a/src/AutoFixture.TUnit/AutoMemberDataSourceAttribute.cs b/src/AutoFixture.TUnit/AutoMemberDataSourceAttribute.cs index d974f56..8202518 100644 --- a/src/AutoFixture.TUnit/AutoMemberDataSourceAttribute.cs +++ b/src/AutoFixture.TUnit/AutoMemberDataSourceAttribute.cs @@ -84,7 +84,7 @@ protected AutoMemberDataSourceAttribute(Func fixtureFactory, Type? mem public object?[] Parameters { get; } /// - public override IEnumerable GetData(DataGeneratorMetadata dataGeneratorMetadata) + public override IAsyncEnumerable>> GetData(DataGeneratorMetadata dataGeneratorMetadata) { var testMethod = dataGeneratorMetadata.GetMethod(); @@ -100,6 +100,6 @@ protected AutoMemberDataSourceAttribute(Func fixtureFactory, Type? mem createFixture: this.FixtureFactory, source: new MemberDataSource(sourceType, this.MemberName, this.Parameters)); - return source.GenerateDataSources(dataGeneratorMetadata).Select(x => x()); + return source.GetDataRowsAsync(dataGeneratorMetadata); } } \ No newline at end of file diff --git a/src/AutoFixture.TUnit/BaseDataSourceAttribute.cs b/src/AutoFixture.TUnit/BaseDataSourceAttribute.cs index e72d94e..39d8fc6 100644 --- a/src/AutoFixture.TUnit/BaseDataSourceAttribute.cs +++ b/src/AutoFixture.TUnit/BaseDataSourceAttribute.cs @@ -5,7 +5,8 @@ namespace AutoFixture.TUnit; /// /// Base class for data sources that provide AutoFixture test data for TUnit data driven tests. /// -public abstract class BaseDataSourceAttribute : NonTypedDataSourceGeneratorAttribute, IDataSource +[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = true)] +public abstract class BaseDataSourceAttribute : Attribute, IDataSourceAttribute, IDataSource { /// /// Returns the test data provided by the source. @@ -17,35 +18,32 @@ public abstract class BaseDataSourceAttribute : NonTypedDataSourceGeneratorAttri /// Returns a sequence of argument collections, where each collection /// is an array of objects representing the arguments for a test method. /// - public abstract IEnumerable GetData(DataGeneratorMetadata dataGeneratorMetadata); + public abstract IAsyncEnumerable>> GetData(DataGeneratorMetadata dataGeneratorMetadata); /// - public override IEnumerable> GenerateDataSources(DataGeneratorMetadata dataGeneratorMetadata) + public bool SkipIfEmpty { get; set; } + + /// + public async IAsyncEnumerable>> GetDataRowsAsync(DataGeneratorMetadata dataGeneratorMetadata) { if (dataGeneratorMetadata is null) throw new ArgumentNullException(nameof(dataGeneratorMetadata)); - return GetTestDataEnumerable(); + var parameters = dataGeneratorMetadata.MembersToGenerate; + if (parameters.Length == 0) + { + // If the method has no parameters, a single test run is enough. + yield return () => Task.FromResult(Array.Empty()); + yield break; + } + + var enumerable = this.GetData(dataGeneratorMetadata) + ?? throw new InvalidOperationException("The source member yielded no test data."); - IEnumerable> GetTestDataEnumerable() + await foreach (var testDataFunc in enumerable) { - var parameters = dataGeneratorMetadata.MembersToGenerate; - if (parameters.Length == 0) - { - // If the method has no parameters, a single test run is enough. - yield return () => []; - yield break; - } - - var enumerable = this.GetData(dataGeneratorMetadata) - ?? throw new InvalidOperationException("The source member yielded no test data."); - - foreach (var testData in enumerable) - { - if (testData is null) throw new InvalidOperationException("The source member yielded a null test data."); - if (testData.Length > parameters.Length) throw new InvalidOperationException("The number of arguments provided exceeds the number of parameters."); - - yield return () => testData; - } + if (testDataFunc is null) throw new InvalidOperationException("The source member yielded a null test data."); + + yield return testDataFunc; } } } diff --git a/src/AutoFixture.TUnit/CompositeDataSourceAttribute.cs b/src/AutoFixture.TUnit/CompositeDataSourceAttribute.cs index 7f97819..97c8e0f 100644 --- a/src/AutoFixture.TUnit/CompositeDataSourceAttribute.cs +++ b/src/AutoFixture.TUnit/CompositeDataSourceAttribute.cs @@ -36,22 +36,33 @@ public CompositeDataSourceAttribute(params BaseDataSourceAttribute[] attributes) public IReadOnlyList Attributes => Array.AsReadOnly(this.attributes); /// - public override IEnumerable GetData(DataGeneratorMetadata dataGeneratorMetadata) + public override async IAsyncEnumerable>> GetData(DataGeneratorMetadata dataGeneratorMetadata) { if (dataGeneratorMetadata is null) { throw new ArgumentNullException(nameof(dataGeneratorMetadata)); } - var results = this.attributes - .Select(attr => attr.GenerateDataSources(dataGeneratorMetadata)) - .ToArray(); + var results = await Task.WhenAll(this.attributes + .Select(async attr => + { + var rows = new List(); + await foreach (var rowFunc in attr.GetDataRowsAsync(dataGeneratorMetadata)) + { + var row = await rowFunc() + ?? throw new InvalidOperationException("The source member yielded a null test data."); + rows.Add(row); + } + + return (IEnumerable)rows; + })); var theoryRows = results - .Select(x => x.Select(y => y())) - .Zip(dataSets => dataSets.Collapse().ToArray()) - .ToArray(); + .Zip(dataSets => dataSets.Collapse().ToArray()); - return theoryRows; + foreach (var row in theoryRows) + { + yield return () => Task.FromResult(row); + } } } \ No newline at end of file diff --git a/src/AutoFixture.TUnit/Internal/AutoDataSource.cs b/src/AutoFixture.TUnit/Internal/AutoDataSource.cs index 308a552..00c75c8 100644 --- a/src/AutoFixture.TUnit/Internal/AutoDataSource.cs +++ b/src/AutoFixture.TUnit/Internal/AutoDataSource.cs @@ -34,28 +34,30 @@ public AutoDataSource(Func createFixture, IDataSource? source = null) /// /// The target method for which to provide the arguments. /// Returns a sequence of argument collections. - public override IEnumerable GetData(DataGeneratorMetadata dataGeneratorMetadata) + public override IAsyncEnumerable>> GetData(DataGeneratorMetadata dataGeneratorMetadata) { return this.Source is null ? this.GenerateValues(dataGeneratorMetadata) : this.CombineValues(dataGeneratorMetadata, this.Source); } - private IEnumerable GenerateValues(DataGeneratorMetadata metadata) + private IAsyncEnumerable>> GenerateValues(DataGeneratorMetadata metadata) { var parameters = Array.ConvertAll(metadata.GetMethod().GetParameters(), TestParameter.From); var fixture = this.CreateFixture(); - yield return Array.ConvertAll(parameters, parameter => GenerateAutoValue(parameter, fixture)); + return new[] { Array.ConvertAll(parameters, parameter => (object?)GenerateAutoValue(parameter, fixture)) }.ToAsyncDataSource(); } - private IEnumerable CombineValues(DataGeneratorMetadata metadata, IDataSource source) + private async IAsyncEnumerable>> CombineValues(DataGeneratorMetadata metadata, IDataSource source) { var method = metadata.GetMethod(); var parameters = Array.ConvertAll(method.GetParameters(), TestParameter.From); - foreach (var testData in source.GetData(metadata)) + await foreach (var testDataFunc in source.GetData(metadata)) { + var testData = await testDataFunc(); + var customizations = parameters.Take(testData!.Length) .Zip(testData, (parameter, value) => new Argument(parameter, value)) .Select(argument => argument.GetCustomization()) @@ -72,7 +74,8 @@ public AutoDataSource(Func createFixture, IDataSource? source = null) .Select(parameter => GenerateAutoValue(parameter, fixture)) .ToArray(); - yield return testData.Concat(missingValues).ToArray(); + var combined = testData.Concat(missingValues).ToArray(); + yield return () => Task.FromResult(combined); } } diff --git a/src/AutoFixture.TUnit/Internal/ClassDataSource.cs b/src/AutoFixture.TUnit/Internal/ClassDataSource.cs index 60c670d..2b194f8 100644 --- a/src/AutoFixture.TUnit/Internal/ClassDataSource.cs +++ b/src/AutoFixture.TUnit/Internal/ClassDataSource.cs @@ -34,7 +34,7 @@ public ClassDataSource(Type type, params object?[] parameters) public IReadOnlyList Parameters => Array.AsReadOnly(this.parameters); /// - public override IEnumerable GetData(DataGeneratorMetadata dataGeneratorMetadata) + public override IAsyncEnumerable>> GetData(DataGeneratorMetadata dataGeneratorMetadata) { var instance = Activator.CreateInstance(type: this.Type, args: this.parameters); @@ -43,6 +43,6 @@ public ClassDataSource(Type type, params object?[] parameters) throw new InvalidOperationException($"Data source type \"{this.Type}\" should implement the \"{typeof(IEnumerable)}\" interface."); } - return enumerable; + return enumerable.ToAsyncDataSource(); } } \ No newline at end of file diff --git a/src/AutoFixture.TUnit/Internal/DataGeneratorMetadataExtensions.cs b/src/AutoFixture.TUnit/Internal/DataGeneratorMetadataExtensions.cs index e56c9eb..96e7d9c 100644 --- a/src/AutoFixture.TUnit/Internal/DataGeneratorMetadataExtensions.cs +++ b/src/AutoFixture.TUnit/Internal/DataGeneratorMetadataExtensions.cs @@ -1,5 +1,6 @@ using System.Reflection; using TUnit.Core.Enums; +using TUnit.Core.Extensions; namespace AutoFixture.TUnit.Internal; @@ -7,11 +8,16 @@ internal static class DataGeneratorMetadataExtensions { public static MethodBase GetMethod(this DataGeneratorMetadata dataGeneratorMetadata) { + if (dataGeneratorMetadata.TestInformation == null) + { + throw new InvalidOperationException("Not a test method"); + } + if (dataGeneratorMetadata.Type == DataGeneratorType.ClassParameters) { - return dataGeneratorMetadata.TestClassType.GetConstructors().First(); + return dataGeneratorMetadata.TestInformation.Class.Type.GetConstructors().First(); } - return dataGeneratorMetadata.TestInformation.ReflectionInformation; + return dataGeneratorMetadata.TestInformation.GetReflectionInfo(); } } \ No newline at end of file diff --git a/src/AutoFixture.TUnit/Internal/DataSource.cs b/src/AutoFixture.TUnit/Internal/DataSource.cs index c51e5c0..a7cd44b 100644 --- a/src/AutoFixture.TUnit/Internal/DataSource.cs +++ b/src/AutoFixture.TUnit/Internal/DataSource.cs @@ -9,4 +9,4 @@ namespace AutoFixture.TUnit.Internal; Justification = "The type is not a collection.")] [SuppressMessage("Naming", "CA1710:Identifiers should have correct suffix", Justification = "The type is not a collection.")] -public abstract class DataSource : BaseDataSourceAttribute, IDataSource; \ No newline at end of file +public abstract class DataSource : BaseDataSourceAttribute; \ No newline at end of file diff --git a/src/AutoFixture.TUnit/Internal/EnumerableExtensions.cs b/src/AutoFixture.TUnit/Internal/EnumerableExtensions.cs index f05c768..81c218c 100644 --- a/src/AutoFixture.TUnit/Internal/EnumerableExtensions.cs +++ b/src/AutoFixture.TUnit/Internal/EnumerableExtensions.cs @@ -40,4 +40,15 @@ internal static IEnumerable Collapse(this IEnumerable> sequ } } } + + #pragma warning disable CS1998 // Async method lacks 'await' - required for IAsyncEnumerable yield + internal static async IAsyncEnumerable>> ToAsyncDataSource( + #pragma warning restore CS1998 + this IEnumerable source) + { + foreach (var item in source) + { + yield return () => Task.FromResult(item); + } + } } \ No newline at end of file diff --git a/src/AutoFixture.TUnit/Internal/FieldDataSource.cs b/src/AutoFixture.TUnit/Internal/FieldDataSource.cs index 708d86c..9784b2d 100644 --- a/src/AutoFixture.TUnit/Internal/FieldDataSource.cs +++ b/src/AutoFixture.TUnit/Internal/FieldDataSource.cs @@ -34,14 +34,15 @@ public FieldDataSource(FieldInfo fieldInfo) /// /// Thrown when the field does not return an enumerable value. /// - public override IEnumerable GetData(DataGeneratorMetadata dataGeneratorMetadata) + public override IAsyncEnumerable>> GetData(DataGeneratorMetadata dataGeneratorMetadata) { var value = this.FieldInfo.GetValue(null); + if (value is not IEnumerable enumerable) { throw new InvalidCastException("Member does not return an enumerable value."); } - return enumerable; + return enumerable.ToAsyncDataSource(); } } \ No newline at end of file diff --git a/src/AutoFixture.TUnit/Internal/IDataSource.cs b/src/AutoFixture.TUnit/Internal/IDataSource.cs index 7fa5279..aea9f87 100644 --- a/src/AutoFixture.TUnit/Internal/IDataSource.cs +++ b/src/AutoFixture.TUnit/Internal/IDataSource.cs @@ -10,5 +10,5 @@ public interface IDataSource /// /// The target method for which to provide the arguments. /// Returns a sequence of argument collections. - IEnumerable GetData(DataGeneratorMetadata dataGeneratorMetadata); + IAsyncEnumerable>> GetData(DataGeneratorMetadata dataGeneratorMetadata); } \ No newline at end of file diff --git a/src/AutoFixture.TUnit/Internal/InlineDataSource.cs b/src/AutoFixture.TUnit/Internal/InlineDataSource.cs index 192d4b0..a59f1d8 100644 --- a/src/AutoFixture.TUnit/Internal/InlineDataSource.cs +++ b/src/AutoFixture.TUnit/Internal/InlineDataSource.cs @@ -29,7 +29,9 @@ public InlineDataSource(object?[] values) public IReadOnlyList Values => Array.AsReadOnly(this.values); /// - public override IEnumerable GetData(DataGeneratorMetadata dataGeneratorMetadata) + #pragma warning disable CS1998 // Async method lacks 'await' - required for IAsyncEnumerable yield + public override async IAsyncEnumerable>> GetData(DataGeneratorMetadata dataGeneratorMetadata) + #pragma warning restore CS1998 { if (dataGeneratorMetadata is null) { @@ -43,6 +45,6 @@ public InlineDataSource(object?[] values) "The number of arguments provided exceeds the number of parameters."); } - yield return this.values; + yield return () => Task.FromResult(this.values); } } \ No newline at end of file diff --git a/src/AutoFixture.TUnit/Internal/MemberDataSource.cs b/src/AutoFixture.TUnit/Internal/MemberDataSource.cs index a97d2ff..e8ded91 100644 --- a/src/AutoFixture.TUnit/Internal/MemberDataSource.cs +++ b/src/AutoFixture.TUnit/Internal/MemberDataSource.cs @@ -79,8 +79,8 @@ private DataSource GetTestDataSource() } /// - public IEnumerable GetData(DataGeneratorMetadata dataGeneratorMetadata) + public IAsyncEnumerable>> GetData(DataGeneratorMetadata dataGeneratorMetadata) { - return this.Source.GenerateDataSources(dataGeneratorMetadata).Select(x => x()); + return this.Source.GetDataRowsAsync(dataGeneratorMetadata); } } \ No newline at end of file diff --git a/src/AutoFixture.TUnit/Internal/MethodDataSource.cs b/src/AutoFixture.TUnit/Internal/MethodDataSource.cs index f896b64..91a6221 100644 --- a/src/AutoFixture.TUnit/Internal/MethodDataSource.cs +++ b/src/AutoFixture.TUnit/Internal/MethodDataSource.cs @@ -34,14 +34,15 @@ public MethodDataSource(MethodInfo methodInfo, params object?[] arguments) public IReadOnlyList Arguments => Array.AsReadOnly(this.arguments); /// - public override IEnumerable GetData(DataGeneratorMetadata dataGeneratorMetadata) + public override IAsyncEnumerable>> GetData(DataGeneratorMetadata dataGeneratorMetadata) { var value = this.MethodInfo.Invoke(null, this.arguments); + if (value is not IEnumerable enumerable) { throw new InvalidCastException("Member does not return an enumerable value."); } - return enumerable; + return enumerable.ToAsyncDataSource(); } } \ No newline at end of file diff --git a/src/AutoFixture.TUnit/Internal/PropertyDataSource.cs b/src/AutoFixture.TUnit/Internal/PropertyDataSource.cs index fad40b8..f6ee139 100644 --- a/src/AutoFixture.TUnit/Internal/PropertyDataSource.cs +++ b/src/AutoFixture.TUnit/Internal/PropertyDataSource.cs @@ -26,7 +26,7 @@ public PropertyDataSource(PropertyInfo propertyInfo) public PropertyInfo PropertyInfo { get; } /// - public override IEnumerable GetData(DataGeneratorMetadata dataGeneratorMetadata) + public override IAsyncEnumerable>> GetData(DataGeneratorMetadata dataGeneratorMetadata) { var value = this.PropertyInfo.GetValue(null); @@ -35,6 +35,6 @@ public PropertyDataSource(PropertyInfo propertyInfo) throw new InvalidCastException("Member does not return an enumerable value."); } - return enumerable; + return enumerable.ToAsyncDataSource(); } } \ No newline at end of file diff --git a/tests/AutoFixture.TUnit.Tests/AutoArgumentsAttributeTests.cs b/tests/AutoFixture.TUnit.Tests/AutoArgumentsAttributeTests.cs index a90b40b..9714b8d 100644 --- a/tests/AutoFixture.TUnit.Tests/AutoArgumentsAttributeTests.cs +++ b/tests/AutoFixture.TUnit.Tests/AutoArgumentsAttributeTests.cs @@ -113,8 +113,8 @@ public async Task GetDataOrdersCustomizationAttributes(string methodName) } [Test] - [MethodDataSource(typeof(InlinePrimitiveValuesTestData), nameof(InlinePrimitiveValuesTestData.GetData))] - [MethodDataSource(typeof(InlineFrozenValuesTestData), nameof(InlineFrozenValuesTestData.GetData))] + [MethodDataSource(typeof(InlinePrimitiveValuesTestData), nameof(InlinePrimitiveValuesTestData.GetTestData))] + [MethodDataSource(typeof(InlineFrozenValuesTestData), nameof(InlineFrozenValuesTestData.GetTestData))] public async Task ReturnsSingleTestDataWithExpectedValues(BaseDataSourceAttribute attribute, MethodInfo testMethod, object[] expected) { diff --git a/tests/AutoFixture.TUnit.Tests/AutoDataSourceAttributeTests.cs b/tests/AutoFixture.TUnit.Tests/AutoDataSourceAttributeTests.cs index 9af552a..a7da5ec 100644 --- a/tests/AutoFixture.TUnit.Tests/AutoDataSourceAttributeTests.cs +++ b/tests/AutoFixture.TUnit.Tests/AutoDataSourceAttributeTests.cs @@ -1,7 +1,8 @@ using AutoFixture.Kernel; using AutoFixture.TUnit.Tests.TestTypes; using TestTypeFoundation; -using TUnit.Assertions.AssertConditions.Throws; +using TUnit.Assertions.Extensions; +using ConcreteType = TestTypeFoundation.ConcreteType; namespace AutoFixture.TUnit.Tests; diff --git a/tests/AutoFixture.TUnit.Tests/AutoFixture.TUnit.Tests.csproj b/tests/AutoFixture.TUnit.Tests/AutoFixture.TUnit.Tests.csproj index 57224b4..a9bc845 100644 --- a/tests/AutoFixture.TUnit.Tests/AutoFixture.TUnit.Tests.csproj +++ b/tests/AutoFixture.TUnit.Tests/AutoFixture.TUnit.Tests.csproj @@ -4,7 +4,7 @@ - net48;net8.0 + net48;net8.0;net10.0 disable @@ -17,7 +17,7 @@ - + diff --git a/tests/AutoFixture.TUnit.Tests/ClassAutoDataSourceAttributeTests.cs b/tests/AutoFixture.TUnit.Tests/ClassAutoDataSourceAttributeTests.cs index 1aec882..9018b1a 100644 --- a/tests/AutoFixture.TUnit.Tests/ClassAutoDataSourceAttributeTests.cs +++ b/tests/AutoFixture.TUnit.Tests/ClassAutoDataSourceAttributeTests.cs @@ -2,7 +2,8 @@ using AutoFixture.Kernel; using AutoFixture.TUnit.Tests.TestTypes; using TestTypeFoundation; -using TUnit.Assertions.AssertConditions.Throws; +using TUnit.Assertions.Extensions; +using ConcreteType = TestTypeFoundation.ConcreteType; namespace AutoFixture.TUnit.Tests; diff --git a/tests/AutoFixture.TUnit.Tests/CompositeDataSourceAttributeSufficientDataTest.cs b/tests/AutoFixture.TUnit.Tests/CompositeDataSourceAttributeSufficientDataTest.cs index 350bb84..36e3d05 100644 --- a/tests/AutoFixture.TUnit.Tests/CompositeDataSourceAttributeSufficientDataTest.cs +++ b/tests/AutoFixture.TUnit.Tests/CompositeDataSourceAttributeSufficientDataTest.cs @@ -2,7 +2,7 @@ using System.Reflection; using AutoFixture.TUnit.Tests.TestTypes; using TestTypeFoundation; -using TUnit.Assertions.Equality; +using TUnit.Assertions.Extensions; namespace AutoFixture.TUnit.Tests; @@ -24,15 +24,13 @@ public async Task GetDataReturnsCorrectResult( var attribute = new CompositeDataSourceAttribute(attributes.ToArray()); var dataGeneratorMetadata = DataGeneratorMetadataHelper .CreateDataGeneratorMetadata(this.method); - var comparer = new CollectionEquivalentToEqualityComparer(); - // Act var result = attribute.GenerateDataSources(dataGeneratorMetadata) .Select(x => x()).ToArray(); // Assert await Assert.That(result) - .IsEquivalentTo(expectedResult, comparer); + .IsEquivalentTo(expectedResult); } public IEnumerable<( diff --git a/tests/AutoFixture.TUnit.Tests/CompositeDataSourceAttributeTest.cs b/tests/AutoFixture.TUnit.Tests/CompositeDataSourceAttributeTest.cs index be2a383..08bcb11 100644 --- a/tests/AutoFixture.TUnit.Tests/CompositeDataSourceAttributeTest.cs +++ b/tests/AutoFixture.TUnit.Tests/CompositeDataSourceAttributeTest.cs @@ -1,6 +1,6 @@ using System.Reflection; using AutoFixture.TUnit.Tests.TestTypes; -using TUnit.Assertions.AssertConditions.Throws; +using TUnit.Assertions.Extensions; namespace AutoFixture.TUnit.Tests; diff --git a/tests/AutoFixture.TUnit.Tests/DataGeneratorMetadataHelper.cs b/tests/AutoFixture.TUnit.Tests/DataGeneratorMetadataHelper.cs index 91ee229..1483b35 100644 --- a/tests/AutoFixture.TUnit.Tests/DataGeneratorMetadataHelper.cs +++ b/tests/AutoFixture.TUnit.Tests/DataGeneratorMetadataHelper.cs @@ -1,4 +1,4 @@ -using System.Reflection; +using System.Reflection; using TUnit.Core.Enums; namespace AutoFixture.TUnit.Tests; @@ -15,9 +15,8 @@ public static DataGeneratorMetadata CreateDataGeneratorMetadata(MethodInfo metho var parameters = methodInfo.GetParameters(); var type = methodInfo.ReflectedType ?? methodInfo.DeclaringType!; var methodName = methodInfo.Name; - var attributes = methodInfo.GetCustomAttributes().ToArray(); - var sourceGeneratedParameterInformations = parameters + var parameterMetadatas = parameters .Select(CreateParameter).ToArray(); return new DataGeneratorMetadata @@ -25,25 +24,27 @@ public static DataGeneratorMetadata CreateDataGeneratorMetadata(MethodInfo metho Type = DataGeneratorType.TestParameters, TestBuilderContext = null!, TestSessionId = null!, - MembersToGenerate = sourceGeneratedParameterInformations - .Cast().ToArray(), - TestInformation = new SourceGeneratedMethodInformation + MembersToGenerate = parameterMetadatas + .Cast().ToArray(), + TestInformation = new MethodMetadata { Type = type, + TypeInfo = new global::TUnit.Core.ConcreteType(type), Name = methodName, - Attributes = attributes, GenericTypeCount = 0, - Class = new SourceGeneratedClassInformation + ReturnTypeInfo = new global::TUnit.Core.ConcreteType(typeof(void)), + Class = new ClassMetadata { Type = type, + TypeInfo = new global::TUnit.Core.ConcreteType(type), Assembly = null!, - Attributes = type.GetCustomAttributes().ToArray(), Name = type.Name, Namespace = null!, Parameters = [], - Properties = [] + Properties = [], + Parent = null! }, - Parameters = sourceGeneratedParameterInformations, + Parameters = parameterMetadatas, ReturnType = typeof(void), }, TestClassInstance = null!, @@ -51,12 +52,13 @@ public static DataGeneratorMetadata CreateDataGeneratorMetadata(MethodInfo metho }; } - private static SourceGeneratedParameterInformation CreateParameter(ParameterInfo parameterInfo) + private static ParameterMetadata CreateParameter(ParameterInfo parameterInfo) { - return new SourceGeneratedParameterInformation(parameterInfo.ParameterType) + return new ParameterMetadata(parameterInfo.ParameterType) { Name = parameterInfo.Name!, - Attributes = parameterInfo.GetCustomAttributes().ToArray() + TypeInfo = new global::TUnit.Core.ConcreteType(parameterInfo.ParameterType), + ReflectionInfo = parameterInfo }; } -} \ No newline at end of file +} diff --git a/tests/AutoFixture.TUnit.Tests/FavorArraysAttributeTest.cs b/tests/AutoFixture.TUnit.Tests/FavorArraysAttributeTest.cs index f0ee622..40ac0f7 100644 --- a/tests/AutoFixture.TUnit.Tests/FavorArraysAttributeTest.cs +++ b/tests/AutoFixture.TUnit.Tests/FavorArraysAttributeTest.cs @@ -1,6 +1,6 @@ using AutoFixture.Kernel; using TestTypeFoundation; -using TUnit.Assertions.AssertConditions.Throws; +using TUnit.Assertions.Extensions; namespace AutoFixture.TUnit.Tests; @@ -37,8 +37,9 @@ public async Task GetCustomizationReturnsCorrectResult() // Act var result = sut.GetCustomization(parameter); // Assert - var invoker = await Assert.That(result).IsAssignableTo(); - await Assert.That(invoker?.TargetType).IsEqualTo(parameter.ParameterType); - await Assert.That(invoker?.Query).IsAssignableTo(); + await Assert.That(result).IsAssignableTo(); + var invoker = (ConstructorCustomization)result; + await Assert.That(invoker.TargetType).IsEqualTo(parameter.ParameterType); + await Assert.That(invoker.Query).IsAssignableTo(); } } \ No newline at end of file diff --git a/tests/AutoFixture.TUnit.Tests/FavorEnumerablesAttributeTest.cs b/tests/AutoFixture.TUnit.Tests/FavorEnumerablesAttributeTest.cs index 77838e6..7c93ac7 100644 --- a/tests/AutoFixture.TUnit.Tests/FavorEnumerablesAttributeTest.cs +++ b/tests/AutoFixture.TUnit.Tests/FavorEnumerablesAttributeTest.cs @@ -1,6 +1,6 @@ using AutoFixture.Kernel; using TestTypeFoundation; -using TUnit.Assertions.AssertConditions.Throws; +using TUnit.Assertions.Extensions; namespace AutoFixture.TUnit.Tests; @@ -37,8 +37,9 @@ public async Task GetCustomizationReturnsCorrectResult() // Act var result = sut.GetCustomization(parameter); // Assert - var invoker = await Assert.That(result).IsAssignableTo(); - await Assert.That(invoker?.TargetType).IsEqualTo(parameter.ParameterType); - await Assert.That(invoker?.Query).IsAssignableTo(); + await Assert.That(result).IsAssignableTo(); + var invoker = (ConstructorCustomization)result; + await Assert.That(invoker.TargetType).IsEqualTo(parameter.ParameterType); + await Assert.That(invoker.Query).IsAssignableTo(); } } \ No newline at end of file diff --git a/tests/AutoFixture.TUnit.Tests/FavorListsAttributeTest.cs b/tests/AutoFixture.TUnit.Tests/FavorListsAttributeTest.cs index 71ec0fe..a8a5632 100644 --- a/tests/AutoFixture.TUnit.Tests/FavorListsAttributeTest.cs +++ b/tests/AutoFixture.TUnit.Tests/FavorListsAttributeTest.cs @@ -1,6 +1,6 @@ using AutoFixture.Kernel; using TestTypeFoundation; -using TUnit.Assertions.AssertConditions.Throws; +using TUnit.Assertions.Extensions; namespace AutoFixture.TUnit.Tests; @@ -37,8 +37,9 @@ public async Task GetCustomizationReturnsCorrectResult() // Act var result = sut.GetCustomization(parameter); // Assert - var invoker = await Assert.That(result).IsAssignableTo(); - await Assert.That(invoker?.TargetType).IsEqualTo(parameter.ParameterType); - await Assert.That(invoker?.Query).IsAssignableTo(); + await Assert.That(result).IsAssignableTo(); + var invoker = (ConstructorCustomization)result; + await Assert.That(invoker.TargetType).IsEqualTo(parameter.ParameterType); + await Assert.That(invoker.Query).IsAssignableTo(); } } \ No newline at end of file diff --git a/tests/AutoFixture.TUnit.Tests/FrozenAttributeTest.cs b/tests/AutoFixture.TUnit.Tests/FrozenAttributeTest.cs index ad3f9a3..ec37c16 100644 --- a/tests/AutoFixture.TUnit.Tests/FrozenAttributeTest.cs +++ b/tests/AutoFixture.TUnit.Tests/FrozenAttributeTest.cs @@ -1,4 +1,4 @@ -using TUnit.Assertions.AssertConditions.Throws; +using TUnit.Assertions.Extensions; namespace AutoFixture.TUnit.Tests; diff --git a/tests/AutoFixture.TUnit.Tests/GreedyAttributeTest.cs b/tests/AutoFixture.TUnit.Tests/GreedyAttributeTest.cs index 25ed9fb..8afe8b7 100644 --- a/tests/AutoFixture.TUnit.Tests/GreedyAttributeTest.cs +++ b/tests/AutoFixture.TUnit.Tests/GreedyAttributeTest.cs @@ -1,6 +1,6 @@ using AutoFixture.Kernel; using TestTypeFoundation; -using TUnit.Assertions.AssertConditions.Throws; +using TUnit.Assertions.Extensions; #if NETCOREAPP1_1 using System.Reflection; #endif @@ -40,8 +40,9 @@ public async Task GetCustomizationReturnsCorrectResult() // Act var result = sut.GetCustomization(parameter); // Assert - var invoker = await Assert.That(result).IsAssignableTo(); - await Assert.That(invoker?.TargetType).IsEqualTo(parameter.ParameterType); - await Assert.That(invoker?.Query).IsAssignableTo(); + await Assert.That(result).IsAssignableTo(); + var invoker = (ConstructorCustomization)result; + await Assert.That(invoker.TargetType).IsEqualTo(parameter.ParameterType); + await Assert.That(invoker.Query).IsAssignableTo(); } } \ No newline at end of file diff --git a/tests/AutoFixture.TUnit.Tests/Internal/AutoDataSourceTests.cs b/tests/AutoFixture.TUnit.Tests/Internal/AutoDataSourceTests.cs index c479105..c120b30 100644 --- a/tests/AutoFixture.TUnit.Tests/Internal/AutoDataSourceTests.cs +++ b/tests/AutoFixture.TUnit.Tests/Internal/AutoDataSourceTests.cs @@ -1,7 +1,7 @@ using AutoFixture.Kernel; using AutoFixture.TUnit.Internal; using AutoFixture.TUnit.Tests.TestTypes; -using TUnit.Assertions.AssertConditions.Throws; +using TUnit.Assertions.Extensions; namespace AutoFixture.TUnit.Tests.Internal; @@ -52,10 +52,11 @@ public async Task GeneratesTestDataUsingFixture() // Assert await Assert.That(result).IsNotNull(); - var item = await Assert.That(result).HasSingleItem(); + await Assert.That(result).HasSingleItem(); + var item = result.Single(); await Assert.That(item).IsNotNull(); - await Assert.That(item.Length).IsEqualTo(3); + await Assert.That(item!.Length).IsEqualTo(3); await Assert.That(item[0]).IsEqualTo("value"); await Assert.That(item[1]).IsEqualTo(1); await Assert.That(item[2]).IsEqualTo(12.2); @@ -179,7 +180,7 @@ public async Task DoesNotCustomizeFixtureWhenParametersNotCustomized() _ = sut.GenerateDataSources(DataGeneratorMetadataHelper.CreateDataGeneratorMetadata(method!)).ToArray(); // Assert - await Assert.That(customizations).IsEmpty(); + await Assert.That(customizations.Count).IsEqualTo(0); } [Test] @@ -196,10 +197,10 @@ public async Task CustomizesFixtureUsingParameterCustomizations() .GetMethod(nameof(SampleTestType.TestMethodWithCustomizedParameter)); // Act - _ = sut.GenerateDataSources(DataGeneratorMetadataHelper.CreateDataGeneratorMetadata(method!)).ToArray(); + _ = sut.GenerateDataSources(DataGeneratorMetadataHelper.CreateDataGeneratorMetadata(method!)).Select(x => x()).ToArray(); // Assert - await Assert.That(customizations).IsNotEmpty(); + await Assert.That(customizations.Count).IsGreaterThan(0); } [Test] @@ -216,14 +217,15 @@ public async Task CustomizationsAreAppliedInExpectedOrder() .GetMethod(nameof(SampleTestType.TestMethodWithMultipleCustomizations)); // Act - _ = sut.GenerateDataSources(DataGeneratorMetadataHelper.CreateDataGeneratorMetadata(method!)).ToArray(); + _ = sut.GenerateDataSources(DataGeneratorMetadataHelper.CreateDataGeneratorMetadata(method!)).Select(x => x()).ToArray(); // Assert using var scope = Assert.Multiple(); await Assert.That(customizations[0]).IsAssignableTo(); await Assert.That(customizations[1]).IsAssignableTo(); - var composite = await Assert.That(customizations[2]).IsAssignableTo(); + await Assert.That(customizations[2]).IsAssignableTo(); + var composite = (CompositeCustomization)customizations[2]; var compositeCustomizations = composite.Customizations.ToArray(); await Assert.That(compositeCustomizations.Length).IsEqualTo(2); diff --git a/tests/AutoFixture.TUnit.Tests/Internal/ClassDataSourceTests.cs b/tests/AutoFixture.TUnit.Tests/Internal/ClassDataSourceTests.cs index 5d9a363..b184f47 100644 --- a/tests/AutoFixture.TUnit.Tests/Internal/ClassDataSourceTests.cs +++ b/tests/AutoFixture.TUnit.Tests/Internal/ClassDataSourceTests.cs @@ -2,7 +2,7 @@ using AutoFixture.TUnit.Internal; using AutoFixture.TUnit.Tests.TestTypes; using TestTypeFoundation; -using TUnit.Assertions.AssertConditions.Throws; +using TUnit.Assertions.Extensions; namespace AutoFixture.TUnit.Tests.Internal; diff --git a/tests/AutoFixture.TUnit.Tests/Internal/DataSourceTests.cs b/tests/AutoFixture.TUnit.Tests/Internal/DataSourceTests.cs index 25d8684..67fb61e 100644 --- a/tests/AutoFixture.TUnit.Tests/Internal/DataSourceTests.cs +++ b/tests/AutoFixture.TUnit.Tests/Internal/DataSourceTests.cs @@ -1,6 +1,6 @@ using AutoFixture.TUnit.Internal; using AutoFixture.TUnit.Tests.TestTypes; -using TUnit.Assertions.AssertConditions.Throws; +using TUnit.Assertions.Extensions; namespace AutoFixture.TUnit.Tests.Internal; @@ -28,7 +28,8 @@ public async Task ReturnSingleEmptyArrayWhenMethodHasNoParameters() var result = sut.GenerateDataSources(DataGeneratorMetadataHelper.CreateDataGeneratorMetadata(testMethod)).ToArray(); // Assert - var item = await Assert.That(result).HasSingleItem(); + await Assert.That(result.Length).IsEqualTo(1); + var item = result.Single()(); await Assert.That(item).IsEmpty(); } @@ -60,9 +61,10 @@ public async Task ReturnSingleArrayWithSingleItemWhenMethodHasSingleParameter() var result = sut.GenerateDataSources(DataGeneratorMetadataHelper.CreateDataGeneratorMetadata(testMethod)).ToArray(); // Assert - var testData = await Assert.That(result).HasSingleItem(); - var argument = await Assert.That(testData).HasSingleItem(); - await Assert.That(argument).IsEqualTo("hello"); + await Assert.That(result.Length).IsEqualTo(1); + var testData = result.Single()(); + await Assert.That(testData!.Length).IsEqualTo(1); + await Assert.That(testData[0]).IsEqualTo("hello"); } [Test] @@ -89,11 +91,10 @@ public async Task ReturnsArgumentsFittingTestParameters() // Assert await Assert.That(actual.Length).IsEqualTo(testData.Length); - await Assert.That(actual) - .All() - .Satisfy( - assert => assert.Satisfies(y => y.Length, - y => y.IsBetween(0, 3).WithInclusiveBounds())); + foreach (var a in actual) + { + await Assert.That(a!.Length).IsBetween(0, 3); + } } [Test] diff --git a/tests/AutoFixture.TUnit.Tests/Internal/FieldDataSourceTests.cs b/tests/AutoFixture.TUnit.Tests/Internal/FieldDataSourceTests.cs index 2c0f953..4f0d802 100644 --- a/tests/AutoFixture.TUnit.Tests/Internal/FieldDataSourceTests.cs +++ b/tests/AutoFixture.TUnit.Tests/Internal/FieldDataSourceTests.cs @@ -1,7 +1,7 @@ using AutoFixture.TUnit.Internal; using AutoFixture.TUnit.Tests.TestTypes; using TestTypeFoundation; -using TUnit.Assertions.AssertConditions.Throws; +using TUnit.Assertions.Extensions; namespace AutoFixture.TUnit.Tests.Internal; @@ -59,7 +59,7 @@ public async Task ThrowsWhenInvokedWithNullTestMethod() var sut = new FieldDataSource(sourceField); // Act & Assert - await Assert.That(() => sut.GenerateDataSources(null!)).ThrowsExactly(); + await Assert.That(() => sut.GenerateDataSources(null!).ToArray()).ThrowsExactly(); } [Test] diff --git a/tests/AutoFixture.TUnit.Tests/Internal/InlineDataSourceTests.cs b/tests/AutoFixture.TUnit.Tests/Internal/InlineDataSourceTests.cs index 64a33bd..85847b9 100644 --- a/tests/AutoFixture.TUnit.Tests/Internal/InlineDataSourceTests.cs +++ b/tests/AutoFixture.TUnit.Tests/Internal/InlineDataSourceTests.cs @@ -1,6 +1,6 @@ using AutoFixture.TUnit.Internal; using AutoFixture.TUnit.Tests.TestTypes; -using TUnit.Assertions.AssertConditions.Throws; +using TUnit.Assertions.Extensions; namespace AutoFixture.TUnit.Tests.Internal; @@ -46,7 +46,7 @@ public async Task GetTestDataWithNullMethodThrows() ]); // Act & Assert await Assert.That(() => - sut.GenerateDataSources(null!)).ThrowsExactly(); + sut.GenerateDataSources(null!).ToArray()).ThrowsExactly(); } [Test] diff --git a/tests/AutoFixture.TUnit.Tests/Internal/MemberDataSourceTests.cs b/tests/AutoFixture.TUnit.Tests/Internal/MemberDataSourceTests.cs index 12b389d..8b30299 100644 --- a/tests/AutoFixture.TUnit.Tests/Internal/MemberDataSourceTests.cs +++ b/tests/AutoFixture.TUnit.Tests/Internal/MemberDataSourceTests.cs @@ -1,6 +1,7 @@ using AutoFixture.TUnit.Internal; using AutoFixture.TUnit.Tests.TestTypes; -using TUnit.Assertions.AssertConditions.Throws; +using TUnit.Assertions.Extensions; +using PropertyDataSource = AutoFixture.TUnit.Internal.PropertyDataSource; namespace AutoFixture.TUnit.Tests.Internal; @@ -85,7 +86,7 @@ public async Task InitializesSourceProperty(string memberName, Type expectedInne var sut = new DelegatingMemberDataSource(type, memberName); // Assert - await Assert.That(sut.GetSource()).IsTypeOf(expectedInnerSourceType); + await Assert.That(sut.GetSource().GetType()).IsEqualTo(expectedInnerSourceType); } [Test] diff --git a/tests/AutoFixture.TUnit.Tests/Internal/MethodDataSourceTests.cs b/tests/AutoFixture.TUnit.Tests/Internal/MethodDataSourceTests.cs index 42aceb6..edbddd8 100644 --- a/tests/AutoFixture.TUnit.Tests/Internal/MethodDataSourceTests.cs +++ b/tests/AutoFixture.TUnit.Tests/Internal/MethodDataSourceTests.cs @@ -1,7 +1,7 @@ using AutoFixture.TUnit.Internal; using AutoFixture.TUnit.Tests.TestTypes; using TestTypeFoundation; -using TUnit.Assertions.AssertConditions.Throws; +using TUnit.Assertions.Extensions; namespace AutoFixture.TUnit.Tests.Internal; diff --git a/tests/AutoFixture.TUnit.Tests/Internal/PropertyDataSourceTests.cs b/tests/AutoFixture.TUnit.Tests/Internal/PropertyDataSourceTests.cs index a7ae04c..588ad52 100644 --- a/tests/AutoFixture.TUnit.Tests/Internal/PropertyDataSourceTests.cs +++ b/tests/AutoFixture.TUnit.Tests/Internal/PropertyDataSourceTests.cs @@ -1,7 +1,8 @@ using AutoFixture.TUnit.Internal; using AutoFixture.TUnit.Tests.TestTypes; using TestTypeFoundation; -using TUnit.Assertions.AssertConditions.Throws; +using TUnit.Assertions.Extensions; +using PropertyDataSource = AutoFixture.TUnit.Internal.PropertyDataSource; namespace AutoFixture.TUnit.Tests.Internal; @@ -59,7 +60,7 @@ public async Task ThrowsWhenInvokedWithNullTestMethod() var sut = new PropertyDataSource(sourceProperty); // Act & Assert - await Assert.That(() => sut.GenerateDataSources(null!)).ThrowsExactly(); + await Assert.That(() => sut.GenerateDataSources(null!).ToArray()).ThrowsExactly(); } [Test] diff --git a/tests/AutoFixture.TUnit.Tests/MemberAutoDataSourceAttributeTest.cs b/tests/AutoFixture.TUnit.Tests/MemberAutoDataSourceAttributeTest.cs index 6720fe2..f49bd1a 100644 --- a/tests/AutoFixture.TUnit.Tests/MemberAutoDataSourceAttributeTest.cs +++ b/tests/AutoFixture.TUnit.Tests/MemberAutoDataSourceAttributeTest.cs @@ -1,7 +1,8 @@ using System.Diagnostics.CodeAnalysis; using AutoFixture.TUnit.Tests.TestTypes; using TestTypeFoundation; -using TUnit.Assertions.AssertConditions.Throws; +using TUnit.Assertions.Extensions; +using ConcreteType = TestTypeFoundation.ConcreteType; namespace AutoFixture.TUnit.Tests; @@ -106,13 +107,13 @@ public async Task ThrowsWhenMemberNotEnumerable() // Arrange const string memberName = nameof(TestTypeWithMethodData.NonEnumerableMethod); var sut = new AutoMemberDataSourceAttribute(memberName); - var method = TestTypeWithMethodData.GetNonEnumerableMethodInfo(); + var method = TestTypeWithMethodData.GetMultipleValueTestMethodInfo(); var dataGeneratorMetadata = DataGeneratorMetadataHelper .CreateDataGeneratorMetadata(method!); // Act & Assert var ex = Assert.Throws( - () => sut.GetData(dataGeneratorMetadata).ToArray()); + () => sut.GenerateDataSources(dataGeneratorMetadata).ToArray()); await Assert.That(ex.Message).Contains(memberName); } @@ -123,13 +124,13 @@ public async Task ThrowsWhenMemberNotStatic() // Arrange const string memberName = nameof(TestTypeWithMethodData.NonStaticSource); var sut = new AutoMemberDataSourceAttribute(memberName); - var method = TestTypeWithMethodData.GetNonStaticSourceMethodInfo(); + var method = TestTypeWithMethodData.GetMultipleValueTestMethodInfo(); var dataGeneratorMetadata = DataGeneratorMetadataHelper .CreateDataGeneratorMetadata(method!); // Act & Assert var ex = Assert.Throws( - () => sut.GetData(dataGeneratorMetadata).ToArray()); + () => sut.GenerateDataSources(dataGeneratorMetadata).ToArray()); await Assert.That(ex.Message).Contains(memberName); } @@ -203,7 +204,8 @@ public async Task GetDataOrdersCustomizationAttributes(string methodName) .Select(x => x()).ToArray(); // Assert - var composite = await Assert.That(customizationLog[0]).IsAssignableTo(); + await Assert.That(customizationLog[0]).IsAssignableTo(); + var composite = (CompositeCustomization)customizationLog[0]; await Assert.That(composite.Customizations.First()).IsNotTypeOf(); await Assert.That(composite.Customizations.Last()).IsAssignableTo(); } diff --git a/tests/AutoFixture.TUnit.Tests/ModestAttributeTest.cs b/tests/AutoFixture.TUnit.Tests/ModestAttributeTest.cs index 3757d67..796c6a4 100644 --- a/tests/AutoFixture.TUnit.Tests/ModestAttributeTest.cs +++ b/tests/AutoFixture.TUnit.Tests/ModestAttributeTest.cs @@ -1,6 +1,6 @@ using AutoFixture.Kernel; using TestTypeFoundation; -using TUnit.Assertions.AssertConditions.Throws; +using TUnit.Assertions.Extensions; namespace AutoFixture.TUnit.Tests; @@ -38,8 +38,9 @@ public async Task GetCustomizationReturnsCorrectResult() var result = sut.GetCustomization(parameter); // Assert - var invoker = await Assert.That(result).IsAssignableTo(); - await Assert.That(invoker?.TargetType).IsEqualTo(parameter.ParameterType); - await Assert.That(invoker?.Query).IsAssignableTo(); + await Assert.That(result).IsAssignableTo(); + var invoker = (ConstructorCustomization)result; + await Assert.That(invoker.TargetType).IsEqualTo(parameter.ParameterType); + await Assert.That(invoker.Query).IsAssignableTo(); } } \ No newline at end of file diff --git a/tests/AutoFixture.TUnit.Tests/NoAutoPropertiesAttributeTest.cs b/tests/AutoFixture.TUnit.Tests/NoAutoPropertiesAttributeTest.cs index 7025062..024159d 100644 --- a/tests/AutoFixture.TUnit.Tests/NoAutoPropertiesAttributeTest.cs +++ b/tests/AutoFixture.TUnit.Tests/NoAutoPropertiesAttributeTest.cs @@ -1,5 +1,5 @@ using TestTypeFoundation; -using TUnit.Assertions.AssertConditions.Throws; +using TUnit.Assertions.Extensions; namespace AutoFixture.TUnit.Tests; diff --git a/tests/AutoFixture.TUnit.Tests/Scenario.cs b/tests/AutoFixture.TUnit.Tests/Scenario.cs index 2732b65..2f273df 100644 --- a/tests/AutoFixture.TUnit.Tests/Scenario.cs +++ b/tests/AutoFixture.TUnit.Tests/Scenario.cs @@ -2,6 +2,7 @@ using System.ComponentModel.DataAnnotations; using AutoFixture.TUnit.Tests.TestTypes; using TestTypeFoundation; +using ConcreteType = TestTypeFoundation.ConcreteType; namespace AutoFixture.TUnit.Tests; diff --git a/tests/AutoFixture.TUnit.Tests/TestTypes/DataSourceExtensions.cs b/tests/AutoFixture.TUnit.Tests/TestTypes/DataSourceExtensions.cs new file mode 100644 index 0000000..441999a --- /dev/null +++ b/tests/AutoFixture.TUnit.Tests/TestTypes/DataSourceExtensions.cs @@ -0,0 +1,27 @@ +namespace AutoFixture.TUnit.Tests.TestTypes; + +internal static class DataSourceExtensions +{ + /// + /// Bridges the old sync GenerateDataSources API to the new async GetDataRowsAsync API for test compatibility. + /// + public static IEnumerable> GenerateDataSources( + this IDataSourceAttribute source, + DataGeneratorMetadata dataGeneratorMetadata) + { + var asyncEnumerable = source.GetDataRowsAsync(dataGeneratorMetadata); + var enumerator = asyncEnumerable.GetAsyncEnumerator(); + try + { + while (enumerator.MoveNextAsync().AsTask().GetAwaiter().GetResult()) + { + var current = enumerator.Current; + yield return () => current().GetAwaiter().GetResult()!; + } + } + finally + { + enumerator.DisposeAsync().AsTask().GetAwaiter().GetResult(); + } + } +} diff --git a/tests/AutoFixture.TUnit.Tests/TestTypes/DelegatingDataSource.cs b/tests/AutoFixture.TUnit.Tests/TestTypes/DelegatingDataSource.cs index 99147ce..1481b8c 100644 --- a/tests/AutoFixture.TUnit.Tests/TestTypes/DelegatingDataSource.cs +++ b/tests/AutoFixture.TUnit.Tests/TestTypes/DelegatingDataSource.cs @@ -1,4 +1,4 @@ -using AutoFixture.TUnit.Internal; +using AutoFixture.TUnit.Internal; namespace AutoFixture.TUnit.Tests.TestTypes; @@ -6,8 +6,26 @@ public class DelegatingDataSource : BaseDataSourceAttribute, IDataSource { public IEnumerable TestData { get; set; } = Array.Empty(); - public override IEnumerable GetData(DataGeneratorMetadata dataGeneratorMetadata) + public override async IAsyncEnumerable>> GetData(DataGeneratorMetadata dataGeneratorMetadata) { - return this.TestData; + if (this.TestData is null) + { + throw new InvalidOperationException("The source member yielded no test data."); + } + + var maxArgs = dataGeneratorMetadata.MembersToGenerate.Length; + + foreach (var data in this.TestData) + { + if (data.Length > maxArgs) + { + throw new InvalidOperationException( + "The number of arguments provided exceeds the number of parameters."); + } + + yield return () => Task.FromResult(data); + } + + await Task.CompletedTask; } -} \ No newline at end of file +} diff --git a/tests/AutoFixture.TUnit.Tests/TestTypes/FakeDataAttribute.cs b/tests/AutoFixture.TUnit.Tests/TestTypes/FakeDataAttribute.cs index 9870480..91c9c85 100644 --- a/tests/AutoFixture.TUnit.Tests/TestTypes/FakeDataAttribute.cs +++ b/tests/AutoFixture.TUnit.Tests/TestTypes/FakeDataAttribute.cs @@ -1,4 +1,4 @@ -using System.Reflection; +using System.Reflection; namespace AutoFixture.TUnit.Tests.TestTypes; @@ -13,8 +13,13 @@ public FakeDataAttribute(MethodInfo expectedMethod, IEnumerable output this.expectedMethod = expectedMethod; } - public override IEnumerable GetData(DataGeneratorMetadata dataGeneratorMetadata) + public override async IAsyncEnumerable>> GetData(DataGeneratorMetadata dataGeneratorMetadata) { - return this.output; + foreach (var data in this.output) + { + yield return () => Task.FromResult(data); + } + + await Task.CompletedTask; } -} \ No newline at end of file +} diff --git a/tests/AutoFixture.TUnit.Tests/TestTypes/InlineFrozenValuesTestData.cs b/tests/AutoFixture.TUnit.Tests/TestTypes/InlineFrozenValuesTestData.cs index 3ca1623..328be8d 100644 --- a/tests/AutoFixture.TUnit.Tests/TestTypes/InlineFrozenValuesTestData.cs +++ b/tests/AutoFixture.TUnit.Tests/TestTypes/InlineFrozenValuesTestData.cs @@ -6,6 +6,9 @@ namespace AutoFixture.TUnit.Tests.TestTypes; [SuppressMessage("Usage", "TUnit0046:Return a `Func` rather than a ``")] internal class InlineFrozenValuesTestData : InlineAttributeTestData<(BaseDataSourceAttribute attribute, MethodInfo testMethod, object[] expected)> { + public static IEnumerable<(BaseDataSourceAttribute attribute, MethodInfo testMethod, object[] expected)> GetTestData() + => new InlineFrozenValuesTestData().GetData(); + public override IEnumerable<(BaseDataSourceAttribute attribute, MethodInfo testMethod, object[] expected)> GetData() { // All values provided by fixture diff --git a/tests/AutoFixture.TUnit.Tests/TestTypes/InlinePrimitiveValuesTestData.cs b/tests/AutoFixture.TUnit.Tests/TestTypes/InlinePrimitiveValuesTestData.cs index 5b4b1fa..e77d8ea 100644 --- a/tests/AutoFixture.TUnit.Tests/TestTypes/InlinePrimitiveValuesTestData.cs +++ b/tests/AutoFixture.TUnit.Tests/TestTypes/InlinePrimitiveValuesTestData.cs @@ -6,6 +6,9 @@ namespace AutoFixture.TUnit.Tests.TestTypes; [SuppressMessage("Usage", "TUnit0046:Return a `Func` rather than a ``")] internal class InlinePrimitiveValuesTestData : InlineAttributeTestData<(BaseDataSourceAttribute attribute, MethodInfo testMethod, object[] expected)> { + public static IEnumerable<(BaseDataSourceAttribute attribute, MethodInfo testMethod, object[] expected)> GetTestData() + => new InlinePrimitiveValuesTestData().GetData(); + public override IEnumerable<(BaseDataSourceAttribute attribute, MethodInfo testMethod, object[] expected)> GetData() { // All values provided by fixture diff --git a/tests/AutoFixture.TUnit.Tests/TestTypes/TypeWithCustomizationAttributes.cs b/tests/AutoFixture.TUnit.Tests/TestTypes/TypeWithCustomizationAttributes.cs index aa2ff5a..e27c00e 100644 --- a/tests/AutoFixture.TUnit.Tests/TestTypes/TypeWithCustomizationAttributes.cs +++ b/tests/AutoFixture.TUnit.Tests/TestTypes/TypeWithCustomizationAttributes.cs @@ -1,4 +1,5 @@ using TestTypeFoundation; +using ConcreteType = TestTypeFoundation.ConcreteType; namespace AutoFixture.TUnit.Tests.TestTypes; diff --git a/tests/TestTypeFoundation/TestTypeFoundation.csproj b/tests/TestTypeFoundation/TestTypeFoundation.csproj index 3c04f23..3c758eb 100644 --- a/tests/TestTypeFoundation/TestTypeFoundation.csproj +++ b/tests/TestTypeFoundation/TestTypeFoundation.csproj @@ -8,6 +8,7 @@ TestTypeFoundation disable false + true