From 77eca9678356ce022b536617570f4a7ea45021f3 Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Mon, 26 Jan 2026 20:05:46 +0000 Subject: [PATCH 1/7] feat: add SharedDataSources helper for custom data source attributes Add a public SharedDataSources class that allows users to implement custom data source attributes with the same sharing behavior (SharedType and Key) as ClassDataSourceAttribute. This addresses the request in discussion #4536 for a way to extend or reuse the functionality from ClassDataSources without exposing internal implementation details. The API provides multiple overloads: - Generic with new() constraint for simple default construction - Generic with factory for custom initialization - Non-generic for runtime type scenarios Co-Authored-By: Claude Opus 4.5 --- TUnit.Core/SharedDataSources.cs | 203 ++++++++++++++++++++++++++++++++ 1 file changed, 203 insertions(+) create mode 100644 TUnit.Core/SharedDataSources.cs diff --git a/TUnit.Core/SharedDataSources.cs b/TUnit.Core/SharedDataSources.cs new file mode 100644 index 0000000000..22f52826a4 --- /dev/null +++ b/TUnit.Core/SharedDataSources.cs @@ -0,0 +1,203 @@ +using TUnit.Core.Helpers; + +namespace TUnit.Core; + +/// +/// Provides shared instance management for custom data sources. +/// Use this class to implement custom data source attributes that need the same +/// sharing behavior as . +/// +public static class SharedDataSources +{ + /// + /// Gets or creates a shared instance based on the specified sharing type, using the default constructor. + /// + /// The type of instance to get or create. Must have a parameterless constructor. + /// How the instance should be shared across tests. + /// The data generator metadata (used to extract the test class type). + /// The sharing key (required for ). + /// The shared or newly created instance. + /// + /// Thrown when is null/empty and is . + /// + /// Thrown when is not a valid value. + public static T GetOrCreate(SharedType sharedType, DataGeneratorMetadata dataGeneratorMetadata, string? key) where T : new() + { + return GetOrCreate(sharedType, dataGeneratorMetadata, key, static () => new T()); + } + + /// + /// Gets or creates a shared instance based on the specified sharing type, using the default constructor. + /// + /// The type of instance to get or create. Must have a parameterless constructor. + /// How the instance should be shared across tests. + /// The test class type (required for ). + /// The sharing key (required for ). + /// The shared or newly created instance. + /// + /// Thrown when is null and is or , + /// or when is null/empty and is . + /// + /// Thrown when is not a valid value. + public static T GetOrCreate(SharedType sharedType, Type? testClassType, string? key) where T : new() + { + return GetOrCreate(sharedType, testClassType, key, static () => new T()); + } + + /// + /// Gets or creates a shared instance based on the specified sharing type. + /// + /// The type of instance to get or create. + /// How the instance should be shared across tests. + /// The test class type (required for ). + /// The sharing key (required for ). + /// A factory function to create the instance if not already cached. + /// The shared or newly created instance. + /// + /// Thrown when is null and is or , + /// or when is null/empty and is . + /// + /// Thrown when is not a valid value. + public static T GetOrCreate(SharedType sharedType, Type? testClassType, string? key, Func factory) + { + ArgumentNullException.ThrowIfNull(factory); + + return sharedType switch + { + SharedType.None => factory(), + SharedType.PerTestSession => (T)TestDataContainer.GetGlobalInstance(typeof(T), _ => factory()!)!, + SharedType.PerClass => GetForClass(testClassType, factory), + SharedType.Keyed => GetForKey(key, factory), + SharedType.PerAssembly => GetForAssembly(testClassType, factory), + _ => throw new ArgumentOutOfRangeException(nameof(sharedType), sharedType, "Invalid SharedType value.") + }; + } + + /// + /// Gets or creates a shared instance based on the specified sharing type. + /// + /// The type of instance to get or create. + /// How the instance should be shared across tests. + /// The data generator metadata (used to extract the test class type). + /// The sharing key (required for ). + /// A factory function to create the instance if not already cached. + /// The shared or newly created instance. + /// + /// Thrown when is null/empty and is . + /// + /// Thrown when is not a valid value. + public static T GetOrCreate(SharedType sharedType, DataGeneratorMetadata dataGeneratorMetadata, string? key, Func factory) + { + var testClassType = TestClassTypeHelper.GetTestClassType(dataGeneratorMetadata); + return GetOrCreate(sharedType, testClassType, key, factory); + } + + /// + /// Gets or creates a shared instance based on the specified sharing type. + /// + /// How the instance should be shared across tests. + /// The type of instance to get or create. + /// The data generator metadata (used to extract the test class type). + /// The sharing key (required for ). + /// A factory function to create the instance if not already cached. + /// The shared or newly created instance. + /// + /// Thrown when is null/empty and is . + /// + /// Thrown when is not a valid value. + public static object? GetOrCreate(SharedType sharedType, Type type, DataGeneratorMetadata dataGeneratorMetadata, string? key, Func factory) + { + var testClassType = TestClassTypeHelper.GetTestClassType(dataGeneratorMetadata); + return GetOrCreate(sharedType, type, testClassType, key, factory); + } + + /// + /// Gets or creates a shared instance based on the specified sharing type. + /// + /// How the instance should be shared across tests. + /// The type of instance to get or create. + /// The test class type (required for ). + /// The sharing key (required for ). + /// A factory function to create the instance if not already cached. + /// The shared or newly created instance. + /// + /// Thrown when is null and is or , + /// or when is null/empty and is . + /// + /// Thrown when is not a valid value. + public static object? GetOrCreate(SharedType sharedType, Type type, Type? testClassType, string? key, Func factory) + { + ArgumentNullException.ThrowIfNull(type); + ArgumentNullException.ThrowIfNull(factory); + + return sharedType switch + { + SharedType.None => factory(), + SharedType.PerTestSession => TestDataContainer.GetGlobalInstance(type, _ => factory()), + SharedType.PerClass => GetForClass(type, testClassType, factory), + SharedType.Keyed => GetForKey(type, key, factory), + SharedType.PerAssembly => GetForAssembly(type, testClassType, factory), + _ => throw new ArgumentOutOfRangeException(nameof(sharedType), sharedType, "Invalid SharedType value.") + }; + } + + private static T GetForClass(Type? testClassType, Func factory) + { + if (testClassType is null) + { + throw new ArgumentNullException(nameof(testClassType), "testClassType is required when SharedType is PerClass."); + } + + return (T)TestDataContainer.GetInstanceForClass(testClassType, typeof(T), _ => factory()!)!; + } + + private static object? GetForClass(Type type, Type? testClassType, Func factory) + { + if (testClassType is null) + { + throw new ArgumentNullException(nameof(testClassType), "testClassType is required when SharedType is PerClass."); + } + + return TestDataContainer.GetInstanceForClass(testClassType, type, _ => factory()); + } + + private static T GetForKey(string? key, Func factory) + { + if (string.IsNullOrEmpty(key)) + { + throw new ArgumentNullException(nameof(key), "key is required when SharedType is Keyed."); + } + + return (T)TestDataContainer.GetInstanceForKey(key, typeof(T), _ => factory()!)!; + } + + private static object? GetForKey(Type type, string? key, Func factory) + { + if (string.IsNullOrEmpty(key)) + { + throw new ArgumentNullException(nameof(key), "key is required when SharedType is Keyed."); + } + + return TestDataContainer.GetInstanceForKey(key, type, _ => factory()); + } + + private static T GetForAssembly(Type? testClassType, Func factory) + { + if (testClassType is null) + { + throw new ArgumentNullException(nameof(testClassType), "testClassType is required when SharedType is PerAssembly."); + } + + return (T)TestDataContainer.GetInstanceForAssembly(testClassType.Assembly, typeof(T), _ => factory()!)!; + } + + private static object? GetForAssembly(Type type, Type? testClassType, Func factory) + { + if (testClassType is null) + { + throw new ArgumentNullException(nameof(testClassType), "testClassType is required when SharedType is PerAssembly."); + } + + return TestDataContainer.GetInstanceForAssembly(testClassType.Assembly, type, _ => factory()); + } +} From 43cc532eeb5a4c8d5dfc8e174e1160e60dc8819c Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Mon, 26 Jan 2026 20:17:20 +0000 Subject: [PATCH 2/7] fix: resolve build errors for netstandard2.0 compatibility - Replace ArgumentNullException.ThrowIfNull with null-coalescing throw pattern - Add null-forgiving operators to TestDataContainer return values - Add null-forgiving operators to key parameter after null check Co-Authored-By: Claude Opus 4.5 --- TUnit.Core/SharedDataSources.cs | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/TUnit.Core/SharedDataSources.cs b/TUnit.Core/SharedDataSources.cs index 22f52826a4..8d174bf028 100644 --- a/TUnit.Core/SharedDataSources.cs +++ b/TUnit.Core/SharedDataSources.cs @@ -60,7 +60,7 @@ public static class SharedDataSources /// Thrown when is not a valid value. public static T GetOrCreate(SharedType sharedType, Type? testClassType, string? key, Func factory) { - ArgumentNullException.ThrowIfNull(factory); + _ = factory ?? throw new ArgumentNullException(nameof(factory)); return sharedType switch { @@ -127,13 +127,13 @@ public static T GetOrCreate(SharedType sharedType, DataGeneratorMetadata data /// Thrown when is not a valid value. public static object? GetOrCreate(SharedType sharedType, Type type, Type? testClassType, string? key, Func factory) { - ArgumentNullException.ThrowIfNull(type); - ArgumentNullException.ThrowIfNull(factory); + _ = type ?? throw new ArgumentNullException(nameof(type)); + _ = factory ?? throw new ArgumentNullException(nameof(factory)); return sharedType switch { SharedType.None => factory(), - SharedType.PerTestSession => TestDataContainer.GetGlobalInstance(type, _ => factory()), + SharedType.PerTestSession => TestDataContainer.GetGlobalInstance(type, _ => factory()!), SharedType.PerClass => GetForClass(type, testClassType, factory), SharedType.Keyed => GetForKey(type, key, factory), SharedType.PerAssembly => GetForAssembly(type, testClassType, factory), @@ -158,7 +158,7 @@ private static T GetForClass(Type? testClassType, Func factory) throw new ArgumentNullException(nameof(testClassType), "testClassType is required when SharedType is PerClass."); } - return TestDataContainer.GetInstanceForClass(testClassType, type, _ => factory()); + return TestDataContainer.GetInstanceForClass(testClassType, type, _ => factory()!); } private static T GetForKey(string? key, Func factory) @@ -168,7 +168,7 @@ private static T GetForKey(string? key, Func factory) throw new ArgumentNullException(nameof(key), "key is required when SharedType is Keyed."); } - return (T)TestDataContainer.GetInstanceForKey(key, typeof(T), _ => factory()!)!; + return (T)TestDataContainer.GetInstanceForKey(key!, typeof(T), _ => factory()!)!; } private static object? GetForKey(Type type, string? key, Func factory) @@ -178,7 +178,7 @@ private static T GetForKey(string? key, Func factory) throw new ArgumentNullException(nameof(key), "key is required when SharedType is Keyed."); } - return TestDataContainer.GetInstanceForKey(key, type, _ => factory()); + return TestDataContainer.GetInstanceForKey(key!, type, _ => factory()!); } private static T GetForAssembly(Type? testClassType, Func factory) @@ -198,6 +198,6 @@ private static T GetForAssembly(Type? testClassType, Func factory) throw new ArgumentNullException(nameof(testClassType), "testClassType is required when SharedType is PerAssembly."); } - return TestDataContainer.GetInstanceForAssembly(testClassType.Assembly, type, _ => factory()); + return TestDataContainer.GetInstanceForAssembly(testClassType.Assembly, type, _ => factory()!); } } From 88afa06c76cd3c7170ecb36816ce746ab1538479 Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Mon, 26 Jan 2026 20:41:01 +0000 Subject: [PATCH 3/7] chore: update public API snapshots for SharedDataSources Add SharedDataSources class to the public API verified files for DotNet8_0, DotNet9_0, and DotNet10_0. Co-Authored-By: Claude Opus 4.5 --- ...Library_Has_No_API_Changes.DotNet10_0.verified.txt | 11 +++++++++++ ..._Library_Has_No_API_Changes.DotNet8_0.verified.txt | 11 +++++++++++ ..._Library_Has_No_API_Changes.DotNet9_0.verified.txt | 11 +++++++++++ 3 files changed, 33 insertions(+) diff --git a/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.DotNet10_0.verified.txt b/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.DotNet10_0.verified.txt index 1ff9acff74..c941f9ac9a 100644 --- a/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.DotNet10_0.verified.txt +++ b/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.DotNet10_0.verified.txt @@ -1198,6 +1198,17 @@ namespace public string Key { get; init; } public Type { get; init; } } + public static class SharedDataSources + { + public static object? GetOrCreate(.SharedType sharedType, type, ? testClassType, string? key, factory) { } + public static object? GetOrCreate(.SharedType sharedType, type, .DataGeneratorMetadata dataGeneratorMetadata, string? key, factory) { } + public static T GetOrCreate(.SharedType sharedType, ? testClassType, string? key) + where T : new() { } + public static T GetOrCreate(.SharedType sharedType, .DataGeneratorMetadata dataGeneratorMetadata, string? key) + where T : new() { } + public static T GetOrCreate(.SharedType sharedType, ? testClassType, string? key, factory) { } + public static T GetOrCreate(.SharedType sharedType, .DataGeneratorMetadata dataGeneratorMetadata, string? key, factory) { } + } public enum SharedType { None = 0, 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 97a073cc98..e9099630b2 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 @@ -1198,6 +1198,17 @@ namespace public string Key { get; init; } public Type { get; init; } } + public static class SharedDataSources + { + public static object? GetOrCreate(.SharedType sharedType, type, ? testClassType, string? key, factory) { } + public static object? GetOrCreate(.SharedType sharedType, type, .DataGeneratorMetadata dataGeneratorMetadata, string? key, factory) { } + public static T GetOrCreate(.SharedType sharedType, ? testClassType, string? key) + where T : new() { } + public static T GetOrCreate(.SharedType sharedType, .DataGeneratorMetadata dataGeneratorMetadata, string? key) + where T : new() { } + public static T GetOrCreate(.SharedType sharedType, ? testClassType, string? key, factory) { } + public static T GetOrCreate(.SharedType sharedType, .DataGeneratorMetadata dataGeneratorMetadata, string? key, factory) { } + } public enum SharedType { None = 0, 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 bd1f9325d5..799da12f25 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 @@ -1198,6 +1198,17 @@ namespace public string Key { get; init; } public Type { get; init; } } + public static class SharedDataSources + { + public static object? GetOrCreate(.SharedType sharedType, type, ? testClassType, string? key, factory) { } + public static object? GetOrCreate(.SharedType sharedType, type, .DataGeneratorMetadata dataGeneratorMetadata, string? key, factory) { } + public static T GetOrCreate(.SharedType sharedType, ? testClassType, string? key) + where T : new() { } + public static T GetOrCreate(.SharedType sharedType, .DataGeneratorMetadata dataGeneratorMetadata, string? key) + where T : new() { } + public static T GetOrCreate(.SharedType sharedType, ? testClassType, string? key, factory) { } + public static T GetOrCreate(.SharedType sharedType, .DataGeneratorMetadata dataGeneratorMetadata, string? key, factory) { } + } public enum SharedType { None = 0, From 58805102412faf544642c591a19e1108f71eb862 Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Mon, 26 Jan 2026 21:05:18 +0000 Subject: [PATCH 4/7] chore: update Net4_7 public API snapshot for SharedDataSources Co-Authored-By: Claude Opus 4.5 --- ...ore_Library_Has_No_API_Changes.Net4_7.verified.txt | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.Net4_7.verified.txt b/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.Net4_7.verified.txt index 08b1e25e4b..ab80bd6a01 100644 --- a/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.Net4_7.verified.txt +++ b/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.Net4_7.verified.txt @@ -1156,6 +1156,17 @@ namespace public string Key { get; init; } public Type { get; init; } } + public static class SharedDataSources + { + public static object? GetOrCreate(.SharedType sharedType, type, ? testClassType, string? key, factory) { } + public static object? GetOrCreate(.SharedType sharedType, type, .DataGeneratorMetadata dataGeneratorMetadata, string? key, factory) { } + public static T GetOrCreate(.SharedType sharedType, ? testClassType, string? key) + where T : new() { } + public static T GetOrCreate(.SharedType sharedType, .DataGeneratorMetadata dataGeneratorMetadata, string? key) + where T : new() { } + public static T GetOrCreate(.SharedType sharedType, ? testClassType, string? key, factory) { } + public static T GetOrCreate(.SharedType sharedType, .DataGeneratorMetadata dataGeneratorMetadata, string? key, factory) { } + } public enum SharedType { None = 0, From d612991bfa432d8c6dccc4c8abb875f933f236cb Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Mon, 26 Jan 2026 22:58:16 +0000 Subject: [PATCH 5/7] fix: add DynamicallyAccessedMembers AOT annotations to Type parameters Address PR review feedback: - Add [DynamicallyAccessedMembers] attribute to Type parameters in non-generic GetOrCreate overloads for Native AOT compatibility - Update public API snapshots with the new signatures Co-Authored-By: Claude Opus 4.5 --- TUnit.Core/SharedDataSources.cs | 17 +++++++++++++++-- ...y_Has_No_API_Changes.DotNet10_0.verified.txt | 4 ++-- ...ry_Has_No_API_Changes.DotNet8_0.verified.txt | 4 ++-- ...ry_Has_No_API_Changes.DotNet9_0.verified.txt | 4 ++-- ...brary_Has_No_API_Changes.Net4_7.verified.txt | 4 ++-- 5 files changed, 23 insertions(+), 10 deletions(-) diff --git a/TUnit.Core/SharedDataSources.cs b/TUnit.Core/SharedDataSources.cs index 8d174bf028..2e324478c5 100644 --- a/TUnit.Core/SharedDataSources.cs +++ b/TUnit.Core/SharedDataSources.cs @@ -1,3 +1,4 @@ +using System.Diagnostics.CodeAnalysis; using TUnit.Core.Helpers; namespace TUnit.Core; @@ -105,7 +106,13 @@ public static T GetOrCreate(SharedType sharedType, DataGeneratorMetadata data /// Thrown when is null/empty and is . /// /// Thrown when is not a valid value. - public static object? GetOrCreate(SharedType sharedType, Type type, DataGeneratorMetadata dataGeneratorMetadata, string? key, Func factory) + public static object? GetOrCreate( + SharedType sharedType, + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors | DynamicallyAccessedMemberTypes.NonPublicConstructors)] + Type type, + DataGeneratorMetadata dataGeneratorMetadata, + string? key, + Func factory) { var testClassType = TestClassTypeHelper.GetTestClassType(dataGeneratorMetadata); return GetOrCreate(sharedType, type, testClassType, key, factory); @@ -125,7 +132,13 @@ public static T GetOrCreate(SharedType sharedType, DataGeneratorMetadata data /// or when is null/empty and is . /// /// Thrown when is not a valid value. - public static object? GetOrCreate(SharedType sharedType, Type type, Type? testClassType, string? key, Func factory) + public static object? GetOrCreate( + SharedType sharedType, + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors | DynamicallyAccessedMemberTypes.NonPublicConstructors)] + Type type, + Type? testClassType, + string? key, + Func factory) { _ = type ?? throw new ArgumentNullException(nameof(type)); _ = factory ?? throw new ArgumentNullException(nameof(factory)); diff --git a/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.DotNet10_0.verified.txt b/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.DotNet10_0.verified.txt index c941f9ac9a..3a83deef66 100644 --- a/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.DotNet10_0.verified.txt +++ b/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.DotNet10_0.verified.txt @@ -1200,8 +1200,8 @@ namespace } public static class SharedDataSources { - public static object? GetOrCreate(.SharedType sharedType, type, ? testClassType, string? key, factory) { } - public static object? GetOrCreate(.SharedType sharedType, type, .DataGeneratorMetadata dataGeneratorMetadata, string? key, factory) { } + public static object? GetOrCreate(.SharedType sharedType, [.(..None | ..PublicParameterlessConstructor | ..PublicConstructors | ..NonPublicConstructors)] type, ? testClassType, string? key, factory) { } + public static object? GetOrCreate(.SharedType sharedType, [.(..None | ..PublicParameterlessConstructor | ..PublicConstructors | ..NonPublicConstructors)] type, .DataGeneratorMetadata dataGeneratorMetadata, string? key, factory) { } public static T GetOrCreate(.SharedType sharedType, ? testClassType, string? key) where T : new() { } public static T GetOrCreate(.SharedType sharedType, .DataGeneratorMetadata dataGeneratorMetadata, string? key) 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 e9099630b2..973ea1df68 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 @@ -1200,8 +1200,8 @@ namespace } public static class SharedDataSources { - public static object? GetOrCreate(.SharedType sharedType, type, ? testClassType, string? key, factory) { } - public static object? GetOrCreate(.SharedType sharedType, type, .DataGeneratorMetadata dataGeneratorMetadata, string? key, factory) { } + public static object? GetOrCreate(.SharedType sharedType, [.(..None | ..PublicParameterlessConstructor | ..PublicConstructors | ..NonPublicConstructors)] type, ? testClassType, string? key, factory) { } + public static object? GetOrCreate(.SharedType sharedType, [.(..None | ..PublicParameterlessConstructor | ..PublicConstructors | ..NonPublicConstructors)] type, .DataGeneratorMetadata dataGeneratorMetadata, string? key, factory) { } public static T GetOrCreate(.SharedType sharedType, ? testClassType, string? key) where T : new() { } public static T GetOrCreate(.SharedType sharedType, .DataGeneratorMetadata dataGeneratorMetadata, string? key) 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 799da12f25..75de1417e2 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 @@ -1200,8 +1200,8 @@ namespace } public static class SharedDataSources { - public static object? GetOrCreate(.SharedType sharedType, type, ? testClassType, string? key, factory) { } - public static object? GetOrCreate(.SharedType sharedType, type, .DataGeneratorMetadata dataGeneratorMetadata, string? key, factory) { } + public static object? GetOrCreate(.SharedType sharedType, [.(..None | ..PublicParameterlessConstructor | ..PublicConstructors | ..NonPublicConstructors)] type, ? testClassType, string? key, factory) { } + public static object? GetOrCreate(.SharedType sharedType, [.(..None | ..PublicParameterlessConstructor | ..PublicConstructors | ..NonPublicConstructors)] type, .DataGeneratorMetadata dataGeneratorMetadata, string? key, factory) { } public static T GetOrCreate(.SharedType sharedType, ? testClassType, string? key) where T : new() { } public static T GetOrCreate(.SharedType sharedType, .DataGeneratorMetadata dataGeneratorMetadata, string? key) diff --git a/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.Net4_7.verified.txt b/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.Net4_7.verified.txt index ab80bd6a01..3f8e3c1751 100644 --- a/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.Net4_7.verified.txt +++ b/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.Net4_7.verified.txt @@ -1158,8 +1158,8 @@ namespace } public static class SharedDataSources { - public static object? GetOrCreate(.SharedType sharedType, type, ? testClassType, string? key, factory) { } - public static object? GetOrCreate(.SharedType sharedType, type, .DataGeneratorMetadata dataGeneratorMetadata, string? key, factory) { } + public static object? GetOrCreate(.SharedType sharedType, [.(..None | ..PublicParameterlessConstructor | ..PublicConstructors | ..NonPublicConstructors)] type, ? testClassType, string? key, factory) { } + public static object? GetOrCreate(.SharedType sharedType, [.(..None | ..PublicParameterlessConstructor | ..PublicConstructors | ..NonPublicConstructors)] type, .DataGeneratorMetadata dataGeneratorMetadata, string? key, factory) { } public static T GetOrCreate(.SharedType sharedType, ? testClassType, string? key) where T : new() { } public static T GetOrCreate(.SharedType sharedType, .DataGeneratorMetadata dataGeneratorMetadata, string? key) From 1c720b5984116dcef4e17d8f025572fd357be1f6 Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Mon, 26 Jan 2026 23:16:51 +0000 Subject: [PATCH 6/7] fix: remove AOT annotations from Net4_7 snapshot The PublicApiGenerator doesn't render DynamicallyAccessedMembers attributes in netstandard2.0/net472 target frameworks. Co-Authored-By: Claude Opus 4.5 --- .../Tests.Core_Library_Has_No_API_Changes.Net4_7.verified.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.Net4_7.verified.txt b/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.Net4_7.verified.txt index 3f8e3c1751..ab80bd6a01 100644 --- a/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.Net4_7.verified.txt +++ b/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.Net4_7.verified.txt @@ -1158,8 +1158,8 @@ namespace } public static class SharedDataSources { - public static object? GetOrCreate(.SharedType sharedType, [.(..None | ..PublicParameterlessConstructor | ..PublicConstructors | ..NonPublicConstructors)] type, ? testClassType, string? key, factory) { } - public static object? GetOrCreate(.SharedType sharedType, [.(..None | ..PublicParameterlessConstructor | ..PublicConstructors | ..NonPublicConstructors)] type, .DataGeneratorMetadata dataGeneratorMetadata, string? key, factory) { } + public static object? GetOrCreate(.SharedType sharedType, type, ? testClassType, string? key, factory) { } + public static object? GetOrCreate(.SharedType sharedType, type, .DataGeneratorMetadata dataGeneratorMetadata, string? key, factory) { } public static T GetOrCreate(.SharedType sharedType, ? testClassType, string? key) where T : new() { } public static T GetOrCreate(.SharedType sharedType, .DataGeneratorMetadata dataGeneratorMetadata, string? key) From 85dedf8df03615829963d8417a74f7646c2d502e Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Mon, 26 Jan 2026 23:45:11 +0000 Subject: [PATCH 7/7] feat: make testClassType and key optional in non-factory overloads This enables cleaner API calls: - SharedDataSources.GetOrCreate(SharedType.PerTestSession) - SharedDataSources.GetOrCreate(SharedType.Keyed, key: "mykey") Co-Authored-By: Claude Opus 4.5 --- TUnit.Core/SharedDataSources.cs | 4 ++-- ...ts.Core_Library_Has_No_API_Changes.DotNet10_0.verified.txt | 4 ++-- ...sts.Core_Library_Has_No_API_Changes.DotNet8_0.verified.txt | 4 ++-- ...sts.Core_Library_Has_No_API_Changes.DotNet9_0.verified.txt | 4 ++-- .../Tests.Core_Library_Has_No_API_Changes.Net4_7.verified.txt | 4 ++-- 5 files changed, 10 insertions(+), 10 deletions(-) diff --git a/TUnit.Core/SharedDataSources.cs b/TUnit.Core/SharedDataSources.cs index 2e324478c5..27ec9236da 100644 --- a/TUnit.Core/SharedDataSources.cs +++ b/TUnit.Core/SharedDataSources.cs @@ -22,7 +22,7 @@ public static class SharedDataSources /// Thrown when is null/empty and is . /// /// Thrown when is not a valid value. - public static T GetOrCreate(SharedType sharedType, DataGeneratorMetadata dataGeneratorMetadata, string? key) where T : new() + public static T GetOrCreate(SharedType sharedType, DataGeneratorMetadata dataGeneratorMetadata, string? key = null) where T : new() { return GetOrCreate(sharedType, dataGeneratorMetadata, key, static () => new T()); } @@ -40,7 +40,7 @@ public static class SharedDataSources /// or when is null/empty and is . /// /// Thrown when is not a valid value. - public static T GetOrCreate(SharedType sharedType, Type? testClassType, string? key) where T : new() + public static T GetOrCreate(SharedType sharedType, Type? testClassType = null, string? key = null) where T : new() { return GetOrCreate(sharedType, testClassType, key, static () => new T()); } diff --git a/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.DotNet10_0.verified.txt b/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.DotNet10_0.verified.txt index 3a83deef66..b08d85780f 100644 --- a/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.DotNet10_0.verified.txt +++ b/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.DotNet10_0.verified.txt @@ -1202,9 +1202,9 @@ namespace { public static object? GetOrCreate(.SharedType sharedType, [.(..None | ..PublicParameterlessConstructor | ..PublicConstructors | ..NonPublicConstructors)] type, ? testClassType, string? key, factory) { } public static object? GetOrCreate(.SharedType sharedType, [.(..None | ..PublicParameterlessConstructor | ..PublicConstructors | ..NonPublicConstructors)] type, .DataGeneratorMetadata dataGeneratorMetadata, string? key, factory) { } - public static T GetOrCreate(.SharedType sharedType, ? testClassType, string? key) + public static T GetOrCreate(.SharedType sharedType, ? testClassType = null, string? key = null) where T : new() { } - public static T GetOrCreate(.SharedType sharedType, .DataGeneratorMetadata dataGeneratorMetadata, string? key) + public static T GetOrCreate(.SharedType sharedType, .DataGeneratorMetadata dataGeneratorMetadata, string? key = null) where T : new() { } public static T GetOrCreate(.SharedType sharedType, ? testClassType, string? key, factory) { } public static T GetOrCreate(.SharedType sharedType, .DataGeneratorMetadata dataGeneratorMetadata, string? key, factory) { } 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 973ea1df68..2de5ad38a2 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 @@ -1202,9 +1202,9 @@ namespace { public static object? GetOrCreate(.SharedType sharedType, [.(..None | ..PublicParameterlessConstructor | ..PublicConstructors | ..NonPublicConstructors)] type, ? testClassType, string? key, factory) { } public static object? GetOrCreate(.SharedType sharedType, [.(..None | ..PublicParameterlessConstructor | ..PublicConstructors | ..NonPublicConstructors)] type, .DataGeneratorMetadata dataGeneratorMetadata, string? key, factory) { } - public static T GetOrCreate(.SharedType sharedType, ? testClassType, string? key) + public static T GetOrCreate(.SharedType sharedType, ? testClassType = null, string? key = null) where T : new() { } - public static T GetOrCreate(.SharedType sharedType, .DataGeneratorMetadata dataGeneratorMetadata, string? key) + public static T GetOrCreate(.SharedType sharedType, .DataGeneratorMetadata dataGeneratorMetadata, string? key = null) where T : new() { } public static T GetOrCreate(.SharedType sharedType, ? testClassType, string? key, factory) { } public static T GetOrCreate(.SharedType sharedType, .DataGeneratorMetadata dataGeneratorMetadata, string? key, factory) { } 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 75de1417e2..bb8a1a6d3d 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 @@ -1202,9 +1202,9 @@ namespace { public static object? GetOrCreate(.SharedType sharedType, [.(..None | ..PublicParameterlessConstructor | ..PublicConstructors | ..NonPublicConstructors)] type, ? testClassType, string? key, factory) { } public static object? GetOrCreate(.SharedType sharedType, [.(..None | ..PublicParameterlessConstructor | ..PublicConstructors | ..NonPublicConstructors)] type, .DataGeneratorMetadata dataGeneratorMetadata, string? key, factory) { } - public static T GetOrCreate(.SharedType sharedType, ? testClassType, string? key) + public static T GetOrCreate(.SharedType sharedType, ? testClassType = null, string? key = null) where T : new() { } - public static T GetOrCreate(.SharedType sharedType, .DataGeneratorMetadata dataGeneratorMetadata, string? key) + public static T GetOrCreate(.SharedType sharedType, .DataGeneratorMetadata dataGeneratorMetadata, string? key = null) where T : new() { } public static T GetOrCreate(.SharedType sharedType, ? testClassType, string? key, factory) { } public static T GetOrCreate(.SharedType sharedType, .DataGeneratorMetadata dataGeneratorMetadata, string? key, factory) { } diff --git a/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.Net4_7.verified.txt b/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.Net4_7.verified.txt index ab80bd6a01..093c221195 100644 --- a/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.Net4_7.verified.txt +++ b/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.Net4_7.verified.txt @@ -1160,9 +1160,9 @@ namespace { public static object? GetOrCreate(.SharedType sharedType, type, ? testClassType, string? key, factory) { } public static object? GetOrCreate(.SharedType sharedType, type, .DataGeneratorMetadata dataGeneratorMetadata, string? key, factory) { } - public static T GetOrCreate(.SharedType sharedType, ? testClassType, string? key) + public static T GetOrCreate(.SharedType sharedType, ? testClassType = null, string? key = null) where T : new() { } - public static T GetOrCreate(.SharedType sharedType, .DataGeneratorMetadata dataGeneratorMetadata, string? key) + public static T GetOrCreate(.SharedType sharedType, .DataGeneratorMetadata dataGeneratorMetadata, string? key = null) where T : new() { } public static T GetOrCreate(.SharedType sharedType, ? testClassType, string? key, factory) { } public static T GetOrCreate(.SharedType sharedType, .DataGeneratorMetadata dataGeneratorMetadata, string? key, factory) { }