GFramework/GFramework.SourceGenerators.Tests/Logging/LoggerGeneratorSnapshotTests.cs
GeWuYou 534818f5f6 docs(source-generators): 添加源代码生成器文档和相关常量定义
- 新增完整的 GFramework.SourceGenerators 文档,涵盖所有核心特性
- 添加 Log 属性生成器、Config Schema 生成器等详细使用说明
- 添加 ContextAware、GenerateEnumExtensions 等属性生成器文档
- 添加 Godot 专用生成器如 GetNode、BindNodeSignal 等使用指南
- 添加 AutoRegisterModule、AutoUiPage、AutoScene 等自动化工具文档
- 添加诊断信息、性能优势、使用示例和最佳实践章节
- 新增 PathContests 常量类定义 GFramework 项目路径常量
- 添加 ContextRegistrationAnalyzerTests 测试类验证上下文注册分析器
2026-04-16 21:40:47 +08:00

592 lines
26 KiB
C#

using System.IO;
using GFramework.Core.SourceGenerators.Logging;
using GFramework.SourceGenerators.Tests.Core;
namespace GFramework.SourceGenerators.Tests.Logging;
[TestFixture]
public class LoggerGeneratorSnapshotTests
{
[Test]
public async Task Snapshot_DefaultConfiguration_Class()
{
const string source = """
using System;
namespace GFramework.Core.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.Core.SourceGenerators.Abstractions.Logging;
[Log]
public partial class MyService
{
}
}
""";
await GeneratorSnapshotTest<LoggerGenerator>.RunAsync(
source,
Path.Combine(
TestContext.CurrentContext.TestDirectory,
"logging",
"snapshots",
"LoggerGenerator",
"DefaultConfiguration_Class"));
}
[Test]
public async Task Snapshot_CustomName_Class()
{
const string source = """
using System;
namespace GFramework.Core.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.Core.SourceGenerators.Abstractions.Logging;
[Log(Name = "CustomLogger")]
public partial class MyService
{
}
}
""";
await GeneratorSnapshotTest<LoggerGenerator>.RunAsync(
source,
Path.Combine(
TestContext.CurrentContext.TestDirectory,
"logging",
"snapshots",
"LoggerGenerator",
"CustomName_Class"));
}
[Test]
public async Task Snapshot_CustomFieldName_Class()
{
const string source = """
using System;
namespace GFramework.Core.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.Core.SourceGenerators.Abstractions.Logging;
[Log(FieldName = "MyLogger")]
public partial class MyService
{
}
}
""";
await GeneratorSnapshotTest<LoggerGenerator>.RunAsync(
source,
Path.Combine(
TestContext.CurrentContext.TestDirectory,
"logging",
"snapshots",
"LoggerGenerator",
"CustomFieldName_Class"));
}
[Test]
public async Task Snapshot_InstanceField_Class()
{
const string source = """
using System;
namespace GFramework.Core.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.Core.SourceGenerators.Abstractions.Logging;
[Log(IsStatic = false)]
public partial class MyService
{
}
}
""";
await GeneratorSnapshotTest<LoggerGenerator>.RunAsync(
source,
Path.Combine(
TestContext.CurrentContext.TestDirectory,
"logging",
"snapshots",
"LoggerGenerator",
"InstanceField_Class"));
}
[Test]
public async Task Snapshot_PublicField_Class()
{
const string source = """
using System;
namespace GFramework.Core.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.Core.SourceGenerators.Abstractions.Logging;
[Log(AccessModifier = "public")]
public partial class MyService
{
}
}
""";
await GeneratorSnapshotTest<LoggerGenerator>.RunAsync(
source,
Path.Combine(
TestContext.CurrentContext.TestDirectory,
"logging",
"snapshots",
"LoggerGenerator",
"PublicField_Class"));
}
[Test]
public async Task Snapshot_GenericClass()
{
const string source = """
using System;
namespace GFramework.Core.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.Core.SourceGenerators.Abstractions.Logging;
[Log]
public partial class MyService<T>
{
}
}
""";
await GeneratorSnapshotTest<LoggerGenerator>.RunAsync(
source,
Path.Combine(
TestContext.CurrentContext.TestDirectory,
"logging",
"snapshots",
"LoggerGenerator",
"GenericClass"));
}
}