Files
HellionChat/HellionChat/SelfTests/FontManagerCtorSmokeStep.cs
T

137 lines
4.6 KiB
C#

using Dalamud.Bindings.ImGui;
using Dalamud.Plugin.SelfTest;
namespace HellionChat.SelfTests;
// Verifies the FontManager came out of the DI container with every
// handle attached and no atlas-load failure on any of them. ItalicFont
// is allowed to be null when ItalicEnabled is off.
internal sealed class FontManagerCtorSmokeStep : ISelfTestStep
{
private readonly Plugin plugin;
public FontManagerCtorSmokeStep(Plugin plugin)
{
this.plugin = plugin;
}
public string Name => "Hellion Chat - FontManager ctor smoke";
public SelfTestStepResult RunStep()
{
var fm = this.plugin.FontManager;
if (fm is null)
{
ImGui.Text("Plugin.FontManager is null");
return SelfTestStepResult.Fail;
}
if (fm.Axis is null)
{
ImGui.Text("Axis handle is null");
return SelfTestStepResult.Fail;
}
if (fm.AxisItalic is null)
{
ImGui.Text("AxisItalic handle is null");
return SelfTestStepResult.Fail;
}
if (fm.FontAwesome is null)
{
ImGui.Text("FontAwesome handle is null");
return SelfTestStepResult.Fail;
}
if (fm.RegularFont is null)
{
ImGui.Text("RegularFont handle is null");
return SelfTestStepResult.Fail;
}
if (Plugin.Config.ItalicEnabled && fm.ItalicFont is null)
{
ImGui.Text("ItalicEnabled is on but ItalicFont handle is null");
return SelfTestStepResult.Fail;
}
if (fm.Axis.LoadException is { } e1)
{
ImGui.Text($"Axis load exception: {e1.Message}");
return SelfTestStepResult.Fail;
}
if (fm.AxisItalic.LoadException is { } e2)
{
ImGui.Text($"AxisItalic load exception: {e2.Message}");
return SelfTestStepResult.Fail;
}
if (fm.FontAwesome.LoadException is { } e3)
{
ImGui.Text($"FontAwesome load exception: {e3.Message}");
return SelfTestStepResult.Fail;
}
if (fm.RegularFont.LoadException is { } e4)
{
ImGui.Text($"RegularFont load exception: {e4.Message}");
return SelfTestStepResult.Fail;
}
if (fm.ItalicFont?.LoadException is { } e5)
{
ImGui.Text($"ItalicFont load exception: {e5.Message}");
return SelfTestStepResult.Fail;
}
// B1: assert the atlas actually finished building all required handles,
// not just that the references are non-null. FontsReady is the observable
// state the trimmed-fallback rebuild must still reach; a half-built atlas
// would pass the null/exception checks above but fail here.
if (!fm.FontsReady)
{
ImGui.Text("FontManager.FontsReady is false (atlas not fully built).");
SelfTestReport.Append(
Name,
"FAIL",
new[] { "FontsReady is false — atlas not fully built." }
);
return SelfTestStepResult.Fail;
}
// Report what was actually verified (Flo's request: don't just show Pass).
// The glyph-range entry counts make the B1 dedup visible — the cjk-fallback
// range is now a small trimmed remainder next to the large primary range.
var counts = fm.GlyphRangeLengths;
var italicState =
fm.ItalicFont is null ? "disabled (null)"
: fm.ItalicFont.Available ? "available"
: "NOT available";
var path = SelfTestReport.Append(
Name,
"PASS",
new[]
{
$"Axis available: {fm.Axis.Available}",
$"AxisItalic available: {fm.AxisItalic.Available}",
$"FontAwesome available: {fm.FontAwesome.Available}",
$"RegularFont available: {fm.RegularFont.Available}",
$"ItalicFont: {italicState}",
$"FontsReady: {fm.FontsReady}",
$"Glyph-range entries: primary={counts.Ranges}, jp={counts.JpRange}, "
+ $"cjk-fallback={counts.CjkFallback} (B1 trimmed)",
$"UseHellionFont={Plugin.Config.UseHellionFont}, ItalicEnabled={Plugin.Config.ItalicEnabled}",
}
);
ImGui.Text(
$"PASS — FontsReady, ranges primary={counts.Ranges}/jp={counts.JpRange}/"
+ $"cjk-fallback={counts.CjkFallback}. Report: {path}"
);
return SelfTestStepResult.Pass;
}
public void CleanUp() { }
}