using System.Linq; using System.Numerics; using Content.Server.Cargo.Components; using Content.Server.Cargo.Systems; using Content.Shared.Cargo.Prototypes; using Content.Shared.Stacks; using Robust.Shared.GameObjects; using Robust.Shared.Map; using Robust.Shared.Maths; using Robust.Shared.Prototypes; namespace Content.IntegrationTests.Tests; [TestFixture] public sealed class CargoTest { [Test] public async Task NoCargoOrderArbitrage() { await using var pairTracker = await PoolManager.GetServerClient(new PoolSettings() { NoClient = true }); var server = pairTracker.Pair.Server; var testMap = await PoolManager.CreateTestMap(pairTracker); var entManager = server.ResolveDependency(); var mapManager = server.ResolveDependency(); var protoManager = server.ResolveDependency(); var pricing = server.ResolveDependency().GetEntitySystem(); await server.WaitAssertion(() => { var mapId = testMap.MapId; Assert.Multiple(() => { foreach (var proto in protoManager.EnumeratePrototypes()) { var ent = entManager.SpawnEntity(proto.Product, new MapCoordinates(Vector2.Zero, mapId)); var price = pricing.GetPrice(ent); Assert.That(price, Is.AtMost(proto.PointCost), $"Found arbitrage on {proto.ID} cargo product! Cost is {proto.PointCost} but sell is {price}!"); entManager.DeleteEntity(ent); } }); mapManager.DeleteMap(mapId); }); await pairTracker.CleanReturnAsync(); } [Test] public async Task NoCargoBountyArbitageTest() { await using var pairTracker = await PoolManager.GetServerClient(new PoolSettings() { NoClient = true }); var server = pairTracker.Pair.Server; var testMap = await PoolManager.CreateTestMap(pairTracker); var entManager = server.ResolveDependency(); var mapManager = server.ResolveDependency(); var protoManager = server.ResolveDependency(); var cargo = entManager.System(); var bounties = protoManager.EnumeratePrototypes().ToList(); await server.WaitAssertion(() => { var mapId = testMap.MapId; Assert.Multiple(() => { foreach (var proto in protoManager.EnumeratePrototypes()) { var ent = entManager.SpawnEntity(proto.Product, new MapCoordinates(Vector2.Zero, mapId)); foreach (var bounty in bounties) { if (cargo.IsBountyComplete(ent, bounty)) Assert.That(proto.PointCost, Is.GreaterThan(bounty.Reward), $"Found arbitrage on {bounty.ID} cargo bounty! Product {proto.ID} costs {proto.PointCost} but fulfills bounty {bounty.ID} with reward {bounty.Reward}!"); } entManager.DeleteEntity(ent); } }); mapManager.DeleteMap(mapId); }); await pairTracker.CleanReturnAsync(); } [Test] public async Task NoStaticPriceAndStackPrice() { await using var pairTracker = await PoolManager.GetServerClient(new PoolSettings { NoClient = true }); var server = pairTracker.Pair.Server; var testMap = await PoolManager.CreateTestMap(pairTracker); var entManager = server.ResolveDependency(); var mapManager = server.ResolveDependency(); var protoManager = server.ResolveDependency(); await server.WaitAssertion(() => { var mapId = testMap.MapId; var grid = mapManager.CreateGrid(mapId); var coord = new EntityCoordinates(grid.Owner, 0, 0); var protoIds = protoManager.EnumeratePrototypes() .Where(p => !p.Abstract) .Where(p => !p.Components.ContainsKey("MapGrid")) // Grids are not for sale. .Select(p => p.ID) .ToList(); foreach (var proto in protoIds) { var ent = entManager.SpawnEntity(proto, coord); if (entManager.TryGetComponent(ent, out var stackpricecomp) && stackpricecomp.Price > 0) { if (entManager.TryGetComponent(ent, out var staticpricecomp)) { Assert.That(staticpricecomp.Price, Is.EqualTo(0), $"The prototype {proto} has a StackPriceComponent and StaticPriceComponent whose values are not compatible with each other."); } } if (entManager.HasComponent(ent)) { if (entManager.TryGetComponent(ent, out var staticpricecomp)) { Assert.That(staticpricecomp.Price, Is.EqualTo(0), $"The prototype {proto} has a StackComponent and StaticPriceComponent whose values are not compatible with each other."); } } entManager.DeleteEntity(ent); } mapManager.DeleteMap(mapId); }); await pairTracker.CleanReturnAsync(); } [Test] public async Task StackPrice() { const string stackProto = @" - type: entity id: A - type: stack id: StackProto spawn: A - type: entity id: StackEnt components: - type: StackPrice price: 20 - type: Stack stackType: StackProto count: 5 "; await using var pairTracker = await PoolManager.GetServerClient(new PoolSettings { NoClient = true, ExtraPrototypes = stackProto }); var server = pairTracker.Pair.Server; var entManager = server.ResolveDependency(); var priceSystem = entManager.System(); var ent = entManager.SpawnEntity("StackEnt", MapCoordinates.Nullspace); var price = priceSystem.GetPrice(ent); Assert.That(price, Is.EqualTo(100.0)); await pairTracker.CleanReturnAsync(); } }