Create picks a country; climate is rolled from the school seed and stored. Old Slavic saves lift as Russia. Co-authored-by: Cursor <cursoragent@cursor.com>
98 lines
3.9 KiB
C#
98 lines
3.9 KiB
C#
namespace HSchool.Content.Tests;
|
|
|
|
/// <summary>
|
|
/// The shipped <c>mods/example</c> folder, copied next to vanilla core. Last-wins, patches and a
|
|
/// placeable room have to work from disk — in-memory documents already have their own tests.
|
|
/// </summary>
|
|
public class ExamplePackTests
|
|
{
|
|
private const string ExamplePackId = "example";
|
|
|
|
private readonly CatalogLoader _loader = new();
|
|
|
|
[Fact]
|
|
public void DuplicateChair_LastWinsAndWarns()
|
|
{
|
|
var log = new RecordingLog();
|
|
var catalog = LoadCoreAndExample(log);
|
|
|
|
Assert.Equal(["Sit", "Chat"], catalog.Things["Chair"].Actions);
|
|
Assert.Contains(
|
|
log.Warnings,
|
|
warning => warning.Contains("Chair", StringComparison.Ordinal)
|
|
&& warning.Contains(ExamplePackId, StringComparison.Ordinal));
|
|
}
|
|
|
|
[Fact]
|
|
public void PatchAddsASlot_OnlyWhenThePackIsLoaded()
|
|
{
|
|
var vanilla = LoadCore();
|
|
Assert.DoesNotContain(vanilla.Rooms["PrincipalsOffice"].Slots, slot => slot.Key == "exampleLocker");
|
|
|
|
var withPack = LoadCoreAndExample();
|
|
Assert.Contains(withPack.Rooms["PrincipalsOffice"].Slots, slot => slot.Key == "exampleLocker" && slot.Thing == "Locker");
|
|
}
|
|
|
|
[Fact]
|
|
public void PackTypes_LoadWithLocalizedLabels()
|
|
{
|
|
var catalog = LoadCoreAndExample();
|
|
|
|
Assert.True(catalog.Traits.ContainsKey("ExampleEarlyRiser"));
|
|
Assert.True(catalog.Traits.ContainsKey("ExampleNightOwl"));
|
|
Assert.True(catalog.Countries.ContainsKey("ExampleNames"));
|
|
Assert.True(catalog.Rooms.ContainsKey("ExampleStore"));
|
|
Assert.Equal("Кладовая", catalog.Label("ru", catalog.Rooms["ExampleStore"]));
|
|
Assert.Equal("Storeroom", catalog.Label("en", catalog.Rooms["ExampleStore"]));
|
|
Assert.Equal("Примерные имена", catalog.Label("ru", catalog.Countries["ExampleNames"]));
|
|
Assert.Equal(["RussianLanguage"], catalog.Countries["ExampleNames"].Names.Spoken.ToArray());
|
|
Assert.True(catalog.Rooms.ContainsKey("PrincipalsOffice"));
|
|
Assert.Equal("Кабинет директора", catalog.Label("ru", catalog.Rooms["PrincipalsOffice"]));
|
|
}
|
|
|
|
[Fact]
|
|
public void MapUsingThePackRoom_PassesValidation()
|
|
{
|
|
var catalog = LoadCoreAndExample();
|
|
var map = new MapLayout
|
|
{
|
|
Territory = new TerritoryNode { Id = "yard", Def = "SchoolYard" },
|
|
Buildings = [new BuildingNode { Id = "main", Def = "MainBuilding" }],
|
|
Floors = [new FloorNode { Id = "floor-1", Def = "StandardFloor", Building = "main" }],
|
|
Rooms =
|
|
[
|
|
new RoomNode { Id = "store", Def = "ExampleStore", Building = "main", Floor = "floor-1" },
|
|
],
|
|
Links = [new MapLink { A = "yard", B = "store" }],
|
|
};
|
|
|
|
MapValidator.Validate(map, catalog);
|
|
var defaults = CatalogLoader.LastDefaultMap([CatalogLoader.CorePackId, ExamplePackId], Documents());
|
|
Assert.NotNull(defaults);
|
|
Assert.Equal("SchoolYard", defaults.Territory?.Def);
|
|
}
|
|
|
|
private DefCatalog LoadCore() =>
|
|
_loader.Load(
|
|
[CatalogLoader.CorePackId],
|
|
PackDocuments.FromDirectory(CatalogLoader.CorePackId, CoreRoot()));
|
|
|
|
private DefCatalog LoadCoreAndExample(IContentLog? log = null) =>
|
|
_loader.Load([CatalogLoader.CorePackId, ExamplePackId], Documents(), log);
|
|
|
|
private static IReadOnlyList<ContentDocument> Documents()
|
|
{
|
|
var example = ExampleRoot();
|
|
Assert.True(Directory.Exists(example), $"Example pack was not copied to {example}.");
|
|
return
|
|
[
|
|
.. PackDocuments.FromDirectory(CatalogLoader.CorePackId, CoreRoot()),
|
|
.. PackDocuments.FromDirectory(ExamplePackId, example),
|
|
];
|
|
}
|
|
|
|
private static string CoreRoot() => Path.Combine(AppContext.BaseDirectory, "vanilla");
|
|
|
|
private static string ExampleRoot() => Path.Combine(AppContext.BaseDirectory, "example");
|
|
}
|