using System.Text.Json; using HSchool.Server.Game; namespace HSchool.Server.Tests; public class SwarmUiLoraFormatterTests { [Fact] public void FormatForApi_SplitsNamesAndWeights() { var (names, weights) = SwarmUiLoraFormatter.FormatForApi( [ new SwarmUiLoraEntry { Name = "style.safetensors", Weight = 0.8 }, new SwarmUiLoraEntry { Name = "face.safetensors", Weight = 1 }, ]); Assert.Equal("style.safetensors,face.safetensors", names); Assert.Equal("0.8,1", weights); } [Fact] public void Concat_StacksModelPresetAndKind() { var stacked = SwarmUiLoraFormatter.Concat( [new SwarmUiLoraEntry { Name = "model-lora", Weight = 1 }], [new SwarmUiLoraEntry { Name = "preset-lora", Weight = 0.5 }], [new SwarmUiLoraEntry { Name = "kind-lora", Weight = 0.2 }]); Assert.Equal(["model-lora", "preset-lora", "kind-lora"], stacked.Select(entry => entry.Name)); } [Fact] public void AppendEmbedTags_AddsSwarmEmbedSyntax() { var prompt = SwarmUiLoraFormatter.AppendEmbedTags( "a student", [ new SwarmUiLoraEntry { Name = "pos.safetensors", Weight = 1 }, new SwarmUiLoraEntry { Name = "soft.safetensors", Weight = 0.6 }, ]); Assert.Contains("", prompt, StringComparison.Ordinal); Assert.Contains("", prompt, StringComparison.Ordinal); Assert.DoesNotContain(" entry.Name)); Assert.Equal(["model-embed", "avatar-embed"], profile.PositiveEmbeddings.Select(entry => entry.Name)); } [Fact] public void Build_PutsEmbedsInPromptAndOmitsLoraTags() { var model = new SwarmUiModelDefinition { Id = "m.safetensors", PositiveLoras = [new SwarmUiLoraEntry { Name = "style-lora", Weight = 1 }], NegativeEmbeddings = [new SwarmUiLoraEntry { Name = "neg-embed", Weight = 1 }], }; var preset = SwarmUiPresetDefinition.CreateDefault(); preset.PositiveEmbeddings = [new SwarmUiLoraEntry { Name = "pos-embed", Weight = 1 }]; var card = new HSchool.Server.Api.PersonCardResponse( "f0.c0", "Maria Ivanova", "Ivanova", "Maria", "", true, 16, new DateTime(2000, 3, 14, 0, 0, 0, DateTimeKind.Utc), ["student"], 5, "A", "class-1", null, null, [], [], [], [], null, null, new HSchool.Server.Api.PersonFamilyResponse([], [], [], []), [], [], 0f, 0f); var (positive, negative) = PortraitPromptBuilder.Build( card, preset.ToProfile(PortraitKind.Avatar, model), PortraitKind.Avatar); Assert.Contains("", positive, StringComparison.Ordinal); Assert.Contains("", negative, StringComparison.Ordinal); Assert.DoesNotContain("