From 863e0a523a3bda10cd5011e4ce4e99f045411706 Mon Sep 17 00:00:00 2001 From: GeWuYou <95328647+GeWuYou@users.noreply.github.com> Date: Thu, 15 Jan 2026 22:11:20 +0800 Subject: [PATCH] =?UTF-8?q?test(logging):=20=E6=9B=B4=E6=96=B0=E6=97=A5?= =?UTF-8?q?=E5=BF=97=E7=94=9F=E6=88=90=E5=99=A8=E5=BF=AB=E7=85=A7=E6=B5=8B?= =?UTF-8?q?=E8=AF=95=E4=B8=AD=E7=9A=84=E4=BE=9D=E8=B5=96=E9=A1=B9=E5=AE=9A?= =?UTF-8?q?=E4=B9=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在测试代码中添加了完整的 LogAttribute 定义 - 添加了 ILogger 接口和相关实现类定义 - 包含 LoggerFactoryResolver 和 MockLoggerProvider 实现 - 补充了 MockLogger 类的具体实现 - 确保所有测试用例都有完整的基础依赖项定义 --- .../EnumExtensionsGeneratorSnapshotTests.cs | 69 ++- .../logging/LoggerGeneratorSnapshotTests.cs | 444 +++++++++++++++++- 2 files changed, 502 insertions(+), 11 deletions(-) diff --git a/GFramework.SourceGenerators.Tests/enums/EnumExtensionsGeneratorSnapshotTests.cs b/GFramework.SourceGenerators.Tests/enums/EnumExtensionsGeneratorSnapshotTests.cs index 62ffab8..2a84399 100644 --- a/GFramework.SourceGenerators.Tests/enums/EnumExtensionsGeneratorSnapshotTests.cs +++ b/GFramework.SourceGenerators.Tests/enums/EnumExtensionsGeneratorSnapshotTests.cs @@ -11,10 +11,22 @@ public class EnumExtensionsGeneratorSnapshotTests public async Task Snapshot_BasicEnum_IsMethods() { const string source = """ - using GFramework.SourceGenerators.Abstractions.enums; + using System; + + namespace GFramework.SourceGenerators.Abstractions.enums + { + [AttributeUsage(AttributeTargets.Enum)] + public sealed class GenerateEnumExtensionsAttribute : Attribute + { + public bool GenerateIsMethods { get; set; } = true; + public bool GenerateIsInMethod { get; set; } = true; + } + } namespace TestApp { + using GFramework.SourceGenerators.Abstractions.enums; + [GenerateEnumExtensions] public enum Status { @@ -39,10 +51,22 @@ public class EnumExtensionsGeneratorSnapshotTests public async Task Snapshot_BasicEnum_IsInMethod() { const string source = """ - using GFramework.SourceGenerators.Abstractions.enums; + using System; + + namespace GFramework.SourceGenerators.Abstractions.enums + { + [AttributeUsage(AttributeTargets.Enum)] + public sealed class GenerateEnumExtensionsAttribute : Attribute + { + public bool GenerateIsMethods { get; set; } = true; + public bool GenerateIsInMethod { get; set; } = true; + } + } namespace TestApp { + using GFramework.SourceGenerators.Abstractions.enums; + [GenerateEnumExtensions] public enum Status { @@ -66,11 +90,22 @@ public class EnumExtensionsGeneratorSnapshotTests public async Task Snapshot_EnumWithFlagValues() { const string source = """ - using GFramework.SourceGenerators.Abstractions.enums; using System; + namespace GFramework.SourceGenerators.Abstractions.enums + { + [AttributeUsage(AttributeTargets.Enum)] + public sealed class GenerateEnumExtensionsAttribute : Attribute + { + public bool GenerateIsMethods { get; set; } = true; + public bool GenerateIsInMethod { get; set; } = true; + } + } + namespace TestApp { + using GFramework.SourceGenerators.Abstractions.enums; + [GenerateEnumExtensions] [Flags] public enum Permissions @@ -97,10 +132,22 @@ public class EnumExtensionsGeneratorSnapshotTests public async Task Snapshot_DisableIsMethods() { const string source = """ - using GFramework.SourceGenerators.Abstractions.enums; + using System; + + namespace GFramework.SourceGenerators.Abstractions.enums + { + [AttributeUsage(AttributeTargets.Enum)] + public sealed class GenerateEnumExtensionsAttribute : Attribute + { + public bool GenerateIsMethods { get; set; } = true; + public bool GenerateIsInMethod { get; set; } = true; + } + } namespace TestApp { + using GFramework.SourceGenerators.Abstractions.enums; + [GenerateEnumExtensions(GenerateIsMethods = false)] public enum Status { @@ -124,10 +171,22 @@ public class EnumExtensionsGeneratorSnapshotTests public async Task Snapshot_DisableIsInMethod() { const string source = """ - using GFramework.SourceGenerators.Abstractions.enums; + using System; + + namespace GFramework.SourceGenerators.Abstractions.enums + { + [AttributeUsage(AttributeTargets.Enum)] + public sealed class GenerateEnumExtensionsAttribute : Attribute + { + public bool GenerateIsMethods { get; set; } = true; + public bool GenerateIsInMethod { get; set; } = true; + } + } namespace TestApp { + using GFramework.SourceGenerators.Abstractions.enums; + [GenerateEnumExtensions(GenerateIsInMethod = false)] public enum Status { diff --git a/GFramework.SourceGenerators.Tests/logging/LoggerGeneratorSnapshotTests.cs b/GFramework.SourceGenerators.Tests/logging/LoggerGeneratorSnapshotTests.cs index 7bc3af3..2cb4278 100644 --- a/GFramework.SourceGenerators.Tests/logging/LoggerGeneratorSnapshotTests.cs +++ b/GFramework.SourceGenerators.Tests/logging/LoggerGeneratorSnapshotTests.cs @@ -11,10 +11,82 @@ public class LoggerGeneratorSnapshotTests public async Task Snapshot_DefaultConfiguration_Class() { const string source = """ - using GFramework.SourceGenerators.Abstractions.logging; + using System; + + namespace GFramework.SourceGenerators.Abstractions.logging + { + [AttributeUsage(AttributeTargets.Class)] + public sealed class LogAttribute : Attribute + { + public string Name { get; set; } + public string FieldName { get; set; } + public string AccessModifier { get; set; } + public bool IsStatic { get; set; } = true; + } + } + + namespace GFramework.Core.Abstractions.logging + { + public interface ILogger + { + void Info(string message); + void Error(string message); + void Warn(string message); + void Debug(string message); + void Trace(string message); + void Fatal(string message); + } + } + + namespace GFramework.Core.logging + { + using GFramework.Core.Abstractions.logging; + + public static class LoggerFactoryResolver + { + public static ILoggerProvider Provider { get; set; } + + public static ILoggerProvider CreateLogger(string name) + { + return Provider ?? new MockLoggerProvider(); + } + } + + public interface ILoggerProvider + { + ILogger CreateLogger(string name); + } + + internal class MockLoggerProvider : ILoggerProvider + { + public ILogger CreateLogger(string name) + { + return new MockLogger(name); + } + } + + internal class MockLogger : ILogger + { + private readonly string _name; + + public MockLogger(string name) + { + _name = name; + } + + public void Info(string message) { } + public void Error(string message) { } + public void Warn(string message) { } + public void Debug(string message) { } + public void Trace(string message) { } + public void Fatal(string message) { } + } + } namespace TestApp { + using GFramework.SourceGenerators.Abstractions.logging; + [Log] public partial class MyService { @@ -36,10 +108,82 @@ public class LoggerGeneratorSnapshotTests public async Task Snapshot_CustomName_Class() { const string source = """ - using GFramework.SourceGenerators.Abstractions.logging; + using System; + + namespace GFramework.SourceGenerators.Abstractions.logging + { + [AttributeUsage(AttributeTargets.Class)] + public sealed class LogAttribute : Attribute + { + public string Name { get; set; } + public string FieldName { get; set; } + public string AccessModifier { get; set; } + public bool IsStatic { get; set; } = true; + } + } + + namespace GFramework.Core.Abstractions.logging + { + public interface ILogger + { + void Info(string message); + void Error(string message); + void Warn(string message); + void Debug(string message); + void Trace(string message); + void Fatal(string message); + } + } + + namespace GFramework.Core.logging + { + using GFramework.Core.Abstractions.logging; + + public static class LoggerFactoryResolver + { + public static ILoggerProvider Provider { get; set; } + + public static ILoggerProvider CreateLogger(string name) + { + return Provider ?? new MockLoggerProvider(); + } + } + + public interface ILoggerProvider + { + ILogger CreateLogger(string name); + } + + internal class MockLoggerProvider : ILoggerProvider + { + public ILogger CreateLogger(string name) + { + return new MockLogger(name); + } + } + + internal class MockLogger : ILogger + { + private readonly string _name; + + public MockLogger(string name) + { + _name = name; + } + + public void Info(string message) { } + public void Error(string message) { } + public void Warn(string message) { } + public void Debug(string message) { } + public void Trace(string message) { } + public void Fatal(string message) { } + } + } namespace TestApp { + using GFramework.SourceGenerators.Abstractions.logging; + [Log(Name = "CustomLogger")] public partial class MyService { @@ -61,10 +205,82 @@ public class LoggerGeneratorSnapshotTests public async Task Snapshot_CustomFieldName_Class() { const string source = """ - using GFramework.SourceGenerators.Abstractions.logging; + using System; + + namespace GFramework.SourceGenerators.Abstractions.logging + { + [AttributeUsage(AttributeTargets.Class)] + public sealed class LogAttribute : Attribute + { + public string Name { get; set; } + public string FieldName { get; set; } + public string AccessModifier { get; set; } + public bool IsStatic { get; set; } = true; + } + } + + namespace GFramework.Core.Abstractions.logging + { + public interface ILogger + { + void Info(string message); + void Error(string message); + void Warn(string message); + void Debug(string message); + void Trace(string message); + void Fatal(string message); + } + } + + namespace GFramework.Core.logging + { + using GFramework.Core.Abstractions.logging; + + public static class LoggerFactoryResolver + { + public static ILoggerProvider Provider { get; set; } + + public static ILoggerProvider CreateLogger(string name) + { + return Provider ?? new MockLoggerProvider(); + } + } + + public interface ILoggerProvider + { + ILogger CreateLogger(string name); + } + + internal class MockLoggerProvider : ILoggerProvider + { + public ILogger CreateLogger(string name) + { + return new MockLogger(name); + } + } + + internal class MockLogger : ILogger + { + private readonly string _name; + + public MockLogger(string name) + { + _name = name; + } + + public void Info(string message) { } + public void Error(string message) { } + public void Warn(string message) { } + public void Debug(string message) { } + public void Trace(string message) { } + public void Fatal(string message) { } + } + } namespace TestApp { + using GFramework.SourceGenerators.Abstractions.logging; + [Log(FieldName = "MyLogger")] public partial class MyService { @@ -86,10 +302,82 @@ public class LoggerGeneratorSnapshotTests public async Task Snapshot_InstanceField_Class() { const string source = """ - using GFramework.SourceGenerators.Abstractions.logging; + using System; + + namespace GFramework.SourceGenerators.Abstractions.logging + { + [AttributeUsage(AttributeTargets.Class)] + public sealed class LogAttribute : Attribute + { + public string Name { get; set; } + public string FieldName { get; set; } + public string AccessModifier { get; set; } + public bool IsStatic { get; set; } = true; + } + } + + namespace GFramework.Core.Abstractions.logging + { + public interface ILogger + { + void Info(string message); + void Error(string message); + void Warn(string message); + void Debug(string message); + void Trace(string message); + void Fatal(string message); + } + } + + namespace GFramework.Core.logging + { + using GFramework.Core.Abstractions.logging; + + public static class LoggerFactoryResolver + { + public static ILoggerProvider Provider { get; set; } + + public static ILoggerProvider CreateLogger(string name) + { + return Provider ?? new MockLoggerProvider(); + } + } + + public interface ILoggerProvider + { + ILogger CreateLogger(string name); + } + + internal class MockLoggerProvider : ILoggerProvider + { + public ILogger CreateLogger(string name) + { + return new MockLogger(name); + } + } + + internal class MockLogger : ILogger + { + private readonly string _name; + + public MockLogger(string name) + { + _name = name; + } + + public void Info(string message) { } + public void Error(string message) { } + public void Warn(string message) { } + public void Debug(string message) { } + public void Trace(string message) { } + public void Fatal(string message) { } + } + } namespace TestApp { + using GFramework.SourceGenerators.Abstractions.logging; + [Log(IsStatic = false)] public partial class MyService { @@ -111,10 +399,82 @@ public class LoggerGeneratorSnapshotTests public async Task Snapshot_PublicField_Class() { const string source = """ - using GFramework.SourceGenerators.Abstractions.logging; + using System; + + namespace GFramework.SourceGenerators.Abstractions.logging + { + [AttributeUsage(AttributeTargets.Class)] + public sealed class LogAttribute : Attribute + { + public string Name { get; set; } + public string FieldName { get; set; } + public string AccessModifier { get; set; } + public bool IsStatic { get; set; } = true; + } + } + + namespace GFramework.Core.Abstractions.logging + { + public interface ILogger + { + void Info(string message); + void Error(string message); + void Warn(string message); + void Debug(string message); + void Trace(string message); + void Fatal(string message); + } + } + + namespace GFramework.Core.logging + { + using GFramework.Core.Abstractions.logging; + + public static class LoggerFactoryResolver + { + public static ILoggerProvider Provider { get; set; } + + public static ILoggerProvider CreateLogger(string name) + { + return Provider ?? new MockLoggerProvider(); + } + } + + public interface ILoggerProvider + { + ILogger CreateLogger(string name); + } + + internal class MockLoggerProvider : ILoggerProvider + { + public ILogger CreateLogger(string name) + { + return new MockLogger(name); + } + } + + internal class MockLogger : ILogger + { + private readonly string _name; + + public MockLogger(string name) + { + _name = name; + } + + public void Info(string message) { } + public void Error(string message) { } + public void Warn(string message) { } + public void Debug(string message) { } + public void Trace(string message) { } + public void Fatal(string message) { } + } + } namespace TestApp { + using GFramework.SourceGenerators.Abstractions.logging; + [Log(AccessModifier = "public")] public partial class MyService { @@ -136,10 +496,82 @@ public class LoggerGeneratorSnapshotTests public async Task Snapshot_GenericClass() { const string source = """ - using GFramework.SourceGenerators.Abstractions.logging; + using System; + + namespace GFramework.SourceGenerators.Abstractions.logging + { + [AttributeUsage(AttributeTargets.Class)] + public sealed class LogAttribute : Attribute + { + public string Name { get; set; } + public string FieldName { get; set; } + public string AccessModifier { get; set; } + public bool IsStatic { get; set; } = true; + } + } + + namespace GFramework.Core.Abstractions.logging + { + public interface ILogger + { + void Info(string message); + void Error(string message); + void Warn(string message); + void Debug(string message); + void Trace(string message); + void Fatal(string message); + } + } + + namespace GFramework.Core.logging + { + using GFramework.Core.Abstractions.logging; + + public static class LoggerFactoryResolver + { + public static ILoggerProvider Provider { get; set; } + + public static ILoggerProvider CreateLogger(string name) + { + return Provider ?? new MockLoggerProvider(); + } + } + + public interface ILoggerProvider + { + ILogger CreateLogger(string name); + } + + internal class MockLoggerProvider : ILoggerProvider + { + public ILogger CreateLogger(string name) + { + return new MockLogger(name); + } + } + + internal class MockLogger : ILogger + { + private readonly string _name; + + public MockLogger(string name) + { + _name = name; + } + + public void Info(string message) { } + public void Error(string message) { } + public void Warn(string message) { } + public void Debug(string message) { } + public void Trace(string message) { } + public void Fatal(string message) { } + } + } namespace TestApp { + using GFramework.SourceGenerators.Abstractions.logging; + [Log] public partial class MyService {