AntagPreferenceTest.cs 3.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. #nullable enable
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using Content.Server.Antag;
  5. using Content.Server.Antag.Components;
  6. using Content.Server.GameTicking;
  7. using Content.Shared.GameTicking;
  8. using Robust.Shared.GameObjects;
  9. using Robust.Shared.Player;
  10. using Robust.Shared.Random;
  11. namespace Content.IntegrationTests.Tests.GameRules;
  12. // Once upon a time, players in the lobby weren't ever considered eligible for antag roles.
  13. // Lets not let that happen again.
  14. [TestFixture]
  15. public sealed class AntagPreferenceTest
  16. {
  17. [Test]
  18. public async Task TestLobbyPlayersValid()
  19. {
  20. await using var pair = await PoolManager.GetServerClient(new PoolSettings
  21. {
  22. DummyTicker = false,
  23. Connected = true,
  24. InLobby = true
  25. });
  26. var server = pair.Server;
  27. var client = pair.Client;
  28. var ticker = server.System<GameTicker>();
  29. var sys = server.System<AntagSelectionSystem>();
  30. // Initially in the lobby
  31. Assert.That(ticker.RunLevel, Is.EqualTo(GameRunLevel.PreRoundLobby));
  32. Assert.That(client.AttachedEntity, Is.Null);
  33. Assert.That(ticker.PlayerGameStatuses[client.User!.Value], Is.EqualTo(PlayerGameStatus.NotReadyToPlay));
  34. EntityUid uid = default;
  35. await server.WaitPost(() => uid = server.EntMan.Spawn("Traitor"));
  36. var rule = new Entity<AntagSelectionComponent>(uid, server.EntMan.GetComponent<AntagSelectionComponent>(uid));
  37. var def = rule.Comp.Definitions.Single();
  38. // IsSessionValid & IsEntityValid are preference agnostic and should always be true for players in the lobby.
  39. // Though maybe that will change in the future, but then GetPlayerPool() needs to be updated to reflect that.
  40. Assert.That(sys.IsSessionValid(rule, pair.Player, def), Is.True);
  41. Assert.That(sys.IsEntityValid(client.AttachedEntity, def), Is.True);
  42. // By default, traitor/antag preferences are disabled, so the pool should be empty.
  43. var sessions = new List<ICommonSession> { pair.Player! };
  44. var pool = sys.GetPlayerPool(rule, sessions, def);
  45. Assert.That(pool.Count, Is.EqualTo(0));
  46. // Opt into the traitor role.
  47. await pair.SetAntagPreference("Traitor", true);
  48. Assert.That(sys.IsSessionValid(rule, pair.Player, def), Is.True);
  49. Assert.That(sys.IsEntityValid(client.AttachedEntity, def), Is.True);
  50. pool = sys.GetPlayerPool(rule, sessions, def);
  51. Assert.That(pool.Count, Is.EqualTo(1));
  52. pool.TryPickAndTake(pair.Server.ResolveDependency<IRobustRandom>(), out var picked);
  53. Assert.That(picked, Is.EqualTo(pair.Player));
  54. Assert.That(sessions.Count, Is.EqualTo(1));
  55. // opt back out
  56. await pair.SetAntagPreference("Traitor", false);
  57. Assert.That(sys.IsSessionValid(rule, pair.Player, def), Is.True);
  58. Assert.That(sys.IsEntityValid(client.AttachedEntity, def), Is.True);
  59. pool = sys.GetPlayerPool(rule, sessions, def);
  60. Assert.That(pool.Count, Is.EqualTo(0));
  61. await server.WaitPost(() => server.EntMan.DeleteEntity(uid));
  62. await pair.CleanReturnAsync();
  63. }
  64. }