GFramework/GFramework.Godot.Tests/Logging/GodotLogAppenderTests.cs
gewuyou 1009fee4a4 feat(godot): 新增 Godot 日志 Appender
新增 GodotLogAppender 作为 Core ILogAppender 的 Godot 控制台落点

重构 GodotLogger 输出路径以复用 appender 管线并保持现有 ILogger 入口

补充 Godot appender 渲染测试、文档说明与 active topic 恢复记录
2026-05-03 11:03:58 +08:00

81 lines
2.5 KiB
C#

using System;
using System.Collections.Generic;
using GFramework.Core.Abstractions.Logging;
using GFramework.Godot.Logging;
namespace GFramework.Godot.Tests.Logging;
/// <summary>
/// Verifies the Godot appender edge that adapts Core log entries to Godot output rendering.
/// </summary>
[TestFixture]
public sealed class GodotLogAppenderTests
{
/// <summary>
/// Verifies that the appender renders Core log entry data and merged structured properties.
/// </summary>
[Test]
public void Render_Should_Use_Core_LogEntry_And_Merged_Properties()
{
LogContext.Clear();
using var sceneContext = LogContext.Push("Scene", "Boot");
var appender = new GodotLogAppender(new GodotLoggerOptions
{
Mode = GodotLoggerMode.Release,
ReleaseOutputTemplate = "{timestamp:yyyyMMdd}|{level:u3}|{category}|{message}{properties}"
});
var entry = new LogEntry(
new DateTime(2026, 5, 3, 4, 5, 6, DateTimeKind.Utc),
LogLevel.Info,
"Game.Services.Inventory",
"Ready",
null,
new Dictionary<string, object?>(StringComparer.Ordinal)
{
[" "] = "ignored",
["Score"] = 12.5m
});
var result = appender.Render(entry);
Assert.That(result, Is.EqualTo("20260503|INF|Game.Services.Inventory|Ready | Scene=Boot, Score=12.5"));
}
/// <summary>
/// Verifies that dynamic option providers are evaluated for each rendered log entry.
/// </summary>
[Test]
public void Render_Should_Use_Latest_Options_From_Provider()
{
var options = new GodotLoggerOptions
{
Mode = GodotLoggerMode.Release,
ReleaseOutputTemplate = "[release] {message}"
};
var appender = new GodotLogAppender(() => options);
var entry = new LogEntry(
DateTime.UtcNow,
LogLevel.Warning,
"Game",
"Reloaded",
null,
null);
var releaseResult = appender.Render(entry);
options = new GodotLoggerOptions
{
Mode = GodotLoggerMode.Debug,
DebugOutputTemplate = "[debug] {message}"
};
var debugResult = appender.Render(entry);
Assert.Multiple(() =>
{
Assert.That(releaseResult, Is.EqualTo("[release] Reloaded"));
Assert.That(debugResult, Is.EqualTo("[debug] Reloaded"));
});
}
}