Record phase 62 portrait-prompt-craft as reviewed.
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -1,6 +1,7 @@
|
||||
using System.Net;
|
||||
using System.Net.Http.Json;
|
||||
using System.Text.Json;
|
||||
using System.Text.RegularExpressions;
|
||||
|
||||
namespace HSchool.AppHost.Tests;
|
||||
|
||||
@@ -86,7 +87,7 @@ public class PortraitApiTests(AppHostFixture fixture)
|
||||
Assert.NotNull(payload);
|
||||
Assert.Equal("avatar", payload!.Kind);
|
||||
Assert.Contains("years old", payload.Positive, StringComparison.OrdinalIgnoreCase);
|
||||
Assert.DoesNotContain("age ", payload.Positive, StringComparison.OrdinalIgnoreCase);
|
||||
Assert.False(Regex.IsMatch(payload.Positive, @"\bage \d+"));
|
||||
Assert.False(string.IsNullOrWhiteSpace(payload.Negative));
|
||||
Assert.False(string.IsNullOrWhiteSpace(payload.PresetId));
|
||||
}
|
||||
|
||||
@@ -15,7 +15,7 @@ public class PortraitPromptBuilderTests
|
||||
var (positive, _) = PortraitPromptBuilder.Build(card, profile, PortraitKind.Avatar);
|
||||
|
||||
Assert.Contains("12 years old", positive, StringComparison.Ordinal);
|
||||
Assert.Contains("black hair", positive, StringComparison.OrdinalIgnoreCase);
|
||||
Assert.Contains("with black hair", positive, StringComparison.OrdinalIgnoreCase);
|
||||
Assert.Contains("wearing a white shirt", positive, StringComparison.OrdinalIgnoreCase);
|
||||
Assert.Contains("Head and shoulders.", positive, StringComparison.Ordinal);
|
||||
Assert.DoesNotContain("age 12", positive, StringComparison.OrdinalIgnoreCase);
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
using System.Text.Json;
|
||||
using HSchool.Server.Game;
|
||||
|
||||
namespace HSchool.Server.Tests;
|
||||
@@ -222,5 +223,119 @@ public class SwarmUiSettingsStoreTests
|
||||
Assert.Equal(1, muse.CfgScale);
|
||||
Assert.Equal("euler", muse.Sampler);
|
||||
Assert.Equal("simple", muse.Scheduler);
|
||||
|
||||
var adult = Assert.Single(config.Presets, preset => preset.Id == "default");
|
||||
Assert.Equal(SwarmUiModelDefinition.RealismV25Id, adult.Model);
|
||||
Assert.DoesNotContain(":1.4)", adult.Negative, StringComparison.Ordinal);
|
||||
Assert.Contains("photograph", adult.Style, StringComparison.OrdinalIgnoreCase);
|
||||
|
||||
var child = Assert.Single(config.Presets, preset => preset.Id == "child");
|
||||
Assert.Equal(SwarmUiModelDefinition.DreamShaperId, child.Model);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void SwarmUiJson_MatchesCatalogAndDefaultPresets()
|
||||
{
|
||||
var path = Path.Combine(RepoRoot(), "src", "HSchool.Server", "swarmui.json");
|
||||
Assert.True(File.Exists(path), path);
|
||||
var loaded = JsonSerializer.Deserialize<SwarmUiConfigFile>(File.ReadAllText(path), JsonOptions);
|
||||
if (loaded is null)
|
||||
{
|
||||
Assert.Fail("swarmui.json did not deserialize.");
|
||||
return;
|
||||
}
|
||||
|
||||
loaded.NormalizeAfterLoad();
|
||||
|
||||
var expected = SwarmUiConfigFile.CreateDefault();
|
||||
Assert.Equal(expected.Models.Select(model => model.Id), loaded.Models.Select(model => model.Id));
|
||||
Assert.DoesNotContain(loaded.Models, model => model.Id.Contains("v20Turbo", StringComparison.OrdinalIgnoreCase));
|
||||
|
||||
for (var i = 0; i < expected.Models.Count; i++)
|
||||
{
|
||||
Assert.Equal(expected.Models[i].Label, loaded.Models[i].Label);
|
||||
Assert.Equal(expected.Models[i].Steps, loaded.Models[i].Steps);
|
||||
Assert.Equal(expected.Models[i].CfgScale, loaded.Models[i].CfgScale);
|
||||
Assert.Equal(expected.Models[i].Sampler, loaded.Models[i].Sampler);
|
||||
Assert.Equal(expected.Models[i].Scheduler, loaded.Models[i].Scheduler);
|
||||
Assert.Equal(expected.Models[i].Seed, loaded.Models[i].Seed);
|
||||
}
|
||||
|
||||
Assert.Equal(expected.Presets.Select(preset => preset.Id), loaded.Presets.Select(preset => preset.Id));
|
||||
Assert.Equal(expected.Presets[0].Model, loaded.Presets[0].Model);
|
||||
Assert.Equal(expected.Presets[0].Style, loaded.Presets[0].Style);
|
||||
Assert.Equal(expected.Presets[0].Negative, loaded.Presets[0].Negative);
|
||||
Assert.Equal(expected.Presets[0].Avatar?.ShotType, loaded.Presets[0].Avatar?.ShotType);
|
||||
Assert.Equal(expected.Presets[1].Model, loaded.Presets[1].Model);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Clone_DoesNotInjectKreaModelsIntoAnExistingSchoolCopy()
|
||||
{
|
||||
var living = new SwarmUiConfigFile
|
||||
{
|
||||
ActivePresetId = "default",
|
||||
Models =
|
||||
[
|
||||
new SwarmUiModelDefinition
|
||||
{
|
||||
Id = SwarmUiModelDefinition.BabesId,
|
||||
Steps = 7,
|
||||
CfgScale = 1.5,
|
||||
Sampler = "euler",
|
||||
Scheduler = "normal",
|
||||
},
|
||||
new SwarmUiModelDefinition
|
||||
{
|
||||
Id = SwarmUiModelDefinition.DreamShaperId,
|
||||
Steps = 4,
|
||||
CfgScale = 2,
|
||||
Sampler = "dpmpp_sde",
|
||||
Scheduler = "karras",
|
||||
},
|
||||
],
|
||||
Presets =
|
||||
[
|
||||
new SwarmUiPresetDefinition
|
||||
{
|
||||
Id = "default",
|
||||
Label = "Default",
|
||||
Model = SwarmUiModelDefinition.BabesId,
|
||||
Avatar = new SwarmUiKindPreset { Width = 1024, Height = 1024 },
|
||||
Custom = new SwarmUiKindPreset { Width = 896, Height = 1152 },
|
||||
FullBody = new SwarmUiKindPreset { Width = 896, Height = 1152 },
|
||||
},
|
||||
],
|
||||
};
|
||||
|
||||
var copy = SwarmUiConfigFile.Clone(living);
|
||||
|
||||
Assert.Equal(2, copy.Models.Count);
|
||||
Assert.DoesNotContain(copy.Models, model => model.Id == SwarmUiModelDefinition.MuseId);
|
||||
Assert.DoesNotContain(copy.Models, model => model.Id == SwarmUiModelDefinition.RealismV25Id);
|
||||
Assert.Equal(SwarmUiModelDefinition.BabesId, copy.Presets[0].Model);
|
||||
Assert.Equal("default", copy.ActivePresetId);
|
||||
}
|
||||
|
||||
private static string RepoRoot()
|
||||
{
|
||||
var dir = new DirectoryInfo(AppContext.BaseDirectory);
|
||||
while (dir is not null && !File.Exists(Path.Combine(dir.FullName, "h-school.sln")))
|
||||
{
|
||||
dir = dir.Parent;
|
||||
}
|
||||
|
||||
if (dir is null)
|
||||
{
|
||||
throw new InvalidOperationException("Could not find h-school.sln from the test output directory.");
|
||||
}
|
||||
|
||||
return dir.FullName;
|
||||
}
|
||||
|
||||
private static readonly JsonSerializerOptions JsonOptions = new()
|
||||
{
|
||||
PropertyNamingPolicy = JsonNamingPolicy.CamelCase,
|
||||
PropertyNameCaseInsensitive = true,
|
||||
};
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user