using System;
using System.Collections.Generic;
using GFramework.Core.Abstractions.Logging;
using GFramework.Godot.Logging;
namespace GFramework.Godot.Tests.Logging;
///
/// Verifies the Godot appender edge that adapts Core log entries to Godot output rendering.
///
[TestFixture]
public sealed class GodotLogAppenderTests
{
///
/// Verifies that the appender renders Core log entry data and merged structured properties.
///
[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(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"));
}
///
/// Verifies that dynamic option providers are evaluated for each rendered log entry.
///
[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"));
});
}
}