diff --git a/TUnit.Core.SourceGenerator.Tests/DataSourceGeneratorTests.NonTyped.verified.txt b/TUnit.Core.SourceGenerator.Tests/DataSourceGeneratorTests.NonTyped.verified.txt new file mode 100644 index 0000000000..a94604bf63 --- /dev/null +++ b/TUnit.Core.SourceGenerator.Tests/DataSourceGeneratorTests.NonTyped.verified.txt @@ -0,0 +1,115 @@ +[ +// +#pragma warning disable +using global::System.Linq; +using global::System.Reflection; +using global::TUnit.Core; +using global::TUnit.Core.Extensions; + +namespace TUnit.SourceGenerated; + +[global::System.Diagnostics.StackTraceHidden] +[global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage] +file partial class AutoDataTests : TUnit.Core.Interfaces.SourceGenerator.ITestSource +{ + [global::System.Runtime.CompilerServices.ModuleInitializer] + public static void Initialise() + { + SourceRegistrar.Register(new AutoDataTests()); + } + public global::System.Collections.Generic.IReadOnlyList CollectTests(string sessionId) + { + return Tests0(sessionId); + } + private global::System.Collections.Generic.List Tests0(string sessionId) + { + global::System.Collections.Generic.List nodes = []; + var classDataIndex = 0; + var testMethodDataIndex = 0; + try + { + var testClassType = typeof(global::TUnit.TestProject.AutoDataTests); + var methodInfo = global::TUnit.Core.Helpers.MethodInfoRetriever.GetMethodInfo(typeof(global::TUnit.TestProject.AutoDataTests), "Test1", 0, [typeof(global::System.String), typeof(global::System.Int32), typeof(global::System.Double), typeof(global::System.Boolean)]); + + var testBuilderContext = new global::TUnit.Core.TestBuilderContext(); + var testBuilderContextAccessor = new global::TUnit.Core.TestBuilderContextAccessor(testBuilderContext); + var methodArgDataGeneratorMetadata = new DataGeneratorMetadata +{ + Type = TUnit.Core.Enums.DataGeneratorType.Parameters, + TestClassType = testClassType, + ParameterInfos = methodInfo.GetParameters(), + PropertyInfo = null, + TestBuilderContext = testBuilderContextAccessor, + TestSessionId = sessionId, +}; + var methodDataAttribute = new global::TUnit.TestProject.Attributes.AutoDataAttribute() +{ + +}; + + var methodArgGeneratedDataArray = methodDataAttribute.GenerateDataSources(methodArgDataGeneratorMetadata); + + foreach (var methodArgGeneratedDataAccessor in methodArgGeneratedDataArray) + { + testMethodDataIndex++; + + var methodArgGeneratedData = methodArgGeneratedDataAccessor(); + global::System.String methodArg = (global::System.String)methodArgGeneratedData[0]; + global::System.Int32 methodArg1 = (global::System.Int32)methodArgGeneratedData[1]; + global::System.Double methodArg2 = (global::System.Double)methodArgGeneratedData[2]; + global::System.Boolean methodArg3 = (global::System.Boolean)methodArgGeneratedData[3]; + var resettableClassFactoryDelegate = () => new ResettableLazy(() => + new global::TUnit.TestProject.AutoDataTests() + , sessionId, testBuilderContext); + + var resettableClassFactory = resettableClassFactoryDelegate(); + + nodes.Add(new TestMetadata + { + TestId = $"global::TUnit.TestProject.Attributes.AutoDataAttribute:{testMethodDataIndex}:TL-GAC0:TUnit.TestProject.AutoDataTests.Test1(System.String,System.Int32,System.Double,System.Boolean):0", + TestClassArguments = [], + TestMethodArguments = [methodArg, methodArg1, methodArg2, methodArg3], + TestClassProperties = [], + CurrentRepeatAttempt = 0, + RepeatLimit = 0, + MethodInfo = methodInfo, + ResettableClassFactory = resettableClassFactory, + TestMethodFactory = (classInstance, cancellationToken) => AsyncConvert.Convert(() => classInstance.Test1(methodArg, methodArg1, methodArg2, methodArg3)), + TestFilePath = @"", + TestLineNumber = 8, + TestAttributes = [ new global::TUnit.TestProject.Attributes.AutoDataAttribute() +{ + +}, new global::TUnit.Core.TestAttribute() +{ + +} ], + ClassAttributes = [ ], + AssemblyAttributes = [ ], + DataAttributes = [ methodDataAttribute ], + TestBuilderContext = testBuilderContext, + }); + resettableClassFactory = resettableClassFactoryDelegate(); + testBuilderContext = new(); + testBuilderContextAccessor.Current = testBuilderContext; + } + } + catch (global::System.Exception exception) + { + nodes.Add(new FailedInitializationTest + { + TestId = $"global::TUnit.TestProject.Attributes.AutoDataAttribute:{testMethodDataIndex}:TL-GAC0:TUnit.TestProject.AutoDataTests.Test1(System.String,System.Int32,System.Double,System.Boolean):0", + TestClass = typeof(global::TUnit.TestProject.AutoDataTests), + ReturnType = global::TUnit.Core.Helpers.MethodInfoRetriever.GetMethodInfo(typeof(global::TUnit.TestProject.AutoDataTests), "Test1", 0, [typeof(global::System.String), typeof(global::System.Int32), typeof(global::System.Double), typeof(global::System.Boolean)]).ReturnType, + ParameterTypeFullNames = [typeof(global::System.String), typeof(global::System.Int32), typeof(global::System.Double), typeof(global::System.Boolean)], + TestName = "Test1", + TestFilePath = @"", + TestLineNumber = 8, + Exception = exception, + }); + } + return nodes; + } +} + +] \ No newline at end of file diff --git a/TUnit.Core.SourceGenerator.Tests/DataSourceGeneratorTests.Typed.verified.txt b/TUnit.Core.SourceGenerator.Tests/DataSourceGeneratorTests.Typed.verified.txt new file mode 100644 index 0000000000..db21df673d --- /dev/null +++ b/TUnit.Core.SourceGenerator.Tests/DataSourceGeneratorTests.Typed.verified.txt @@ -0,0 +1,800 @@ +[ +// +#pragma warning disable +using global::System.Linq; +using global::System.Reflection; +using global::TUnit.Core; +using global::TUnit.Core.Extensions; + +namespace TUnit.SourceGenerated; + +[global::System.Diagnostics.StackTraceHidden] +[global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage] +file partial class DataSourceGeneratorTests : TUnit.Core.Interfaces.SourceGenerator.ITestSource +{ + [global::System.Runtime.CompilerServices.ModuleInitializer] + public static void Initialise() + { + SourceRegistrar.Register(new DataSourceGeneratorTests()); + } + public global::System.Collections.Generic.IReadOnlyList CollectTests(string sessionId) + { + return + [ + ..Tests0(sessionId), + ..Tests1(sessionId), + ]; + } + private global::System.Collections.Generic.List Tests0(string sessionId) + { + global::System.Collections.Generic.List nodes = []; + var classDataIndex = 0; + var testMethodDataIndex = 0; + try + { + var testClassType = typeof(global::TUnit.TestProject.DataSourceGeneratorTests); + var methodInfo = global::TUnit.Core.Helpers.MethodInfoRetriever.GetMethodInfo(typeof(global::TUnit.TestProject.DataSourceGeneratorTests), "GeneratedData_Method", 0, [typeof(global::System.Int32)]); + + var testBuilderContext = new global::TUnit.Core.TestBuilderContext(); + var testBuilderContextAccessor = new global::TUnit.Core.TestBuilderContextAccessor(testBuilderContext); + var classArgDataGeneratorMetadata = new DataGeneratorMetadata +{ + Type = TUnit.Core.Enums.DataGeneratorType.Parameters, + TestClassType = testClassType, + ParameterInfos = typeof(global::TUnit.TestProject.DataSourceGeneratorTests).GetConstructors().First().GetParameters(), + PropertyInfo = null, + TestBuilderContext = testBuilderContextAccessor, + TestSessionId = sessionId, +}; + var classDataAttribute = new global::TUnit.TestProject.DataSourceGeneratorTests.AutoFixtureGeneratorAttribute() +{ + +}; + + var classArgGeneratedDataArray = classDataAttribute.GenerateDataSources(classArgDataGeneratorMetadata); + + foreach (var classArgGeneratedDataAccessor in classArgGeneratedDataArray) + { + classDataIndex++; + var methodArgDataGeneratorMetadata = new DataGeneratorMetadata +{ + Type = TUnit.Core.Enums.DataGeneratorType.Parameters, + TestClassType = testClassType, + ParameterInfos = methodInfo.GetParameters(), + PropertyInfo = null, + TestBuilderContext = testBuilderContextAccessor, + TestSessionId = sessionId, +}; + var methodDataAttribute = new global::TUnit.TestProject.DataSourceGeneratorTests.AutoFixtureGeneratorAttribute() +{ + +}; + + var methodArgGeneratedDataArray = methodDataAttribute.GenerateDataSources(methodArgDataGeneratorMetadata); + + foreach (var methodArgGeneratedDataAccessor in methodArgGeneratedDataArray) + { + testMethodDataIndex++; + var classArgGeneratedData = classArgGeneratedDataAccessor(); + global::System.Int32 classArg = classArgGeneratedData.Item1; + global::System.String classArg1 = classArgGeneratedData.Item2; + global::System.Boolean classArg2 = classArgGeneratedData.Item3; + + + var methodArgGeneratedData = methodArgGeneratedDataAccessor(); + var resettableClassFactoryDelegate = () => new ResettableLazy(() => + new global::TUnit.TestProject.DataSourceGeneratorTests(classArg, classArg1, classArg2) + , sessionId, testBuilderContext); + + var resettableClassFactory = resettableClassFactoryDelegate(); + + nodes.Add(new TestMetadata + { + TestId = $"global::TUnit.TestProject.DataSourceGeneratorTests.AutoFixtureGeneratorAttribute:{classDataIndex}:CL-GAC0:global::TUnit.TestProject.DataSourceGeneratorTests.AutoFixtureGeneratorAttribute:{testMethodDataIndex}:TL-GAC0:TUnit.TestProject.DataSourceGeneratorTests(System.Int32,System.String,System.Boolean).GeneratedData_Method(System.Int32):0", + TestClassArguments = [classArg, classArg1, classArg2], + TestMethodArguments = [methodArgGeneratedData], + TestClassProperties = [], + CurrentRepeatAttempt = 0, + RepeatLimit = 0, + MethodInfo = methodInfo, + ResettableClassFactory = resettableClassFactory, + TestMethodFactory = (classInstance, cancellationToken) => AsyncConvert.Convert(() => classInstance.GeneratedData_Method(methodArgGeneratedData)), + TestFilePath = @"", + TestLineNumber = 9, + TestAttributes = [ new global::TUnit.Core.TestAttribute() +{ + +}, new global::TUnit.TestProject.DataSourceGeneratorTests.AutoFixtureGeneratorAttribute() +{ + +} ], + ClassAttributes = [ new global::TUnit.TestProject.DataSourceGeneratorTests.AutoFixtureGeneratorAttribute() +{ + +}, new global::TUnit.TestProject.DataSourceGeneratorTests.AutoFixtureGeneratorAttribute() +{ + +} ], + AssemblyAttributes = [ ], + DataAttributes = [ classDataAttribute, methodDataAttribute ], + TestBuilderContext = testBuilderContext, + }); + resettableClassFactory = resettableClassFactoryDelegate(); + testBuilderContext = new(); + testBuilderContextAccessor.Current = testBuilderContext; + } + } + } + catch (global::System.Exception exception) + { + nodes.Add(new FailedInitializationTest + { + TestId = $"global::TUnit.TestProject.DataSourceGeneratorTests.AutoFixtureGeneratorAttribute:{classDataIndex}:CL-GAC0:global::TUnit.TestProject.DataSourceGeneratorTests.AutoFixtureGeneratorAttribute:{testMethodDataIndex}:TL-GAC0:TUnit.TestProject.DataSourceGeneratorTests(System.Int32,System.String,System.Boolean).GeneratedData_Method(System.Int32):0", + TestClass = typeof(global::TUnit.TestProject.DataSourceGeneratorTests), + ReturnType = global::TUnit.Core.Helpers.MethodInfoRetriever.GetMethodInfo(typeof(global::TUnit.TestProject.DataSourceGeneratorTests), "GeneratedData_Method", 0, [typeof(global::System.Int32)]).ReturnType, + ParameterTypeFullNames = [typeof(global::System.Int32)], + TestName = "GeneratedData_Method", + TestFilePath = @"", + TestLineNumber = 9, + Exception = exception, + }); + } + return nodes; + } + private global::System.Collections.Generic.List Tests1(string sessionId) + { + global::System.Collections.Generic.List nodes = []; + var classDataIndex = 0; + var testMethodDataIndex = 0; + try + { + var testClassType = typeof(global::TUnit.TestProject.DataSourceGeneratorTests); + var methodInfo = global::TUnit.Core.Helpers.MethodInfoRetriever.GetMethodInfo(typeof(global::TUnit.TestProject.DataSourceGeneratorTests), "GeneratedData_Method", 0, [typeof(global::System.Int32)]); + + var testBuilderContext = new global::TUnit.Core.TestBuilderContext(); + var testBuilderContextAccessor = new global::TUnit.Core.TestBuilderContextAccessor(testBuilderContext); + var classArgDataGeneratorMetadata = new DataGeneratorMetadata +{ + Type = TUnit.Core.Enums.DataGeneratorType.Parameters, + TestClassType = testClassType, + ParameterInfos = typeof(global::TUnit.TestProject.DataSourceGeneratorTests).GetConstructors().First().GetParameters(), + PropertyInfo = null, + TestBuilderContext = testBuilderContextAccessor, + TestSessionId = sessionId, +}; + var classDataAttribute = new global::TUnit.TestProject.DataSourceGeneratorTests.AutoFixtureGeneratorAttribute() +{ + +}; + + var classArgGeneratedDataArray = classDataAttribute.GenerateDataSources(classArgDataGeneratorMetadata); + + foreach (var classArgGeneratedDataAccessor in classArgGeneratedDataArray) + { + classDataIndex++; + var methodArgDataGeneratorMetadata = new DataGeneratorMetadata +{ + Type = TUnit.Core.Enums.DataGeneratorType.Parameters, + TestClassType = testClassType, + ParameterInfos = methodInfo.GetParameters(), + PropertyInfo = null, + TestBuilderContext = testBuilderContextAccessor, + TestSessionId = sessionId, +}; + var methodDataAttribute = new global::TUnit.TestProject.DataSourceGeneratorTests.AutoFixtureGeneratorAttribute() +{ + +}; + + var methodArgGeneratedDataArray = methodDataAttribute.GenerateDataSources(methodArgDataGeneratorMetadata); + + foreach (var methodArgGeneratedDataAccessor in methodArgGeneratedDataArray) + { + testMethodDataIndex++; + var classArgGeneratedData = classArgGeneratedDataAccessor(); + global::System.Int32 classArg = classArgGeneratedData.Item1; + global::System.String classArg1 = classArgGeneratedData.Item2; + global::System.Boolean classArg2 = classArgGeneratedData.Item3; + + + var methodArgGeneratedData = methodArgGeneratedDataAccessor(); + var resettableClassFactoryDelegate = () => new ResettableLazy(() => + new global::TUnit.TestProject.DataSourceGeneratorTests(classArg, classArg1, classArg2) + , sessionId, testBuilderContext); + + var resettableClassFactory = resettableClassFactoryDelegate(); + + nodes.Add(new TestMetadata + { + TestId = $"global::TUnit.TestProject.DataSourceGeneratorTests.AutoFixtureGeneratorAttribute:{classDataIndex}:CL-GAC0:global::TUnit.TestProject.DataSourceGeneratorTests.AutoFixtureGeneratorAttribute:{testMethodDataIndex}:TL-GAC0:TUnit.TestProject.DataSourceGeneratorTests(System.Int32,System.String,System.Boolean).GeneratedData_Method(System.Int32):0", + TestClassArguments = [classArg, classArg1, classArg2], + TestMethodArguments = [methodArgGeneratedData], + TestClassProperties = [], + CurrentRepeatAttempt = 0, + RepeatLimit = 0, + MethodInfo = methodInfo, + ResettableClassFactory = resettableClassFactory, + TestMethodFactory = (classInstance, cancellationToken) => AsyncConvert.Convert(() => classInstance.GeneratedData_Method(methodArgGeneratedData)), + TestFilePath = @"", + TestLineNumber = 9, + TestAttributes = [ new global::TUnit.Core.TestAttribute() +{ + +}, new global::TUnit.TestProject.DataSourceGeneratorTests.AutoFixtureGeneratorAttribute() +{ + +} ], + ClassAttributes = [ new global::TUnit.TestProject.DataSourceGeneratorTests.AutoFixtureGeneratorAttribute() +{ + +}, new global::TUnit.TestProject.DataSourceGeneratorTests.AutoFixtureGeneratorAttribute() +{ + +} ], + AssemblyAttributes = [ ], + DataAttributes = [ classDataAttribute, methodDataAttribute ], + TestBuilderContext = testBuilderContext, + }); + resettableClassFactory = resettableClassFactoryDelegate(); + testBuilderContext = new(); + testBuilderContextAccessor.Current = testBuilderContext; + } + } + } + catch (global::System.Exception exception) + { + nodes.Add(new FailedInitializationTest + { + TestId = $"global::TUnit.TestProject.DataSourceGeneratorTests.AutoFixtureGeneratorAttribute:{classDataIndex}:CL-GAC0:global::TUnit.TestProject.DataSourceGeneratorTests.AutoFixtureGeneratorAttribute:{testMethodDataIndex}:TL-GAC0:TUnit.TestProject.DataSourceGeneratorTests(System.Int32,System.String,System.Boolean).GeneratedData_Method(System.Int32):0", + TestClass = typeof(global::TUnit.TestProject.DataSourceGeneratorTests), + ReturnType = global::TUnit.Core.Helpers.MethodInfoRetriever.GetMethodInfo(typeof(global::TUnit.TestProject.DataSourceGeneratorTests), "GeneratedData_Method", 0, [typeof(global::System.Int32)]).ReturnType, + ParameterTypeFullNames = [typeof(global::System.Int32)], + TestName = "GeneratedData_Method", + TestFilePath = @"", + TestLineNumber = 9, + Exception = exception, + }); + } + return nodes; + } +} + + +// +#pragma warning disable +using global::System.Linq; +using global::System.Reflection; +using global::TUnit.Core; +using global::TUnit.Core.Extensions; + +namespace TUnit.SourceGenerated; + +[global::System.Diagnostics.StackTraceHidden] +[global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage] +file partial class DataSourceGeneratorTests : TUnit.Core.Interfaces.SourceGenerator.ITestSource +{ + [global::System.Runtime.CompilerServices.ModuleInitializer] + public static void Initialise() + { + SourceRegistrar.Register(new DataSourceGeneratorTests()); + } + public global::System.Collections.Generic.IReadOnlyList CollectTests(string sessionId) + { + return + [ + ..Tests0(sessionId), + ..Tests1(sessionId), + ]; + } + private global::System.Collections.Generic.List Tests0(string sessionId) + { + global::System.Collections.Generic.List nodes = []; + var classDataIndex = 0; + var testMethodDataIndex = 0; + try + { + var testClassType = typeof(global::TUnit.TestProject.DataSourceGeneratorTests); + var methodInfo = global::TUnit.Core.Helpers.MethodInfoRetriever.GetMethodInfo(typeof(global::TUnit.TestProject.DataSourceGeneratorTests), "GeneratedData_Method2", 0, [typeof(global::System.Int32), typeof(global::System.String), typeof(global::System.Boolean)]); + + var testBuilderContext = new global::TUnit.Core.TestBuilderContext(); + var testBuilderContextAccessor = new global::TUnit.Core.TestBuilderContextAccessor(testBuilderContext); + var classArgDataGeneratorMetadata = new DataGeneratorMetadata +{ + Type = TUnit.Core.Enums.DataGeneratorType.Parameters, + TestClassType = testClassType, + ParameterInfos = typeof(global::TUnit.TestProject.DataSourceGeneratorTests).GetConstructors().First().GetParameters(), + PropertyInfo = null, + TestBuilderContext = testBuilderContextAccessor, + TestSessionId = sessionId, +}; + var classDataAttribute = new global::TUnit.TestProject.DataSourceGeneratorTests.AutoFixtureGeneratorAttribute() +{ + +}; + + var classArgGeneratedDataArray = classDataAttribute.GenerateDataSources(classArgDataGeneratorMetadata); + + foreach (var classArgGeneratedDataAccessor in classArgGeneratedDataArray) + { + classDataIndex++; + var methodArgDataGeneratorMetadata = new DataGeneratorMetadata +{ + Type = TUnit.Core.Enums.DataGeneratorType.Parameters, + TestClassType = testClassType, + ParameterInfos = methodInfo.GetParameters(), + PropertyInfo = null, + TestBuilderContext = testBuilderContextAccessor, + TestSessionId = sessionId, +}; + var methodDataAttribute = new global::TUnit.TestProject.DataSourceGeneratorTests.AutoFixtureGeneratorAttribute() +{ + +}; + + var methodArgGeneratedDataArray = methodDataAttribute.GenerateDataSources(methodArgDataGeneratorMetadata); + + foreach (var methodArgGeneratedDataAccessor in methodArgGeneratedDataArray) + { + testMethodDataIndex++; + var classArgGeneratedData = classArgGeneratedDataAccessor(); + global::System.Int32 classArg = classArgGeneratedData.Item1; + global::System.String classArg1 = classArgGeneratedData.Item2; + global::System.Boolean classArg2 = classArgGeneratedData.Item3; + + + var methodArgGeneratedData = methodArgGeneratedDataAccessor(); + global::System.Int32 methodArg = methodArgGeneratedData.Item1; + global::System.String methodArg1 = methodArgGeneratedData.Item2; + global::System.Boolean methodArg2 = methodArgGeneratedData.Item3; + + var resettableClassFactoryDelegate = () => new ResettableLazy(() => + new global::TUnit.TestProject.DataSourceGeneratorTests(classArg, classArg1, classArg2) + , sessionId, testBuilderContext); + + var resettableClassFactory = resettableClassFactoryDelegate(); + + nodes.Add(new TestMetadata + { + TestId = $"global::TUnit.TestProject.DataSourceGeneratorTests.AutoFixtureGeneratorAttribute:{classDataIndex}:CL-GAC0:global::TUnit.TestProject.DataSourceGeneratorTests.AutoFixtureGeneratorAttribute:{testMethodDataIndex}:TL-GAC0:TUnit.TestProject.DataSourceGeneratorTests(System.Int32,System.String,System.Boolean).GeneratedData_Method2(System.Int32,System.String,System.Boolean):0", + TestClassArguments = [classArg, classArg1, classArg2], + TestMethodArguments = [methodArg, methodArg1, methodArg2], + TestClassProperties = [], + CurrentRepeatAttempt = 0, + RepeatLimit = 0, + MethodInfo = methodInfo, + ResettableClassFactory = resettableClassFactory, + TestMethodFactory = (classInstance, cancellationToken) => AsyncConvert.Convert(() => classInstance.GeneratedData_Method2(methodArg, methodArg1, methodArg2)), + TestFilePath = @"", + TestLineNumber = 17, + TestAttributes = [ new global::TUnit.Core.TestAttribute() +{ + +}, new global::TUnit.TestProject.DataSourceGeneratorTests.AutoFixtureGeneratorAttribute() +{ + +} ], + ClassAttributes = [ new global::TUnit.TestProject.DataSourceGeneratorTests.AutoFixtureGeneratorAttribute() +{ + +}, new global::TUnit.TestProject.DataSourceGeneratorTests.AutoFixtureGeneratorAttribute() +{ + +} ], + AssemblyAttributes = [ ], + DataAttributes = [ classDataAttribute, methodDataAttribute ], + TestBuilderContext = testBuilderContext, + }); + resettableClassFactory = resettableClassFactoryDelegate(); + testBuilderContext = new(); + testBuilderContextAccessor.Current = testBuilderContext; + } + } + } + catch (global::System.Exception exception) + { + nodes.Add(new FailedInitializationTest + { + TestId = $"global::TUnit.TestProject.DataSourceGeneratorTests.AutoFixtureGeneratorAttribute:{classDataIndex}:CL-GAC0:global::TUnit.TestProject.DataSourceGeneratorTests.AutoFixtureGeneratorAttribute:{testMethodDataIndex}:TL-GAC0:TUnit.TestProject.DataSourceGeneratorTests(System.Int32,System.String,System.Boolean).GeneratedData_Method2(System.Int32,System.String,System.Boolean):0", + TestClass = typeof(global::TUnit.TestProject.DataSourceGeneratorTests), + ReturnType = global::TUnit.Core.Helpers.MethodInfoRetriever.GetMethodInfo(typeof(global::TUnit.TestProject.DataSourceGeneratorTests), "GeneratedData_Method2", 0, [typeof(global::System.Int32), typeof(global::System.String), typeof(global::System.Boolean)]).ReturnType, + ParameterTypeFullNames = [typeof(global::System.Int32), typeof(global::System.String), typeof(global::System.Boolean)], + TestName = "GeneratedData_Method2", + TestFilePath = @"", + TestLineNumber = 17, + Exception = exception, + }); + } + return nodes; + } + private global::System.Collections.Generic.List Tests1(string sessionId) + { + global::System.Collections.Generic.List nodes = []; + var classDataIndex = 0; + var testMethodDataIndex = 0; + try + { + var testClassType = typeof(global::TUnit.TestProject.DataSourceGeneratorTests); + var methodInfo = global::TUnit.Core.Helpers.MethodInfoRetriever.GetMethodInfo(typeof(global::TUnit.TestProject.DataSourceGeneratorTests), "GeneratedData_Method2", 0, [typeof(global::System.Int32), typeof(global::System.String), typeof(global::System.Boolean)]); + + var testBuilderContext = new global::TUnit.Core.TestBuilderContext(); + var testBuilderContextAccessor = new global::TUnit.Core.TestBuilderContextAccessor(testBuilderContext); + var classArgDataGeneratorMetadata = new DataGeneratorMetadata +{ + Type = TUnit.Core.Enums.DataGeneratorType.Parameters, + TestClassType = testClassType, + ParameterInfos = typeof(global::TUnit.TestProject.DataSourceGeneratorTests).GetConstructors().First().GetParameters(), + PropertyInfo = null, + TestBuilderContext = testBuilderContextAccessor, + TestSessionId = sessionId, +}; + var classDataAttribute = new global::TUnit.TestProject.DataSourceGeneratorTests.AutoFixtureGeneratorAttribute() +{ + +}; + + var classArgGeneratedDataArray = classDataAttribute.GenerateDataSources(classArgDataGeneratorMetadata); + + foreach (var classArgGeneratedDataAccessor in classArgGeneratedDataArray) + { + classDataIndex++; + var methodArgDataGeneratorMetadata = new DataGeneratorMetadata +{ + Type = TUnit.Core.Enums.DataGeneratorType.Parameters, + TestClassType = testClassType, + ParameterInfos = methodInfo.GetParameters(), + PropertyInfo = null, + TestBuilderContext = testBuilderContextAccessor, + TestSessionId = sessionId, +}; + var methodDataAttribute = new global::TUnit.TestProject.DataSourceGeneratorTests.AutoFixtureGeneratorAttribute() +{ + +}; + + var methodArgGeneratedDataArray = methodDataAttribute.GenerateDataSources(methodArgDataGeneratorMetadata); + + foreach (var methodArgGeneratedDataAccessor in methodArgGeneratedDataArray) + { + testMethodDataIndex++; + var classArgGeneratedData = classArgGeneratedDataAccessor(); + global::System.Int32 classArg = classArgGeneratedData.Item1; + global::System.String classArg1 = classArgGeneratedData.Item2; + global::System.Boolean classArg2 = classArgGeneratedData.Item3; + + + var methodArgGeneratedData = methodArgGeneratedDataAccessor(); + global::System.Int32 methodArg = methodArgGeneratedData.Item1; + global::System.String methodArg1 = methodArgGeneratedData.Item2; + global::System.Boolean methodArg2 = methodArgGeneratedData.Item3; + + var resettableClassFactoryDelegate = () => new ResettableLazy(() => + new global::TUnit.TestProject.DataSourceGeneratorTests(classArg, classArg1, classArg2) + , sessionId, testBuilderContext); + + var resettableClassFactory = resettableClassFactoryDelegate(); + + nodes.Add(new TestMetadata + { + TestId = $"global::TUnit.TestProject.DataSourceGeneratorTests.AutoFixtureGeneratorAttribute:{classDataIndex}:CL-GAC0:global::TUnit.TestProject.DataSourceGeneratorTests.AutoFixtureGeneratorAttribute:{testMethodDataIndex}:TL-GAC0:TUnit.TestProject.DataSourceGeneratorTests(System.Int32,System.String,System.Boolean).GeneratedData_Method2(System.Int32,System.String,System.Boolean):0", + TestClassArguments = [classArg, classArg1, classArg2], + TestMethodArguments = [methodArg, methodArg1, methodArg2], + TestClassProperties = [], + CurrentRepeatAttempt = 0, + RepeatLimit = 0, + MethodInfo = methodInfo, + ResettableClassFactory = resettableClassFactory, + TestMethodFactory = (classInstance, cancellationToken) => AsyncConvert.Convert(() => classInstance.GeneratedData_Method2(methodArg, methodArg1, methodArg2)), + TestFilePath = @"", + TestLineNumber = 17, + TestAttributes = [ new global::TUnit.Core.TestAttribute() +{ + +}, new global::TUnit.TestProject.DataSourceGeneratorTests.AutoFixtureGeneratorAttribute() +{ + +} ], + ClassAttributes = [ new global::TUnit.TestProject.DataSourceGeneratorTests.AutoFixtureGeneratorAttribute() +{ + +}, new global::TUnit.TestProject.DataSourceGeneratorTests.AutoFixtureGeneratorAttribute() +{ + +} ], + AssemblyAttributes = [ ], + DataAttributes = [ classDataAttribute, methodDataAttribute ], + TestBuilderContext = testBuilderContext, + }); + resettableClassFactory = resettableClassFactoryDelegate(); + testBuilderContext = new(); + testBuilderContextAccessor.Current = testBuilderContext; + } + } + } + catch (global::System.Exception exception) + { + nodes.Add(new FailedInitializationTest + { + TestId = $"global::TUnit.TestProject.DataSourceGeneratorTests.AutoFixtureGeneratorAttribute:{classDataIndex}:CL-GAC0:global::TUnit.TestProject.DataSourceGeneratorTests.AutoFixtureGeneratorAttribute:{testMethodDataIndex}:TL-GAC0:TUnit.TestProject.DataSourceGeneratorTests(System.Int32,System.String,System.Boolean).GeneratedData_Method2(System.Int32,System.String,System.Boolean):0", + TestClass = typeof(global::TUnit.TestProject.DataSourceGeneratorTests), + ReturnType = global::TUnit.Core.Helpers.MethodInfoRetriever.GetMethodInfo(typeof(global::TUnit.TestProject.DataSourceGeneratorTests), "GeneratedData_Method2", 0, [typeof(global::System.Int32), typeof(global::System.String), typeof(global::System.Boolean)]).ReturnType, + ParameterTypeFullNames = [typeof(global::System.Int32), typeof(global::System.String), typeof(global::System.Boolean)], + TestName = "GeneratedData_Method2", + TestFilePath = @"", + TestLineNumber = 17, + Exception = exception, + }); + } + return nodes; + } +} + + +// +#pragma warning disable +using global::System.Linq; +using global::System.Reflection; +using global::TUnit.Core; +using global::TUnit.Core.Extensions; + +namespace TUnit.SourceGenerated; + +[global::System.Diagnostics.StackTraceHidden] +[global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage] +file partial class DataSourceGeneratorTests : TUnit.Core.Interfaces.SourceGenerator.ITestSource +{ + [global::System.Runtime.CompilerServices.ModuleInitializer] + public static void Initialise() + { + SourceRegistrar.Register(new DataSourceGeneratorTests()); + } + public global::System.Collections.Generic.IReadOnlyList CollectTests(string sessionId) + { + return + [ + ..Tests0(sessionId), + ..Tests1(sessionId), + ]; + } + private global::System.Collections.Generic.List Tests0(string sessionId) + { + global::System.Collections.Generic.List nodes = []; + var classDataIndex = 0; + var testMethodDataIndex = 0; + try + { + var testClassType = typeof(global::TUnit.TestProject.DataSourceGeneratorTests); + var methodInfo = global::TUnit.Core.Helpers.MethodInfoRetriever.GetMethodInfo(typeof(global::TUnit.TestProject.DataSourceGeneratorTests), "GeneratedData_Method3", 0, [typeof(global::System.Int32), typeof(global::System.String), typeof(global::System.Boolean)]); + + var testBuilderContext = new global::TUnit.Core.TestBuilderContext(); + var testBuilderContextAccessor = new global::TUnit.Core.TestBuilderContextAccessor(testBuilderContext); + var classArgDataGeneratorMetadata = new DataGeneratorMetadata +{ + Type = TUnit.Core.Enums.DataGeneratorType.Parameters, + TestClassType = testClassType, + ParameterInfos = typeof(global::TUnit.TestProject.DataSourceGeneratorTests).GetConstructors().First().GetParameters(), + PropertyInfo = null, + TestBuilderContext = testBuilderContextAccessor, + TestSessionId = sessionId, +}; + var classDataAttribute = new global::TUnit.TestProject.DataSourceGeneratorTests.AutoFixtureGeneratorAttribute() +{ + +}; + + var classArgGeneratedDataArray = classDataAttribute.GenerateDataSources(classArgDataGeneratorMetadata); + + foreach (var classArgGeneratedDataAccessor in classArgGeneratedDataArray) + { + classDataIndex++; + var methodArgDataGeneratorMetadata = new DataGeneratorMetadata +{ + Type = TUnit.Core.Enums.DataGeneratorType.Parameters, + TestClassType = testClassType, + ParameterInfos = methodInfo.GetParameters(), + PropertyInfo = null, + TestBuilderContext = testBuilderContextAccessor, + TestSessionId = sessionId, +}; + var methodDataAttribute = new global::TUnit.TestProject.DataSourceGeneratorTests.AutoFixtureGeneratorAttribute() +{ + +}; + + var methodArgGeneratedDataArray = methodDataAttribute.GenerateDataSources(methodArgDataGeneratorMetadata); + + foreach (var methodArgGeneratedDataAccessor in methodArgGeneratedDataArray) + { + testMethodDataIndex++; + var classArgGeneratedData = classArgGeneratedDataAccessor(); + global::System.Int32 classArg = classArgGeneratedData.Item1; + global::System.String classArg1 = classArgGeneratedData.Item2; + global::System.Boolean classArg2 = classArgGeneratedData.Item3; + + + var methodArgGeneratedData = methodArgGeneratedDataAccessor(); + global::System.Int32 methodArg = methodArgGeneratedData.Item1; + global::System.String methodArg1 = methodArgGeneratedData.Item2; + global::System.Boolean methodArg2 = methodArgGeneratedData.Item3; + + var resettableClassFactoryDelegate = () => new ResettableLazy(() => + new global::TUnit.TestProject.DataSourceGeneratorTests(classArg, classArg1, classArg2) + , sessionId, testBuilderContext); + + var resettableClassFactory = resettableClassFactoryDelegate(); + + nodes.Add(new TestMetadata + { + TestId = $"global::TUnit.TestProject.DataSourceGeneratorTests.AutoFixtureGeneratorAttribute:{classDataIndex}:CL-GAC0:global::TUnit.TestProject.DataSourceGeneratorTests.AutoFixtureGeneratorAttribute:{testMethodDataIndex}:TL-GAC0:TUnit.TestProject.DataSourceGeneratorTests(System.Int32,System.String,System.Boolean).GeneratedData_Method3(System.Int32,System.String,System.Boolean):0", + TestClassArguments = [classArg, classArg1, classArg2], + TestMethodArguments = [methodArg, methodArg1, methodArg2], + TestClassProperties = [], + CurrentRepeatAttempt = 0, + RepeatLimit = 0, + MethodInfo = methodInfo, + ResettableClassFactory = resettableClassFactory, + TestMethodFactory = (classInstance, cancellationToken) => AsyncConvert.Convert(() => classInstance.GeneratedData_Method3(methodArg, methodArg1, methodArg2)), + TestFilePath = @"", + TestLineNumber = 25, + TestAttributes = [ new global::TUnit.Core.TestAttribute() +{ + +}, new global::TUnit.TestProject.DataSourceGeneratorTests.AutoFixtureGeneratorAttribute() +{ + +} ], + ClassAttributes = [ new global::TUnit.TestProject.DataSourceGeneratorTests.AutoFixtureGeneratorAttribute() +{ + +}, new global::TUnit.TestProject.DataSourceGeneratorTests.AutoFixtureGeneratorAttribute() +{ + +} ], + AssemblyAttributes = [ ], + DataAttributes = [ classDataAttribute, methodDataAttribute ], + TestBuilderContext = testBuilderContext, + }); + resettableClassFactory = resettableClassFactoryDelegate(); + testBuilderContext = new(); + testBuilderContextAccessor.Current = testBuilderContext; + } + } + } + catch (global::System.Exception exception) + { + nodes.Add(new FailedInitializationTest + { + TestId = $"global::TUnit.TestProject.DataSourceGeneratorTests.AutoFixtureGeneratorAttribute:{classDataIndex}:CL-GAC0:global::TUnit.TestProject.DataSourceGeneratorTests.AutoFixtureGeneratorAttribute:{testMethodDataIndex}:TL-GAC0:TUnit.TestProject.DataSourceGeneratorTests(System.Int32,System.String,System.Boolean).GeneratedData_Method3(System.Int32,System.String,System.Boolean):0", + TestClass = typeof(global::TUnit.TestProject.DataSourceGeneratorTests), + ReturnType = global::TUnit.Core.Helpers.MethodInfoRetriever.GetMethodInfo(typeof(global::TUnit.TestProject.DataSourceGeneratorTests), "GeneratedData_Method3", 0, [typeof(global::System.Int32), typeof(global::System.String), typeof(global::System.Boolean)]).ReturnType, + ParameterTypeFullNames = [typeof(global::System.Int32), typeof(global::System.String), typeof(global::System.Boolean)], + TestName = "GeneratedData_Method3", + TestFilePath = @"", + TestLineNumber = 25, + Exception = exception, + }); + } + return nodes; + } + private global::System.Collections.Generic.List Tests1(string sessionId) + { + global::System.Collections.Generic.List nodes = []; + var classDataIndex = 0; + var testMethodDataIndex = 0; + try + { + var testClassType = typeof(global::TUnit.TestProject.DataSourceGeneratorTests); + var methodInfo = global::TUnit.Core.Helpers.MethodInfoRetriever.GetMethodInfo(typeof(global::TUnit.TestProject.DataSourceGeneratorTests), "GeneratedData_Method3", 0, [typeof(global::System.Int32), typeof(global::System.String), typeof(global::System.Boolean)]); + + var testBuilderContext = new global::TUnit.Core.TestBuilderContext(); + var testBuilderContextAccessor = new global::TUnit.Core.TestBuilderContextAccessor(testBuilderContext); + var classArgDataGeneratorMetadata = new DataGeneratorMetadata +{ + Type = TUnit.Core.Enums.DataGeneratorType.Parameters, + TestClassType = testClassType, + ParameterInfos = typeof(global::TUnit.TestProject.DataSourceGeneratorTests).GetConstructors().First().GetParameters(), + PropertyInfo = null, + TestBuilderContext = testBuilderContextAccessor, + TestSessionId = sessionId, +}; + var classDataAttribute = new global::TUnit.TestProject.DataSourceGeneratorTests.AutoFixtureGeneratorAttribute() +{ + +}; + + var classArgGeneratedDataArray = classDataAttribute.GenerateDataSources(classArgDataGeneratorMetadata); + + foreach (var classArgGeneratedDataAccessor in classArgGeneratedDataArray) + { + classDataIndex++; + var methodArgDataGeneratorMetadata = new DataGeneratorMetadata +{ + Type = TUnit.Core.Enums.DataGeneratorType.Parameters, + TestClassType = testClassType, + ParameterInfos = methodInfo.GetParameters(), + PropertyInfo = null, + TestBuilderContext = testBuilderContextAccessor, + TestSessionId = sessionId, +}; + var methodDataAttribute = new global::TUnit.TestProject.DataSourceGeneratorTests.AutoFixtureGeneratorAttribute() +{ + +}; + + var methodArgGeneratedDataArray = methodDataAttribute.GenerateDataSources(methodArgDataGeneratorMetadata); + + foreach (var methodArgGeneratedDataAccessor in methodArgGeneratedDataArray) + { + testMethodDataIndex++; + var classArgGeneratedData = classArgGeneratedDataAccessor(); + global::System.Int32 classArg = classArgGeneratedData.Item1; + global::System.String classArg1 = classArgGeneratedData.Item2; + global::System.Boolean classArg2 = classArgGeneratedData.Item3; + + + var methodArgGeneratedData = methodArgGeneratedDataAccessor(); + global::System.Int32 methodArg = methodArgGeneratedData.Item1; + global::System.String methodArg1 = methodArgGeneratedData.Item2; + global::System.Boolean methodArg2 = methodArgGeneratedData.Item3; + + var resettableClassFactoryDelegate = () => new ResettableLazy(() => + new global::TUnit.TestProject.DataSourceGeneratorTests(classArg, classArg1, classArg2) + , sessionId, testBuilderContext); + + var resettableClassFactory = resettableClassFactoryDelegate(); + + nodes.Add(new TestMetadata + { + TestId = $"global::TUnit.TestProject.DataSourceGeneratorTests.AutoFixtureGeneratorAttribute:{classDataIndex}:CL-GAC0:global::TUnit.TestProject.DataSourceGeneratorTests.AutoFixtureGeneratorAttribute:{testMethodDataIndex}:TL-GAC0:TUnit.TestProject.DataSourceGeneratorTests(System.Int32,System.String,System.Boolean).GeneratedData_Method3(System.Int32,System.String,System.Boolean):0", + TestClassArguments = [classArg, classArg1, classArg2], + TestMethodArguments = [methodArg, methodArg1, methodArg2], + TestClassProperties = [], + CurrentRepeatAttempt = 0, + RepeatLimit = 0, + MethodInfo = methodInfo, + ResettableClassFactory = resettableClassFactory, + TestMethodFactory = (classInstance, cancellationToken) => AsyncConvert.Convert(() => classInstance.GeneratedData_Method3(methodArg, methodArg1, methodArg2)), + TestFilePath = @"", + TestLineNumber = 25, + TestAttributes = [ new global::TUnit.Core.TestAttribute() +{ + +}, new global::TUnit.TestProject.DataSourceGeneratorTests.AutoFixtureGeneratorAttribute() +{ + +} ], + ClassAttributes = [ new global::TUnit.TestProject.DataSourceGeneratorTests.AutoFixtureGeneratorAttribute() +{ + +}, new global::TUnit.TestProject.DataSourceGeneratorTests.AutoFixtureGeneratorAttribute() +{ + +} ], + AssemblyAttributes = [ ], + DataAttributes = [ classDataAttribute, methodDataAttribute ], + TestBuilderContext = testBuilderContext, + }); + resettableClassFactory = resettableClassFactoryDelegate(); + testBuilderContext = new(); + testBuilderContextAccessor.Current = testBuilderContext; + } + } + } + catch (global::System.Exception exception) + { + nodes.Add(new FailedInitializationTest + { + TestId = $"global::TUnit.TestProject.DataSourceGeneratorTests.AutoFixtureGeneratorAttribute:{classDataIndex}:CL-GAC0:global::TUnit.TestProject.DataSourceGeneratorTests.AutoFixtureGeneratorAttribute:{testMethodDataIndex}:TL-GAC0:TUnit.TestProject.DataSourceGeneratorTests(System.Int32,System.String,System.Boolean).GeneratedData_Method3(System.Int32,System.String,System.Boolean):0", + TestClass = typeof(global::TUnit.TestProject.DataSourceGeneratorTests), + ReturnType = global::TUnit.Core.Helpers.MethodInfoRetriever.GetMethodInfo(typeof(global::TUnit.TestProject.DataSourceGeneratorTests), "GeneratedData_Method3", 0, [typeof(global::System.Int32), typeof(global::System.String), typeof(global::System.Boolean)]).ReturnType, + ParameterTypeFullNames = [typeof(global::System.Int32), typeof(global::System.String), typeof(global::System.Boolean)], + TestName = "GeneratedData_Method3", + TestFilePath = @"", + TestLineNumber = 25, + Exception = exception, + }); + } + return nodes; + } +} + +] \ No newline at end of file diff --git a/TUnit.Core.SourceGenerator.Tests/DataSourceGeneratorTests.cs b/TUnit.Core.SourceGenerator.Tests/DataSourceGeneratorTests.cs index b9d4f77534..2a5f6b63b8 100644 --- a/TUnit.Core.SourceGenerator.Tests/DataSourceGeneratorTests.cs +++ b/TUnit.Core.SourceGenerator.Tests/DataSourceGeneratorTests.cs @@ -1,15 +1,34 @@ using TUnit.Core.SourceGenerator.CodeGenerators; +using TUnit.Core.SourceGenerator.Tests.Options; namespace TUnit.Core.SourceGenerator.Tests; internal class DataSourceGeneratorTests : TestsBase { [Test] - public Task Test() => RunTest(Path.Combine(Git.RootDirectory.FullName, + public Task Typed() => RunTest(Path.Combine(Git.RootDirectory.FullName, "TUnit.TestProject", "DataSourceGeneratorTests.cs"), async generatedFiles => { await Assert.That(generatedFiles.Length).IsEqualTo(3); }); + + [Test] + public Task NonTyped() => RunTest(Path.Combine(Git.RootDirectory.FullName, + "TUnit.TestProject", + "AutoDataTests.cs"), + new RunTestOptions() + { + AdditionalFiles = [ + Path.Combine(Git.RootDirectory.FullName, + "TUnit.TestProject", + "Attributes", + "AutoDataAttribute.cs") + ] + }, + async generatedFiles => + { + await Assert.That(generatedFiles.Length).IsEqualTo(1); + }); } \ No newline at end of file diff --git a/TUnit.Core.SourceGenerator/CodeGenerators/Helpers/ArgumentsRetriever.cs b/TUnit.Core.SourceGenerator/CodeGenerators/Helpers/ArgumentsRetriever.cs index 13adca5bf4..30efffc35a 100644 --- a/TUnit.Core.SourceGenerator/CodeGenerators/Helpers/ArgumentsRetriever.cs +++ b/TUnit.Core.SourceGenerator/CodeGenerators/Helpers/ArgumentsRetriever.cs @@ -63,7 +63,14 @@ public static IEnumerable GetArguments(GeneratorAttributeSyntaxCo if (dataAttribute.AttributeClass?.IsOrInherits(WellKnownFullyQualifiedClassNames .DataSourceGeneratorAttribute.WithGlobalPrefix) == true) { - yield return DataSourceGeneratorRetriever.Parse(context, namedTypeSymbol, dataAttribute, argumentsType, + yield return DataSourceGeneratorRetriever.Parse(context, namedTypeSymbol, parameterOrPropertyTypes, dataAttribute, argumentsType, + index, propertyName); + } + + if (dataAttribute.AttributeClass?.IsOrInherits(WellKnownFullyQualifiedClassNames + .NonTypedDataSourceGeneratorAttribute.WithGlobalPrefix) == true) + { + yield return DataSourceGeneratorRetriever.Parse(context, namedTypeSymbol, parameterOrPropertyTypes, dataAttribute, argumentsType, index, propertyName); } } diff --git a/TUnit.Core.SourceGenerator/CodeGenerators/Helpers/DataSourceGeneratorRetriever.cs b/TUnit.Core.SourceGenerator/CodeGenerators/Helpers/DataSourceGeneratorRetriever.cs index 1f5b9a69d6..4441d6e9c4 100644 --- a/TUnit.Core.SourceGenerator/CodeGenerators/Helpers/DataSourceGeneratorRetriever.cs +++ b/TUnit.Core.SourceGenerator/CodeGenerators/Helpers/DataSourceGeneratorRetriever.cs @@ -1,4 +1,5 @@ -using Microsoft.CodeAnalysis; +using System.Collections.Immutable; +using Microsoft.CodeAnalysis; using TUnit.Core.SourceGenerator.Enums; using TUnit.Core.SourceGenerator.Extensions; using TUnit.Core.SourceGenerator.Models.Arguments; @@ -7,7 +8,9 @@ namespace TUnit.Core.SourceGenerator.CodeGenerators.Helpers; public static class DataSourceGeneratorRetriever { - public static ArgumentsContainer Parse(GeneratorAttributeSyntaxContext context, INamedTypeSymbol namedTypeSymbol, + public static ArgumentsContainer Parse(GeneratorAttributeSyntaxContext context, + INamedTypeSymbol namedTypeSymbol, + ImmutableArray parameterOrPropertyTypes, AttributeData attributeData, ArgumentsType argumentsType, int index, @@ -18,11 +21,12 @@ public static ArgumentsContainer Parse(GeneratorAttributeSyntaxContext context, context, attributeData: attributeData, ArgumentsType: argumentsType, + parameterOrPropertyTypes: parameterOrPropertyTypes, TestClassTypeName: namedTypeSymbol.ToDisplayString(DisplayFormats.FullyQualifiedGenericWithGlobalPrefix), AttributeDataGeneratorType: attributeData.AttributeClass!.ToDisplayString(DisplayFormats .FullyQualifiedGenericWithGlobalPrefix), - GenericArguments: GetDataGeneratorAttributeBaseClass(attributeData.AttributeClass).TypeArguments - .Select(x => x.ToDisplayString(DisplayFormats.FullyQualifiedGenericWithGlobalPrefix)).ToArray(), + GenericArguments: GetDataGeneratorAttributeBaseClass(attributeData.AttributeClass)?.TypeArguments + .Select(x => x.ToDisplayString(DisplayFormats.FullyQualifiedGenericWithGlobalPrefix)).ToArray() ?? [], AttributeIndex: index ) { @@ -36,11 +40,16 @@ .Value.Value as bool? ?? }; } - private static INamedTypeSymbol GetDataGeneratorAttributeBaseClass(ITypeSymbol attributeClass) + private static INamedTypeSymbol? GetDataGeneratorAttributeBaseClass(ITypeSymbol attributeClass) { var selfAndBaseTypes = attributeClass.GetSelfAndBaseTypes(); - return (INamedTypeSymbol) selfAndBaseTypes.First(HasGeneratorInterface); + if (selfAndBaseTypes.FirstOrDefault(HasGeneratorInterface) is INamedTypeSymbol generatorInterface) + { + return generatorInterface; + } + + return null; } private static bool HasGeneratorInterface(ITypeSymbol t) diff --git a/TUnit.Core.SourceGenerator/Models/Arguments/GeneratedArgumentsContainer.cs b/TUnit.Core.SourceGenerator/Models/Arguments/GeneratedArgumentsContainer.cs index 4ced356cb1..c9dce30578 100644 --- a/TUnit.Core.SourceGenerator/Models/Arguments/GeneratedArgumentsContainer.cs +++ b/TUnit.Core.SourceGenerator/Models/Arguments/GeneratedArgumentsContainer.cs @@ -1,18 +1,22 @@ +using System.Collections.Immutable; using Microsoft.CodeAnalysis; using TUnit.Core.SourceGenerator.CodeGenerators.Writers; using TUnit.Core.SourceGenerator.Enums; +using TUnit.Core.SourceGenerator.Extensions; namespace TUnit.Core.SourceGenerator.Models.Arguments; public record GeneratedArgumentsContainer : ArgumentsContainer { public GeneratedArgumentsContainer(GeneratorAttributeSyntaxContext context, AttributeData attributeData, - ArgumentsType ArgumentsType, int AttributeIndex, string TestClassTypeName, string[] GenericArguments, + ArgumentsType ArgumentsType, ImmutableArray parameterOrPropertyTypes, int AttributeIndex, + string TestClassTypeName, string[] GenericArguments, string AttributeDataGeneratorType) : base(ArgumentsType) { this.AttributeIndex = AttributeIndex; Context = context; AttributeData = attributeData; + ParameterOrPropertyTypes = parameterOrPropertyTypes; this.TestClassTypeName = TestClassTypeName; this.GenericArguments = GenericArguments; this.AttributeDataGeneratorType = AttributeDataGeneratorType; @@ -137,8 +141,17 @@ public override void WriteVariableAssignments(SourceCodeWriter sourceCodeWriter, var generatedDataVariableName = $"{VariableNamePrefix}GeneratedData"; sourceCodeWriter.WriteLine($"var {generatedDataVariableName} = {generatedDataVariableName}Accessor();"); - - if (GenericArguments.Length > 1) + + if (GenericArguments.Length == 0) + { + for (var i = 0; i < ParameterOrPropertyTypes.Length; i++) + { + var refIndex = i; + + sourceCodeWriter.WriteLine(GenerateVariable(ParameterOrPropertyTypes[i].GloballyQualified(), $"({ParameterOrPropertyTypes[i].GloballyQualified()}){generatedDataVariableName}[{i}]", ref refIndex).ToString()); + } + } + else if (GenericArguments.Length > 1) { for (var i = 0; i < GenericArguments.Length; i++) { @@ -176,6 +189,7 @@ public override string[] GetArgumentTypes() public GeneratorAttributeSyntaxContext Context { get; } public AttributeData AttributeData { get; } + public ImmutableArray ParameterOrPropertyTypes { get; } public string TestClassTypeName { get; } public string[] GenericArguments { get; } diff --git a/TUnit.Core.SourceGenerator/WellKnownFullyQualifiedClassNames.cs b/TUnit.Core.SourceGenerator/WellKnownFullyQualifiedClassNames.cs index 0e0891111b..b7679d51bd 100644 --- a/TUnit.Core.SourceGenerator/WellKnownFullyQualifiedClassNames.cs +++ b/TUnit.Core.SourceGenerator/WellKnownFullyQualifiedClassNames.cs @@ -16,6 +16,7 @@ public static class WellKnownFullyQualifiedClassNames public static readonly FullyQualifiedTypeName MatrixAttribute = "TUnit.Core.MatrixAttribute"; public static readonly FullyQualifiedTypeName ClassConstructorAttribute = "TUnit.Core.ClassConstructorAttribute"; public static readonly FullyQualifiedTypeName DataSourceGeneratorAttribute = "TUnit.Core.DataSourceGeneratorAttribute"; + public static readonly FullyQualifiedTypeName NonTypedDataSourceGeneratorAttribute = "TUnit.Core.NonTypedDataSourceGeneratorAttribute"; // Metadata diff --git a/TUnit.Core/Attributes/TestData/INonTypedDataSourceGeneratorAttribute.cs b/TUnit.Core/Attributes/TestData/INonTypedDataSourceGeneratorAttribute.cs new file mode 100644 index 0000000000..af3fc08670 --- /dev/null +++ b/TUnit.Core/Attributes/TestData/INonTypedDataSourceGeneratorAttribute.cs @@ -0,0 +1,3 @@ +namespace TUnit.Core; + +internal interface INonTypedDataSource : IDataAttribute; \ No newline at end of file diff --git a/TUnit.Core/Attributes/TestData/NonTypedDataSourceGeneratorAttribute.cs b/TUnit.Core/Attributes/TestData/NonTypedDataSourceGeneratorAttribute.cs new file mode 100644 index 0000000000..954bb86f0a --- /dev/null +++ b/TUnit.Core/Attributes/TestData/NonTypedDataSourceGeneratorAttribute.cs @@ -0,0 +1,7 @@ +namespace TUnit.Core; + +[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class | AttributeTargets.Property, AllowMultiple = true)] +public abstract class NonTypedDataSourceGeneratorAttribute : TestDataAttribute, INonTypedDataSource +{ + public abstract IEnumerable> GenerateDataSources(DataGeneratorMetadata dataGeneratorMetadata); +} \ No newline at end of file diff --git a/TUnit.TestProject/Attributes/AutoDataAttribute.cs b/TUnit.TestProject/Attributes/AutoDataAttribute.cs new file mode 100644 index 0000000000..5d672c45ba --- /dev/null +++ b/TUnit.TestProject/Attributes/AutoDataAttribute.cs @@ -0,0 +1,26 @@ +using AutoFixture.Kernel; + +namespace TUnit.TestProject.Attributes; + +public class AutoDataAttribute : NonTypedDataSourceGeneratorAttribute +{ + private static AutoFixture.Fixture _fixture = new(); + + public override IEnumerable> GenerateDataSources(DataGeneratorMetadata dataGeneratorMetadata) + { + yield return () => GenerateRow(dataGeneratorMetadata); + } + + private object?[] GenerateRow(DataGeneratorMetadata dataGeneratorMetadata) + { + return GenerateRowEnumerable(dataGeneratorMetadata).ToArray(); + } + + private static IEnumerable GenerateRowEnumerable(DataGeneratorMetadata dataGeneratorMetadata) + { + foreach (var parameterInfo in dataGeneratorMetadata.ParameterInfos ?? []) + { + yield return _fixture.Create(parameterInfo.ParameterType, new SpecimenContext(_fixture)); + } + } +} \ No newline at end of file diff --git a/TUnit.TestProject/AutoDataTests.cs b/TUnit.TestProject/AutoDataTests.cs new file mode 100644 index 0000000000..193657c554 --- /dev/null +++ b/TUnit.TestProject/AutoDataTests.cs @@ -0,0 +1,13 @@ +using TUnit.TestProject.Attributes; + +namespace TUnit.TestProject; + +public class AutoDataTests +{ + [AutoData] + [Test] + public Task Test1(string value1, int value2, double value3, bool value4) + { + return Task.CompletedTask; + } +} \ No newline at end of file diff --git a/TUnit.TestProject/TUnit.TestProject.csproj b/TUnit.TestProject/TUnit.TestProject.csproj index 7370bf5049..e265f03300 100644 --- a/TUnit.TestProject/TUnit.TestProject.csproj +++ b/TUnit.TestProject/TUnit.TestProject.csproj @@ -33,6 +33,7 @@ +