diff --git a/Directory.Packages.props b/Directory.Packages.props index ccf0158851..b99e36e249 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -59,8 +59,14 @@ - - + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + diff --git a/TUnit.Assertions.FSharp/Extensions.fs b/TUnit.Assertions.FSharp/Extensions.fs index 1b4b1bd244..3c4d865272 100644 --- a/TUnit.Assertions.FSharp/Extensions.fs +++ b/TUnit.Assertions.FSharp/Extensions.fs @@ -2,11 +2,12 @@ open TUnit.Assertions.AssertionBuilders -module Extensions = +module Operations = + [] let check (assertion: IInvokableAssertionBuilder) = Async.FromContinuations(fun (cont, econt, ccont) -> let awaiter = assertion.GetAwaiter() - + awaiter.OnCompleted(fun () -> try if awaiter.IsCompleted then diff --git a/TUnit.Assertions.FSharp/TUnit.Assertions.FSharp.fsproj b/TUnit.Assertions.FSharp/TUnit.Assertions.FSharp.fsproj index 2af7590863..83e4d8e25e 100644 --- a/TUnit.Assertions.FSharp/TUnit.Assertions.FSharp.fsproj +++ b/TUnit.Assertions.FSharp/TUnit.Assertions.FSharp.fsproj @@ -4,8 +4,8 @@ - + diff --git a/TUnit.Core.SourceGenerator.Tests/AssemblyLoaderTests.Test.DotNet8_0.verified.txt b/TUnit.Core.SourceGenerator.Tests/AssemblyLoaderTests.Test.DotNet8_0.verified.txt index efe5742507..0abca50ba8 100644 --- a/TUnit.Core.SourceGenerator.Tests/AssemblyLoaderTests.Test.DotNet8_0.verified.txt +++ b/TUnit.Core.SourceGenerator.Tests/AssemblyLoaderTests.Test.DotNet8_0.verified.txt @@ -19,7 +19,7 @@ file static class AssemblyLoader_Guid global::TUnit.Core.SourceRegistrar.RegisterAssembly(() => global::System.Reflection.Assembly.Load("TUnit.Engine, Version=1.0.0.0, Culture=neutral, PublicKeyToken=b8d4030011dbd70c")); global::TUnit.Core.SourceRegistrar.RegisterAssembly(() => global::System.Reflection.Assembly.Load("EnumerableAsyncProcessor, Version=2.1.0.0, Culture=neutral, PublicKeyToken=7a7adb9c614908c9")); global::TUnit.Core.SourceRegistrar.RegisterAssembly(() => global::System.Reflection.Assembly.Load("Newtonsoft.Json, Version=13.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed")); - global::TUnit.Core.SourceRegistrar.RegisterAssembly(() => global::System.Reflection.Assembly.Load("Sourcy.Core, Version=0.7.6.0, Culture=neutral, PublicKeyToken=null")); + global::TUnit.Core.SourceRegistrar.RegisterAssembly(() => global::System.Reflection.Assembly.Load("Sourcy.Core, Version=0.7.7.0, Culture=neutral, PublicKeyToken=null")); global::TUnit.Core.SourceRegistrar.RegisterAssembly(() => global::System.Reflection.Assembly.Load("TUnit.TestProject.Library, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null")); } } diff --git a/TUnit.Core.SourceGenerator.Tests/AssemblyLoaderTests.Test.DotNet9_0.verified.txt b/TUnit.Core.SourceGenerator.Tests/AssemblyLoaderTests.Test.DotNet9_0.verified.txt index efe5742507..0abca50ba8 100644 --- a/TUnit.Core.SourceGenerator.Tests/AssemblyLoaderTests.Test.DotNet9_0.verified.txt +++ b/TUnit.Core.SourceGenerator.Tests/AssemblyLoaderTests.Test.DotNet9_0.verified.txt @@ -19,7 +19,7 @@ file static class AssemblyLoader_Guid global::TUnit.Core.SourceRegistrar.RegisterAssembly(() => global::System.Reflection.Assembly.Load("TUnit.Engine, Version=1.0.0.0, Culture=neutral, PublicKeyToken=b8d4030011dbd70c")); global::TUnit.Core.SourceRegistrar.RegisterAssembly(() => global::System.Reflection.Assembly.Load("EnumerableAsyncProcessor, Version=2.1.0.0, Culture=neutral, PublicKeyToken=7a7adb9c614908c9")); global::TUnit.Core.SourceRegistrar.RegisterAssembly(() => global::System.Reflection.Assembly.Load("Newtonsoft.Json, Version=13.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed")); - global::TUnit.Core.SourceRegistrar.RegisterAssembly(() => global::System.Reflection.Assembly.Load("Sourcy.Core, Version=0.7.6.0, Culture=neutral, PublicKeyToken=null")); + global::TUnit.Core.SourceRegistrar.RegisterAssembly(() => global::System.Reflection.Assembly.Load("Sourcy.Core, Version=0.7.7.0, Culture=neutral, PublicKeyToken=null")); global::TUnit.Core.SourceRegistrar.RegisterAssembly(() => global::System.Reflection.Assembly.Load("TUnit.TestProject.Library, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null")); } } diff --git a/TUnit.Core.SourceGenerator.Tests/AssemblyLoaderTests.Test.Net4_7.verified.txt b/TUnit.Core.SourceGenerator.Tests/AssemblyLoaderTests.Test.Net4_7.verified.txt index efe5742507..0abca50ba8 100644 --- a/TUnit.Core.SourceGenerator.Tests/AssemblyLoaderTests.Test.Net4_7.verified.txt +++ b/TUnit.Core.SourceGenerator.Tests/AssemblyLoaderTests.Test.Net4_7.verified.txt @@ -19,7 +19,7 @@ file static class AssemblyLoader_Guid global::TUnit.Core.SourceRegistrar.RegisterAssembly(() => global::System.Reflection.Assembly.Load("TUnit.Engine, Version=1.0.0.0, Culture=neutral, PublicKeyToken=b8d4030011dbd70c")); global::TUnit.Core.SourceRegistrar.RegisterAssembly(() => global::System.Reflection.Assembly.Load("EnumerableAsyncProcessor, Version=2.1.0.0, Culture=neutral, PublicKeyToken=7a7adb9c614908c9")); global::TUnit.Core.SourceRegistrar.RegisterAssembly(() => global::System.Reflection.Assembly.Load("Newtonsoft.Json, Version=13.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed")); - global::TUnit.Core.SourceRegistrar.RegisterAssembly(() => global::System.Reflection.Assembly.Load("Sourcy.Core, Version=0.7.6.0, Culture=neutral, PublicKeyToken=null")); + global::TUnit.Core.SourceRegistrar.RegisterAssembly(() => global::System.Reflection.Assembly.Load("Sourcy.Core, Version=0.7.7.0, Culture=neutral, PublicKeyToken=null")); global::TUnit.Core.SourceRegistrar.RegisterAssembly(() => global::System.Reflection.Assembly.Load("TUnit.TestProject.Library, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null")); } } diff --git a/TUnit.Core.SourceGenerator.Tests/ClassDataSourceDrivenTests.Test.verified.txt b/TUnit.Core.SourceGenerator.Tests/ClassDataSourceDrivenTests.Test.verified.txt index 6db663658b..fadb34c0d0 100644 --- a/TUnit.Core.SourceGenerator.Tests/ClassDataSourceDrivenTests.Test.verified.txt +++ b/TUnit.Core.SourceGenerator.Tests/ClassDataSourceDrivenTests.Test.verified.txt @@ -40,7 +40,7 @@ file partial class ClassDataSourceDrivenTests : global::TUnit.Core.Interfaces.So ], Parameters = [ - new global::TUnit.Core.SourceGeneratedParameterInformation + new global::TUnit.Core.SourceGeneratedParameterInformation { Name = "value", Attributes = [], @@ -74,7 +74,7 @@ file partial class ClassDataSourceDrivenTests : global::TUnit.Core.Interfaces.So TestInformation = testInformation, MembersToGenerate = [ - new global::TUnit.Core.SourceGeneratedParameterInformation + new global::TUnit.Core.SourceGeneratedParameterInformation { Name = "value", Attributes = [], @@ -84,7 +84,7 @@ file partial class ClassDataSourceDrivenTests : global::TUnit.Core.Interfaces.So TestClassInstance = classInstance, ClassInstanceArguments = classInstanceArguments, }; - var methodDataAttribute = new global::TUnit.Core.ClassDataSourceAttribute(); + var methodDataAttribute = new global::TUnit.Core.ClassDataSourceAttribute(); testBuilderContext.DataAttributes.Add(methodDataAttribute); @@ -104,7 +104,7 @@ file partial class ClassDataSourceDrivenTests : global::TUnit.Core.Interfaces.So nodes.Add(new TestMetadata { - TestId = $"global::TUnit.Core.ClassDataSourceAttribute:{testMethodDataIndex}:TL-GAC0:TUnit.TestProject.ClassDataSourceDrivenTests.DataSource_Class(TUnit.TestProject.Dummy.SomeAsyncDisposableClass):0", + TestId = $"global::TUnit.Core.ClassDataSourceAttribute:{testMethodDataIndex}:TL-GAC0:TUnit.TestProject.ClassDataSourceDrivenTests.DataSource_Class(TUnit.TestProject.Library.Models.SomeAsyncDisposableClass):0", TestClassArguments = [], TestMethodArguments = [methodArgGeneratedData], TestClassProperties = new global::System.Collections.Generic.Dictionary @@ -115,7 +115,7 @@ file partial class ClassDataSourceDrivenTests : global::TUnit.Core.Interfaces.So ResettableClassFactory = resettableClassFactory, TestMethodFactory = (classInstance, cancellationToken) => AsyncConvert.Convert(() => classInstance.DataSource_Class(methodArgGeneratedData)), TestFilePath = @"", - TestLineNumber = 10, + TestLineNumber = 9, TestMethod = testInformation, TestBuilderContext = testBuilderContext, }); @@ -128,11 +128,11 @@ file partial class ClassDataSourceDrivenTests : global::TUnit.Core.Interfaces.So { nodes.Add(new FailedTestMetadata { - TestId = $"global::TUnit.Core.ClassDataSourceAttribute:{testMethodDataIndex}:TL-GAC0:TUnit.TestProject.ClassDataSourceDrivenTests.DataSource_Class(TUnit.TestProject.Dummy.SomeAsyncDisposableClass):0", + TestId = $"global::TUnit.Core.ClassDataSourceAttribute:{testMethodDataIndex}:TL-GAC0:TUnit.TestProject.ClassDataSourceDrivenTests.DataSource_Class(TUnit.TestProject.Library.Models.SomeAsyncDisposableClass):0", MethodName = $"DataSource_Class", Exception = new TUnit.Core.Exceptions.TestFailedInitializationException("ClassDataSourceDrivenTests.DataSource_Class failed to initialize", exception), TestFilePath = @"", - TestLineNumber = 10, + TestLineNumber = 9, }); } return nodes; @@ -181,7 +181,7 @@ file partial class ClassDataSourceDrivenTests : global::TUnit.Core.Interfaces.So ], Parameters = [ - new global::TUnit.Core.SourceGeneratedParameterInformation + new global::TUnit.Core.SourceGeneratedParameterInformation { Name = "value", Attributes = [], @@ -215,7 +215,7 @@ file partial class ClassDataSourceDrivenTests : global::TUnit.Core.Interfaces.So TestInformation = testInformation, MembersToGenerate = [ - new global::TUnit.Core.SourceGeneratedParameterInformation + new global::TUnit.Core.SourceGeneratedParameterInformation { Name = "value", Attributes = [], @@ -225,7 +225,7 @@ file partial class ClassDataSourceDrivenTests : global::TUnit.Core.Interfaces.So TestClassInstance = classInstance, ClassInstanceArguments = classInstanceArguments, }; - var methodDataAttribute = new global::TUnit.Core.ClassDataSourceAttribute(); + var methodDataAttribute = new global::TUnit.Core.ClassDataSourceAttribute(); testBuilderContext.DataAttributes.Add(methodDataAttribute); @@ -245,7 +245,7 @@ file partial class ClassDataSourceDrivenTests : global::TUnit.Core.Interfaces.So nodes.Add(new TestMetadata { - TestId = $"global::TUnit.Core.ClassDataSourceAttribute:{testMethodDataIndex}:TL-GAC0:TUnit.TestProject.ClassDataSourceDrivenTests.DataSource_Class_Generic(TUnit.TestProject.Dummy.SomeAsyncDisposableClass):0", + TestId = $"global::TUnit.Core.ClassDataSourceAttribute:{testMethodDataIndex}:TL-GAC0:TUnit.TestProject.ClassDataSourceDrivenTests.DataSource_Class_Generic(TUnit.TestProject.Library.Models.SomeAsyncDisposableClass):0", TestClassArguments = [], TestMethodArguments = [methodArgGeneratedData], TestClassProperties = new global::System.Collections.Generic.Dictionary @@ -256,7 +256,7 @@ file partial class ClassDataSourceDrivenTests : global::TUnit.Core.Interfaces.So ResettableClassFactory = resettableClassFactory, TestMethodFactory = (classInstance, cancellationToken) => AsyncConvert.Convert(() => classInstance.DataSource_Class_Generic(methodArgGeneratedData)), TestFilePath = @"", - TestLineNumber = 17, + TestLineNumber = 16, TestMethod = testInformation, TestBuilderContext = testBuilderContext, }); @@ -269,11 +269,11 @@ file partial class ClassDataSourceDrivenTests : global::TUnit.Core.Interfaces.So { nodes.Add(new FailedTestMetadata { - TestId = $"global::TUnit.Core.ClassDataSourceAttribute:{testMethodDataIndex}:TL-GAC0:TUnit.TestProject.ClassDataSourceDrivenTests.DataSource_Class_Generic(TUnit.TestProject.Dummy.SomeAsyncDisposableClass):0", + TestId = $"global::TUnit.Core.ClassDataSourceAttribute:{testMethodDataIndex}:TL-GAC0:TUnit.TestProject.ClassDataSourceDrivenTests.DataSource_Class_Generic(TUnit.TestProject.Library.Models.SomeAsyncDisposableClass):0", MethodName = $"DataSource_Class_Generic", Exception = new TUnit.Core.Exceptions.TestFailedInitializationException("ClassDataSourceDrivenTests.DataSource_Class_Generic failed to initialize", exception), TestFilePath = @"", - TestLineNumber = 17, + TestLineNumber = 16, }); } return nodes; @@ -322,7 +322,7 @@ file partial class ClassDataSourceDrivenTests : global::TUnit.Core.Interfaces.So ], Parameters = [ - new global::TUnit.Core.SourceGeneratedParameterInformation + new global::TUnit.Core.SourceGeneratedParameterInformation { Name = "class1", Attributes = [], @@ -356,7 +356,7 @@ file partial class ClassDataSourceDrivenTests : global::TUnit.Core.Interfaces.So TestInformation = testInformation, MembersToGenerate = [ - new global::TUnit.Core.SourceGeneratedParameterInformation + new global::TUnit.Core.SourceGeneratedParameterInformation { Name = "class1", Attributes = [], @@ -366,7 +366,7 @@ file partial class ClassDataSourceDrivenTests : global::TUnit.Core.Interfaces.So TestClassInstance = classInstance, ClassInstanceArguments = classInstanceArguments, }; - var methodDataAttribute = new global::TUnit.Core.ClassDataSourceAttribute(); + var methodDataAttribute = new global::TUnit.Core.ClassDataSourceAttribute(); testBuilderContext.DataAttributes.Add(methodDataAttribute); @@ -386,7 +386,7 @@ file partial class ClassDataSourceDrivenTests : global::TUnit.Core.Interfaces.So nodes.Add(new TestMetadata { - TestId = $"global::TUnit.Core.ClassDataSourceAttribute:{testMethodDataIndex}:TL-GAC0:TUnit.TestProject.ClassDataSourceDrivenTests.IsInitialized_With_1_ClassDataSource(TUnit.TestProject.InitializableClass):0", + TestId = $"global::TUnit.Core.ClassDataSourceAttribute:{testMethodDataIndex}:TL-GAC0:TUnit.TestProject.ClassDataSourceDrivenTests.IsInitialized_With_1_ClassDataSource(TUnit.TestProject.Library.Models.InitializableClass):0", TestClassArguments = [], TestMethodArguments = [methodArgGeneratedData], TestClassProperties = new global::System.Collections.Generic.Dictionary @@ -397,7 +397,7 @@ file partial class ClassDataSourceDrivenTests : global::TUnit.Core.Interfaces.So ResettableClassFactory = resettableClassFactory, TestMethodFactory = (classInstance, cancellationToken) => AsyncConvert.Convert(() => classInstance.IsInitialized_With_1_ClassDataSource(methodArgGeneratedData)), TestFilePath = @"", - TestLineNumber = 24, + TestLineNumber = 23, TestMethod = testInformation, TestBuilderContext = testBuilderContext, }); @@ -410,11 +410,11 @@ file partial class ClassDataSourceDrivenTests : global::TUnit.Core.Interfaces.So { nodes.Add(new FailedTestMetadata { - TestId = $"global::TUnit.Core.ClassDataSourceAttribute:{testMethodDataIndex}:TL-GAC0:TUnit.TestProject.ClassDataSourceDrivenTests.IsInitialized_With_1_ClassDataSource(TUnit.TestProject.InitializableClass):0", + TestId = $"global::TUnit.Core.ClassDataSourceAttribute:{testMethodDataIndex}:TL-GAC0:TUnit.TestProject.ClassDataSourceDrivenTests.IsInitialized_With_1_ClassDataSource(TUnit.TestProject.Library.Models.InitializableClass):0", MethodName = $"IsInitialized_With_1_ClassDataSource", Exception = new TUnit.Core.Exceptions.TestFailedInitializationException("ClassDataSourceDrivenTests.IsInitialized_With_1_ClassDataSource failed to initialize", exception), TestFilePath = @"", - TestLineNumber = 24, + TestLineNumber = 23, }); } return nodes; @@ -463,12 +463,12 @@ file partial class ClassDataSourceDrivenTests : global::TUnit.Core.Interfaces.So ], Parameters = [ - new global::TUnit.Core.SourceGeneratedParameterInformation + new global::TUnit.Core.SourceGeneratedParameterInformation { Name = "class1", Attributes = [], }, - new global::TUnit.Core.SourceGeneratedParameterInformation + new global::TUnit.Core.SourceGeneratedParameterInformation { Name = "class2", Attributes = [], @@ -502,12 +502,12 @@ file partial class ClassDataSourceDrivenTests : global::TUnit.Core.Interfaces.So TestInformation = testInformation, MembersToGenerate = [ - new global::TUnit.Core.SourceGeneratedParameterInformation + new global::TUnit.Core.SourceGeneratedParameterInformation { Name = "class1", Attributes = [], }, - new global::TUnit.Core.SourceGeneratedParameterInformation + new global::TUnit.Core.SourceGeneratedParameterInformation { Name = "class2", Attributes = [], @@ -517,7 +517,7 @@ file partial class ClassDataSourceDrivenTests : global::TUnit.Core.Interfaces.So TestClassInstance = classInstance, ClassInstanceArguments = classInstanceArguments, }; - var methodDataAttribute = new global::TUnit.Core.ClassDataSourceAttribute(); + var methodDataAttribute = new global::TUnit.Core.ClassDataSourceAttribute(); testBuilderContext.DataAttributes.Add(methodDataAttribute); @@ -529,8 +529,8 @@ file partial class ClassDataSourceDrivenTests : global::TUnit.Core.Interfaces.So classInstanceArguments = []; var methodArgGeneratedData = methodArgGeneratedDataAccessor(); - global::TUnit.TestProject.InitializableClass methodArg = methodArgGeneratedData.Item1; - global::TUnit.TestProject.InitializableClass methodArg1 = methodArgGeneratedData.Item2; + global::TUnit.TestProject.Library.Models.InitializableClass methodArg = methodArgGeneratedData.Item1; + global::TUnit.TestProject.Library.Models.InitializableClass methodArg1 = methodArgGeneratedData.Item2; var resettableClassFactoryDelegate = () => new ResettableLazy(() => new global::TUnit.TestProject.ClassDataSourceDrivenTests() @@ -540,7 +540,7 @@ file partial class ClassDataSourceDrivenTests : global::TUnit.Core.Interfaces.So nodes.Add(new TestMetadata { - TestId = $"global::TUnit.Core.ClassDataSourceAttribute:{testMethodDataIndex}:TL-GAC0:TUnit.TestProject.ClassDataSourceDrivenTests.IsInitialized_With_2_ClassDataSources(TUnit.TestProject.InitializableClass,TUnit.TestProject.InitializableClass):0", + TestId = $"global::TUnit.Core.ClassDataSourceAttribute:{testMethodDataIndex}:TL-GAC0:TUnit.TestProject.ClassDataSourceDrivenTests.IsInitialized_With_2_ClassDataSources(TUnit.TestProject.Library.Models.InitializableClass,TUnit.TestProject.Library.Models.InitializableClass):0", TestClassArguments = [], TestMethodArguments = [methodArg, methodArg1], TestClassProperties = new global::System.Collections.Generic.Dictionary @@ -551,7 +551,7 @@ file partial class ClassDataSourceDrivenTests : global::TUnit.Core.Interfaces.So ResettableClassFactory = resettableClassFactory, TestMethodFactory = (classInstance, cancellationToken) => AsyncConvert.Convert(() => classInstance.IsInitialized_With_2_ClassDataSources(methodArg, methodArg1)), TestFilePath = @"", - TestLineNumber = 31, + TestLineNumber = 30, TestMethod = testInformation, TestBuilderContext = testBuilderContext, }); @@ -564,11 +564,11 @@ file partial class ClassDataSourceDrivenTests : global::TUnit.Core.Interfaces.So { nodes.Add(new FailedTestMetadata { - TestId = $"global::TUnit.Core.ClassDataSourceAttribute:{testMethodDataIndex}:TL-GAC0:TUnit.TestProject.ClassDataSourceDrivenTests.IsInitialized_With_2_ClassDataSources(TUnit.TestProject.InitializableClass,TUnit.TestProject.InitializableClass):0", + TestId = $"global::TUnit.Core.ClassDataSourceAttribute:{testMethodDataIndex}:TL-GAC0:TUnit.TestProject.ClassDataSourceDrivenTests.IsInitialized_With_2_ClassDataSources(TUnit.TestProject.Library.Models.InitializableClass,TUnit.TestProject.Library.Models.InitializableClass):0", MethodName = $"IsInitialized_With_2_ClassDataSources", Exception = new TUnit.Core.Exceptions.TestFailedInitializationException("ClassDataSourceDrivenTests.IsInitialized_With_2_ClassDataSources failed to initialize", exception), TestFilePath = @"", - TestLineNumber = 31, + TestLineNumber = 30, }); } return nodes; @@ -617,17 +617,17 @@ file partial class ClassDataSourceDrivenTests : global::TUnit.Core.Interfaces.So ], Parameters = [ - new global::TUnit.Core.SourceGeneratedParameterInformation + new global::TUnit.Core.SourceGeneratedParameterInformation { Name = "class1", Attributes = [], }, - new global::TUnit.Core.SourceGeneratedParameterInformation + new global::TUnit.Core.SourceGeneratedParameterInformation { Name = "class2", Attributes = [], }, - new global::TUnit.Core.SourceGeneratedParameterInformation + new global::TUnit.Core.SourceGeneratedParameterInformation { Name = "class3", Attributes = [], @@ -661,17 +661,17 @@ file partial class ClassDataSourceDrivenTests : global::TUnit.Core.Interfaces.So TestInformation = testInformation, MembersToGenerate = [ - new global::TUnit.Core.SourceGeneratedParameterInformation + new global::TUnit.Core.SourceGeneratedParameterInformation { Name = "class1", Attributes = [], }, - new global::TUnit.Core.SourceGeneratedParameterInformation + new global::TUnit.Core.SourceGeneratedParameterInformation { Name = "class2", Attributes = [], }, - new global::TUnit.Core.SourceGeneratedParameterInformation + new global::TUnit.Core.SourceGeneratedParameterInformation { Name = "class3", Attributes = [], @@ -681,7 +681,7 @@ file partial class ClassDataSourceDrivenTests : global::TUnit.Core.Interfaces.So TestClassInstance = classInstance, ClassInstanceArguments = classInstanceArguments, }; - var methodDataAttribute = new global::TUnit.Core.ClassDataSourceAttribute(); + var methodDataAttribute = new global::TUnit.Core.ClassDataSourceAttribute(); testBuilderContext.DataAttributes.Add(methodDataAttribute); @@ -693,9 +693,9 @@ file partial class ClassDataSourceDrivenTests : global::TUnit.Core.Interfaces.So classInstanceArguments = []; var methodArgGeneratedData = methodArgGeneratedDataAccessor(); - global::TUnit.TestProject.InitializableClass methodArg = methodArgGeneratedData.Item1; - global::TUnit.TestProject.InitializableClass methodArg1 = methodArgGeneratedData.Item2; - global::TUnit.TestProject.InitializableClass methodArg2 = methodArgGeneratedData.Item3; + global::TUnit.TestProject.Library.Models.InitializableClass methodArg = methodArgGeneratedData.Item1; + global::TUnit.TestProject.Library.Models.InitializableClass methodArg1 = methodArgGeneratedData.Item2; + global::TUnit.TestProject.Library.Models.InitializableClass methodArg2 = methodArgGeneratedData.Item3; var resettableClassFactoryDelegate = () => new ResettableLazy(() => new global::TUnit.TestProject.ClassDataSourceDrivenTests() @@ -705,7 +705,7 @@ file partial class ClassDataSourceDrivenTests : global::TUnit.Core.Interfaces.So nodes.Add(new TestMetadata { - TestId = $"global::TUnit.Core.ClassDataSourceAttribute:{testMethodDataIndex}:TL-GAC0:TUnit.TestProject.ClassDataSourceDrivenTests.IsInitialized_With_3_ClassDataSources(TUnit.TestProject.InitializableClass,TUnit.TestProject.InitializableClass,TUnit.TestProject.InitializableClass):0", + TestId = $"global::TUnit.Core.ClassDataSourceAttribute:{testMethodDataIndex}:TL-GAC0:TUnit.TestProject.ClassDataSourceDrivenTests.IsInitialized_With_3_ClassDataSources(TUnit.TestProject.Library.Models.InitializableClass,TUnit.TestProject.Library.Models.InitializableClass,TUnit.TestProject.Library.Models.InitializableClass):0", TestClassArguments = [], TestMethodArguments = [methodArg, methodArg1, methodArg2], TestClassProperties = new global::System.Collections.Generic.Dictionary @@ -716,7 +716,7 @@ file partial class ClassDataSourceDrivenTests : global::TUnit.Core.Interfaces.So ResettableClassFactory = resettableClassFactory, TestMethodFactory = (classInstance, cancellationToken) => AsyncConvert.Convert(() => classInstance.IsInitialized_With_3_ClassDataSources(methodArg, methodArg1, methodArg2)), TestFilePath = @"", - TestLineNumber = 39, + TestLineNumber = 38, TestMethod = testInformation, TestBuilderContext = testBuilderContext, }); @@ -729,11 +729,11 @@ file partial class ClassDataSourceDrivenTests : global::TUnit.Core.Interfaces.So { nodes.Add(new FailedTestMetadata { - TestId = $"global::TUnit.Core.ClassDataSourceAttribute:{testMethodDataIndex}:TL-GAC0:TUnit.TestProject.ClassDataSourceDrivenTests.IsInitialized_With_3_ClassDataSources(TUnit.TestProject.InitializableClass,TUnit.TestProject.InitializableClass,TUnit.TestProject.InitializableClass):0", + TestId = $"global::TUnit.Core.ClassDataSourceAttribute:{testMethodDataIndex}:TL-GAC0:TUnit.TestProject.ClassDataSourceDrivenTests.IsInitialized_With_3_ClassDataSources(TUnit.TestProject.Library.Models.InitializableClass,TUnit.TestProject.Library.Models.InitializableClass,TUnit.TestProject.Library.Models.InitializableClass):0", MethodName = $"IsInitialized_With_3_ClassDataSources", Exception = new TUnit.Core.Exceptions.TestFailedInitializationException("ClassDataSourceDrivenTests.IsInitialized_With_3_ClassDataSources failed to initialize", exception), TestFilePath = @"", - TestLineNumber = 39, + TestLineNumber = 38, }); } return nodes; @@ -782,22 +782,22 @@ file partial class ClassDataSourceDrivenTests : global::TUnit.Core.Interfaces.So ], Parameters = [ - new global::TUnit.Core.SourceGeneratedParameterInformation + new global::TUnit.Core.SourceGeneratedParameterInformation { Name = "class1", Attributes = [], }, - new global::TUnit.Core.SourceGeneratedParameterInformation + new global::TUnit.Core.SourceGeneratedParameterInformation { Name = "class2", Attributes = [], }, - new global::TUnit.Core.SourceGeneratedParameterInformation + new global::TUnit.Core.SourceGeneratedParameterInformation { Name = "class3", Attributes = [], }, - new global::TUnit.Core.SourceGeneratedParameterInformation + new global::TUnit.Core.SourceGeneratedParameterInformation { Name = "class4", Attributes = [], @@ -831,22 +831,22 @@ file partial class ClassDataSourceDrivenTests : global::TUnit.Core.Interfaces.So TestInformation = testInformation, MembersToGenerate = [ - new global::TUnit.Core.SourceGeneratedParameterInformation + new global::TUnit.Core.SourceGeneratedParameterInformation { Name = "class1", Attributes = [], }, - new global::TUnit.Core.SourceGeneratedParameterInformation + new global::TUnit.Core.SourceGeneratedParameterInformation { Name = "class2", Attributes = [], }, - new global::TUnit.Core.SourceGeneratedParameterInformation + new global::TUnit.Core.SourceGeneratedParameterInformation { Name = "class3", Attributes = [], }, - new global::TUnit.Core.SourceGeneratedParameterInformation + new global::TUnit.Core.SourceGeneratedParameterInformation { Name = "class4", Attributes = [], @@ -856,7 +856,7 @@ file partial class ClassDataSourceDrivenTests : global::TUnit.Core.Interfaces.So TestClassInstance = classInstance, ClassInstanceArguments = classInstanceArguments, }; - var methodDataAttribute = new global::TUnit.Core.ClassDataSourceAttribute(); + var methodDataAttribute = new global::TUnit.Core.ClassDataSourceAttribute(); testBuilderContext.DataAttributes.Add(methodDataAttribute); @@ -868,10 +868,10 @@ file partial class ClassDataSourceDrivenTests : global::TUnit.Core.Interfaces.So classInstanceArguments = []; var methodArgGeneratedData = methodArgGeneratedDataAccessor(); - global::TUnit.TestProject.InitializableClass methodArg = methodArgGeneratedData.Item1; - global::TUnit.TestProject.InitializableClass methodArg1 = methodArgGeneratedData.Item2; - global::TUnit.TestProject.InitializableClass methodArg2 = methodArgGeneratedData.Item3; - global::TUnit.TestProject.InitializableClass methodArg3 = methodArgGeneratedData.Item4; + global::TUnit.TestProject.Library.Models.InitializableClass methodArg = methodArgGeneratedData.Item1; + global::TUnit.TestProject.Library.Models.InitializableClass methodArg1 = methodArgGeneratedData.Item2; + global::TUnit.TestProject.Library.Models.InitializableClass methodArg2 = methodArgGeneratedData.Item3; + global::TUnit.TestProject.Library.Models.InitializableClass methodArg3 = methodArgGeneratedData.Item4; var resettableClassFactoryDelegate = () => new ResettableLazy(() => new global::TUnit.TestProject.ClassDataSourceDrivenTests() @@ -881,7 +881,7 @@ file partial class ClassDataSourceDrivenTests : global::TUnit.Core.Interfaces.So nodes.Add(new TestMetadata { - TestId = $"global::TUnit.Core.ClassDataSourceAttribute:{testMethodDataIndex}:TL-GAC0:TUnit.TestProject.ClassDataSourceDrivenTests.IsInitialized_With_4_ClassDataSources(TUnit.TestProject.InitializableClass,TUnit.TestProject.InitializableClass,TUnit.TestProject.InitializableClass,TUnit.TestProject.InitializableClass):0", + TestId = $"global::TUnit.Core.ClassDataSourceAttribute:{testMethodDataIndex}:TL-GAC0:TUnit.TestProject.ClassDataSourceDrivenTests.IsInitialized_With_4_ClassDataSources(TUnit.TestProject.Library.Models.InitializableClass,TUnit.TestProject.Library.Models.InitializableClass,TUnit.TestProject.Library.Models.InitializableClass,TUnit.TestProject.Library.Models.InitializableClass):0", TestClassArguments = [], TestMethodArguments = [methodArg, methodArg1, methodArg2, methodArg3], TestClassProperties = new global::System.Collections.Generic.Dictionary @@ -892,7 +892,7 @@ file partial class ClassDataSourceDrivenTests : global::TUnit.Core.Interfaces.So ResettableClassFactory = resettableClassFactory, TestMethodFactory = (classInstance, cancellationToken) => AsyncConvert.Convert(() => classInstance.IsInitialized_With_4_ClassDataSources(methodArg, methodArg1, methodArg2, methodArg3)), TestFilePath = @"", - TestLineNumber = 48, + TestLineNumber = 47, TestMethod = testInformation, TestBuilderContext = testBuilderContext, }); @@ -905,11 +905,11 @@ file partial class ClassDataSourceDrivenTests : global::TUnit.Core.Interfaces.So { nodes.Add(new FailedTestMetadata { - TestId = $"global::TUnit.Core.ClassDataSourceAttribute:{testMethodDataIndex}:TL-GAC0:TUnit.TestProject.ClassDataSourceDrivenTests.IsInitialized_With_4_ClassDataSources(TUnit.TestProject.InitializableClass,TUnit.TestProject.InitializableClass,TUnit.TestProject.InitializableClass,TUnit.TestProject.InitializableClass):0", + TestId = $"global::TUnit.Core.ClassDataSourceAttribute:{testMethodDataIndex}:TL-GAC0:TUnit.TestProject.ClassDataSourceDrivenTests.IsInitialized_With_4_ClassDataSources(TUnit.TestProject.Library.Models.InitializableClass,TUnit.TestProject.Library.Models.InitializableClass,TUnit.TestProject.Library.Models.InitializableClass,TUnit.TestProject.Library.Models.InitializableClass):0", MethodName = $"IsInitialized_With_4_ClassDataSources", Exception = new TUnit.Core.Exceptions.TestFailedInitializationException("ClassDataSourceDrivenTests.IsInitialized_With_4_ClassDataSources failed to initialize", exception), TestFilePath = @"", - TestLineNumber = 48, + TestLineNumber = 47, }); } return nodes; @@ -958,27 +958,27 @@ file partial class ClassDataSourceDrivenTests : global::TUnit.Core.Interfaces.So ], Parameters = [ - new global::TUnit.Core.SourceGeneratedParameterInformation + new global::TUnit.Core.SourceGeneratedParameterInformation { Name = "class1", Attributes = [], }, - new global::TUnit.Core.SourceGeneratedParameterInformation + new global::TUnit.Core.SourceGeneratedParameterInformation { Name = "class2", Attributes = [], }, - new global::TUnit.Core.SourceGeneratedParameterInformation + new global::TUnit.Core.SourceGeneratedParameterInformation { Name = "class3", Attributes = [], }, - new global::TUnit.Core.SourceGeneratedParameterInformation + new global::TUnit.Core.SourceGeneratedParameterInformation { Name = "class4", Attributes = [], }, - new global::TUnit.Core.SourceGeneratedParameterInformation + new global::TUnit.Core.SourceGeneratedParameterInformation { Name = "class5", Attributes = [], @@ -1012,27 +1012,27 @@ file partial class ClassDataSourceDrivenTests : global::TUnit.Core.Interfaces.So TestInformation = testInformation, MembersToGenerate = [ - new global::TUnit.Core.SourceGeneratedParameterInformation + new global::TUnit.Core.SourceGeneratedParameterInformation { Name = "class1", Attributes = [], }, - new global::TUnit.Core.SourceGeneratedParameterInformation + new global::TUnit.Core.SourceGeneratedParameterInformation { Name = "class2", Attributes = [], }, - new global::TUnit.Core.SourceGeneratedParameterInformation + new global::TUnit.Core.SourceGeneratedParameterInformation { Name = "class3", Attributes = [], }, - new global::TUnit.Core.SourceGeneratedParameterInformation + new global::TUnit.Core.SourceGeneratedParameterInformation { Name = "class4", Attributes = [], }, - new global::TUnit.Core.SourceGeneratedParameterInformation + new global::TUnit.Core.SourceGeneratedParameterInformation { Name = "class5", Attributes = [], @@ -1042,7 +1042,7 @@ file partial class ClassDataSourceDrivenTests : global::TUnit.Core.Interfaces.So TestClassInstance = classInstance, ClassInstanceArguments = classInstanceArguments, }; - var methodDataAttribute = new global::TUnit.Core.ClassDataSourceAttribute(); + var methodDataAttribute = new global::TUnit.Core.ClassDataSourceAttribute(); testBuilderContext.DataAttributes.Add(methodDataAttribute); @@ -1054,11 +1054,11 @@ file partial class ClassDataSourceDrivenTests : global::TUnit.Core.Interfaces.So classInstanceArguments = []; var methodArgGeneratedData = methodArgGeneratedDataAccessor(); - global::TUnit.TestProject.InitializableClass methodArg = methodArgGeneratedData.Item1; - global::TUnit.TestProject.InitializableClass methodArg1 = methodArgGeneratedData.Item2; - global::TUnit.TestProject.InitializableClass methodArg2 = methodArgGeneratedData.Item3; - global::TUnit.TestProject.InitializableClass methodArg3 = methodArgGeneratedData.Item4; - global::TUnit.TestProject.InitializableClass methodArg4 = methodArgGeneratedData.Item5; + global::TUnit.TestProject.Library.Models.InitializableClass methodArg = methodArgGeneratedData.Item1; + global::TUnit.TestProject.Library.Models.InitializableClass methodArg1 = methodArgGeneratedData.Item2; + global::TUnit.TestProject.Library.Models.InitializableClass methodArg2 = methodArgGeneratedData.Item3; + global::TUnit.TestProject.Library.Models.InitializableClass methodArg3 = methodArgGeneratedData.Item4; + global::TUnit.TestProject.Library.Models.InitializableClass methodArg4 = methodArgGeneratedData.Item5; var resettableClassFactoryDelegate = () => new ResettableLazy(() => new global::TUnit.TestProject.ClassDataSourceDrivenTests() @@ -1068,7 +1068,7 @@ file partial class ClassDataSourceDrivenTests : global::TUnit.Core.Interfaces.So nodes.Add(new TestMetadata { - TestId = $"global::TUnit.Core.ClassDataSourceAttribute:{testMethodDataIndex}:TL-GAC0:TUnit.TestProject.ClassDataSourceDrivenTests.IsInitialized_With_5_ClassDataSources(TUnit.TestProject.InitializableClass,TUnit.TestProject.InitializableClass,TUnit.TestProject.InitializableClass,TUnit.TestProject.InitializableClass,TUnit.TestProject.InitializableClass):0", + TestId = $"global::TUnit.Core.ClassDataSourceAttribute:{testMethodDataIndex}:TL-GAC0:TUnit.TestProject.ClassDataSourceDrivenTests.IsInitialized_With_5_ClassDataSources(TUnit.TestProject.Library.Models.InitializableClass,TUnit.TestProject.Library.Models.InitializableClass,TUnit.TestProject.Library.Models.InitializableClass,TUnit.TestProject.Library.Models.InitializableClass,TUnit.TestProject.Library.Models.InitializableClass):0", TestClassArguments = [], TestMethodArguments = [methodArg, methodArg1, methodArg2, methodArg3, methodArg4], TestClassProperties = new global::System.Collections.Generic.Dictionary @@ -1079,7 +1079,7 @@ file partial class ClassDataSourceDrivenTests : global::TUnit.Core.Interfaces.So ResettableClassFactory = resettableClassFactory, TestMethodFactory = (classInstance, cancellationToken) => AsyncConvert.Convert(() => classInstance.IsInitialized_With_5_ClassDataSources(methodArg, methodArg1, methodArg2, methodArg3, methodArg4)), TestFilePath = @"", - TestLineNumber = 58, + TestLineNumber = 57, TestMethod = testInformation, TestBuilderContext = testBuilderContext, }); @@ -1092,11 +1092,11 @@ file partial class ClassDataSourceDrivenTests : global::TUnit.Core.Interfaces.So { nodes.Add(new FailedTestMetadata { - TestId = $"global::TUnit.Core.ClassDataSourceAttribute:{testMethodDataIndex}:TL-GAC0:TUnit.TestProject.ClassDataSourceDrivenTests.IsInitialized_With_5_ClassDataSources(TUnit.TestProject.InitializableClass,TUnit.TestProject.InitializableClass,TUnit.TestProject.InitializableClass,TUnit.TestProject.InitializableClass,TUnit.TestProject.InitializableClass):0", + TestId = $"global::TUnit.Core.ClassDataSourceAttribute:{testMethodDataIndex}:TL-GAC0:TUnit.TestProject.ClassDataSourceDrivenTests.IsInitialized_With_5_ClassDataSources(TUnit.TestProject.Library.Models.InitializableClass,TUnit.TestProject.Library.Models.InitializableClass,TUnit.TestProject.Library.Models.InitializableClass,TUnit.TestProject.Library.Models.InitializableClass,TUnit.TestProject.Library.Models.InitializableClass):0", MethodName = $"IsInitialized_With_5_ClassDataSources", Exception = new TUnit.Core.Exceptions.TestFailedInitializationException("ClassDataSourceDrivenTests.IsInitialized_With_5_ClassDataSources failed to initialize", exception), TestFilePath = @"", - TestLineNumber = 58, + TestLineNumber = 57, }); } return nodes; diff --git a/TUnit.Core.SourceGenerator.Tests/ClassDataSourceDrivenTests.cs b/TUnit.Core.SourceGenerator.Tests/ClassDataSourceDrivenTests.cs index 50721c87e2..b578809bf8 100644 --- a/TUnit.Core.SourceGenerator.Tests/ClassDataSourceDrivenTests.cs +++ b/TUnit.Core.SourceGenerator.Tests/ClassDataSourceDrivenTests.cs @@ -14,8 +14,8 @@ public Task Test() => RunTest(Path.Combine(Git.RootDirectory.FullName, AdditionalFiles = [ Path.Combine(Git.RootDirectory.FullName, - "TUnit.TestProject", - "Dummy", + "TUnit.TestProject.Library", + "Models", "SomeAsyncDisposableClass.cs") ] }, diff --git a/TUnit.Core.SourceGenerator.Tests/ClassDataSourceDrivenTestsSharedKeyed.Test.verified.txt b/TUnit.Core.SourceGenerator.Tests/ClassDataSourceDrivenTestsSharedKeyed.Test.verified.txt index 4d7e1992a3..17eb8a6708 100644 --- a/TUnit.Core.SourceGenerator.Tests/ClassDataSourceDrivenTestsSharedKeyed.Test.verified.txt +++ b/TUnit.Core.SourceGenerator.Tests/ClassDataSourceDrivenTestsSharedKeyed.Test.verified.txt @@ -40,7 +40,7 @@ file partial class ClassDataSourceDrivenTestsSharedKeyed : global::TUnit.Core.In ], Parameters = [ - new global::TUnit.Core.SourceGeneratedParameterInformation + new global::TUnit.Core.SourceGeneratedParameterInformation { Name = "value", Attributes = [], @@ -74,7 +74,7 @@ file partial class ClassDataSourceDrivenTestsSharedKeyed : global::TUnit.Core.In TestInformation = testInformation, MembersToGenerate = [ - new global::TUnit.Core.SourceGeneratedParameterInformation + new global::TUnit.Core.SourceGeneratedParameterInformation { Name = "value", Attributes = [], @@ -84,7 +84,7 @@ file partial class ClassDataSourceDrivenTestsSharedKeyed : global::TUnit.Core.In TestClassInstance = classInstance, ClassInstanceArguments = classInstanceArguments, }; - var methodDataAttribute = new global::TUnit.Core.ClassDataSourceAttribute() + var methodDataAttribute = new global::TUnit.Core.ClassDataSourceAttribute() { Shared = global::TUnit.Core.SharedType.Keyed, Key = "🔑", @@ -108,7 +108,7 @@ file partial class ClassDataSourceDrivenTestsSharedKeyed : global::TUnit.Core.In nodes.Add(new TestMetadata { - TestId = $"global::TUnit.Core.ClassDataSourceAttribute:{testMethodDataIndex}:TL-GAC0:TUnit.TestProject.ClassDataSourceDrivenTestsSharedKeyed.DataSource_Class(SomeAsyncDisposableClass):0", + TestId = $"global::TUnit.Core.ClassDataSourceAttribute:{testMethodDataIndex}:TL-GAC0:TUnit.TestProject.ClassDataSourceDrivenTestsSharedKeyed.DataSource_Class(TUnit.TestProject.Library.Models.SomeAsyncDisposableClass):0", TestClassArguments = [], TestMethodArguments = [methodArgGeneratedData], TestClassProperties = new global::System.Collections.Generic.Dictionary @@ -132,7 +132,7 @@ file partial class ClassDataSourceDrivenTestsSharedKeyed : global::TUnit.Core.In { nodes.Add(new FailedTestMetadata { - TestId = $"global::TUnit.Core.ClassDataSourceAttribute:{testMethodDataIndex}:TL-GAC0:TUnit.TestProject.ClassDataSourceDrivenTestsSharedKeyed.DataSource_Class(SomeAsyncDisposableClass):0", + TestId = $"global::TUnit.Core.ClassDataSourceAttribute:{testMethodDataIndex}:TL-GAC0:TUnit.TestProject.ClassDataSourceDrivenTestsSharedKeyed.DataSource_Class(TUnit.TestProject.Library.Models.SomeAsyncDisposableClass):0", MethodName = $"DataSource_Class", Exception = new TUnit.Core.Exceptions.TestFailedInitializationException("ClassDataSourceDrivenTestsSharedKeyed.DataSource_Class failed to initialize", exception), TestFilePath = @"", @@ -185,7 +185,7 @@ file partial class ClassDataSourceDrivenTestsSharedKeyed : global::TUnit.Core.In ], Parameters = [ - new global::TUnit.Core.SourceGeneratedParameterInformation + new global::TUnit.Core.SourceGeneratedParameterInformation { Name = "value", Attributes = [], @@ -219,7 +219,7 @@ file partial class ClassDataSourceDrivenTestsSharedKeyed : global::TUnit.Core.In TestInformation = testInformation, MembersToGenerate = [ - new global::TUnit.Core.SourceGeneratedParameterInformation + new global::TUnit.Core.SourceGeneratedParameterInformation { Name = "value", Attributes = [], @@ -229,7 +229,7 @@ file partial class ClassDataSourceDrivenTestsSharedKeyed : global::TUnit.Core.In TestClassInstance = classInstance, ClassInstanceArguments = classInstanceArguments, }; - var methodDataAttribute = new global::TUnit.Core.ClassDataSourceAttribute() + var methodDataAttribute = new global::TUnit.Core.ClassDataSourceAttribute() { Shared = global::TUnit.Core.SharedType.Keyed, Key = "🔑", @@ -253,7 +253,7 @@ file partial class ClassDataSourceDrivenTestsSharedKeyed : global::TUnit.Core.In nodes.Add(new TestMetadata { - TestId = $"global::TUnit.Core.ClassDataSourceAttribute:{testMethodDataIndex}:TL-GAC0:TUnit.TestProject.ClassDataSourceDrivenTestsSharedKeyed.DataSource_Class_Generic(SomeAsyncDisposableClass):0", + TestId = $"global::TUnit.Core.ClassDataSourceAttribute:{testMethodDataIndex}:TL-GAC0:TUnit.TestProject.ClassDataSourceDrivenTestsSharedKeyed.DataSource_Class_Generic(TUnit.TestProject.Library.Models.SomeAsyncDisposableClass):0", TestClassArguments = [], TestMethodArguments = [methodArgGeneratedData], TestClassProperties = new global::System.Collections.Generic.Dictionary @@ -277,7 +277,7 @@ file partial class ClassDataSourceDrivenTestsSharedKeyed : global::TUnit.Core.In { nodes.Add(new FailedTestMetadata { - TestId = $"global::TUnit.Core.ClassDataSourceAttribute:{testMethodDataIndex}:TL-GAC0:TUnit.TestProject.ClassDataSourceDrivenTestsSharedKeyed.DataSource_Class_Generic(SomeAsyncDisposableClass):0", + TestId = $"global::TUnit.Core.ClassDataSourceAttribute:{testMethodDataIndex}:TL-GAC0:TUnit.TestProject.ClassDataSourceDrivenTestsSharedKeyed.DataSource_Class_Generic(TUnit.TestProject.Library.Models.SomeAsyncDisposableClass):0", MethodName = $"DataSource_Class_Generic", Exception = new TUnit.Core.Exceptions.TestFailedInitializationException("ClassDataSourceDrivenTestsSharedKeyed.DataSource_Class_Generic failed to initialize", exception), TestFilePath = @"", diff --git a/TUnit.Core/Attributes/Executors/HookExecutorAttribute.cs b/TUnit.Core/Attributes/Executors/HookExecutorAttribute.cs index ef3307131a..709413fb79 100644 --- a/TUnit.Core/Attributes/Executors/HookExecutorAttribute.cs +++ b/TUnit.Core/Attributes/Executors/HookExecutorAttribute.cs @@ -2,17 +2,10 @@ namespace TUnit.Core.Executors; -public abstract class HookExecutorAttribute : TUnitAttribute +public class HookExecutorAttribute(Type type) : TUnitAttribute { - public abstract Type HookExecutorType { get; } - - internal HookExecutorAttribute() - { - } + public Type HookExecutorType { get; } = type; } [AttributeUsage(AttributeTargets.Assembly | AttributeTargets.Class | AttributeTargets.Method)] -public sealed class HookExecutorAttribute : HookExecutorAttribute where T : IHookExecutor, new() -{ - public override Type HookExecutorType { get; } = typeof(T); -} \ No newline at end of file +public sealed class HookExecutorAttribute() : HookExecutorAttribute(typeof(T)) where T : IHookExecutor, new(); \ No newline at end of file diff --git a/TUnit.Core/Attributes/Executors/TestExecutorAttribute.cs b/TUnit.Core/Attributes/Executors/TestExecutorAttribute.cs index 16999f1185..421e9db51a 100644 --- a/TUnit.Core/Attributes/Executors/TestExecutorAttribute.cs +++ b/TUnit.Core/Attributes/Executors/TestExecutorAttribute.cs @@ -1,4 +1,5 @@ -using TUnit.Core.Interfaces; +using System.Diagnostics.CodeAnalysis; +using TUnit.Core.Interfaces; namespace TUnit.Core.Executors; @@ -12,4 +13,16 @@ public ValueTask OnTestRegistered(TestRegisteredContext context) context.SetTestExecutor(new T()); return default; } +} + +[AttributeUsage(AttributeTargets.Assembly | AttributeTargets.Class | AttributeTargets.Method)] +public sealed class TestExecutorAttribute([DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] Type type) : TUnitAttribute, ITestRegisteredEventReceiver +{ + public int Order => 0; + + public ValueTask OnTestRegistered(TestRegisteredContext context) + { + context.SetTestExecutor((ITestExecutor)Activator.CreateInstance(type)!); + return default; + } } \ No newline at end of file diff --git a/TUnit.Core/Attributes/TestData/ClassDataSourceAttribute.cs b/TUnit.Core/Attributes/TestData/ClassDataSourceAttribute.cs index 7771d296be..d630d13354 100644 --- a/TUnit.Core/Attributes/TestData/ClassDataSourceAttribute.cs +++ b/TUnit.Core/Attributes/TestData/ClassDataSourceAttribute.cs @@ -1,7 +1,9 @@ -namespace TUnit.Core; +using System.Diagnostics.CodeAnalysis; + +namespace TUnit.Core; [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method | AttributeTargets.Property, AllowMultiple = true)] -public sealed class ClassDataSourceAttribute : DataSourceGeneratorAttribute where T : new() +public sealed class ClassDataSourceAttribute<[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] T> : DataSourceGeneratorAttribute where T : new() { public SharedType Shared { get; set; } = SharedType.None; public string Key { get; set; } = string.Empty; @@ -55,4 +57,155 @@ await ClassDataSources.Get(dataGeneratorMetadata.TestSessionId).OnInitialize( return item; }; } +} + +[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method | AttributeTargets.Property, AllowMultiple = true)] +public sealed class ClassDataSourceAttribute : NonTypedDataSourceGeneratorAttribute +{ + private readonly Type[] _types; + + [UnconditionalSuppressMessage("Trimming", "IL2026:Members annotated with 'RequiresUnreferencedCodeAttribute' require dynamic access otherwise can break functionality when trimming application code", Justification = "")] + [UnconditionalSuppressMessage("AOT", "IL3050:Calling members annotated with \'RequiresDynamicCodeAttribute\' may break functionality when AOT compiling.")] + public ClassDataSourceAttribute( + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] + Type type) : this([type]) + { + } + + [UnconditionalSuppressMessage("Trimming", "IL2026:Members annotated with 'RequiresUnreferencedCodeAttribute' require dynamic access otherwise can break functionality when trimming application code", Justification = "")] + [UnconditionalSuppressMessage("AOT", "IL3050:Calling members annotated with \'RequiresDynamicCodeAttribute\' may break functionality when AOT compiling.")] + public ClassDataSourceAttribute( + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] + Type type, + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] + Type type2) : this([type, type2]) + { + } + + [UnconditionalSuppressMessage("Trimming", "IL2026:Members annotated with 'RequiresUnreferencedCodeAttribute' require dynamic access otherwise can break functionality when trimming application code", Justification = "")] + [UnconditionalSuppressMessage("AOT", "IL3050:Calling members annotated with \'RequiresDynamicCodeAttribute\' may break functionality when AOT compiling.")] + public ClassDataSourceAttribute( + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] + Type type, + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] + Type type2, + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] + Type type3) : this([type, type2, type3]) + { + } + + [UnconditionalSuppressMessage("Trimming", "IL2026:Members annotated with 'RequiresUnreferencedCodeAttribute' require dynamic access otherwise can break functionality when trimming application code", Justification = "")] + [UnconditionalSuppressMessage("AOT", "IL3050:Calling members annotated with \'RequiresDynamicCodeAttribute\' may break functionality when AOT compiling.")] + public ClassDataSourceAttribute( + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] + Type type, + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] + Type type2, + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] + Type type3, + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] + Type type4) : this([type, type2, type3, type4]) + { + } + + [UnconditionalSuppressMessage("Trimming", "IL2026:Members annotated with 'RequiresUnreferencedCodeAttribute' require dynamic access otherwise can break functionality when trimming application code", Justification = "")] + [UnconditionalSuppressMessage("AOT", "IL3050:Calling members annotated with \'RequiresDynamicCodeAttribute\' may break functionality when AOT compiling.")] + public ClassDataSourceAttribute( + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] + Type type, + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] + Type type2, + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] + Type type3, + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] + Type type4, + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] + Type type5) : this([type, type2, type3, type4, type5]) + { + } + + [RequiresUnreferencedCode("Reflection")] + [RequiresDynamicCode("Reflection")] + public ClassDataSourceAttribute(params Type[] types) + { + _types = types; + } + + public SharedType Shared { get; set; } = SharedType.None; + public string Key { get; set; } = string.Empty; + + [SuppressMessage("Trimming", "IL2062:The parameter of method has a DynamicallyAccessedMembersAttribute, but the value passed to it can not be statically analyzed.")] + public override IEnumerable> GenerateDataSources(DataGeneratorMetadata dataGeneratorMetadata) + { + yield return () => + { + var items = new object?[_types.Length]; + + for (var i = 0; i < _types.Length; i++) + { + items[i] = ClassDataSources.Get(dataGeneratorMetadata.TestSessionId) + .Get(Shared, _types[i], dataGeneratorMetadata.TestClassType, Key, dataGeneratorMetadata); + } + + dataGeneratorMetadata.TestBuilderContext.Current.Events.OnTestRegistered += async (obj, context) => + { + foreach (var item in items) + { + await ClassDataSources.Get(dataGeneratorMetadata.TestSessionId).OnTestRegistered( + context.TestContext, + ClassDataSources.IsStaticProperty(dataGeneratorMetadata), + Shared, + Key, + item); + } + }; + + dataGeneratorMetadata.TestBuilderContext.Current.Events.OnInitialize += async (obj, context) => + { + foreach (var item in items) + { + await ClassDataSources.Get(dataGeneratorMetadata.TestSessionId).OnInitialize( + context, + ClassDataSources.IsStaticProperty(dataGeneratorMetadata), + Shared, + Key, + item); + } + }; + + dataGeneratorMetadata.TestBuilderContext.Current.Events.OnTestStart += async (obj, context) => + { + foreach (var item in items) + { + await ClassDataSources.Get(dataGeneratorMetadata.TestSessionId).OnTestStart(context, item); + } + }; + + dataGeneratorMetadata.TestBuilderContext.Current.Events.OnTestEnd += async (obj, context) => + { + foreach (var item in items) + { + await ClassDataSources.Get(dataGeneratorMetadata.TestSessionId).OnTestEnd(context, item); + } + }; + + dataGeneratorMetadata.TestBuilderContext.Current.Events.OnTestSkipped += async (obj, context) => + { + foreach (var item in items) + { + await ClassDataSources.Get(dataGeneratorMetadata.TestSessionId).OnDispose(context, Shared, Key, item); + } + }; + + dataGeneratorMetadata.TestBuilderContext.Current.Events.OnDispose += async (obj, context) => + { + foreach (var item in items) + { + await ClassDataSources.Get(dataGeneratorMetadata.TestSessionId).OnDispose(context, Shared, Key, item); + } + }; + + return items; + }; + } } \ No newline at end of file diff --git a/TUnit.Core/Attributes/TestData/ClassDataSourceAttribute_2.cs b/TUnit.Core/Attributes/TestData/ClassDataSourceAttribute_2.cs index 56b7ca994f..9e631bba45 100644 --- a/TUnit.Core/Attributes/TestData/ClassDataSourceAttribute_2.cs +++ b/TUnit.Core/Attributes/TestData/ClassDataSourceAttribute_2.cs @@ -1,9 +1,11 @@ -namespace TUnit.Core; +using System.Diagnostics.CodeAnalysis; + +namespace TUnit.Core; [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = true)] public sealed class ClassDataSourceAttribute< - T1, - T2> + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] T1, + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] T2> : DataSourceGeneratorAttribute where T1 : new() where T2 : new() diff --git a/TUnit.Core/Attributes/TestData/ClassDataSourceAttribute_3.cs b/TUnit.Core/Attributes/TestData/ClassDataSourceAttribute_3.cs index ce47810e55..5c2a3f0223 100644 --- a/TUnit.Core/Attributes/TestData/ClassDataSourceAttribute_3.cs +++ b/TUnit.Core/Attributes/TestData/ClassDataSourceAttribute_3.cs @@ -1,10 +1,12 @@ -namespace TUnit.Core; +using System.Diagnostics.CodeAnalysis; + +namespace TUnit.Core; [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = true)] public sealed class ClassDataSourceAttribute< - T1, - T2, - T3> + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] T1, + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] T2, + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] T3> : DataSourceGeneratorAttribute where T1 : new() where T2 : new() diff --git a/TUnit.Core/Attributes/TestData/ClassDataSourceAttribute_4.cs b/TUnit.Core/Attributes/TestData/ClassDataSourceAttribute_4.cs index 254ab9df7c..8e7cbd4ba6 100644 --- a/TUnit.Core/Attributes/TestData/ClassDataSourceAttribute_4.cs +++ b/TUnit.Core/Attributes/TestData/ClassDataSourceAttribute_4.cs @@ -1,11 +1,13 @@ -namespace TUnit.Core; +using System.Diagnostics.CodeAnalysis; + +namespace TUnit.Core; [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = true)] public sealed class ClassDataSourceAttribute< - T1, - T2, - T3, - T4> + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] T1, + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] T2, + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] T3, + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] T4> : DataSourceGeneratorAttribute where T1 : new() where T2 : new() diff --git a/TUnit.Core/Attributes/TestData/ClassDataSourceAttribute_5.cs b/TUnit.Core/Attributes/TestData/ClassDataSourceAttribute_5.cs index 471fedb78a..341f9509fd 100644 --- a/TUnit.Core/Attributes/TestData/ClassDataSourceAttribute_5.cs +++ b/TUnit.Core/Attributes/TestData/ClassDataSourceAttribute_5.cs @@ -1,12 +1,14 @@ -namespace TUnit.Core; +using System.Diagnostics.CodeAnalysis; + +namespace TUnit.Core; [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = true)] public sealed class ClassDataSourceAttribute< - T1, - T2, - T3, - T4, - T5> + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] T1, + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] T2, + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] T3, + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] T4, + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] T5> : DataSourceGeneratorAttribute where T1 : new() where T2 : new() diff --git a/TUnit.Core/Attributes/TestData/ClassDataSources.cs b/TUnit.Core/Attributes/TestData/ClassDataSources.cs index 703dae8fb9..6eb9d28c7b 100644 --- a/TUnit.Core/Attributes/TestData/ClassDataSources.cs +++ b/TUnit.Core/Attributes/TestData/ClassDataSources.cs @@ -1,4 +1,5 @@ -using System.Reflection; +using System.Diagnostics.CodeAnalysis; +using System.Reflection; using System.Runtime.ExceptionServices; using TUnit.Core.Data; using TUnit.Core.Helpers; @@ -22,7 +23,7 @@ private ClassDataSources() public static ClassDataSources Get(string sessionId) => SourcesPerSession.GetOrAdd(sessionId, _ => new()); - public (T, SharedType, string) GetItemForIndex(int index, Type testClassType, SharedType[] sharedTypes, string[] keys, DataGeneratorMetadata dataGeneratorMetadata) where T : new() + public (T, SharedType, string) GetItemForIndex<[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] T>(int index, Type testClassType, SharedType[] sharedTypes, string[] keys, DataGeneratorMetadata dataGeneratorMetadata) where T : new() { var shared = sharedTypes.ElementAtOrDefault(index); var key = shared == SharedType.Keyed ? GetKey(index, sharedTypes, keys) : string.Empty; @@ -42,7 +43,7 @@ private string GetKey(int index, SharedType[] sharedTypes, string[] keys) return keys.ElementAtOrDefault(keyedIndex) ?? throw new ArgumentException($"Key at index {keyedIndex} not found"); } - public T Get(SharedType sharedType, Type testClassType, string key, DataGeneratorMetadata dataGeneratorMetadata) where T : new() + public T Get<[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] T>(SharedType sharedType, Type testClassType, string key, DataGeneratorMetadata dataGeneratorMetadata) where T : new() { if (sharedType == SharedType.None) { @@ -51,22 +52,51 @@ private string GetKey(int index, SharedType[] sharedTypes, string[] keys) if (sharedType == SharedType.PerTestSession) { - return TestDataContainer.GetGlobalInstance(Create); + return (T)TestDataContainer.GetGlobalInstance(typeof(T), () => Create()); } if (sharedType == SharedType.PerClass) { - return TestDataContainer.GetInstanceForClass(testClassType, Create); + return (T)TestDataContainer.GetInstanceForClass(testClassType, typeof(T), () => Create()); } if (sharedType == SharedType.Keyed) { - return TestDataContainer.GetInstanceForKey(key, Create); + return (T)TestDataContainer.GetInstanceForKey(key, typeof(T), () => Create()); } if (sharedType == SharedType.PerAssembly) { - return TestDataContainer.GetInstanceForAssembly(testClassType.Assembly, Create); + return (T)TestDataContainer.GetInstanceForAssembly(testClassType.Assembly, typeof(T), () => Create()); + } + + throw new ArgumentOutOfRangeException(); + } + public object Get(SharedType sharedType, [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] Type type, Type testClassType, string key, DataGeneratorMetadata dataGeneratorMetadata) + { + if (sharedType == SharedType.None) + { + return Create(type); + } + + if (sharedType == SharedType.PerTestSession) + { + return TestDataContainer.GetGlobalInstance(type, () => Create(type)); + } + + if (sharedType == SharedType.PerClass) + { + return TestDataContainer.GetInstanceForClass(testClassType, type, () => Create(type)); + } + + if (sharedType == SharedType.Keyed) + { + return TestDataContainer.GetInstanceForKey(key, type, () => Create(type)); + } + + if (sharedType == SharedType.PerAssembly) + { + return TestDataContainer.GetInstanceForAssembly(testClassType.Assembly, type, () => Create(type)); } throw new ArgumentOutOfRangeException(); @@ -200,21 +230,23 @@ public static bool IsStaticProperty(DataGeneratorMetadata dataGeneratorMetadata) return dataGeneratorMetadata.MembersToGenerate is [SourceGeneratedPropertyInformation { IsStatic: true }]; } - private static T Create() where T : new() + [return: NotNull] + private static T Create<[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] T>() where T : new() + { + return ((T)Create(typeof(T)))!; + } + + private static object Create([DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] Type type) { try { - return new T(); + return Activator.CreateInstance(type)!; } catch (TargetInvocationException targetInvocationException) { if (targetInvocationException.InnerException != null) { -#if NET - ExceptionDispatchInfo.Throw(targetInvocationException.InnerException); -#else ExceptionDispatchInfo.Capture(targetInvocationException.InnerException).Throw(); -#endif } throw; diff --git a/TUnit.Core/TestDataContainer.cs b/TUnit.Core/TestDataContainer.cs index f2e33315e7..ec952bde25 100644 --- a/TUnit.Core/TestDataContainer.cs +++ b/TUnit.Core/TestDataContainer.cs @@ -14,8 +14,6 @@ internal static class TestDataContainer private static readonly GetOnlyDictionary> InjectedSharedPerClassType = new(); private static readonly GetOnlyDictionary> InjectedSharedPerAssembly = new(); private static readonly GetOnlyDictionary> InjectedSharedPerKey = new(); - - private static readonly Lock Lock = new(); private static readonly ConcurrentDictionary> CountsPerKey = new(); private static readonly ConcurrentDictionary CountsPerTestSession = new(); @@ -27,29 +25,29 @@ internal static class TestDataContainer /// /// Gets an instance for the specified class. /// - /// The type of the instance. /// The test class type. + /// The type of object to retrieve /// The function to create the instance. /// The instance. - public static T GetInstanceForClass(Type testClass, Func func) + public static object GetInstanceForClass(Type testClass, Type type, Func func) { var objectsForClass = InjectedSharedPerClassType.GetOrAdd(testClass, _ => new GetOnlyDictionary()); - return (T)objectsForClass.GetOrAdd(typeof(T), _ => func()!); + return objectsForClass.GetOrAdd(type, _ => func()); } - + /// /// Gets an instance for the specified assembly. /// - /// The type of the instance. /// The assembly. + /// The type of object to retrieve /// The function to create the instance. /// The instance. - public static T GetInstanceForAssembly(Assembly assembly, Func func) + public static object GetInstanceForAssembly(Assembly assembly, Type type, Func func) { var objectsForClass = InjectedSharedPerAssembly.GetOrAdd(assembly, _ => new GetOnlyDictionary()); - return (T)objectsForClass.GetOrAdd(typeof(T), _ => func()!); + return objectsForClass.GetOrAdd(type, _ => func()); } /// @@ -64,12 +62,12 @@ public static void IncrementGlobalUsage(Type type) /// /// Gets a global instance of the specified type. /// - /// The type of the instance. + /// The type of object to retrieve /// The function to create the instance. /// The instance. - public static T GetGlobalInstance(Func func) + public static object GetGlobalInstance(Type type, Func func) { - return (T)InjectedSharedGlobally.GetOrAdd(typeof(T), _ => func()!); + return InjectedSharedGlobally.GetOrAdd(type, _ => func()); } /// @@ -111,15 +109,15 @@ public static void IncrementKeyUsage(string key, Type type) /// /// Gets an instance for the specified key. /// - /// The type of the instance. + /// The type of object to retrieve /// The key. /// The function to create the instance. /// The instance. - public static T GetInstanceForKey(string key, Func func) + public static object GetInstanceForKey(string key, Type type, Func func) { - var instancesForType = InjectedSharedPerKey.GetOrAdd(typeof(T), _ => new GetOnlyDictionary()); + var instancesForType = InjectedSharedPerKey.GetOrAdd(type, _ => new GetOnlyDictionary()); - return (T)instancesForType.GetOrAdd(key, _ => func()!); + return instancesForType.GetOrAdd(key, _ => func()); } /// diff --git a/TUnit.Engine.Tests/FSharp.cs b/TUnit.Engine.Tests/FSharp.cs new file mode 100644 index 0000000000..3064186fcf --- /dev/null +++ b/TUnit.Engine.Tests/FSharp.cs @@ -0,0 +1,49 @@ +using CliWrap; +using CliWrap.Buffered; +using Shouldly; + +namespace TUnit.Engine.Tests; + +public class FSharp +{ + [Test] + public async Task Test() + { + var runOptions = new RunOptions(); + + var testProject = Sourcy.DotNet.Projects.TUnit_TestProject_FSharp; + var guid = Guid.NewGuid().ToString("N"); + var trxFilename = guid + ".trx"; + var result = await Cli.Wrap("dotnet") + .WithArguments( + [ + "run", + "--no-build", + "-f", "net9.0", + "--configuration", "Release", + "--report-trx", "--report-trx-filename", trxFilename, + "--diagnostic-verbosity", "Debug", + "--diagnostic", "--diagnostic-output-fileprefix", $"log_{GetType().Name}_", + "--timeout", "5m", + // "--hangdump", "--hangdump-filename", $"hangdump.tests-{guid}.txt", "--hangdump-timeout", "3m", + + ..runOptions.AdditionalArguments + ] + ) + .WithWorkingDirectory(testProject.DirectoryName!) + .WithValidation(CommandResultValidation.None) + .ExecuteBufferedAsync(); + + await TrxAsserter.AssertTrx(result, + + [ + result => result.ResultSummary.Outcome.ShouldBe("Completed"), + result => result.ResultSummary.Counters.Total.ShouldBeGreaterThanOrEqualTo(9), + result => result.ResultSummary.Counters.Passed.ShouldBeGreaterThanOrEqualTo(9), + result => result.ResultSummary.Counters.Failed.ShouldBe(0), + result => result.ResultSummary.Counters.NotExecuted.ShouldBe(0) + ], + + trxFilename); + } +} \ No newline at end of file diff --git a/TUnit.Engine.Tests/InvokableTestBase.cs b/TUnit.Engine.Tests/InvokableTestBase.cs index 74f9a31f10..d00927bec8 100644 --- a/TUnit.Engine.Tests/InvokableTestBase.cs +++ b/TUnit.Engine.Tests/InvokableTestBase.cs @@ -73,7 +73,7 @@ private async Task RunWithoutAot(string filter, .WithValidation(CommandResultValidation.None) .ExecuteBufferedAsync(); - await AssertTrx(result, assertions, trxFilename, assertionExpression); + await TrxAsserter.AssertTrx(result, assertions, trxFilename, assertionExpression); } private async Task RunWithAot(string filter, List> assertions, @@ -108,7 +108,7 @@ private async Task RunWithAot(string filter, List> assertions, .WithValidation(CommandResultValidation.None) .ExecuteBufferedAsync(); - await AssertTrx(result, assertions, trxFilename, assertionExpression); + await TrxAsserter.AssertTrx(result, assertions, trxFilename, assertionExpression); } private async Task RunWithSingleFile(string filter, @@ -143,7 +143,7 @@ private async Task RunWithSingleFile(string filter, .WithValidation(CommandResultValidation.None) .ExecuteBufferedAsync(); - await AssertTrx(result, assertions, trxFilename, assertionExpression); + await TrxAsserter.AssertTrx(result, assertions, trxFilename, assertionExpression); } protected static FileInfo? FindFile(Func predicate) @@ -155,34 +155,6 @@ private async Task RunWithSingleFile(string filter, { return FileSystemHelpers.FindFolder(predicate); } - - private async Task AssertTrx(BufferedCommandResult commandResult, - List> assertions, - string trxFilename, string assertionExpression) - { - try - { - var trxFile = FindFile(x => x.Name == trxFilename)?.FullName ?? throw new FileNotFoundException($"Could not find trx file {trxFilename}"); - - var trxFileContents = await File.ReadAllTextAsync(trxFile); - - var testRun = TrxControl.ReadTrx(new StringReader(trxFileContents)); - - assertions.ForEach(x => x.Invoke(testRun)); - } - catch (Exception e) - { - Console.WriteLine(@$"Command Input: {commandResult}"); - Console.WriteLine(@$"Error: {commandResult.StandardError}"); - Console.WriteLine(@$"Output: {commandResult.StandardOutput}"); - - throw new Exception($""" - Error asserting results for {GetType().Name}: {e.Message} - - Expression: {assertionExpression} - """, e); - } - } } public record RunOptions diff --git a/TUnit.Engine.Tests/TrxAsserter.cs b/TUnit.Engine.Tests/TrxAsserter.cs new file mode 100644 index 0000000000..f2a3d64b7a --- /dev/null +++ b/TUnit.Engine.Tests/TrxAsserter.cs @@ -0,0 +1,36 @@ +using System.Runtime.CompilerServices; +using CliWrap.Buffered; +using TrxTools.TrxParser; + +namespace TUnit.Engine.Tests; + +public class TrxAsserter +{ + public static async Task AssertTrx(BufferedCommandResult commandResult, + List> assertions, + string trxFilename, [CallerArgumentExpression("assertions")] string assertionExpression = "") + { + try + { + var trxFile = FileSystemHelpers.FindFile(x => x.Name == trxFilename)?.FullName ?? throw new FileNotFoundException($"Could not find trx file {trxFilename}"); + + var trxFileContents = await File.ReadAllTextAsync(trxFile); + + var testRun = TrxControl.ReadTrx(new StringReader(trxFileContents)); + + assertions.ForEach(x => x.Invoke(testRun)); + } + catch (Exception e) + { + Console.WriteLine(@$"Command Input: {commandResult}"); + Console.WriteLine(@$"Error: {commandResult.StandardError}"); + Console.WriteLine(@$"Output: {commandResult.StandardOutput}"); + + throw new Exception($""" + Error asserting results for {TestContext.Current!.TestDetails.TestClass.Name}: {e.Message} + + Expression: {assertionExpression} + """, e); + } + } +} \ No newline at end of file diff --git a/TUnit.Engine.Tests/VB.cs b/TUnit.Engine.Tests/VB.cs new file mode 100644 index 0000000000..377ba2172a --- /dev/null +++ b/TUnit.Engine.Tests/VB.cs @@ -0,0 +1,49 @@ +using CliWrap; +using CliWrap.Buffered; +using Shouldly; + +namespace TUnit.Engine.Tests; + +public class VB +{ + [Test] + public async Task Test() + { + var runOptions = new RunOptions(); + + var testProject = Sourcy.DotNet.Projects.TUnit_TestProject_VB_NET; + var guid = Guid.NewGuid().ToString("N"); + var trxFilename = guid + ".trx"; + var result = await Cli.Wrap("dotnet") + .WithArguments( + [ + "run", + "--no-build", + "-f", "net9.0", + "--configuration", "Release", + "--report-trx", "--report-trx-filename", trxFilename, + "--diagnostic-verbosity", "Debug", + "--diagnostic", "--diagnostic-output-fileprefix", $"log_{GetType().Name}_", + "--timeout", "5m", + // "--hangdump", "--hangdump-filename", $"hangdump.tests-{guid}.txt", "--hangdump-timeout", "3m", + + ..runOptions.AdditionalArguments + ] + ) + .WithWorkingDirectory(testProject.DirectoryName!) + .WithValidation(CommandResultValidation.None) + .ExecuteBufferedAsync(); + + await TrxAsserter.AssertTrx(result, + + [ + result => result.ResultSummary.Outcome.ShouldBe("Completed"), + result => result.ResultSummary.Counters.Total.ShouldBeGreaterThanOrEqualTo(9), + result => result.ResultSummary.Counters.Passed.ShouldBeGreaterThanOrEqualTo(9), + result => result.ResultSummary.Counters.Failed.ShouldBe(0), + result => result.ResultSummary.Counters.NotExecuted.ShouldBe(0) + ], + + trxFilename); + } +} \ No newline at end of file diff --git a/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.DotNet2_0.verified.txt b/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.DotNet2_0.verified.txt index 48c1e19574..a2845bc22d 100644 --- a/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.DotNet2_0.verified.txt +++ b/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.DotNet2_0.verified.txt @@ -125,6 +125,19 @@ namespace TUnit.Core public required string TestSessionId { get; init; } } [System.AttributeUsage(System.AttributeTargets.Class | System.AttributeTargets.Method | System.AttributeTargets.Property, AllowMultiple=true)] + public sealed class ClassDataSourceAttribute : TUnit.Core.NonTypedDataSourceGeneratorAttribute + { + public ClassDataSourceAttribute(System.Type type) { } + public ClassDataSourceAttribute(params System.Type[] types) { } + public ClassDataSourceAttribute(System.Type type, System.Type type2) { } + public ClassDataSourceAttribute(System.Type type, System.Type type2, System.Type type3) { } + public ClassDataSourceAttribute(System.Type type, System.Type type2, System.Type type3, System.Type type4) { } + public ClassDataSourceAttribute(System.Type type, System.Type type2, System.Type type3, System.Type type4, System.Type type5) { } + public string Key { get; set; } + public TUnit.Core.SharedType Shared { get; set; } + public override System.Collections.Generic.IEnumerable> GenerateDataSources(TUnit.Core.DataGeneratorMetadata dataGeneratorMetadata) { } + } + [System.AttributeUsage(System.AttributeTargets.Class | System.AttributeTargets.Method | System.AttributeTargets.Property, AllowMultiple=true)] public sealed class ClassDataSourceAttribute : TUnit.Core.DataSourceGeneratorAttribute where T : new() { @@ -1084,16 +1097,16 @@ namespace TUnit.Core.Executors public int Order { get; } public System.Threading.Tasks.ValueTask OnTestRegistered(TUnit.Core.TestRegisteredContext context) { } } - public abstract class HookExecutorAttribute : TUnit.Core.TUnitAttribute + public class HookExecutorAttribute : TUnit.Core.TUnitAttribute { - public abstract System.Type HookExecutorType { get; } + public HookExecutorAttribute(System.Type type) { } + public System.Type HookExecutorType { get; } } [System.AttributeUsage(System.AttributeTargets.Assembly | System.AttributeTargets.Class | System.AttributeTargets.Method)] public sealed class HookExecutorAttribute : TUnit.Core.Executors.HookExecutorAttribute where T : TUnit.Core.Interfaces.IHookExecutor, new () { public HookExecutorAttribute() { } - public override System.Type HookExecutorType { get; } } [System.AttributeUsage(System.AttributeTargets.Assembly | System.AttributeTargets.Class | System.AttributeTargets.Method)] public class InvariantCultureAttribute : TUnit.Core.Executors.CultureAttribute @@ -1108,6 +1121,13 @@ namespace TUnit.Core.Executors public System.Threading.Tasks.ValueTask OnTestRegistered(TUnit.Core.TestRegisteredContext context) { } } [System.AttributeUsage(System.AttributeTargets.Assembly | System.AttributeTargets.Class | System.AttributeTargets.Method)] + public sealed class TestExecutorAttribute : TUnit.Core.TUnitAttribute, TUnit.Core.Interfaces.IEventReceiver, TUnit.Core.Interfaces.ITestRegisteredEventReceiver + { + public TestExecutorAttribute(System.Type type) { } + public int Order { get; } + public System.Threading.Tasks.ValueTask OnTestRegistered(TUnit.Core.TestRegisteredContext context) { } + } + [System.AttributeUsage(System.AttributeTargets.Assembly | System.AttributeTargets.Class | System.AttributeTargets.Method)] public sealed class TestExecutorAttribute : TUnit.Core.TUnitAttribute, TUnit.Core.Interfaces.IEventReceiver, TUnit.Core.Interfaces.ITestRegisteredEventReceiver where T : TUnit.Core.Interfaces.ITestExecutor, new () { diff --git a/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.DotNet8_0.verified.txt b/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.DotNet8_0.verified.txt index 3b3ed2aa80..143f3635c1 100644 --- a/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.DotNet8_0.verified.txt +++ b/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.DotNet8_0.verified.txt @@ -125,7 +125,42 @@ namespace TUnit.Core public required string TestSessionId { get; init; } } [System.AttributeUsage(System.AttributeTargets.Class | System.AttributeTargets.Method | System.AttributeTargets.Property, AllowMultiple=true)] - public sealed class ClassDataSourceAttribute : TUnit.Core.DataSourceGeneratorAttribute + public sealed class ClassDataSourceAttribute : TUnit.Core.NonTypedDataSourceGeneratorAttribute + { + [System.Diagnostics.CodeAnalysis.UnconditionalSuppressMessage("AOT", "IL3050:Calling members annotated with \'RequiresDynamicCodeAttribute\' may break fu" + + "nctionality when AOT compiling.")] + [System.Diagnostics.CodeAnalysis.UnconditionalSuppressMessage("Trimming", "IL2026:Members annotated with \'RequiresUnreferencedCodeAttribute\' require dynamic" + + " access otherwise can break functionality when trimming application code", Justification="")] + public ClassDataSourceAttribute([System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembers(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicConstructors)] System.Type type) { } + [System.Diagnostics.CodeAnalysis.RequiresDynamicCode("Reflection")] + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCode("Reflection")] + public ClassDataSourceAttribute(params System.Type[] types) { } + [System.Diagnostics.CodeAnalysis.UnconditionalSuppressMessage("AOT", "IL3050:Calling members annotated with \'RequiresDynamicCodeAttribute\' may break fu" + + "nctionality when AOT compiling.")] + [System.Diagnostics.CodeAnalysis.UnconditionalSuppressMessage("Trimming", "IL2026:Members annotated with \'RequiresUnreferencedCodeAttribute\' require dynamic" + + " access otherwise can break functionality when trimming application code", Justification="")] + public ClassDataSourceAttribute([System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembers(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicConstructors)] System.Type type, [System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembers(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicConstructors)] System.Type type2) { } + [System.Diagnostics.CodeAnalysis.UnconditionalSuppressMessage("AOT", "IL3050:Calling members annotated with \'RequiresDynamicCodeAttribute\' may break fu" + + "nctionality when AOT compiling.")] + [System.Diagnostics.CodeAnalysis.UnconditionalSuppressMessage("Trimming", "IL2026:Members annotated with \'RequiresUnreferencedCodeAttribute\' require dynamic" + + " access otherwise can break functionality when trimming application code", Justification="")] + public ClassDataSourceAttribute([System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembers(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicConstructors)] System.Type type, [System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembers(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicConstructors)] System.Type type2, [System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembers(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicConstructors)] System.Type type3) { } + [System.Diagnostics.CodeAnalysis.UnconditionalSuppressMessage("AOT", "IL3050:Calling members annotated with \'RequiresDynamicCodeAttribute\' may break fu" + + "nctionality when AOT compiling.")] + [System.Diagnostics.CodeAnalysis.UnconditionalSuppressMessage("Trimming", "IL2026:Members annotated with \'RequiresUnreferencedCodeAttribute\' require dynamic" + + " access otherwise can break functionality when trimming application code", Justification="")] + public ClassDataSourceAttribute([System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembers(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicConstructors)] System.Type type, [System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembers(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicConstructors)] System.Type type2, [System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembers(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicConstructors)] System.Type type3, [System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembers(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicConstructors)] System.Type type4) { } + [System.Diagnostics.CodeAnalysis.UnconditionalSuppressMessage("AOT", "IL3050:Calling members annotated with \'RequiresDynamicCodeAttribute\' may break fu" + + "nctionality when AOT compiling.")] + [System.Diagnostics.CodeAnalysis.UnconditionalSuppressMessage("Trimming", "IL2026:Members annotated with \'RequiresUnreferencedCodeAttribute\' require dynamic" + + " access otherwise can break functionality when trimming application code", Justification="")] + public ClassDataSourceAttribute([System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembers(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicConstructors)] System.Type type, [System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembers(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicConstructors)] System.Type type2, [System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembers(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicConstructors)] System.Type type3, [System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembers(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicConstructors)] System.Type type4, [System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembers(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicConstructors)] System.Type type5) { } + public string Key { get; set; } + public TUnit.Core.SharedType Shared { get; set; } + public override System.Collections.Generic.IEnumerable> GenerateDataSources(TUnit.Core.DataGeneratorMetadata dataGeneratorMetadata) { } + } + [System.AttributeUsage(System.AttributeTargets.Class | System.AttributeTargets.Method | System.AttributeTargets.Property, AllowMultiple=true)] + public sealed class ClassDataSourceAttribute<[System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembers(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicConstructors)] T> : TUnit.Core.DataSourceGeneratorAttribute where T : new() { public ClassDataSourceAttribute() { } @@ -134,7 +169,7 @@ namespace TUnit.Core public override System.Collections.Generic.IEnumerable> GenerateDataSources(TUnit.Core.DataGeneratorMetadata dataGeneratorMetadata) { } } [System.AttributeUsage(System.AttributeTargets.Class | System.AttributeTargets.Method, AllowMultiple=true)] - public sealed class ClassDataSourceAttribute : TUnit.Core.DataSourceGeneratorAttribute + public sealed class ClassDataSourceAttribute<[System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembers(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicConstructors)] T1, [System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembers(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicConstructors)] T2> : TUnit.Core.DataSourceGeneratorAttribute where T1 : new() where T2 : new() { @@ -144,7 +179,7 @@ namespace TUnit.Core public override System.Collections.Generic.IEnumerable>> GenerateDataSources(TUnit.Core.DataGeneratorMetadata dataGeneratorMetadata) { } } [System.AttributeUsage(System.AttributeTargets.Class | System.AttributeTargets.Method, AllowMultiple=true)] - public sealed class ClassDataSourceAttribute : TUnit.Core.DataSourceGeneratorAttribute + public sealed class ClassDataSourceAttribute<[System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembers(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicConstructors)] T1, [System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembers(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicConstructors)] T2, [System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembers(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicConstructors)] T3> : TUnit.Core.DataSourceGeneratorAttribute where T1 : new() where T2 : new() where T3 : new() @@ -155,7 +190,7 @@ namespace TUnit.Core public override System.Collections.Generic.IEnumerable>> GenerateDataSources(TUnit.Core.DataGeneratorMetadata dataGeneratorMetadata) { } } [System.AttributeUsage(System.AttributeTargets.Class | System.AttributeTargets.Method, AllowMultiple=true)] - public sealed class ClassDataSourceAttribute : TUnit.Core.DataSourceGeneratorAttribute + public sealed class ClassDataSourceAttribute<[System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembers(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicConstructors)] T1, [System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembers(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicConstructors)] T2, [System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembers(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicConstructors)] T3, [System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembers(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicConstructors)] T4> : TUnit.Core.DataSourceGeneratorAttribute where T1 : new() where T2 : new() where T3 : new() @@ -167,7 +202,7 @@ namespace TUnit.Core public override System.Collections.Generic.IEnumerable>> GenerateDataSources(TUnit.Core.DataGeneratorMetadata dataGeneratorMetadata) { } } [System.AttributeUsage(System.AttributeTargets.Class | System.AttributeTargets.Method, AllowMultiple=true)] - public sealed class ClassDataSourceAttribute : TUnit.Core.DataSourceGeneratorAttribute + public sealed class ClassDataSourceAttribute<[System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembers(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicConstructors)] T1, [System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembers(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicConstructors)] T2, [System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembers(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicConstructors)] T3, [System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembers(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicConstructors)] T4, [System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembers(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicConstructors)] T5> : TUnit.Core.DataSourceGeneratorAttribute where T1 : new() where T2 : new() where T3 : new() @@ -1118,16 +1153,16 @@ namespace TUnit.Core.Executors public int Order { get; } public System.Threading.Tasks.ValueTask OnTestRegistered(TUnit.Core.TestRegisteredContext context) { } } - public abstract class HookExecutorAttribute : TUnit.Core.TUnitAttribute + public class HookExecutorAttribute : TUnit.Core.TUnitAttribute { - public abstract System.Type HookExecutorType { get; } + public HookExecutorAttribute(System.Type type) { } + public System.Type HookExecutorType { get; } } [System.AttributeUsage(System.AttributeTargets.Assembly | System.AttributeTargets.Class | System.AttributeTargets.Method)] public sealed class HookExecutorAttribute : TUnit.Core.Executors.HookExecutorAttribute where T : TUnit.Core.Interfaces.IHookExecutor, new () { public HookExecutorAttribute() { } - public override System.Type HookExecutorType { get; } } [System.AttributeUsage(System.AttributeTargets.Assembly | System.AttributeTargets.Class | System.AttributeTargets.Method)] public class InvariantCultureAttribute : TUnit.Core.Executors.CultureAttribute @@ -1143,6 +1178,13 @@ namespace TUnit.Core.Executors public System.Threading.Tasks.ValueTask OnTestRegistered(TUnit.Core.TestRegisteredContext context) { } } [System.AttributeUsage(System.AttributeTargets.Assembly | System.AttributeTargets.Class | System.AttributeTargets.Method)] + public sealed class TestExecutorAttribute : TUnit.Core.TUnitAttribute, TUnit.Core.Interfaces.IEventReceiver, TUnit.Core.Interfaces.ITestRegisteredEventReceiver + { + public TestExecutorAttribute([System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembers(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicConstructors)] System.Type type) { } + public int Order { get; } + public System.Threading.Tasks.ValueTask OnTestRegistered(TUnit.Core.TestRegisteredContext context) { } + } + [System.AttributeUsage(System.AttributeTargets.Assembly | System.AttributeTargets.Class | System.AttributeTargets.Method)] public sealed class TestExecutorAttribute : TUnit.Core.TUnitAttribute, TUnit.Core.Interfaces.IEventReceiver, TUnit.Core.Interfaces.ITestRegisteredEventReceiver where T : TUnit.Core.Interfaces.ITestExecutor, new () { diff --git a/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.DotNet9_0.verified.txt b/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.DotNet9_0.verified.txt index d8d2893a00..e9321caaf6 100644 --- a/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.DotNet9_0.verified.txt +++ b/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.DotNet9_0.verified.txt @@ -125,7 +125,42 @@ namespace TUnit.Core public required string TestSessionId { get; init; } } [System.AttributeUsage(System.AttributeTargets.Class | System.AttributeTargets.Method | System.AttributeTargets.Property, AllowMultiple=true)] - public sealed class ClassDataSourceAttribute : TUnit.Core.DataSourceGeneratorAttribute + public sealed class ClassDataSourceAttribute : TUnit.Core.NonTypedDataSourceGeneratorAttribute + { + [System.Diagnostics.CodeAnalysis.UnconditionalSuppressMessage("AOT", "IL3050:Calling members annotated with \'RequiresDynamicCodeAttribute\' may break fu" + + "nctionality when AOT compiling.")] + [System.Diagnostics.CodeAnalysis.UnconditionalSuppressMessage("Trimming", "IL2026:Members annotated with \'RequiresUnreferencedCodeAttribute\' require dynamic" + + " access otherwise can break functionality when trimming application code", Justification="")] + public ClassDataSourceAttribute([System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembers(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicConstructors)] System.Type type) { } + [System.Diagnostics.CodeAnalysis.RequiresDynamicCode("Reflection")] + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCode("Reflection")] + public ClassDataSourceAttribute(params System.Type[] types) { } + [System.Diagnostics.CodeAnalysis.UnconditionalSuppressMessage("AOT", "IL3050:Calling members annotated with \'RequiresDynamicCodeAttribute\' may break fu" + + "nctionality when AOT compiling.")] + [System.Diagnostics.CodeAnalysis.UnconditionalSuppressMessage("Trimming", "IL2026:Members annotated with \'RequiresUnreferencedCodeAttribute\' require dynamic" + + " access otherwise can break functionality when trimming application code", Justification="")] + public ClassDataSourceAttribute([System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembers(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicConstructors)] System.Type type, [System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembers(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicConstructors)] System.Type type2) { } + [System.Diagnostics.CodeAnalysis.UnconditionalSuppressMessage("AOT", "IL3050:Calling members annotated with \'RequiresDynamicCodeAttribute\' may break fu" + + "nctionality when AOT compiling.")] + [System.Diagnostics.CodeAnalysis.UnconditionalSuppressMessage("Trimming", "IL2026:Members annotated with \'RequiresUnreferencedCodeAttribute\' require dynamic" + + " access otherwise can break functionality when trimming application code", Justification="")] + public ClassDataSourceAttribute([System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembers(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicConstructors)] System.Type type, [System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembers(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicConstructors)] System.Type type2, [System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembers(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicConstructors)] System.Type type3) { } + [System.Diagnostics.CodeAnalysis.UnconditionalSuppressMessage("AOT", "IL3050:Calling members annotated with \'RequiresDynamicCodeAttribute\' may break fu" + + "nctionality when AOT compiling.")] + [System.Diagnostics.CodeAnalysis.UnconditionalSuppressMessage("Trimming", "IL2026:Members annotated with \'RequiresUnreferencedCodeAttribute\' require dynamic" + + " access otherwise can break functionality when trimming application code", Justification="")] + public ClassDataSourceAttribute([System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembers(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicConstructors)] System.Type type, [System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembers(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicConstructors)] System.Type type2, [System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembers(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicConstructors)] System.Type type3, [System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembers(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicConstructors)] System.Type type4) { } + [System.Diagnostics.CodeAnalysis.UnconditionalSuppressMessage("AOT", "IL3050:Calling members annotated with \'RequiresDynamicCodeAttribute\' may break fu" + + "nctionality when AOT compiling.")] + [System.Diagnostics.CodeAnalysis.UnconditionalSuppressMessage("Trimming", "IL2026:Members annotated with \'RequiresUnreferencedCodeAttribute\' require dynamic" + + " access otherwise can break functionality when trimming application code", Justification="")] + public ClassDataSourceAttribute([System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembers(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicConstructors)] System.Type type, [System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembers(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicConstructors)] System.Type type2, [System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembers(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicConstructors)] System.Type type3, [System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembers(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicConstructors)] System.Type type4, [System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembers(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicConstructors)] System.Type type5) { } + public string Key { get; set; } + public TUnit.Core.SharedType Shared { get; set; } + public override System.Collections.Generic.IEnumerable> GenerateDataSources(TUnit.Core.DataGeneratorMetadata dataGeneratorMetadata) { } + } + [System.AttributeUsage(System.AttributeTargets.Class | System.AttributeTargets.Method | System.AttributeTargets.Property, AllowMultiple=true)] + public sealed class ClassDataSourceAttribute<[System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembers(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicConstructors)] T> : TUnit.Core.DataSourceGeneratorAttribute where T : new() { public ClassDataSourceAttribute() { } @@ -134,7 +169,7 @@ namespace TUnit.Core public override System.Collections.Generic.IEnumerable> GenerateDataSources(TUnit.Core.DataGeneratorMetadata dataGeneratorMetadata) { } } [System.AttributeUsage(System.AttributeTargets.Class | System.AttributeTargets.Method, AllowMultiple=true)] - public sealed class ClassDataSourceAttribute : TUnit.Core.DataSourceGeneratorAttribute + public sealed class ClassDataSourceAttribute<[System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembers(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicConstructors)] T1, [System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembers(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicConstructors)] T2> : TUnit.Core.DataSourceGeneratorAttribute where T1 : new() where T2 : new() { @@ -144,7 +179,7 @@ namespace TUnit.Core public override System.Collections.Generic.IEnumerable>> GenerateDataSources(TUnit.Core.DataGeneratorMetadata dataGeneratorMetadata) { } } [System.AttributeUsage(System.AttributeTargets.Class | System.AttributeTargets.Method, AllowMultiple=true)] - public sealed class ClassDataSourceAttribute : TUnit.Core.DataSourceGeneratorAttribute + public sealed class ClassDataSourceAttribute<[System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembers(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicConstructors)] T1, [System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembers(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicConstructors)] T2, [System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembers(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicConstructors)] T3> : TUnit.Core.DataSourceGeneratorAttribute where T1 : new() where T2 : new() where T3 : new() @@ -155,7 +190,7 @@ namespace TUnit.Core public override System.Collections.Generic.IEnumerable>> GenerateDataSources(TUnit.Core.DataGeneratorMetadata dataGeneratorMetadata) { } } [System.AttributeUsage(System.AttributeTargets.Class | System.AttributeTargets.Method, AllowMultiple=true)] - public sealed class ClassDataSourceAttribute : TUnit.Core.DataSourceGeneratorAttribute + public sealed class ClassDataSourceAttribute<[System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembers(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicConstructors)] T1, [System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembers(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicConstructors)] T2, [System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembers(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicConstructors)] T3, [System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembers(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicConstructors)] T4> : TUnit.Core.DataSourceGeneratorAttribute where T1 : new() where T2 : new() where T3 : new() @@ -167,7 +202,7 @@ namespace TUnit.Core public override System.Collections.Generic.IEnumerable>> GenerateDataSources(TUnit.Core.DataGeneratorMetadata dataGeneratorMetadata) { } } [System.AttributeUsage(System.AttributeTargets.Class | System.AttributeTargets.Method, AllowMultiple=true)] - public sealed class ClassDataSourceAttribute : TUnit.Core.DataSourceGeneratorAttribute + public sealed class ClassDataSourceAttribute<[System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembers(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicConstructors)] T1, [System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembers(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicConstructors)] T2, [System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembers(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicConstructors)] T3, [System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembers(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicConstructors)] T4, [System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembers(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicConstructors)] T5> : TUnit.Core.DataSourceGeneratorAttribute where T1 : new() where T2 : new() where T3 : new() @@ -1118,16 +1153,16 @@ namespace TUnit.Core.Executors public int Order { get; } public System.Threading.Tasks.ValueTask OnTestRegistered(TUnit.Core.TestRegisteredContext context) { } } - public abstract class HookExecutorAttribute : TUnit.Core.TUnitAttribute + public class HookExecutorAttribute : TUnit.Core.TUnitAttribute { - public abstract System.Type HookExecutorType { get; } + public HookExecutorAttribute(System.Type type) { } + public System.Type HookExecutorType { get; } } [System.AttributeUsage(System.AttributeTargets.Assembly | System.AttributeTargets.Class | System.AttributeTargets.Method)] public sealed class HookExecutorAttribute : TUnit.Core.Executors.HookExecutorAttribute where T : TUnit.Core.Interfaces.IHookExecutor, new () { public HookExecutorAttribute() { } - public override System.Type HookExecutorType { get; } } [System.AttributeUsage(System.AttributeTargets.Assembly | System.AttributeTargets.Class | System.AttributeTargets.Method)] public class InvariantCultureAttribute : TUnit.Core.Executors.CultureAttribute @@ -1143,6 +1178,13 @@ namespace TUnit.Core.Executors public System.Threading.Tasks.ValueTask OnTestRegistered(TUnit.Core.TestRegisteredContext context) { } } [System.AttributeUsage(System.AttributeTargets.Assembly | System.AttributeTargets.Class | System.AttributeTargets.Method)] + public sealed class TestExecutorAttribute : TUnit.Core.TUnitAttribute, TUnit.Core.Interfaces.IEventReceiver, TUnit.Core.Interfaces.ITestRegisteredEventReceiver + { + public TestExecutorAttribute([System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembers(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicConstructors)] System.Type type) { } + public int Order { get; } + public System.Threading.Tasks.ValueTask OnTestRegistered(TUnit.Core.TestRegisteredContext context) { } + } + [System.AttributeUsage(System.AttributeTargets.Assembly | System.AttributeTargets.Class | System.AttributeTargets.Method)] public sealed class TestExecutorAttribute : TUnit.Core.TUnitAttribute, TUnit.Core.Interfaces.IEventReceiver, TUnit.Core.Interfaces.ITestRegisteredEventReceiver where T : TUnit.Core.Interfaces.ITestExecutor, new () { diff --git a/TUnit.TestProject.FSharp/ClassDataSourceDrivenTests.fs b/TUnit.TestProject.FSharp/ClassDataSourceDrivenTests.fs new file mode 100644 index 0000000000..b7ccdcc81a --- /dev/null +++ b/TUnit.TestProject.FSharp/ClassDataSourceDrivenTests.fs @@ -0,0 +1,67 @@ +namespace TUnit.TestProject + +open System.Threading.Tasks +open TUnit.Assertions +open TUnit.Assertions.Extensions +open TUnit.Assertions.FSharp.Operations +open TUnit.Core +open TUnit.TestProject.Library.Models + +type ClassDataSourceDrivenTests() = + + [] + [)>] + member _.DataSource_Class(value: SomeAsyncDisposableClass) : unit = + // Dummy method + () + + [] + [)>] + member _.DataSource_Class_Generic(value: SomeAsyncDisposableClass) : unit = + // Dummy method + () + + [] + [)>] + member _.IsInitialized_With_1_ClassDataSource(class1: InitializableClass) : Task = + task { + do! check (Assert.That(class1.IsInitialized).IsTrue()) + } + + [] + [, typeof)>] + member _.IsInitialized_With_2_ClassDataSources(class1: InitializableClass, class2: InitializableClass) : Task = + task { + do! check (Assert.That(class1.IsInitialized).IsTrue()) + do! check (Assert.That(class2.IsInitialized).IsTrue()) + } + + [] + [, typeof, typeof)>] + member _.IsInitialized_With_3_ClassDataSources(class1: InitializableClass, class2: InitializableClass, class3: InitializableClass) : Task = + task { + do! check (Assert.That(class1.IsInitialized).IsTrue()) + do! check (Assert.That(class2.IsInitialized).IsTrue()) + do! check (Assert.That(class3.IsInitialized).IsTrue()) + } + + [] + [, typeof, typeof, typeof)>] + member _.IsInitialized_With_4_ClassDataSources(class1: InitializableClass, class2: InitializableClass, class3: InitializableClass, class4: InitializableClass) : Task = + task { + do! check (Assert.That(class1.IsInitialized).IsTrue()) + do! check (Assert.That(class2.IsInitialized).IsTrue()) + do! check (Assert.That(class3.IsInitialized).IsTrue()) + do! check (Assert.That(class4.IsInitialized).IsTrue()) + } + + [] + [, typeof, typeof, typeof, typeof)>] + member _.IsInitialized_With_5_ClassDataSources(class1: InitializableClass, class2: InitializableClass, class3: InitializableClass, class4: InitializableClass, class5: InitializableClass) : Task = + task { + do! check (Assert.That(class1.IsInitialized).IsTrue()) + do! check (Assert.That(class2.IsInitialized).IsTrue()) + do! check (Assert.That(class3.IsInitialized).IsTrue()) + do! check (Assert.That(class4.IsInitialized).IsTrue()) + do! check (Assert.That(class5.IsInitialized).IsTrue()) + } diff --git a/TUnit.TestProject.FSharp/TUnit.TestProject.FSharp.fsproj b/TUnit.TestProject.FSharp/TUnit.TestProject.FSharp.fsproj index 8fb67101fe..468d3060b2 100644 --- a/TUnit.TestProject.FSharp/TUnit.TestProject.FSharp.fsproj +++ b/TUnit.TestProject.FSharp/TUnit.TestProject.FSharp.fsproj @@ -8,15 +8,19 @@ + + + + diff --git a/TUnit.TestProject.FSharp/Tests.fs b/TUnit.TestProject.FSharp/Tests.fs index 4c48eabb10..ee835b5b28 100644 --- a/TUnit.TestProject.FSharp/Tests.fs +++ b/TUnit.TestProject.FSharp/Tests.fs @@ -1,9 +1,8 @@ namespace TUnit.TestProject.FSharp -open System open TUnit.Assertions open TUnit.Assertions.Extensions -open TUnit.Assertions.FSharp.Extensions +open TUnit.Assertions.FSharp.Operations open TUnit.Core type Tests() = diff --git a/TUnit.TestProject.Library/Models/InitializableClass.cs b/TUnit.TestProject.Library/Models/InitializableClass.cs new file mode 100644 index 0000000000..ef9f4545c2 --- /dev/null +++ b/TUnit.TestProject.Library/Models/InitializableClass.cs @@ -0,0 +1,14 @@ +using TUnit.Core.Interfaces; + +namespace TUnit.TestProject.Library.Models; + +public class InitializableClass : IAsyncInitializer +{ + public Task InitializeAsync() + { + IsInitialized = true; + return Task.CompletedTask; + } + + public bool IsInitialized { get; private set; } +} \ No newline at end of file diff --git a/TUnit.TestProject/Dummy/ParallelLimit3.cs b/TUnit.TestProject.Library/Models/ParallelLimit3.cs similarity index 71% rename from TUnit.TestProject/Dummy/ParallelLimit3.cs rename to TUnit.TestProject.Library/Models/ParallelLimit3.cs index 86d358135c..9e3f1f3e8f 100644 --- a/TUnit.TestProject/Dummy/ParallelLimit3.cs +++ b/TUnit.TestProject.Library/Models/ParallelLimit3.cs @@ -1,6 +1,6 @@ using TUnit.Core.Interfaces; -namespace TUnit.TestProject.Dummy; +namespace TUnit.TestProject.Library.Models; public class ParallelLimit3 : IParallelLimit { diff --git a/TUnit.TestProject/Dummy/SomeAsyncDisposableClass.cs b/TUnit.TestProject.Library/Models/SomeAsyncDisposableClass.cs similarity index 83% rename from TUnit.TestProject/Dummy/SomeAsyncDisposableClass.cs rename to TUnit.TestProject.Library/Models/SomeAsyncDisposableClass.cs index 1a8999e0f7..79c84a9186 100644 --- a/TUnit.TestProject/Dummy/SomeAsyncDisposableClass.cs +++ b/TUnit.TestProject.Library/Models/SomeAsyncDisposableClass.cs @@ -1,4 +1,4 @@ -namespace TUnit.TestProject.Dummy; +namespace TUnit.TestProject.Library.Models; public class SomeAsyncDisposableClass : IAsyncDisposable { diff --git a/TUnit.TestProject.VB.NET/ClassDataSourceDrivenTests.vb b/TUnit.TestProject.VB.NET/ClassDataSourceDrivenTests.vb new file mode 100644 index 0000000000..5aa9a2c794 --- /dev/null +++ b/TUnit.TestProject.VB.NET/ClassDataSourceDrivenTests.vb @@ -0,0 +1,74 @@ +Imports System.Threading.Tasks +Imports TUnit.Assertions +Imports TUnit.Assertions.Extensions +Imports TUnit.Core +Imports TUnit.Core.Interfaces +Imports TUnit.TestProject.Library.Models + + +Public Class ClassDataSourceDrivenTests + + + + Public Sub DataSource_Class(value As SomeAsyncDisposableClass) + ' Dummy method + End Sub + + + + Public Sub DataSource_Class_Generic(value As SomeAsyncDisposableClass) + ' Dummy method + End Sub + + + + Public Async Function IsInitialized_With_1_ClassDataSource(class1 As InitializableClass) As Task + Await Assert.That(class1.IsInitialized).IsTrue() + End Function + + + + Public Async Function IsInitialized_With_2_ClassDataSources(class1 As InitializableClass, class2 As InitializableClass) As Task + Await Assert.That(class1.IsInitialized).IsTrue() + Await Assert.That(class2.IsInitialized).IsTrue() + End Function + + + + Public Async Function IsInitialized_With_3_ClassDataSources(class1 As InitializableClass, class2 As InitializableClass, class3 As InitializableClass) As Task + Await Assert.That(class1.IsInitialized).IsTrue() + Await Assert.That(class2.IsInitialized).IsTrue() + Await Assert.That(class3.IsInitialized).IsTrue() + End Function + + + + Public Async Function IsInitialized_With_4_ClassDataSources(class1 As InitializableClass, class2 As InitializableClass, class3 As InitializableClass, class4 As InitializableClass) As Task + Await Assert.That(class1.IsInitialized).IsTrue() + Await Assert.That(class2.IsInitialized).IsTrue() + Await Assert.That(class3.IsInitialized).IsTrue() + Await Assert.That(class4.IsInitialized).IsTrue() + End Function + + + + Public Async Function IsInitialized_With_5_ClassDataSources(class1 As InitializableClass, class2 As InitializableClass, class3 As InitializableClass, class4 As InitializableClass, class5 As InitializableClass) As Task + Await Assert.That(class1.IsInitialized).IsTrue() + Await Assert.That(class2.IsInitialized).IsTrue() + Await Assert.That(class3.IsInitialized).IsTrue() + Await Assert.That(class4.IsInitialized).IsTrue() + Await Assert.That(class5.IsInitialized).IsTrue() + End Function + +End Class + +Public Class InitializableClass + Implements IAsyncInitializer + + Public Property IsInitialized As Boolean + + Public Function InitializeAsync() As Task Implements IAsyncInitializer.InitializeAsync + IsInitialized = True + Return Task.CompletedTask + End Function +End Class \ No newline at end of file diff --git a/TUnit.TestProject.VB.NET/Program.vb b/TUnit.TestProject.VB.NET/Program.vb index d8c7175547..e4f5142dfa 100644 --- a/TUnit.TestProject.VB.NET/Program.vb +++ b/TUnit.TestProject.VB.NET/Program.vb @@ -12,7 +12,7 @@ Public Class Tests Public Async Function TestAsync() As Task Dim result = 1 + 1 - Await Assert.That(result).IsNegative() + Await Assert.That(result).IsPositive() Dim assertionResult = Await Assert.That(result).IsPositive() Console.WriteLine(assertionResult) End Function diff --git a/TUnit.TestProject.VB.NET/TUnit.TestProject.VB.NET.vbproj b/TUnit.TestProject.VB.NET/TUnit.TestProject.VB.NET.vbproj index 3cdb0753d0..90dd07f58b 100644 --- a/TUnit.TestProject.VB.NET/TUnit.TestProject.VB.NET.vbproj +++ b/TUnit.TestProject.VB.NET/TUnit.TestProject.VB.NET.vbproj @@ -7,8 +7,14 @@ + + + + + + diff --git a/TUnit.TestProject/ClassDataSourceDrivenTests.cs b/TUnit.TestProject/ClassDataSourceDrivenTests.cs index 5c5aa21624..37db61266d 100644 --- a/TUnit.TestProject/ClassDataSourceDrivenTests.cs +++ b/TUnit.TestProject/ClassDataSourceDrivenTests.cs @@ -1,7 +1,6 @@ using TUnit.Assertions; using TUnit.Assertions.Extensions; -using TUnit.Core.Interfaces; -using TUnit.TestProject.Dummy; +using TUnit.TestProject.Library.Models; namespace TUnit.TestProject; @@ -65,15 +64,4 @@ public async Task IsInitialized_With_5_ClassDataSources(InitializableClass class await Assert.That(class4.IsInitialized).IsTrue(); await Assert.That(class5.IsInitialized).IsTrue(); } -} - -public class InitializableClass : IAsyncInitializer -{ - public Task InitializeAsync() - { - IsInitialized = true; - return Task.CompletedTask; - } - - public bool IsInitialized { get; private set; } } \ No newline at end of file diff --git a/TUnit.TestProject/ClassDataSourceDrivenTestsSharedForClass.cs b/TUnit.TestProject/ClassDataSourceDrivenTestsSharedForClass.cs index 0843520ff2..cca8bd1e43 100644 --- a/TUnit.TestProject/ClassDataSourceDrivenTestsSharedForClass.cs +++ b/TUnit.TestProject/ClassDataSourceDrivenTestsSharedForClass.cs @@ -1,4 +1,4 @@ -using TUnit.TestProject.Dummy; +using TUnit.TestProject.Library.Models; namespace TUnit.TestProject; diff --git a/TUnit.TestProject/ClassDataSourceDrivenTestsSharedKeyed.cs b/TUnit.TestProject/ClassDataSourceDrivenTestsSharedKeyed.cs index 8957842d95..a81622ebfd 100644 --- a/TUnit.TestProject/ClassDataSourceDrivenTestsSharedKeyed.cs +++ b/TUnit.TestProject/ClassDataSourceDrivenTestsSharedKeyed.cs @@ -1,4 +1,4 @@ -using TUnit.TestProject.Dummy; +using TUnit.TestProject.Library.Models; namespace TUnit.TestProject; diff --git a/TUnit.TestProject/ClassDataSourceDrivenTestsSharedKeyed2.cs b/TUnit.TestProject/ClassDataSourceDrivenTestsSharedKeyed2.cs index ad77d7aab9..cae2a35c26 100644 --- a/TUnit.TestProject/ClassDataSourceDrivenTestsSharedKeyed2.cs +++ b/TUnit.TestProject/ClassDataSourceDrivenTestsSharedKeyed2.cs @@ -1,7 +1,7 @@ using System.Diagnostics.CodeAnalysis; using TUnit.Assertions; using TUnit.Assertions.Extensions; -using TUnit.TestProject.Dummy; +using TUnit.TestProject.Library.Models; namespace TUnit.TestProject; diff --git a/TUnit.TestProject/ClassDataSourceDrivenTestsSharedKeyed3.cs b/TUnit.TestProject/ClassDataSourceDrivenTestsSharedKeyed3.cs index 66c0277a7d..e0941368e0 100644 --- a/TUnit.TestProject/ClassDataSourceDrivenTestsSharedKeyed3.cs +++ b/TUnit.TestProject/ClassDataSourceDrivenTestsSharedKeyed3.cs @@ -1,7 +1,7 @@ using System.Diagnostics.CodeAnalysis; using TUnit.Assertions; using TUnit.Assertions.Extensions; -using TUnit.TestProject.Dummy; +using TUnit.TestProject.Library.Models; namespace TUnit.TestProject; diff --git a/TUnit.TestProject/ClassDataSourceDrivenTestsSharedNone.cs b/TUnit.TestProject/ClassDataSourceDrivenTestsSharedNone.cs index 304547e0e1..a672d36f39 100644 --- a/TUnit.TestProject/ClassDataSourceDrivenTestsSharedNone.cs +++ b/TUnit.TestProject/ClassDataSourceDrivenTestsSharedNone.cs @@ -1,4 +1,4 @@ -using TUnit.TestProject.Dummy; +using TUnit.TestProject.Library.Models; namespace TUnit.TestProject; diff --git a/TUnit.TestProject/ParallelLimiterTests.cs b/TUnit.TestProject/ParallelLimiterTests.cs index bd4156b98e..fd854d9894 100644 --- a/TUnit.TestProject/ParallelLimiterTests.cs +++ b/TUnit.TestProject/ParallelLimiterTests.cs @@ -1,4 +1,4 @@ -using TUnit.TestProject.Dummy; +using TUnit.TestProject.Library.Models; namespace TUnit.TestProject;