using HSchool.Server.Api; using HSchool.Server.Game; namespace HSchool.Server.Tests; public class PortraitPromptBuilderTests { [Fact] public void Build_IncludesAgeHairAndWornClothing() { var settings = new SwarmUiSettings { Positive = "School photo.", Avatar = new SwarmUiSettings.SwarmUiPreset { Positive = "Head and shoulders." }, }; var card = SampleCard(); var (positive, _) = PortraitPromptBuilder.Build(card, settings, 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 settings = new SwarmUiSettings { Positive = "School photo.", Avatar = new SwarmUiSettings.SwarmUiPreset { Positive = "Head and shoulders." }, FullBody = new SwarmUiSettings.SwarmUiPreset { Positive = "Standing full body." }, }; var (avatarPositive, _) = PortraitPromptBuilder.Build(SampleCard(), settings, PortraitKind.Avatar); var (fullPositive, _) = PortraitPromptBuilder.Build(SampleCard(), settings, 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 settings = new SwarmUiSettings { Positive = "School photo.", Avatar = new SwarmUiSettings.SwarmUiPreset { Positive = "Head and shoulders." }, FullBody = new SwarmUiSettings.SwarmUiPreset { Positive = "Standing full body." }, }; const string extra = "standing in a school hallway, soft window light"; var (customPositive, _) = PortraitPromptBuilder.Build( SampleCard(), settings, 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); } 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); }