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 protoManager = server.ResolveDependency(); var compFact = server.ResolveDependency(); await server.WaitAssertion(() => { var allEnts = protoManager.EnumeratePrototypes(); var allLathes = new HashSet(); foreach (var proto in allEnts) { if (proto.Abstract) continue; if (pair.IsTestPrototype(proto)) continue; if (!proto.TryGetComponent(out var lathe, compFact)) continue; allLathes.Add(lathe); } var latheTechs = new HashSet(); foreach (var lathe in allLathes) { if (lathe.DynamicRecipes == null) continue; foreach (var recipe in lathe.DynamicRecipes) { latheTechs.Add(recipe); } } Assert.Multiple(() => { foreach (var tech in protoManager.EnumeratePrototypes()) { foreach (var recipe in tech.RecipeUnlocks) { Assert.That(latheTechs, Does.Contain(recipe), $"Recipe \"{recipe}\" cannot be unlocked on any lathes."); } } }); }); await pair.CleanReturnAsync(); } [Test] public async Task AllLatheRecipesValidTest() { await using var pair = await PoolManager.GetServerClient(); var server = pair.Server; var proto = server.ResolveDependency(); Assert.Multiple(() => { foreach (var recipe in proto.EnumeratePrototypes()) { if (recipe.Result == null) Assert.That(recipe.ResultReagents, Is.Not.Null, $"Recipe '{recipe.ID}' has no result or result reagents."); } }); await pair.CleanReturnAsync(); } }