GFramework/GFramework.Godot.Tests/Logging/GodotLogTemplateTests.cs
gewuyou ff553977e3 chore(license): 补齐 Apache-2.0 文件头治理
- 新增许可证文件头检查与修复脚本

- 补充维护者手动修复 PR 工作流和 CI 校验

- 更新贡献指南中的文件头说明

- 补齐仓库维护源码和配置文件的许可证声明
2026-05-03 19:39:49 +08:00

146 lines
4.2 KiB
C#

// Copyright (c) 2025-2026 GeWuYou
// SPDX-License-Identifier: Apache-2.0
using System;
using GFramework.Core.Abstractions.Logging;
using GFramework.Godot.Logging;
namespace GFramework.Godot.Tests.Logging;
[TestFixture]
public sealed class GodotLogTemplateTests
{
[Test]
public void Render_Should_Format_Timestamp_Level_Color_Category_And_Message()
{
var template = GodotLogTemplate.Parse("[{timestamp:yyyyMMdd}] [color={color}]{level:u3}[/color] [{category:l16}] {message}");
var context = new GodotLogRenderContext(
new DateTime(2026, 5, 2, 1, 2, 3, DateTimeKind.Utc),
LogLevel.Warning,
"Game.Services.Inventory",
"Loaded",
"orange",
string.Empty);
var result = template.Render(context);
Assert.That(result, Is.EqualTo("[20260502] [color=orange]WRN[/color] [G.S.Inventory ] Loaded"));
}
[Test]
public void Render_Should_Support_Lowercase_Level_Format()
{
var template = GodotLogTemplate.Parse("{level:l3}:{message}");
var context = new GodotLogRenderContext(
new DateTime(2026, 5, 2, 1, 2, 3, DateTimeKind.Utc),
LogLevel.Debug,
"Game",
"Ready",
"cyan",
string.Empty);
var result = template.Render(context);
Assert.That(result, Is.EqualTo("dbg:Ready"));
}
[Test]
public void Render_Should_Right_Align_Category()
{
var template = GodotLogTemplate.Parse("[{category:r10}]");
var context = new GodotLogRenderContext(
new DateTime(2026, 5, 2, 1, 2, 3, DateTimeKind.Utc),
LogLevel.Info,
"UI",
"Ready",
"white",
string.Empty);
var result = template.Render(context);
Assert.That(result, Is.EqualTo("[ UI]"));
}
[Test]
public void Render_Should_Preserve_Unknown_Placeholders()
{
var template = GodotLogTemplate.Parse("{message} {unknown}");
var context = new GodotLogRenderContext(
new DateTime(2026, 5, 2, 1, 2, 3, DateTimeKind.Utc),
LogLevel.Info,
"Game",
"Ready",
"white",
string.Empty);
var result = template.Render(context);
Assert.That(result, Is.EqualTo("Ready {unknown}"));
}
[Test]
public void Render_Should_Format_Padded_Level()
{
var template = GodotLogTemplate.Parse("{level:padded}");
var context = new GodotLogRenderContext(
new DateTime(2026, 5, 2, 1, 2, 3, DateTimeKind.Utc),
LogLevel.Info,
"Game",
"Ready",
"white",
string.Empty);
var result = template.Render(context);
Assert.That(result, Is.EqualTo("INFO "));
}
[Test]
public void Render_Should_Append_Properties_Placeholder()
{
var template = GodotLogTemplate.Parse("{message}{properties}");
var context = new GodotLogRenderContext(
new DateTime(2026, 5, 2, 1, 2, 3, DateTimeKind.Utc),
LogLevel.Info,
"Game",
"Ready",
"white",
" | Scene=Boot");
var result = template.Render(context);
Assert.That(result, Is.EqualTo("Ready | Scene=Boot"));
}
[Test]
public void Options_ForMinimumLevel_Should_Preserve_Fixed_Minimum_Level()
{
var options = GodotLoggerOptions.ForMinimumLevel(LogLevel.Warning);
Assert.That(options.Mode, Is.EqualTo(GodotLoggerMode.Debug));
Assert.That(options.DebugMinLevel, Is.EqualTo(LogLevel.Warning));
Assert.That(options.ReleaseMinLevel, Is.EqualTo(LogLevel.Warning));
}
[Test]
public void Options_Should_Use_Default_Color_When_Configured_Color_Is_Missing()
{
var options = new GodotLoggerOptions();
options.Colors.Remove(LogLevel.Error);
var result = options.GetColor(LogLevel.Error);
Assert.That(result, Is.EqualTo("red"));
}
[Test]
public void Options_Should_Use_White_Color_When_Level_Is_Not_Defined()
{
var options = new GodotLoggerOptions();
var result = options.GetColor((LogLevel)999);
Assert.That(result, Is.EqualTo("white"));
}
}