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
@@ -1,6 +1,5 @@
using TUnit.Assertions.Extensions;
using TUnit.Core.SourceGenerator.CodeGenerators;
using TUnit.Core.SourceGenerator.Tests.Options;

namespace TUnit.Core.SourceGenerator.Tests;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
using System.Collections.Immutable;
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CSharp;
using TUnit.Core.SourceGenerator.CodeGenerators.Helpers;
using TUnit.Core.SourceGenerator.CodeGenerators.Writers.Hooks;
Expand Down
8 changes: 3 additions & 5 deletions TUnit.Core/AsyncConvert.cs
Original file line number Diff line number Diff line change
Expand Up @@ -21,18 +21,16 @@ public static async Task Convert(Func<ValueTask> action)
await action();
}

public static Task Convert(object? invoke)
public static async ValueTask Convert(object? invoke)
{
if (invoke is Task task)
{
return task;
await task;
}

if (invoke is ValueTask valueTask)
{
return valueTask.AsTask();
await valueTask;
}

return Task.CompletedTask;
}
}
17 changes: 3 additions & 14 deletions TUnit.Core/Attributes/TestData/ClassDataSourceAttribute.cs
Original file line number Diff line number Diff line change
Expand Up @@ -14,20 +14,10 @@ namespace TUnit.Core;
public override IEnumerable<T> GenerateDataSources(DataGeneratorMetadata dataGeneratorMetadata)
{
_dataGeneratorMetadata = dataGeneratorMetadata;

var t = Shared switch
{
SharedType.None => new T(),
SharedType.Globally => TestDataContainer.GetGlobalInstance(() => new T()),
SharedType.ForClass => TestDataContainer.GetInstanceForType<T>(dataGeneratorMetadata.TestClassType, () => new T()),
SharedType.Keyed => TestDataContainer.GetInstanceForKey(Key, () => new T()),
SharedType.ForAssembly => TestDataContainer.GetInstanceForAssembly(dataGeneratorMetadata.TestClassType.Assembly, () => new T()),
_ => throw new ArgumentOutOfRangeException()
};

_item = t;
_item = ClassDataSources.Get<T>(Shared, dataGeneratorMetadata.TestClassType, Key);

yield return t;
yield return _item;
}

public async ValueTask OnTestRegistered(TestContext testContext)
Expand All @@ -52,8 +42,7 @@ public ValueTask OnTestStart(BeforeTestContext beforeTestContext)

public async ValueTask OnTestEnd(TestContext testContext)
{
await ClassDataSources.OnTestEnd(Shared,
Key, _item);
await ClassDataSources.OnTestEnd(Shared, Key, _item);
}

public async ValueTask IfLastTestInClass(ClassHookContext context, TestContext testContext)
Expand Down
83 changes: 46 additions & 37 deletions TUnit.Core/Attributes/TestData/ClassDataSourceAttribute_2.cs
Original file line number Diff line number Diff line change
Expand Up @@ -8,81 +8,90 @@ public sealed class ClassDataSourceAttribute<[DynamicallyAccessedMembers(Dynamic
where T1 : new()
where T2 : new()
{
private T1? _item1;
private T2? _item2;
private DataGeneratorMetadata? _dataGeneratorMetadata;

public SharedType Shared { get; set; } = SharedType.None;
public string Key { get; set; } = string.Empty;
public SharedType[] Shared { get; set; } = [SharedType.None, SharedType.None, SharedType.None, SharedType.None, SharedType.None];
public string[] Keys { get; set; } = [string.Empty, string.Empty, string.Empty, string.Empty, string.Empty];

private
(
(T1 T, SharedType SharedType, string Key),
(T2 T, SharedType SharedType, string Key)
) _itemsWithMetadata;

public override IEnumerable<(T1, T2)> GenerateDataSources(DataGeneratorMetadata dataGeneratorMetadata)
{
_dataGeneratorMetadata = dataGeneratorMetadata;

var t = Shared switch
{
SharedType.None => (new T1(), new T2()),
SharedType.Globally => (TestDataContainer.GetGlobalInstance(() => new T1()), TestDataContainer.GetGlobalInstance(() => new T2())),
SharedType.ForClass => (TestDataContainer.GetInstanceForType<T1>(dataGeneratorMetadata.TestClassType, () => new T1()), TestDataContainer.GetInstanceForType<T2>(dataGeneratorMetadata.TestClassType, () => new T2())),
SharedType.Keyed => (TestDataContainer.GetInstanceForKey(Key, () => new T1()), TestDataContainer.GetInstanceForKey(Key, () => new T2())),
SharedType.ForAssembly => (TestDataContainer.GetInstanceForAssembly(dataGeneratorMetadata.TestClassType.Assembly, () => new T1()), TestDataContainer.GetInstanceForAssembly(dataGeneratorMetadata.TestClassType.Assembly, () => new T2())),
_ => throw new ArgumentOutOfRangeException()
};

_item1 = t.Item1;
_item2 = t.Item2;
_itemsWithMetadata =
(
ClassDataSources.GetItemForIndex<T1>(0, dataGeneratorMetadata.TestClassType, Shared, Keys),
ClassDataSources.GetItemForIndex<T2>(1, dataGeneratorMetadata.TestClassType, Shared, Keys)
);

yield return t;
yield return
(
_itemsWithMetadata.Item1.T,
_itemsWithMetadata.Item2.T
);
}

public async ValueTask OnTestRegistered(TestContext testContext)
{
await ClassDataSources.OnTestRegistered<T1>(
await ClassDataSources.OnTestRegistered(
testContext,
_dataGeneratorMetadata?.PropertyInfo?.GetAccessors()[0].IsStatic == true,
Shared,
Key,
_item1);
_itemsWithMetadata.Item1.SharedType,
_itemsWithMetadata.Item1.Key,
_itemsWithMetadata.Item1.T);

await ClassDataSources.OnTestRegistered<T2>(
await ClassDataSources.OnTestRegistered(
testContext,
_dataGeneratorMetadata?.PropertyInfo?.GetAccessors()[0].IsStatic == true,
Shared,
Key,
_item2);
_itemsWithMetadata.Item2.SharedType,
_itemsWithMetadata.Item2.Key,
_itemsWithMetadata.Item2.T);
}

public async ValueTask OnTestStart(BeforeTestContext beforeTestContext)
{
await ClassDataSources.OnTestStart(
beforeTestContext,
_dataGeneratorMetadata?.PropertyInfo?.GetAccessors()[0].IsStatic == true,
Shared,
Key,
_item1);
_itemsWithMetadata.Item1.SharedType,
_itemsWithMetadata.Item1.Key,
_itemsWithMetadata.Item1.Key);

await ClassDataSources.OnTestStart(
beforeTestContext,
_dataGeneratorMetadata?.PropertyInfo?.GetAccessors()[0].IsStatic == true,
Shared,
Key,
_item2);
_itemsWithMetadata.Item2.SharedType,
_itemsWithMetadata.Item2.Key,
_itemsWithMetadata.Item2.Key);
}

public async ValueTask OnTestEnd(TestContext testContext)
{
await ClassDataSources.OnTestEnd(Shared, Key, _item1);
await ClassDataSources.OnTestEnd(Shared, Key, _item2);
await ClassDataSources.OnTestEnd(
_itemsWithMetadata.Item1.SharedType,
_itemsWithMetadata.Item1.Key,
_itemsWithMetadata.Item1.T);

await ClassDataSources.OnTestEnd(
_itemsWithMetadata.Item2.SharedType,
_itemsWithMetadata.Item2.Key,
_itemsWithMetadata.Item2.T);
}

public async ValueTask IfLastTestInClass(ClassHookContext context, TestContext testContext)
{
await ClassDataSources.IfLastTestInClass<T1>(Shared);
await ClassDataSources.IfLastTestInClass<T2>(Shared);
await ClassDataSources.IfLastTestInClass<T1>(_itemsWithMetadata.Item1.SharedType);
await ClassDataSources.IfLastTestInClass<T2>(_itemsWithMetadata.Item2.SharedType);
}

public async ValueTask IfLastTestInAssembly(AssemblyHookContext context, TestContext testContext)
{
await ClassDataSources.IfLastTestInAssembly<T1>(Shared);
await ClassDataSources.IfLastTestInAssembly<T2>(Shared);
await ClassDataSources.IfLastTestInAssembly<T1>(_itemsWithMetadata.Item1.SharedType);
await ClassDataSources.IfLastTestInAssembly<T2>(_itemsWithMetadata.Item2.SharedType);
}
}
134 changes: 64 additions & 70 deletions TUnit.Core/Attributes/TestData/ClassDataSourceAttribute_3.cs
Original file line number Diff line number Diff line change
Expand Up @@ -9,120 +9,114 @@ public sealed class ClassDataSourceAttribute<[DynamicallyAccessedMembers(Dynamic
where T2 : new()
where T3 : new()
{
private T1? _item1;
private T2? _item2;
private T3? _item3;
private DataGeneratorMetadata? _dataGeneratorMetadata;

public SharedType Shared { get; set; } = SharedType.None;
public string Key { get; set; } = string.Empty;
public SharedType[] Shared { get; set; } = [SharedType.None, SharedType.None, SharedType.None, SharedType.None, SharedType.None];
public string[] Keys { get; set; } = [string.Empty, string.Empty, string.Empty, string.Empty, string.Empty];

private
(
(T1 T, SharedType SharedType, string Key),
(T2 T, SharedType SharedType, string Key),
(T3 T, SharedType SharedType, string Key)
) _itemsWithMetadata;

public override IEnumerable<(T1, T2, T3)> GenerateDataSources(DataGeneratorMetadata dataGeneratorMetadata)
{
_dataGeneratorMetadata = dataGeneratorMetadata;

var t = Shared switch
{
SharedType.None => (
new T1(),
new T2(),
new T3()
),
SharedType.Globally => (
TestDataContainer.GetGlobalInstance(() => new T1()),
TestDataContainer.GetGlobalInstance(() => new T2()),
TestDataContainer.GetGlobalInstance(() => new T3())
),
SharedType.ForClass => (
TestDataContainer.GetInstanceForType<T1>(dataGeneratorMetadata.TestClassType, () => new T1()),
TestDataContainer.GetInstanceForType<T2>(dataGeneratorMetadata.TestClassType, () => new T2()),
TestDataContainer.GetInstanceForType<T3>(dataGeneratorMetadata.TestClassType, () => new T3())
),
SharedType.Keyed => (
TestDataContainer.GetInstanceForKey(Key, () => new T1()),
TestDataContainer.GetInstanceForKey(Key, () => new T2()),
TestDataContainer.GetInstanceForKey(Key, () => new T3())
),
SharedType.ForAssembly => (
TestDataContainer.GetInstanceForAssembly(dataGeneratorMetadata.TestClassType.Assembly, () => new T1()),
TestDataContainer.GetInstanceForAssembly(dataGeneratorMetadata.TestClassType.Assembly, () => new T2()),
TestDataContainer.GetInstanceForAssembly(dataGeneratorMetadata.TestClassType.Assembly, () => new T3())
),
_ => throw new ArgumentOutOfRangeException()
};

_item1 = t.Item1;
_item2 = t.Item2;
_item3 = t.Item3;

yield return t;
_itemsWithMetadata =
(
ClassDataSources.GetItemForIndex<T1>(0, dataGeneratorMetadata.TestClassType, Shared, Keys),
ClassDataSources.GetItemForIndex<T2>(1, dataGeneratorMetadata.TestClassType, Shared, Keys),
ClassDataSources.GetItemForIndex<T3>(2, dataGeneratorMetadata.TestClassType, Shared, Keys)
);

yield return
(
_itemsWithMetadata.Item1.T,
_itemsWithMetadata.Item2.T,
_itemsWithMetadata.Item3.T
);
}

public async ValueTask OnTestRegistered(TestContext testContext)
{
await ClassDataSources.OnTestRegistered<T1>(
await ClassDataSources.OnTestRegistered(
testContext,
_dataGeneratorMetadata?.PropertyInfo?.GetAccessors()[0].IsStatic == true,
Shared,
Key,
_item1);
_itemsWithMetadata.Item1.SharedType,
_itemsWithMetadata.Item1.Key,
_itemsWithMetadata.Item1.T);

await ClassDataSources.OnTestRegistered<T2>(
await ClassDataSources.OnTestRegistered(
testContext,
_dataGeneratorMetadata?.PropertyInfo?.GetAccessors()[0].IsStatic == true,
Shared,
Key,
_item2);
_itemsWithMetadata.Item2.SharedType,
_itemsWithMetadata.Item2.Key,
_itemsWithMetadata.Item2.T);

await ClassDataSources.OnTestRegistered<T3>(
await ClassDataSources.OnTestRegistered(
testContext,
_dataGeneratorMetadata?.PropertyInfo?.GetAccessors()[0].IsStatic == true,
Shared,
Key,
_item3);
_itemsWithMetadata.Item3.SharedType,
_itemsWithMetadata.Item3.Key,
_itemsWithMetadata.Item3.T);
}

public async ValueTask OnTestStart(BeforeTestContext beforeTestContext)
{
await ClassDataSources.OnTestStart(
beforeTestContext,
_dataGeneratorMetadata?.PropertyInfo?.GetAccessors()[0].IsStatic == true,
Shared,
Key,
_item1);
_itemsWithMetadata.Item1.SharedType,
_itemsWithMetadata.Item1.Key,
_itemsWithMetadata.Item1.Key);

await ClassDataSources.OnTestStart(
beforeTestContext,
_dataGeneratorMetadata?.PropertyInfo?.GetAccessors()[0].IsStatic == true,
Shared,
Key,
_item2);
_itemsWithMetadata.Item2.SharedType,
_itemsWithMetadata.Item2.Key,
_itemsWithMetadata.Item2.Key);

await ClassDataSources.OnTestStart(
beforeTestContext,
_dataGeneratorMetadata?.PropertyInfo?.GetAccessors()[0].IsStatic == true,
Shared,
Key,
_item3);
_itemsWithMetadata.Item3.SharedType,
_itemsWithMetadata.Item3.Key,
_itemsWithMetadata.Item3.Key);
}

public async ValueTask OnTestEnd(TestContext testContext)
{
await ClassDataSources.OnTestEnd(Shared, Key, _item1);
await ClassDataSources.OnTestEnd(Shared, Key, _item2);
await ClassDataSources.OnTestEnd(Shared, Key, _item3);
await ClassDataSources.OnTestEnd(
_itemsWithMetadata.Item1.SharedType,
_itemsWithMetadata.Item1.Key,
_itemsWithMetadata.Item1.T);

await ClassDataSources.OnTestEnd(
_itemsWithMetadata.Item2.SharedType,
_itemsWithMetadata.Item2.Key,
_itemsWithMetadata.Item2.T);

await ClassDataSources.OnTestEnd(
_itemsWithMetadata.Item3.SharedType,
_itemsWithMetadata.Item3.Key,
_itemsWithMetadata.Item3.T);
}

public async ValueTask IfLastTestInClass(ClassHookContext context, TestContext testContext)
{
await ClassDataSources.IfLastTestInClass<T1>(Shared);
await ClassDataSources.IfLastTestInClass<T2>(Shared);
await ClassDataSources.IfLastTestInClass<T3>(Shared);
await ClassDataSources.IfLastTestInClass<T1>(_itemsWithMetadata.Item1.SharedType);
await ClassDataSources.IfLastTestInClass<T2>(_itemsWithMetadata.Item2.SharedType);
await ClassDataSources.IfLastTestInClass<T3>(_itemsWithMetadata.Item3.SharedType);
}

public async ValueTask IfLastTestInAssembly(AssemblyHookContext context, TestContext testContext)
{
await ClassDataSources.IfLastTestInAssembly<T1>(Shared);
await ClassDataSources.IfLastTestInClass<T2>(Shared);
await ClassDataSources.IfLastTestInClass<T3>(Shared);
await ClassDataSources.IfLastTestInAssembly<T1>(_itemsWithMetadata.Item1.SharedType);
await ClassDataSources.IfLastTestInAssembly<T2>(_itemsWithMetadata.Item2.SharedType);
await ClassDataSources.IfLastTestInAssembly<T3>(_itemsWithMetadata.Item3.SharedType);
}
}
Loading