using Content.Server._DV.Mapping; using Robust.Shared.ContentPack; using Robust.Shared.EntitySerialization; using Robust.Shared.EntitySerialization.Systems; using Robust.Shared.GameObjects; using Robust.Shared.Log; using Robust.Shared.Map; using Robust.Shared.Prototypes; using Robust.Shared.Serialization.Markdown.Mapping; using Robust.Shared.Serialization.Markdown.Value; using Robust.Shared.Utility; using System.Linq; namespace Content.IntegrationTests.Tests._DV; /// /// Checks that every mapped entity with is allowed to be mapped. /// public sealed class MappingCategoryTest { private const string MapsPath = "/Maps"; // dev map doesn't matter and don't want to change it private const string TestMapsPath = "/Maps/Test/"; [Test] public async Task NonGameMapsLoadableTest() { await using var pair = await PoolManager.GetServerClient(); var server = pair.Server; var entMan = server.ResolveDependency(); var resMan = server.ResolveDependency(); var mapLoader = entMan.System(); var catSys = entMan.System(); // meow var mapSys = entMan.System(); var sawmill = server.ResolveDependency().GetSawmill("mapping_categories"); await server.WaitPost(() => { Assert.Multiple(() => { var mapFolder = new ResPath(MapsPath); foreach (var map in resMan.ContentFindFiles(mapFolder)) { if (map.Extension != "yml" || map.Filename.StartsWith(".", StringComparison.Ordinal)) continue; var rootedPath = map.ToRootedPath().ToString(); if (rootedPath.StartsWith(TestMapsPath, StringComparison.Ordinal)) continue; if (GetCategory(map, mapLoader) is not {} category) { sawmill.Warning($"Map {map} is missing a category, skipping it."); continue; } var mapUid = mapSys.CreateMap(out var mapId); var opts = new MapLoadOptions { MergeMap = category == FileCategory.Map ? null // don't try to reparent maps : mapId // needed or else grids will be de-orphaned which is bad }; Assert.That(mapLoader.TryLoadGeneric(map, out var maps, out _, opts), $"Failed to load map {rootedPath}"); maps.Add(mapUid); var allowed = catSys.GetAllowedCategories(rootedPath); var query = entMan.EntityQueryEnumerator(); while (query.MoveNext(out var uid, out var comp)) { var ent = (uid, comp); Assert.That(catSys.CanMap(ent, allowed), $"Entity {entMan.ToPrettyString(uid)} cannot be mapped on {rootedPath}"); } foreach (var uid in maps) { entMan.DeleteEntity(uid); } } }); }); await server.WaitRunTicks(1); await pair.CleanReturnAsync(); } // me when engine doesnt have this private FileCategory? GetCategory(ResPath path, MapLoaderSystem mapLoader) { Assert.That(mapLoader.TryReadFile(path, out var data), $"Failed to read map file {path}"); var meta = data.Get("meta"); if (!meta.TryGet("category", out var node)) return null; var valid = Enum.TryParse(node.Value, out var cat); Assert.That(valid, $"Category for {path} is invalid"); return cat; } }