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