GFramework/GFramework.Godot.Tests/Logging/GodotLogAppenderTests.cs
gewuyou 3ced56be8b chore(godot): 处理 Godot 日志 PR 反馈
- 修复 GodotLogAppender 测试对结构化属性顺序的依赖

- 移除 GodotLogger 未使用的私有格式化包装方法

- 更新 ai-plan 默认索引和 trace 恢复记录,避免归档主题与重复标题干扰 boot
2026-05-03 13:24:24 +08:00

86 lines
2.6 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.Multiple(() =>
{
Assert.That(result, Does.StartWith("20260503|INF|Game.Services.Inventory|Ready | "));
Assert.That(result, Does.Contain("Scene=Boot"));
Assert.That(result, Does.Contain("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"));
});
}
}