using System.Collections.Generic; using System.Linq; using Content.Shared.Lathe; using Content.Shared.Research.Prototypes; using Robust.Shared.GameObjects; using Robust.Shared.Prototypes; namespace Content.IntegrationTests.Tests; [TestFixture] public sealed class ResearchTest { [Test] public async Task DisciplineValidTierPrerequesitesTest() { await using var pair = await PoolManager.GetServerClient(); var server = pair.Server; var protoManager = server.ResolveDependency(); await server.WaitAssertion(() => { var allTechs = protoManager.EnumeratePrototypes().ToList(); Assert.Multiple(() => { foreach (var discipline in protoManager.EnumeratePrototypes()) { foreach (var tech in allTechs) { if (tech.Discipline != discipline.ID) continue; // we ignore these, anyways if (tech.Tier == 1) continue; Assert.That(tech.Tier, Is.GreaterThan(0), $"Technology {tech} has invalid tier {tech.Tier}."); Assert.That(discipline.TierPrerequisites.ContainsKey(tech.Tier), $"Discipline {discipline.ID} does not have a TierPrerequisites definition for tier {tech.Tier}"); } } }); }); await pair.CleanReturnAsync(); } [Test] public async Task AllTechPrintableTest() { await using var pair = await PoolManager.GetServerClient(); var server = pair.Server; var entMan = server.ResolveDependency(); var protoManager = server.ResolveDependency(); var compFact = server.ResolveDependency(); var latheSys = entMan.System(); await server.WaitAssertion(() => { var allEnts = protoManager.EnumeratePrototypes(); var latheTechs = new HashSet>(); foreach (var proto in allEnts) { if (proto.Abstract) continue; if (pair.IsTestPrototype(proto)) continue; if (!proto.TryGetComponent(out var lathe, compFact)) continue; latheSys.AddRecipesFromPacks(latheTechs, lathe.DynamicPacks); if (proto.TryGetComponent(out var emag, compFact)) latheSys.AddRecipesFromPacks(latheTechs, emag.EmagDynamicPacks); } Assert.Multiple(() => { // check that every recipe a tech adds can be made on some lathe var unlockedTechs = new HashSet>(); foreach (var tech in protoManager.EnumeratePrototypes()) { unlockedTechs.UnionWith(tech.RecipeUnlocks); foreach (var recipe in tech.RecipeUnlocks) { Assert.That(latheTechs, Does.Contain(recipe), $"Recipe '{recipe}' from tech '{tech.ID}' cannot be unlocked on any lathes."); } } // now check that every dynamic recipe a lathe lists can be unlocked foreach (var recipe in latheTechs) { Assert.That(unlockedTechs, Does.Contain(recipe), $"Recipe '{recipe}' is dynamic on a lathe but cannot be unlocked by research."); } }); }); await pair.CleanReturnAsync(); } }