From 1919ef6c6bb5e3ef383d0c5354333434f33e9665 Mon Sep 17 00:00:00 2001 From: Simon Cropp Date: Thu, 17 Apr 2025 21:54:23 +1000 Subject: [PATCH 1/4] remove namespace and append guid to AssemblyLoader --- .../CodeGenerators/AssemblyLoaderGenerator.cs | 20 +++++++------------ 1 file changed, 7 insertions(+), 13 deletions(-) diff --git a/TUnit.Core.SourceGenerator/CodeGenerators/AssemblyLoaderGenerator.cs b/TUnit.Core.SourceGenerator/CodeGenerators/AssemblyLoaderGenerator.cs index aedede8c59..4d2a06b1c7 100644 --- a/TUnit.Core.SourceGenerator/CodeGenerators/AssemblyLoaderGenerator.cs +++ b/TUnit.Core.SourceGenerator/CodeGenerators/AssemblyLoaderGenerator.cs @@ -35,22 +35,16 @@ private void GenerateCode(SourceProductionContext context, Compilation compilati .ToArray(); var sourceBuilder = new SourceCodeWriter(); - + sourceBuilder.WriteLine("// "); sourceBuilder.WriteLine("#pragma warning disable"); - - if(!string.IsNullOrEmpty(compilation.Assembly.Name)) - { - sourceBuilder.WriteLine($"namespace {compilation.Assembly.Name};"); - sourceBuilder.WriteLine(); - } - - sourceBuilder.WriteLine("public static class AssemblyLoader"); + + sourceBuilder.WriteLine("public static class AssemblyLoader" + Guid.NewGuid().ToString("N")); sourceBuilder.WriteLine("{"); sourceBuilder.WriteLine("[global::System.Runtime.CompilerServices.ModuleInitializer]"); sourceBuilder.WriteLine("public static void Initialize()"); sourceBuilder.WriteLine("{"); - + foreach (var type in types) { var typeName = type.GloballyQualifiedNonGeneric(); @@ -59,13 +53,13 @@ private void GenerateCode(SourceProductionContext context, Compilation compilati { typeName += $"<{new string(',', type.TypeParameters.Length - 1)}>"; } - + sourceBuilder.WriteLine($"global::TUnit.Core.SourceRegistrar.RegisterAssembly(() => typeof({typeName}).Assembly);"); } - + sourceBuilder.WriteLine("}"); sourceBuilder.WriteLine("}"); - + context.AddSource("AssemblyLoader.g.cs", sourceBuilder.ToString()); } From 340aa75bcbb0b61026cf18aa3a01e39db879e2c5 Mon Sep 17 00:00:00 2001 From: Simon Cropp Date: Fri, 18 Apr 2025 11:24:14 +1000 Subject: [PATCH 2/4] scrub AssemblyLoader Guid --- ...ssemblyLoaderTests.Test.DotNet8_0.verified.txt | 5 +---- ...ssemblyLoaderTests.Test.DotNet9_0.verified.txt | 5 +---- .../AssemblyLoaderTests.Test.Net4_7.verified.txt | 4 +--- .../AssemblyLoaderTests.cs | 15 ++++++++++++++- 4 files changed, 17 insertions(+), 12 deletions(-) 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 e0e2a7e2e9..f53ecd9549 100644 --- a/TUnit.Core.SourceGenerator.Tests/AssemblyLoaderTests.Test.DotNet8_0.verified.txt +++ b/TUnit.Core.SourceGenerator.Tests/AssemblyLoaderTests.Test.DotNet8_0.verified.txt @@ -1,16 +1,13 @@ [ // #pragma warning disable -namespace AssemblyLoaderTests; - -public static class AssemblyLoader +public static class AssemblyLoader_Guid { [global::System.Runtime.CompilerServices.ModuleInitializer] public static void Initialize() { global::TUnit.Core.SourceRegistrar.RegisterAssembly(() => typeof(global::System.SequencePosition).Assembly); global::TUnit.Core.SourceRegistrar.RegisterAssembly(() => typeof(global::System.Xml.XmlNamedNodeMap).Assembly); - global::TUnit.Core.SourceRegistrar.RegisterAssembly(() => typeof(global::System.Xml.Linq.XAttribute).Assembly); global::TUnit.Core.SourceRegistrar.RegisterAssembly(() => typeof(global::TUnit.Core.AsyncEvent<>).Assembly); } } 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 556c15a76a..926f7be4af 100644 --- a/TUnit.Core.SourceGenerator.Tests/AssemblyLoaderTests.Test.DotNet9_0.verified.txt +++ b/TUnit.Core.SourceGenerator.Tests/AssemblyLoaderTests.Test.DotNet9_0.verified.txt @@ -1,9 +1,7 @@ [ // #pragma warning disable -namespace AssemblyLoaderTests; - -public static class AssemblyLoader +public static class AssemblyLoader_Guid { [global::System.Runtime.CompilerServices.ModuleInitializer] public static void Initialize() @@ -11,7 +9,6 @@ public static class AssemblyLoader global::TUnit.Core.SourceRegistrar.RegisterAssembly(() => typeof(global::System.SequencePosition).Assembly); global::TUnit.Core.SourceRegistrar.RegisterAssembly(() => typeof(global::System.Diagnostics.ActivityChangedEventArgs).Assembly); global::TUnit.Core.SourceRegistrar.RegisterAssembly(() => typeof(global::System.Xml.XmlNamedNodeMap).Assembly); - global::TUnit.Core.SourceRegistrar.RegisterAssembly(() => typeof(global::System.Xml.Linq.XAttribute).Assembly); global::TUnit.Core.SourceRegistrar.RegisterAssembly(() => typeof(global::TUnit.Core.AsyncEvent<>).Assembly); } } 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 b099a991be..f55c03cd0e 100644 --- a/TUnit.Core.SourceGenerator.Tests/AssemblyLoaderTests.Test.Net4_7.verified.txt +++ b/TUnit.Core.SourceGenerator.Tests/AssemblyLoaderTests.Test.Net4_7.verified.txt @@ -1,9 +1,7 @@ [ // #pragma warning disable -namespace AssemblyLoaderTests; - -public static class AssemblyLoader +public static class AssemblyLoader_Guid { [global::System.Runtime.CompilerServices.ModuleInitializer] public static void Initialize() diff --git a/TUnit.Core.SourceGenerator.Tests/AssemblyLoaderTests.cs b/TUnit.Core.SourceGenerator.Tests/AssemblyLoaderTests.cs index 295d5415b8..5f993f476b 100644 --- a/TUnit.Core.SourceGenerator.Tests/AssemblyLoaderTests.cs +++ b/TUnit.Core.SourceGenerator.Tests/AssemblyLoaderTests.cs @@ -1,3 +1,4 @@ +using System.Runtime.InteropServices; using TUnit.Core.SourceGenerator.CodeGenerators; using TUnit.Core.SourceGenerator.Tests.Options; @@ -11,7 +12,19 @@ public Task Test() => RunTest(Path.Combine(Git.RootDirectory.FullName, "BasicTests.cs"), new RunTestOptions() { - VerifyConfigurator = verify => verify.UniqueForTargetFrameworkAndVersion() + VerifyConfigurator = verify => + { + return verify.UniqueForTargetFrameworkAndVersion() + .ScrubLinesWithReplace(line => + { + if (line.Contains("public static class AssemblyLoader")) + { + return "public static class AssemblyLoader_Guid"; + } + + return line; + }); + } }, async generatedFiles => { From e8a785359bc7497dc2f31e6b7a013e2dd96a7964 Mon Sep 17 00:00:00 2001 From: Simon Cropp Date: Fri, 18 Apr 2025 17:00:46 +1000 Subject: [PATCH 3/4] add missing PublicKeyToken to IsSystemAssembly --- .../AssemblyLoaderTests.Test.DotNet8_0.verified.txt | 2 -- .../AssemblyLoaderTests.Test.DotNet9_0.verified.txt | 3 --- .../AssemblyLoaderTests.Test.Net4_7.verified.txt | 1 - .../CodeGenerators/AssemblyLoaderGenerator.cs | 1 + 4 files changed, 1 insertion(+), 6 deletions(-) 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 f53ecd9549..cca5c88b27 100644 --- a/TUnit.Core.SourceGenerator.Tests/AssemblyLoaderTests.Test.DotNet8_0.verified.txt +++ b/TUnit.Core.SourceGenerator.Tests/AssemblyLoaderTests.Test.DotNet8_0.verified.txt @@ -6,8 +6,6 @@ public static class AssemblyLoader_Guid [global::System.Runtime.CompilerServices.ModuleInitializer] public static void Initialize() { - global::TUnit.Core.SourceRegistrar.RegisterAssembly(() => typeof(global::System.SequencePosition).Assembly); - global::TUnit.Core.SourceRegistrar.RegisterAssembly(() => typeof(global::System.Xml.XmlNamedNodeMap).Assembly); global::TUnit.Core.SourceRegistrar.RegisterAssembly(() => typeof(global::TUnit.Core.AsyncEvent<>).Assembly); } } 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 926f7be4af..cca5c88b27 100644 --- a/TUnit.Core.SourceGenerator.Tests/AssemblyLoaderTests.Test.DotNet9_0.verified.txt +++ b/TUnit.Core.SourceGenerator.Tests/AssemblyLoaderTests.Test.DotNet9_0.verified.txt @@ -6,9 +6,6 @@ public static class AssemblyLoader_Guid [global::System.Runtime.CompilerServices.ModuleInitializer] public static void Initialize() { - global::TUnit.Core.SourceRegistrar.RegisterAssembly(() => typeof(global::System.SequencePosition).Assembly); - global::TUnit.Core.SourceRegistrar.RegisterAssembly(() => typeof(global::System.Diagnostics.ActivityChangedEventArgs).Assembly); - global::TUnit.Core.SourceRegistrar.RegisterAssembly(() => typeof(global::System.Xml.XmlNamedNodeMap).Assembly); global::TUnit.Core.SourceRegistrar.RegisterAssembly(() => typeof(global::TUnit.Core.AsyncEvent<>).Assembly); } } 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 f55c03cd0e..cca5c88b27 100644 --- a/TUnit.Core.SourceGenerator.Tests/AssemblyLoaderTests.Test.Net4_7.verified.txt +++ b/TUnit.Core.SourceGenerator.Tests/AssemblyLoaderTests.Test.Net4_7.verified.txt @@ -6,7 +6,6 @@ public static class AssemblyLoader_Guid [global::System.Runtime.CompilerServices.ModuleInitializer] public static void Initialize() { - global::TUnit.Core.SourceRegistrar.RegisterAssembly(() => typeof(global::System.Runtime.CompilerServices.AsyncMethodBuilderAttribute).Assembly); global::TUnit.Core.SourceRegistrar.RegisterAssembly(() => typeof(global::TUnit.Core.AsyncEvent<>).Assembly); } } diff --git a/TUnit.Core.SourceGenerator/CodeGenerators/AssemblyLoaderGenerator.cs b/TUnit.Core.SourceGenerator/CodeGenerators/AssemblyLoaderGenerator.cs index 4d2a06b1c7..f3b0d2df8c 100644 --- a/TUnit.Core.SourceGenerator/CodeGenerators/AssemblyLoaderGenerator.cs +++ b/TUnit.Core.SourceGenerator/CodeGenerators/AssemblyLoaderGenerator.cs @@ -102,6 +102,7 @@ private static bool IsSystemAssembly(IAssemblySymbol assemblySymbol) return publicKeyToken.SequenceEqual(new byte[] { 0xb7, 0x7a, 0x5c, 0x56, 0x19, 0x34, 0xe0, 0x89 }) // .NET Framework || publicKeyToken.SequenceEqual(new byte[] { 0x7c, 0xec, 0x85, 0xd7, 0xbe, 0xa7, 0x79, 0x8e }) // .NET Core + || publicKeyToken.SequenceEqual(new byte[] { 0xcc, 0x7b, 0x13, 0xff, 0xcd, 0x2d, 0xdd, 0x51 }) // System.Private || publicKeyToken.SequenceEqual(new byte[] { 0xb0, 0x3f, 0x5f, 0x7f, 0x11, 0xd5, 0x0a, 0x3a }); // mscorlib } From 5a528c0a2152b28756ffbe9abeb0b9f5dd6946f2 Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Fri, 18 Apr 2025 10:50:20 +0100 Subject: [PATCH 4/4] Update snaps --- .../AssemblyLoaderTests.cs | 2 +- ...t_Library_Has_No_API_Changes.DotNet2_0.verified.txt | 8 ++++---- ...t_Library_Has_No_API_Changes.DotNet8_0.verified.txt | 10 +++++----- ...t_Library_Has_No_API_Changes.DotNet9_0.verified.txt | 10 +++++----- TUnit.PublicAPI/Tests.cs | 9 +++++++++ 5 files changed, 24 insertions(+), 15 deletions(-) diff --git a/TUnit.Core.SourceGenerator.Tests/AssemblyLoaderTests.cs b/TUnit.Core.SourceGenerator.Tests/AssemblyLoaderTests.cs index 5f993f476b..523178b9bf 100644 --- a/TUnit.Core.SourceGenerator.Tests/AssemblyLoaderTests.cs +++ b/TUnit.Core.SourceGenerator.Tests/AssemblyLoaderTests.cs @@ -10,7 +10,7 @@ internal class AssemblyLoaderTests : TestsBase public Task Test() => RunTest(Path.Combine(Git.RootDirectory.FullName, "TUnit.TestProject", "BasicTests.cs"), - new RunTestOptions() + new RunTestOptions { VerifyConfigurator = verify => { diff --git a/TUnit.PublicAPI/Tests.Playwright_Library_Has_No_API_Changes.DotNet2_0.verified.txt b/TUnit.PublicAPI/Tests.Playwright_Library_Has_No_API_Changes.DotNet2_0.verified.txt index 2fbc0fff73..f9e0121abc 100644 --- a/TUnit.PublicAPI/Tests.Playwright_Library_Has_No_API_Changes.DotNet2_0.verified.txt +++ b/TUnit.PublicAPI/Tests.Playwright_Library_Has_No_API_Changes.DotNet2_0.verified.txt @@ -1,10 +1,10 @@ [assembly: System.Runtime.Versioning.TargetFramework(".NETStandard,Version=v2.0", FrameworkDisplayName=".NET Standard 2.0")] +public static class AssemblyLoader_Guid +{ + public static void Initialize() { } +} namespace TUnit.Playwright { - public static class AssemblyLoader - { - public static void Initialize() { } - } public class BrowserTest : TUnit.Playwright.PlaywrightTest { public BrowserTest() { } diff --git a/TUnit.PublicAPI/Tests.Playwright_Library_Has_No_API_Changes.DotNet8_0.verified.txt b/TUnit.PublicAPI/Tests.Playwright_Library_Has_No_API_Changes.DotNet8_0.verified.txt index bd3cf63c5b..022bef3662 100644 --- a/TUnit.PublicAPI/Tests.Playwright_Library_Has_No_API_Changes.DotNet8_0.verified.txt +++ b/TUnit.PublicAPI/Tests.Playwright_Library_Has_No_API_Changes.DotNet8_0.verified.txt @@ -1,11 +1,11 @@ [assembly: System.Runtime.Versioning.TargetFramework(".NETCoreApp,Version=v8.0", FrameworkDisplayName=".NET 8.0")] +public static class AssemblyLoader_Guid +{ + [System.Runtime.CompilerServices.ModuleInitializer] + public static void Initialize() { } +} namespace TUnit.Playwright { - public static class AssemblyLoader - { - [System.Runtime.CompilerServices.ModuleInitializer] - public static void Initialize() { } - } public class BrowserTest : TUnit.Playwright.PlaywrightTest { public BrowserTest() { } diff --git a/TUnit.PublicAPI/Tests.Playwright_Library_Has_No_API_Changes.DotNet9_0.verified.txt b/TUnit.PublicAPI/Tests.Playwright_Library_Has_No_API_Changes.DotNet9_0.verified.txt index 12661f6562..1491edf0d6 100644 --- a/TUnit.PublicAPI/Tests.Playwright_Library_Has_No_API_Changes.DotNet9_0.verified.txt +++ b/TUnit.PublicAPI/Tests.Playwright_Library_Has_No_API_Changes.DotNet9_0.verified.txt @@ -1,11 +1,11 @@ [assembly: System.Runtime.Versioning.TargetFramework(".NETCoreApp,Version=v9.0", FrameworkDisplayName=".NET 9.0")] +public static class AssemblyLoader_Guid +{ + [System.Runtime.CompilerServices.ModuleInitializer] + public static void Initialize() { } +} namespace TUnit.Playwright { - public static class AssemblyLoader - { - [System.Runtime.CompilerServices.ModuleInitializer] - public static void Initialize() { } - } public class BrowserTest : TUnit.Playwright.PlaywrightTest { public BrowserTest() { } diff --git a/TUnit.PublicAPI/Tests.cs b/TUnit.PublicAPI/Tests.cs index a4166344e6..a3c5144830 100644 --- a/TUnit.PublicAPI/Tests.cs +++ b/TUnit.PublicAPI/Tests.cs @@ -46,6 +46,15 @@ private async Task VerifyPublicApi(Assembly assembly) await Verify(publicApi) .AddScrubber(sb => Scrub(sb)) .ScrubLinesWithReplace(x => x.Replace("\r\n", "\n")) + .ScrubLinesWithReplace(line => + { + if (line.Contains("public static class AssemblyLoader")) + { + return "public static class AssemblyLoader_Guid"; + } + + return line; + }) .OnVerifyMismatch(async (pair, message, verify) => { var received = await FilePolyfill.ReadAllTextAsync(pair.ReceivedPath);