Skip to content
Merged
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
// <auto-generated/>
#pragma warning disable

// <auto-generated/>
#pragma warning disable
#nullable enable
namespace TUnit.Generated;
internal sealed class Tests_SimpleTest_TestSource_GUID : global::TUnit.Core.Interfaces.SourceGenerator.ITestSource
{
public async global::System.Collections.Generic.IAsyncEnumerable<global::TUnit.Core.TestMetadata> GetTestsAsync(string testSessionId, [global::System.Runtime.CompilerServices.EnumeratorCancellation] global::System.Threading.CancellationToken cancellationToken = default)
{
var metadata = new global::TUnit.Core.TestMetadata<global::TUnit.TestProject.Bugs._2971.Tests>
{
TestName = "SimpleTest",
TestClassType = typeof(global::TUnit.TestProject.Bugs._2971.Tests),
TestMethodName = "SimpleTest",
Dependencies = global::System.Array.Empty<global::TUnit.Core.TestDependency>(),
AttributeFactory = () =>
[
new global::TUnit.Core.TestAttribute(),
new global::TUnit.TestProject.Bugs._2971.SomeAttribute(typeof(global::System.Nullable<>))
],
DataSources = new global::TUnit.Core.IDataSourceAttribute[]
{
},
ClassDataSources = new global::TUnit.Core.IDataSourceAttribute[]
{
},
PropertyDataSources = new global::TUnit.Core.PropertyDataSource[]
{
},
PropertyInjections = new global::TUnit.Core.PropertyInjectionData[]
{
},
InheritanceDepth = 0,
FilePath = @"",
LineNumber = 19,
MethodMetadata = new global::TUnit.Core.MethodMetadata
{
Type = typeof(global::TUnit.TestProject.Bugs._2971.Tests),
TypeReference = global::TUnit.Core.TypeReference.CreateConcrete("TUnit.TestProject.Bugs._2971.Tests, TestsBase`1"),
Name = "SimpleTest",
GenericTypeCount = 0,
ReturnType = typeof(void),
ReturnTypeReference = global::TUnit.Core.TypeReference.CreateConcrete("void, System.Private.CoreLib"),
Parameters = global::System.Array.Empty<global::TUnit.Core.ParameterMetadata>(),
Class = global::TUnit.Core.ClassMetadata.GetOrAdd("TestsBase`1:global::TUnit.TestProject.Bugs._2971.Tests", () =>
{
var classMetadata = new global::TUnit.Core.ClassMetadata
{
Type = typeof(global::TUnit.TestProject.Bugs._2971.Tests),
TypeReference = global::TUnit.Core.TypeReference.CreateConcrete("TUnit.TestProject.Bugs._2971.Tests, TestsBase`1"),
Name = "Tests",
Namespace = "TUnit.TestProject.Bugs._2971",
Assembly = global::TUnit.Core.AssemblyMetadata.GetOrAdd("TestsBase`1", () => new global::TUnit.Core.AssemblyMetadata { Name = "TestsBase`1" }),
Parameters = global::System.Array.Empty<global::TUnit.Core.ParameterMetadata>(),
Properties = global::System.Array.Empty<global::TUnit.Core.PropertyMetadata>(),
Parent = null
};
// Set ClassMetadata and ContainingTypeMetadata references on properties to avoid circular dependency
foreach (var prop in classMetadata.Properties)
{
prop.ClassMetadata = classMetadata;
prop.ContainingTypeMetadata = classMetadata;
}
return classMetadata;
})
},
InstanceFactory = (typeArgs, args) => new global::TUnit.TestProject.Bugs._2971.Tests(),
TestInvoker = async (instance, args) =>
{
var typedInstance = (global::TUnit.TestProject.Bugs._2971.Tests)instance;
typedInstance.SimpleTest();
await global::System.Threading.Tasks.Task.CompletedTask;
},
InvokeTypedTest = async (instance, args, cancellationToken) =>
{
instance.SimpleTest();
await global::System.Threading.Tasks.Task.CompletedTask;
},
};
metadata.UseRuntimeDataGeneration(testSessionId);
yield return metadata;
yield break;
}
}
internal static class Tests_SimpleTest_ModuleInitializer_GUID
{
[global::System.Runtime.CompilerServices.ModuleInitializer]
public static void Initialize()
{
global::TUnit.Core.SourceRegistrar.Register(typeof(global::TUnit.TestProject.Bugs._2971.Tests), new Tests_SimpleTest_TestSource_GUID());
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
// <auto-generated/>
#pragma warning disable

// <auto-generated/>
#pragma warning disable
#nullable enable
namespace TUnit.Generated;
internal sealed class Tests_SimpleTest_TestSource_GUID : global::TUnit.Core.Interfaces.SourceGenerator.ITestSource
{
public async global::System.Collections.Generic.IAsyncEnumerable<global::TUnit.Core.TestMetadata> GetTestsAsync(string testSessionId, [global::System.Runtime.CompilerServices.EnumeratorCancellation] global::System.Threading.CancellationToken cancellationToken = default)
{
var metadata = new global::TUnit.Core.TestMetadata<global::TUnit.TestProject.Bugs._2971.Tests>
{
TestName = "SimpleTest",
TestClassType = typeof(global::TUnit.TestProject.Bugs._2971.Tests),
TestMethodName = "SimpleTest",
Dependencies = global::System.Array.Empty<global::TUnit.Core.TestDependency>(),
AttributeFactory = () =>
[
new global::TUnit.Core.TestAttribute(),
new global::TUnit.TestProject.Bugs._2971.SomeAttribute(typeof(global::System.Nullable<>))
],
DataSources = new global::TUnit.Core.IDataSourceAttribute[]
{
},
ClassDataSources = new global::TUnit.Core.IDataSourceAttribute[]
{
},
PropertyDataSources = new global::TUnit.Core.PropertyDataSource[]
{
},
PropertyInjections = new global::TUnit.Core.PropertyInjectionData[]
{
},
InheritanceDepth = 0,
FilePath = @"",
LineNumber = 19,
MethodMetadata = new global::TUnit.Core.MethodMetadata
{
Type = typeof(global::TUnit.TestProject.Bugs._2971.Tests),
TypeReference = global::TUnit.Core.TypeReference.CreateConcrete("TUnit.TestProject.Bugs._2971.Tests, TestsBase`1"),
Name = "SimpleTest",
GenericTypeCount = 0,
ReturnType = typeof(void),
ReturnTypeReference = global::TUnit.Core.TypeReference.CreateConcrete("void, System.Private.CoreLib"),
Parameters = global::System.Array.Empty<global::TUnit.Core.ParameterMetadata>(),
Class = global::TUnit.Core.ClassMetadata.GetOrAdd("TestsBase`1:global::TUnit.TestProject.Bugs._2971.Tests", () =>
{
var classMetadata = new global::TUnit.Core.ClassMetadata
{
Type = typeof(global::TUnit.TestProject.Bugs._2971.Tests),
TypeReference = global::TUnit.Core.TypeReference.CreateConcrete("TUnit.TestProject.Bugs._2971.Tests, TestsBase`1"),
Name = "Tests",
Namespace = "TUnit.TestProject.Bugs._2971",
Assembly = global::TUnit.Core.AssemblyMetadata.GetOrAdd("TestsBase`1", () => new global::TUnit.Core.AssemblyMetadata { Name = "TestsBase`1" }),
Parameters = global::System.Array.Empty<global::TUnit.Core.ParameterMetadata>(),
Properties = global::System.Array.Empty<global::TUnit.Core.PropertyMetadata>(),
Parent = null
};
// Set ClassMetadata and ContainingTypeMetadata references on properties to avoid circular dependency
foreach (var prop in classMetadata.Properties)
{
prop.ClassMetadata = classMetadata;
prop.ContainingTypeMetadata = classMetadata;
}
return classMetadata;
})
},
InstanceFactory = (typeArgs, args) => new global::TUnit.TestProject.Bugs._2971.Tests(),
TestInvoker = async (instance, args) =>
{
var typedInstance = (global::TUnit.TestProject.Bugs._2971.Tests)instance;
typedInstance.SimpleTest();
await global::System.Threading.Tasks.Task.CompletedTask;
},
InvokeTypedTest = async (instance, args, cancellationToken) =>
{
instance.SimpleTest();
await global::System.Threading.Tasks.Task.CompletedTask;
},
};
metadata.UseRuntimeDataGeneration(testSessionId);
yield return metadata;
yield break;
}
}
internal static class Tests_SimpleTest_ModuleInitializer_GUID
{
[global::System.Runtime.CompilerServices.ModuleInitializer]
public static void Initialize()
{
global::TUnit.Core.SourceRegistrar.Register(typeof(global::TUnit.TestProject.Bugs._2971.Tests), new Tests_SimpleTest_TestSource_GUID());
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
// <auto-generated/>
#pragma warning disable

// <auto-generated/>
#pragma warning disable
#nullable enable
namespace TUnit.Generated;
internal sealed class Tests_SimpleTest_TestSource_GUID : global::TUnit.Core.Interfaces.SourceGenerator.ITestSource
{
public async global::System.Collections.Generic.IAsyncEnumerable<global::TUnit.Core.TestMetadata> GetTestsAsync(string testSessionId, [global::System.Runtime.CompilerServices.EnumeratorCancellation] global::System.Threading.CancellationToken cancellationToken = default)
{
var metadata = new global::TUnit.Core.TestMetadata<global::TUnit.TestProject.Bugs._2971.Tests>
{
TestName = "SimpleTest",
TestClassType = typeof(global::TUnit.TestProject.Bugs._2971.Tests),
TestMethodName = "SimpleTest",
Dependencies = global::System.Array.Empty<global::TUnit.Core.TestDependency>(),
AttributeFactory = () =>
[
new global::TUnit.Core.TestAttribute(),
new global::TUnit.TestProject.Bugs._2971.SomeAttribute(typeof(global::System.Nullable<>))
],
DataSources = new global::TUnit.Core.IDataSourceAttribute[]
{
},
ClassDataSources = new global::TUnit.Core.IDataSourceAttribute[]
{
},
PropertyDataSources = new global::TUnit.Core.PropertyDataSource[]
{
},
PropertyInjections = new global::TUnit.Core.PropertyInjectionData[]
{
},
InheritanceDepth = 0,
FilePath = @"",
LineNumber = 19,
MethodMetadata = new global::TUnit.Core.MethodMetadata
{
Type = typeof(global::TUnit.TestProject.Bugs._2971.Tests),
TypeReference = global::TUnit.Core.TypeReference.CreateConcrete("TUnit.TestProject.Bugs._2971.Tests, TestsBase`1"),
Name = "SimpleTest",
GenericTypeCount = 0,
ReturnType = typeof(void),
ReturnTypeReference = global::TUnit.Core.TypeReference.CreateConcrete("void, System.Private.CoreLib"),
Parameters = global::System.Array.Empty<global::TUnit.Core.ParameterMetadata>(),
Class = global::TUnit.Core.ClassMetadata.GetOrAdd("TestsBase`1:global::TUnit.TestProject.Bugs._2971.Tests", () =>
{
var classMetadata = new global::TUnit.Core.ClassMetadata
{
Type = typeof(global::TUnit.TestProject.Bugs._2971.Tests),
TypeReference = global::TUnit.Core.TypeReference.CreateConcrete("TUnit.TestProject.Bugs._2971.Tests, TestsBase`1"),
Name = "Tests",
Namespace = "TUnit.TestProject.Bugs._2971",
Assembly = global::TUnit.Core.AssemblyMetadata.GetOrAdd("TestsBase`1", () => new global::TUnit.Core.AssemblyMetadata { Name = "TestsBase`1" }),
Parameters = global::System.Array.Empty<global::TUnit.Core.ParameterMetadata>(),
Properties = global::System.Array.Empty<global::TUnit.Core.PropertyMetadata>(),
Parent = null
};
// Set ClassMetadata and ContainingTypeMetadata references on properties to avoid circular dependency
foreach (var prop in classMetadata.Properties)
{
prop.ClassMetadata = classMetadata;
prop.ContainingTypeMetadata = classMetadata;
}
return classMetadata;
})
},
InstanceFactory = (typeArgs, args) => new global::TUnit.TestProject.Bugs._2971.Tests(),
TestInvoker = async (instance, args) =>
{
var typedInstance = (global::TUnit.TestProject.Bugs._2971.Tests)instance;
typedInstance.SimpleTest();
await global::System.Threading.Tasks.Task.CompletedTask;
},
InvokeTypedTest = async (instance, args, cancellationToken) =>
{
instance.SimpleTest();
await global::System.Threading.Tasks.Task.CompletedTask;
},
};
metadata.UseRuntimeDataGeneration(testSessionId);
yield return metadata;
yield break;
}
}
internal static class Tests_SimpleTest_ModuleInitializer_GUID
{
[global::System.Runtime.CompilerServices.ModuleInitializer]
public static void Initialize()
{
global::TUnit.Core.SourceRegistrar.Register(typeof(global::TUnit.TestProject.Bugs._2971.Tests), new Tests_SimpleTest_TestSource_GUID());
}
}
48 changes: 48 additions & 0 deletions TUnit.Core.SourceGenerator.Tests/Bugs2971NullableTypeTest.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
using TUnit.Core.SourceGenerator.Tests.Options;

namespace TUnit.Core.SourceGenerator.Tests;

internal class Bugs2971NullableTypeTest : TestsBase
{
[Test]
public Task Test() => RunTest(Path.Combine(Git.RootDirectory.FullName,
"TUnit.TestProject",
"Bugs",
"2971",
"NullableTypeTest.cs"),
new RunTestOptions
{
AdditionalFiles = [Path.Combine(Git.RootDirectory.FullName,
"TUnit.TestProject",
"Bugs",
"2971",
"AssemblyInfo.cs")],
VerifyConfigurator = verify => verify.UniqueForTargetFrameworkAndVersion()
},
async generatedFiles =>
{
// Scrub GUIDs from generated files before verification (same as TestsBase)
var scrubbedFiles = generatedFiles.Select(file => ScrubGuids(file)).ToArray();
await Verify(scrubbedFiles).UniqueForTargetFrameworkAndVersion();
});

private string ScrubGuids(string text)
{
var result = text
.Replace("\r\n", "\n")
.Replace("\r", "\n")
.Replace("\\r\\n", "\\n")
.Replace("\\r", "\\n");

// Scrub GUIDs from class names and identifiers
// Pattern 1: TestSource classes - ClassName_MethodName_TestSource_[32 hex chars]
var guidPattern1 = @"_TestSource_[a-fA-F0-9]{32}";
var scrubbedText = System.Text.RegularExpressions.Regex.Replace(result, guidPattern1, "_TestSource_GUID", System.Text.RegularExpressions.RegexOptions.None);

// Pattern 2: ModuleInitializer classes - ClassName_MethodName_ModuleInitializer_[32 hex chars]
var guidPattern2 = @"_ModuleInitializer_[a-fA-F0-9]{32}";
scrubbedText = System.Text.RegularExpressions.Regex.Replace(scrubbedText, guidPattern2, "_ModuleInitializer_GUID", System.Text.RegularExpressions.RegexOptions.None);

return scrubbedText;
}
}
12 changes: 6 additions & 6 deletions TUnit.Core.SourceGenerator.Tests/TestsBase.cs
Original file line number Diff line number Diff line change
Expand Up @@ -206,13 +206,13 @@ private StringBuilder Scrub(StringBuilder text)
.Replace("\\r", "\\n");

// Scrub GUIDs from class names and identifiers
// Pattern 1: ClassName_[32 hex chars]
var guidPattern1 = @"([A-Za-z_]\w*)_[a-fA-F0-9]{32}";
var scrubbedText = System.Text.RegularExpressions.Regex.Replace(result.ToString(), guidPattern1, "$1_GUID", System.Text.RegularExpressions.RegexOptions.None);
// Pattern 1: TestSource classes - ClassName_MethodName_TestSource_[32 hex chars]
var guidPattern1 = @"_TestSource_[a-fA-F0-9]{32}";
var scrubbedText = System.Text.RegularExpressions.Regex.Replace(result.ToString(), guidPattern1, "_TestSource_GUID", System.Text.RegularExpressions.RegexOptions.None);

// Pattern 2: ClassName_[standard GUID format]
var guidPattern2 = @"([A-Za-z_]\w*)_[a-fA-F0-9]{8}-?[a-fA-F0-9]{4}-?[a-fA-F0-9]{4}-?[a-fA-F0-9]{4}-?[a-fA-F0-9]{12}";
scrubbedText = System.Text.RegularExpressions.Regex.Replace(scrubbedText, guidPattern2, "$1_GUID", System.Text.RegularExpressions.RegexOptions.None);
// Pattern 2: ModuleInitializer classes - ClassName_MethodName_ModuleInitializer_[32 hex chars]
var guidPattern2 = @"_ModuleInitializer_[a-fA-F0-9]{32}";
scrubbedText = System.Text.RegularExpressions.Regex.Replace(scrubbedText, guidPattern2, "_ModuleInitializer_GUID", System.Text.RegularExpressions.RegexOptions.None);

// Scrub file paths - Windows style (e.g., D:\\git\\TUnit\\)
var windowsPathPattern = @"[A-Za-z]:\\\\[^""'\s,)]+";
Expand Down
Loading
Loading