CraftingTests.cs 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. using System.Linq;
  2. using Content.IntegrationTests.Tests.Interaction;
  3. using Content.Shared.DoAfter;
  4. using Content.Shared.Stacks;
  5. using Robust.Shared.Containers;
  6. namespace Content.IntegrationTests.Tests.Construction.Interaction;
  7. public sealed class CraftingTests : InteractionTest
  8. {
  9. public const string ShardGlass = "ShardGlass";
  10. public const string Spear = "Spear";
  11. /// <summary>
  12. /// Craft a simple instant recipe
  13. /// </summary>
  14. [Test]
  15. public async Task CraftRods()
  16. {
  17. await PlaceInHands(Steel);
  18. await CraftItem(Rod);
  19. await FindEntity((Rod, 2));
  20. }
  21. /// <summary>
  22. /// Craft a simple recipe with a DoAfter
  23. /// </summary>
  24. [Test]
  25. public async Task CraftGrenade()
  26. {
  27. await PlaceInHands(Steel, 5);
  28. await CraftItem("ModularGrenadeRecipe");
  29. await FindEntity("ModularGrenade");
  30. }
  31. /// <summary>
  32. /// Craft a complex recipe (more than one ingredient).
  33. /// </summary>
  34. [Test]
  35. public async Task CraftSpear()
  36. {
  37. // Spawn a full tack of rods in the user's hands.
  38. await PlaceInHands(Rod, 10);
  39. await SpawnEntity((Cable, 10), SEntMan.GetCoordinates(PlayerCoords));
  40. // Attempt (and fail) to craft without glass.
  41. await CraftItem(Spear, shouldSucceed: false);
  42. await FindEntity(Spear, shouldSucceed: false);
  43. // Spawn three shards of glass and finish crafting (only one is needed).
  44. await SpawnTarget(ShardGlass);
  45. await SpawnTarget(ShardGlass);
  46. await SpawnTarget(ShardGlass);
  47. await CraftItem(Spear);
  48. await FindEntity(Spear);
  49. // Reset target because entitylookup will dump this.
  50. Target = null;
  51. // Player's hands should be full of the remaining rods, except those dropped during the failed crafting attempt.
  52. // Spear and left over stacks should be on the floor.
  53. await AssertEntityLookup((Rod, 2), (Cable, 7), (ShardGlass, 2), (Spear, 1));
  54. }
  55. /// <summary>
  56. /// Cancel crafting a complex recipe.
  57. /// </summary>
  58. [Test]
  59. public async Task CancelCraft()
  60. {
  61. var serverTargetCoords = SEntMan.GetCoordinates(TargetCoords);
  62. var rods = await SpawnEntity((Rod, 10), serverTargetCoords);
  63. var wires = await SpawnEntity((Cable, 10), serverTargetCoords);
  64. var shard = await SpawnEntity(ShardGlass, serverTargetCoords);
  65. var rodStack = SEntMan.GetComponent<StackComponent>(rods);
  66. var wireStack = SEntMan.GetComponent<StackComponent>(wires);
  67. await RunTicks(5);
  68. var sys = SEntMan.System<SharedContainerSystem>();
  69. Assert.Multiple(() =>
  70. {
  71. Assert.That(sys.IsEntityInContainer(rods), Is.False);
  72. Assert.That(sys.IsEntityInContainer(wires), Is.False);
  73. Assert.That(sys.IsEntityInContainer(shard), Is.False);
  74. });
  75. #pragma warning disable CS4014 // Legacy construction code uses DoAfterAwait. If we await it we will be waiting forever.
  76. await Server.WaitPost(() => SConstruction.TryStartItemConstruction(Spear, SEntMan.GetEntity(Player)));
  77. #pragma warning restore CS4014
  78. await RunTicks(1);
  79. // DoAfter is in progress. Entity not spawned, stacks have been split and someingredients are in a container.
  80. Assert.That(ActiveDoAfters.Count(), Is.EqualTo(1));
  81. Assert.That(sys.IsEntityInContainer(shard), Is.True);
  82. Assert.That(sys.IsEntityInContainer(rods), Is.False);
  83. Assert.That(sys.IsEntityInContainer(wires), Is.False);
  84. Assert.That(rodStack, Has.Count.EqualTo(8));
  85. Assert.That(wireStack, Has.Count.EqualTo(7));
  86. await FindEntity(Spear, shouldSucceed: false);
  87. // Cancel the DoAfter. Should drop ingredients to the floor.
  88. await CancelDoAfters();
  89. Assert.That(sys.IsEntityInContainer(rods), Is.False);
  90. Assert.That(sys.IsEntityInContainer(wires), Is.False);
  91. Assert.That(sys.IsEntityInContainer(shard), Is.False);
  92. await FindEntity(Spear, shouldSucceed: false);
  93. await AssertEntityLookup((Rod, 10), (Cable, 10), (ShardGlass, 1));
  94. // Re-attempt the do-after
  95. #pragma warning disable CS4014 // Legacy construction code uses DoAfterAwait. See above.
  96. await Server.WaitPost(() => SConstruction.TryStartItemConstruction(Spear, SEntMan.GetEntity(Player)));
  97. #pragma warning restore CS4014
  98. await RunTicks(1);
  99. // DoAfter is in progress. Entity not spawned, ingredients are in a container.
  100. Assert.That(ActiveDoAfters.Count(), Is.EqualTo(1));
  101. Assert.That(sys.IsEntityInContainer(shard), Is.True);
  102. await FindEntity(Spear, shouldSucceed: false);
  103. // Finish the DoAfter
  104. await AwaitDoAfters();
  105. // Spear has been crafted. Rods and wires are no longer contained. Glass has been consumed.
  106. await FindEntity(Spear);
  107. Assert.That(sys.IsEntityInContainer(rods), Is.False);
  108. Assert.That(sys.IsEntityInContainer(wires), Is.False);
  109. Assert.That(SEntMan.Deleted(shard));
  110. }
  111. }