Files
h-school/tests/HSchool.Server.Tests/PortraitPromptBuilderTests.cs
T
Leonid Pershin 5a400be792 Add SwarmUI settings management and portrait generation enhancements
- Introduced new API endpoints for managing SwarmUI settings, including fetching and saving presets and age rules.
- Updated the portrait generation logic to utilize the new settings structure, allowing for dynamic preset selection based on age.
- Enhanced UI components to support SwarmUI settings, including localization for new strings and improved styling for settings sections.
- Added tests to verify the functionality of new settings endpoints and portrait generation behavior.

This commit lays the groundwork for more flexible and user-friendly portrait generation options.
2026-08-20 06:06:45 +03:00

109 lines
3.8 KiB
C#

using HSchool.Server.Api;
using HSchool.Server.Game;
namespace HSchool.Server.Tests;
public class PortraitPromptBuilderTests
{
[Fact]
public void Build_IncludesAgeHairAndWornClothing()
{
var profile = SamplePreset().ToProfile(PortraitKind.Avatar);
var card = SampleCard();
var (positive, _) = PortraitPromptBuilder.Build(card, profile, PortraitKind.Avatar);
Assert.Contains("age 12", positive, StringComparison.OrdinalIgnoreCase);
Assert.Contains("black", positive, StringComparison.OrdinalIgnoreCase);
Assert.Contains("shirt", positive, StringComparison.OrdinalIgnoreCase);
Assert.Contains("white", positive, StringComparison.OrdinalIgnoreCase);
Assert.Contains("Head and shoulders.", positive, StringComparison.Ordinal);
}
[Fact]
public void Build_FullBody_AddsFullBodyPreset()
{
var preset = SamplePreset();
var (avatarPositive, _) = PortraitPromptBuilder.Build(SampleCard(), preset.ToProfile(PortraitKind.Avatar), PortraitKind.Avatar);
var (fullPositive, _) = PortraitPromptBuilder.Build(SampleCard(), preset.ToProfile(PortraitKind.Full), PortraitKind.Full);
Assert.Contains("Head and shoulders.", avatarPositive, StringComparison.Ordinal);
Assert.DoesNotContain("Standing full body.", avatarPositive, StringComparison.Ordinal);
Assert.Contains("Standing full body.", fullPositive, StringComparison.Ordinal);
}
[Fact]
public void Build_Custom_UsesPromptExtraInsteadOfPreset()
{
var profile = SamplePreset().ToProfile(PortraitKind.Custom);
const string extra = "standing in a school hallway, soft window light";
var (customPositive, _) = PortraitPromptBuilder.Build(
SampleCard(),
profile,
PortraitKind.Custom,
extra);
Assert.Contains("School photo.", customPositive, StringComparison.Ordinal);
Assert.Contains(extra, customPositive, StringComparison.Ordinal);
Assert.DoesNotContain("Head and shoulders.", customPositive, StringComparison.Ordinal);
Assert.DoesNotContain("Standing full body.", customPositive, StringComparison.Ordinal);
}
[Fact]
public void Build_ChildAge_UsesChildSubjectDescriptor()
{
var profile = SamplePreset().ToProfile(PortraitKind.Avatar);
var child = SampleCard() with { Age = 8 };
var (positive, _) = PortraitPromptBuilder.Build(child, profile, PortraitKind.Avatar);
Assert.Contains("young girl", positive, StringComparison.OrdinalIgnoreCase);
}
private static SwarmUiPresetDefinition SamplePreset()
{
var preset = SwarmUiPresetDefinition.CreateDefault();
preset.Positive = "School photo.";
preset.Avatar = new SwarmUiKindPreset
{
Width = 512,
Height = 512,
Positive = "Head and shoulders.",
};
preset.FullBody = new SwarmUiKindPreset
{
Width = 512,
Height = 768,
Positive = "Standing full body.",
};
return preset;
}
private static PersonCardResponse SampleCard() =>
new(
"f0.c0",
"Maria Ivanova",
"Ivanova",
"Maria",
"",
true,
12,
new DateTime(2000, 3, 14, 0, 0, 0, DateTimeKind.Utc),
["student"],
5,
"A",
"class-1",
null,
null,
[new LabeledStatResponse("HairColor", "Hair colour", "Black")],
[],
[],
[],
null,
null,
new PersonFamilyResponse([], [], [], []),
[new WornItemResponse("Shirt", "Shirt", "White", "White", [], 1f, "new")],
[],
0f,
0f);
}