Implement phase 35 dress appropriateness and school rules.

Adds outfit evaluation, morning home dressing, locker-room ChangeClothes with day-log events, PE/weather AI goals, dress-rules API, and tests.
This commit is contained in:
Leonid Pershin
2026-08-20 05:16:52 +03:00
parent 5b63c72806
commit 6a0d5a9886
32 changed files with 1894 additions and 25 deletions
@@ -0,0 +1,55 @@
using HSchool.Content;
namespace HSchool.Content.Tests;
public class AppropriatenessTests
{
[Fact]
public void NoBright_RejectsBrightTag()
{
var catalog = LoadCatalog();
var rules = new DressRulePair(FormPolicies.Regular, ColorPolicies.NoBright);
Assert.False(Appropriateness.ColorAllowed(catalog, rules, catalog.Things["TShirt"], "Red"));
Assert.True(Appropriateness.ColorAllowed(catalog, rules, catalog.Things["TShirt"], "Blue"));
}
[Fact]
public void ShortForm_YoungPupil_UsesRegularEffectiveForm()
{
var catalog = LoadCatalog();
var rules = new DressRulePair(FormPolicies.Short, ColorPolicies.Free);
var context = new ApparelContext(
Female: true,
Age: 7,
IsStudent: true,
rules,
ApparelMode.Everyday,
OutdoorTemperatureC: 15f,
catalog.BehaviorRules);
Assert.Equal(FormPolicies.Regular, Appropriateness.EffectiveForm(context));
Assert.False(Appropriateness.SkirtLengthFits(context, catalog.Things["ShortSkirt"]));
}
[Fact]
public void ShortForm_OlderPupil_AllowsShortSkirt()
{
var catalog = LoadCatalog();
var rules = new DressRulePair(FormPolicies.Short, ColorPolicies.Free);
var context = new ApparelContext(
Female: true,
Age: 15,
IsStudent: true,
rules,
ApparelMode.Everyday,
OutdoorTemperatureC: 15f,
catalog.BehaviorRules);
Assert.True(Appropriateness.SkirtLengthFits(context, catalog.Things["ShortSkirt"]));
}
private static DefCatalog LoadCatalog()
{
var root = Path.Combine(AppContext.BaseDirectory, "vanilla");
var documents = PackDocuments.FromDirectory(CatalogLoader.CorePackId, root);
return new CatalogLoader().Load([CatalogLoader.CorePackId], documents);
}
}