Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -195,7 +195,7 @@ internal sealed class TUnit_TestProject_MethodDataSourceDrivenWithCancellationTo
switch (args.Length)
{
case 1:
instance.MyTest(TUnit.Core.Helpers.CastHelper.Cast<int>(args[0]), context?.CancellationToken ?? System.Threading.CancellationToken.None);
instance.MyTest(TUnit.Core.Helpers.CastHelper.Cast<int>(args[0]), context?.Execution.CancellationToken ?? System.Threading.CancellationToken.None);
return default(global::System.Threading.Tasks.ValueTask);
default:
throw new global::System.ArgumentException($"Expected exactly 1 argument, but got {args.Length}");
Expand Down
2 changes: 1 addition & 1 deletion TUnit.Core.SourceGenerator.Tests/Tests.Test.verified.txt
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,7 @@ internal sealed class TUnit_TestProject_Bugs__1304_Tests_TryParse_InvalidString_
switch (args.Length)
{
case 1:
return new global::System.Threading.Tasks.ValueTask(instance.TryParse_InvalidString_ReturnsFailure(TUnit.Core.Helpers.CastHelper.Cast<string>(args[0]), context?.CancellationToken ?? System.Threading.CancellationToken.None));
return new global::System.Threading.Tasks.ValueTask(instance.TryParse_InvalidString_ReturnsFailure(TUnit.Core.Helpers.CastHelper.Cast<string>(args[0]), context?.Execution.CancellationToken ?? System.Threading.CancellationToken.None));
default:
throw new global::System.ArgumentException($"Expected exactly 1 argument, but got {args.Length}");
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -527,7 +527,7 @@ internal sealed class TUnit_TestProject_TimeoutCancellationTokenTests_DataTest__
switch (args.Length)
{
case 1:
return new global::System.Threading.Tasks.ValueTask(instance.DataTest(TUnit.Core.Helpers.CastHelper.Cast<int>(args[0]), context?.CancellationToken ?? System.Threading.CancellationToken.None));
return new global::System.Threading.Tasks.ValueTask(instance.DataTest(TUnit.Core.Helpers.CastHelper.Cast<int>(args[0]), context?.Execution.CancellationToken ?? System.Threading.CancellationToken.None));
default:
throw new global::System.ArgumentException($"Expected exactly 1 argument, but got {args.Length}");
}
Expand Down Expand Up @@ -700,7 +700,7 @@ internal sealed class TUnit_TestProject_TimeoutCancellationTokenTests_DataSource
switch (args.Length)
{
case 1:
return new global::System.Threading.Tasks.ValueTask(instance.DataSourceTest(TUnit.Core.Helpers.CastHelper.Cast<int>(args[0]), context?.CancellationToken ?? System.Threading.CancellationToken.None));
return new global::System.Threading.Tasks.ValueTask(instance.DataSourceTest(TUnit.Core.Helpers.CastHelper.Cast<int>(args[0]), context?.Execution.CancellationToken ?? System.Threading.CancellationToken.None));
default:
throw new global::System.ArgumentException($"Expected exactly 1 argument, but got {args.Length}");
}
Expand Down Expand Up @@ -853,7 +853,7 @@ internal sealed class TUnit_TestProject_TimeoutCancellationTokenTests_MatrixTest
switch (args.Length)
{
case 1:
return new global::System.Threading.Tasks.ValueTask(instance.MatrixTest(TUnit.Core.Helpers.CastHelper.Cast<int>(args[0]), context?.CancellationToken ?? System.Threading.CancellationToken.None));
return new global::System.Threading.Tasks.ValueTask(instance.MatrixTest(TUnit.Core.Helpers.CastHelper.Cast<int>(args[0]), context?.Execution.CancellationToken ?? System.Threading.CancellationToken.None));
default:
throw new global::System.ArgumentException($"Expected exactly 1 argument, but got {args.Length}");
}
Expand Down
4 changes: 2 additions & 2 deletions TUnit.Core.SourceGenerator.Tests/Verify.cs
Original file line number Diff line number Diff line change
Expand Up @@ -88,8 +88,8 @@ public async Task ToTask()

if (testContext != null)
{
testClassName = testContext.TestDetails.ClassType.Name;
testName = testContext.TestDetails.TestName;
testClassName = testContext.Metadata.TestDetails.ClassType.Name;
testName = testContext.Metadata.TestDetails.TestName;
}
else
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2002,7 +2002,7 @@ private static void GenerateConcreteTestInvoker(CodeWriter writer, TestMethodMet
// Add CancellationToken if present
if (hasCancellationToken)
{
argsToPass.Add("context?.CancellationToken ?? System.Threading.CancellationToken.None");
argsToPass.Add("context?.Execution.CancellationToken ?? System.Threading.CancellationToken.None");
}

var typedMethodCall = $"instance.{methodName}({string.Join(", ", argsToPass)})";
Expand Down
8 changes: 4 additions & 4 deletions TUnit.Core/AbstractExecutableTest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -44,8 +44,8 @@ public required TestContext Context

public TestResult? Result
{
get => Context.Result;
set => Context.Result = value;
get => Context.Execution.Result;
set => Context.Execution.Result = value;
}

public DateTimeOffset? StartTime
Expand All @@ -61,7 +61,7 @@ public DateTimeOffset? StartTime

public Task CompletionTask => ExecutionTask ?? Task.CompletedTask;

public DateTimeOffset? EndTime { get => Context.TestEnd; set => Context.TestEnd = value; }
public DateTimeOffset? EndTime { get => Context.Execution.TestEnd; set => Context.Execution.TestEnd = value; }

public TimeSpan? Duration => StartTime.HasValue && EndTime.HasValue
? EndTime.Value - StartTime.Value
Expand All @@ -70,7 +70,7 @@ public DateTimeOffset? StartTime
public void SetResult(TestState state, Exception? exception = null)
{
State = state;
Context.Result ??= new TestResult
Context.Execution.Result ??= new TestResult
{
State = state,
Exception = exception,
Expand Down
4 changes: 2 additions & 2 deletions TUnit.Core/Attributes/TestData/ArgumentsAttribute.cs
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@ public ValueTask OnTestRegistered(TestRegisteredContext context)
if (!string.IsNullOrEmpty(Skip))
{
context.TestContext.SkipReason = Skip;
context.TestContext.TestDetails.ClassInstance = SkippedTestInstance.Instance;
context.TestContext.Metadata.TestDetails.ClassInstance = SkippedTestInstance.Instance;
}

return default;
Expand Down Expand Up @@ -90,7 +90,7 @@ public ValueTask OnTestRegistered(TestRegisteredContext context)
if (!string.IsNullOrEmpty(Skip))
{
context.TestContext.SkipReason = Skip;
context.TestContext.TestDetails.ClassInstance = SkippedTestInstance.Instance;
context.TestContext.Metadata.TestDetails.ClassInstance = SkippedTestInstance.Instance;
}

return default;
Expand Down
2 changes: 1 addition & 1 deletion TUnit.Core/Attributes/TestMetadata/DisplayNameAttribute.cs
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ public sealed class DisplayNameAttribute(string displayName) : DisplayNameFormat
/// <inheritdoc />
protected override string FormatDisplayName(DiscoveredTestContext context)
{
var testDetails = context.TestDetails;
var testDetails = context.TestContext.Metadata.TestDetails;

var mutableDisplayName = displayName;

Expand Down
2 changes: 1 addition & 1 deletion TUnit.Core/Attributes/TestMetadata/SkipAttribute.cs
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ public async ValueTask OnTestRegistered(TestRegisteredContext context)
{
// Store skip reason directly on TestContext
context.TestContext.SkipReason = Reason;
context.TestContext.TestDetails.ClassInstance = SkippedTestInstance.Instance;
context.TestContext.Metadata.TestDetails.ClassInstance = SkippedTestInstance.Instance;
}
}

Expand Down
2 changes: 1 addition & 1 deletion TUnit.Core/Attributes/TestMetadata/TimeoutAttribute.cs
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ public class TimeoutAttribute(int timeoutInMilliseconds) : TUnitAttribute, ITest
/// <inheritdoc />
public ValueTask OnTestDiscovered(DiscoveredTestContext context)
{
context.TestDetails.Timeout = Timeout;
context.TestContext.Metadata.TestDetails.Timeout = Timeout;
return default(ValueTask);
}

Expand Down
6 changes: 3 additions & 3 deletions TUnit.Core/Contexts/DiscoveredTestContext.cs
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ public class DiscoveredTestContext
public string TestName { get; }
public TestContext TestContext { get; }

public TestDetails TestDetails => TestContext.TestDetails;
public TestDetails TestDetails => TestContext.Metadata.TestDetails;

public DiscoveredTestContext(string testName, TestContext testContext)
{
Expand All @@ -21,7 +21,7 @@ public DiscoveredTestContext(string testName, TestContext testContext)

public void AddCategory(string category)
{
if (!string.IsNullOrWhiteSpace(category) && !TestContext.TestDetails.Categories.Contains(category))
if (!string.IsNullOrWhiteSpace(category) && !TestContext.Metadata.TestDetails.Categories.Contains(category))
{
TestDetails.Categories.Add(category);
}
Expand Down Expand Up @@ -57,7 +57,7 @@ public void SetRetryLimit(int retryLimit)
public void SetRetryLimit(int retryCount, Func<TestContext, Exception, int, Task<bool>> shouldRetry)
{
TestContext.RetryFunc = shouldRetry;
TestContext.TestDetails.RetryLimit = retryCount;
TestContext.Metadata.TestDetails.RetryLimit = retryCount;
}

/// <summary>
Expand Down
6 changes: 3 additions & 3 deletions TUnit.Core/Contexts/TestRegisteredContext.cs
Original file line number Diff line number Diff line change
Expand Up @@ -16,19 +16,19 @@ public class TestRegisteredContext
public TestRegisteredContext(TestContext testContext)
{
TestContext = testContext;
TestName = testContext.TestDetails.TestName;
TestName = testContext.Metadata.TestDetails.TestName;
CustomDisplayName = testContext.CustomDisplayName;
}

/// <summary>
/// Gets the object bag from the underlying TestContext
/// </summary>
public ConcurrentDictionary<string, object?> ObjectBag => TestContext.ObjectBag;
public ConcurrentDictionary<string, object?> ObjectBag => TestContext.StateBag.Items;

/// <summary>
/// Gets the test details from the underlying TestContext
/// </summary>
public TestDetails TestDetails => TestContext.TestDetails;
public TestDetails TestDetails => TestContext.Metadata.TestDetails;

public void SetTestExecutor(ITestExecutor executor)
{
Expand Down
4 changes: 2 additions & 2 deletions TUnit.Core/DataGeneratorMetadataCreator.cs
Original file line number Diff line number Diff line change
Expand Up @@ -194,8 +194,8 @@ public static DataGeneratorMetadata CreateForPropertyInjection(
TestInformation = methodMetadata,
Type = DataGeneratorType.Property,
TestSessionId = TestSessionContext.Current?.Id ?? "property-injection",
TestClassInstance = testClassInstance ?? testContext?.TestDetails.ClassInstance,
ClassInstanceArguments = testContext?.TestDetails.TestClassArguments ?? []
TestClassInstance = testClassInstance ?? testContext?.Metadata.TestDetails.ClassInstance,
ClassInstanceArguments = testContext?.Metadata.TestDetails.TestClassArguments ?? []
};
}

Expand Down
2 changes: 1 addition & 1 deletion TUnit.Core/DataSources/TestDataFormatter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ public static class TestDataFormatter
/// </summary>
public static string FormatArguments(TestContext context)
{
var arguments = context.TestDetails.TestMethodArguments;
var arguments = context.Metadata.TestDetails.TestMethodArguments;
return FormatArguments(arguments, context.ArgumentDisplayFormatters);
}

Expand Down
2 changes: 1 addition & 1 deletion TUnit.Core/DiscoveredTest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ namespace TUnit.Core;
public abstract class DiscoveredTest
{
public required TestContext TestContext { get; init; }
public TestDetails TestDetails => TestContext.TestDetails;
public TestDetails TestDetails => TestContext.Metadata.TestDetails;
public ITestExecutor? TestExecutor { get; set; }
}

Expand Down
8 changes: 4 additions & 4 deletions TUnit.Core/Extensions/TestContextExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -13,22 +13,22 @@ public static class TestContextExtensions

public static string GetClassTypeName(this TestContext context)
{
var parameters = context.TestDetails.MethodMetadata.Class.Parameters;
var parameters = context.Metadata.TestDetails.MethodMetadata.Class.Parameters;

if (parameters.Length == 0)
{
return context.TestDetails.ClassType.Name;
return context.Metadata.TestDetails.ClassType.Name;
}

// Optimize: Use array instead of LINQ Select to reduce allocations
var args = context.TestDetails.TestClassArguments;
var args = context.Metadata.TestDetails.TestClassArguments;
var formattedArgs = new string[args.Length];
for (int i = 0; i < args.Length; i++)
{
formattedArgs[i] = ArgumentFormatter.Format(args[i], context.ArgumentDisplayFormatters);
}

return $"{context.TestDetails.ClassType.Name}({string.Join(", ", formattedArgs)})";
return $"{context.Metadata.TestDetails.ClassType.Name}({string.Join(", ", formattedArgs)})";
}

#if NET6_0_OR_GREATER
Expand Down
2 changes: 1 addition & 1 deletion TUnit.Core/GenericTestMetadata.cs
Original file line number Diff line number Diff line change
Expand Up @@ -123,7 +123,7 @@ public override Func<ExecutableTestCreationContext, TestMetadata, AbstractExecut
}
else
{
typeArgs = testContext.TestDetails.TestClassArguments?.OfType<Type>().ToArray() ?? Type.EmptyTypes;
typeArgs = testContext.Metadata.TestDetails.TestClassArguments?.OfType<Type>().ToArray() ?? Type.EmptyTypes;
}

var instance = InstanceFactory(typeArgs, context.ClassArguments ?? []);
Expand Down
4 changes: 2 additions & 2 deletions TUnit.Core/Helpers/DataSourceHelpers.cs
Original file line number Diff line number Diff line change
Expand Up @@ -562,9 +562,9 @@ public static void RegisterTypeCreator<T>(Func<MethodMetadata, string, Task<T>>
testInformation,
dataSourceAttribute,
TestContext.Current,
TestContext.Current?.TestDetails.ClassInstance,
TestContext.Current?.Metadata.TestDetails.ClassInstance,
TestContext.Current?.Events,
TestContext.Current?.ObjectBag ?? new ConcurrentDictionary<string, object?>()
TestContext.Current?.StateBag.Items ?? new ConcurrentDictionary<string, object?>()
);

// Generate the data source value using the attribute's GetDataRowsAsync method
Expand Down
6 changes: 3 additions & 3 deletions TUnit.Core/Hooks/InstanceHookMethod.cs
Original file line number Diff line number Diff line change
Expand Up @@ -24,19 +24,19 @@ public required Type InitClassType
public ValueTask ExecuteAsync(TestContext context, CancellationToken cancellationToken)
{
// Skip instance hooks if this is a pre-skipped test
if (context.TestDetails.ClassInstance is SkippedTestInstance)
if (context.Metadata.TestDetails.ClassInstance is SkippedTestInstance)
{
return new ValueTask();
}

// If the instance is still a placeholder, we can't execute instance hooks
if (context.TestDetails.ClassInstance is PlaceholderInstance)
if (context.Metadata.TestDetails.ClassInstance is PlaceholderInstance)
{
throw new InvalidOperationException($"Cannot execute instance hook {Name} because the test instance has not been created yet. This is likely a framework bug.");
}

return HookExecutor.ExecuteBeforeTestHook(MethodInfo, context,
() => Body!.Invoke(context.TestDetails.ClassInstance, context, cancellationToken)
() => Body!.Invoke(context.Metadata.TestDetails.ClassInstance, context, cancellationToken)
);
}
}
8 changes: 4 additions & 4 deletions TUnit.Core/Interfaces/ITestExecution.cs
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ public interface ITestExecution
/// <summary>
/// Gets the test result after execution completes, or null if the test is still running.
/// </summary>
TestResult? Result { get; }
TestResult? Result { get; internal set; }

/// <summary>
/// Gets the cancellation token for this test execution.
Expand All @@ -25,17 +25,17 @@ public interface ITestExecution
/// <summary>
/// Gets the timestamp when test execution started, or null if not yet started.
/// </summary>
DateTimeOffset? TestStart { get; }
DateTimeOffset? TestStart { get; internal set; }

/// <summary>
/// Gets the timestamp when test execution ended, or null if not yet completed.
/// </summary>
DateTimeOffset? TestEnd { get; }
DateTimeOffset? TestEnd { get; internal set; }

/// <summary>
/// Gets the current retry attempt number (0 for first attempt, 1+ for retries).
/// </summary>
int CurrentRetryAttempt { get; }
int CurrentRetryAttempt { get; internal set; }

/// <summary>
/// Gets the reason why this test was skipped, or null if not skipped.
Expand Down
2 changes: 1 addition & 1 deletion TUnit.Core/Interfaces/ITestMetadata.cs
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ public interface ITestMetadata
/// <summary>
/// Gets the detailed metadata about this test, including class type, method info, and arguments.
/// </summary>
TestDetails TestDetails { get; }
TestDetails TestDetails { get; internal set; }

/// <summary>
/// Gets the base name of the test method.
Expand Down
2 changes: 1 addition & 1 deletion TUnit.Core/Interfaces/ITestStateBag.cs
Original file line number Diff line number Diff line change
Expand Up @@ -14,5 +14,5 @@ public interface ITestStateBag
/// Use this to share state between hooks, data sources, and test methods within a single test execution.
/// Thread-safe for concurrent access.
/// </summary>
ConcurrentDictionary<string, object?> Bag { get; }
ConcurrentDictionary<string, object?> Items { get; }
}
4 changes: 2 additions & 2 deletions TUnit.Core/TestBuilderContext.cs
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ public static TestBuilderContext? Current
public required MethodMetadata TestMetadata { get; init; }

internal IClassConstructor? ClassConstructor { get; set; }

/// <summary>
/// Cached and initialized attributes for the test
/// </summary>
Expand All @@ -49,7 +49,7 @@ internal static TestBuilderContext FromTestContext(TestContext testContext, IDat
{
return new TestBuilderContext
{
Events = testContext.Events, TestMetadata = testContext.TestDetails.MethodMetadata, DataSourceAttribute = dataSourceAttribute, ObjectBag = testContext.ObjectBag,
Events = testContext.Events, TestMetadata = testContext.Metadata.TestDetails.MethodMetadata, DataSourceAttribute = dataSourceAttribute, ObjectBag = testContext.StateBag.Items,
};
}
}
Expand Down
Loading
Loading