AccessReaderTest.cs 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. using System.Collections.Generic;
  2. using System.Linq;
  3. using Content.Shared.Access;
  4. using Content.Shared.Access.Components;
  5. using Content.Shared.Access.Systems;
  6. using Robust.Shared.GameObjects;
  7. using Robust.Shared.Prototypes;
  8. namespace Content.IntegrationTests.Tests.Access
  9. {
  10. [TestFixture]
  11. [TestOf(typeof(AccessReaderComponent))]
  12. public sealed class AccessReaderTest
  13. {
  14. [Test]
  15. public async Task TestProtoTags()
  16. {
  17. await using var pair = await PoolManager.GetServerClient();
  18. var server = pair.Server;
  19. var protoManager = server.ResolveDependency<IPrototypeManager>();
  20. var accessName = server.ResolveDependency<IComponentFactory>().GetComponentName(typeof(AccessReaderComponent));
  21. await server.WaitAssertion(() =>
  22. {
  23. foreach (var ent in protoManager.EnumeratePrototypes<EntityPrototype>())
  24. {
  25. if (!ent.Components.TryGetComponent(accessName, out var access))
  26. continue;
  27. var reader = (AccessReaderComponent) access;
  28. var allTags = reader.AccessLists.SelectMany(c => c).Union(reader.DenyTags);
  29. foreach (var level in allTags)
  30. {
  31. Assert.That(protoManager.HasIndex<AccessLevelPrototype>(level), $"Invalid access level: {level} found on {ent}");
  32. }
  33. }
  34. });
  35. await pair.CleanReturnAsync();
  36. }
  37. [Test]
  38. public async Task TestTags()
  39. {
  40. await using var pair = await PoolManager.GetServerClient();
  41. var server = pair.Server;
  42. var entityManager = server.ResolveDependency<IEntityManager>();
  43. await server.WaitAssertion(() =>
  44. {
  45. var system = entityManager.System<AccessReaderSystem>();
  46. // test empty
  47. var reader = new AccessReaderComponent();
  48. Assert.Multiple(() =>
  49. {
  50. Assert.That(system.AreAccessTagsAllowed(new List<ProtoId<AccessLevelPrototype>> { "Foo" }, reader), Is.True);
  51. Assert.That(system.AreAccessTagsAllowed(new List<ProtoId<AccessLevelPrototype>> { "Bar" }, reader), Is.True);
  52. Assert.That(system.AreAccessTagsAllowed(Array.Empty<ProtoId<AccessLevelPrototype>>(), reader), Is.True);
  53. });
  54. // test deny
  55. reader = new AccessReaderComponent();
  56. reader.DenyTags.Add("A");
  57. Assert.Multiple(() =>
  58. {
  59. Assert.That(system.AreAccessTagsAllowed(new List<ProtoId<AccessLevelPrototype>> { "Foo" }, reader), Is.True);
  60. Assert.That(system.AreAccessTagsAllowed(new List<ProtoId<AccessLevelPrototype>> { "A" }, reader), Is.False);
  61. Assert.That(system.AreAccessTagsAllowed(new List<ProtoId<AccessLevelPrototype>> { "A", "Foo" }, reader), Is.False);
  62. Assert.That(system.AreAccessTagsAllowed(Array.Empty<ProtoId<AccessLevelPrototype>>(), reader), Is.True);
  63. });
  64. // test one list
  65. reader = new AccessReaderComponent();
  66. reader.AccessLists.Add(new HashSet<ProtoId<AccessLevelPrototype>> { "A" });
  67. Assert.Multiple(() =>
  68. {
  69. Assert.That(system.AreAccessTagsAllowed(new List<ProtoId<AccessLevelPrototype>> { "A" }, reader), Is.True);
  70. Assert.That(system.AreAccessTagsAllowed(new List<ProtoId<AccessLevelPrototype>> { "B" }, reader), Is.False);
  71. Assert.That(system.AreAccessTagsAllowed(new List<ProtoId<AccessLevelPrototype>> { "A", "B" }, reader), Is.True);
  72. Assert.That(system.AreAccessTagsAllowed(Array.Empty<ProtoId<AccessLevelPrototype>>(), reader), Is.False);
  73. });
  74. // test one list - two items
  75. reader = new AccessReaderComponent();
  76. reader.AccessLists.Add(new HashSet<ProtoId<AccessLevelPrototype>> { "A", "B" });
  77. Assert.Multiple(() =>
  78. {
  79. Assert.That(system.AreAccessTagsAllowed(new List<ProtoId<AccessLevelPrototype>> { "A" }, reader), Is.False);
  80. Assert.That(system.AreAccessTagsAllowed(new List<ProtoId<AccessLevelPrototype>> { "B" }, reader), Is.False);
  81. Assert.That(system.AreAccessTagsAllowed(new List<ProtoId<AccessLevelPrototype>> { "A", "B" }, reader), Is.True);
  82. Assert.That(system.AreAccessTagsAllowed(Array.Empty<ProtoId<AccessLevelPrototype>>(), reader), Is.False);
  83. });
  84. // test two list
  85. reader = new AccessReaderComponent();
  86. reader.AccessLists.Add(new HashSet<ProtoId<AccessLevelPrototype>> { "A" });
  87. reader.AccessLists.Add(new HashSet<ProtoId<AccessLevelPrototype>> { "B", "C" });
  88. Assert.Multiple(() =>
  89. {
  90. Assert.That(system.AreAccessTagsAllowed(new List<ProtoId<AccessLevelPrototype>> { "A" }, reader), Is.True);
  91. Assert.That(system.AreAccessTagsAllowed(new List<ProtoId<AccessLevelPrototype>> { "B" }, reader), Is.False);
  92. Assert.That(system.AreAccessTagsAllowed(new List<ProtoId<AccessLevelPrototype>> { "A", "B" }, reader), Is.True);
  93. Assert.That(system.AreAccessTagsAllowed(new List<ProtoId<AccessLevelPrototype>> { "C", "B" }, reader), Is.True);
  94. Assert.That(system.AreAccessTagsAllowed(new List<ProtoId<AccessLevelPrototype>> { "C", "B", "A" }, reader), Is.True);
  95. Assert.That(system.AreAccessTagsAllowed(Array.Empty<ProtoId<AccessLevelPrototype>>(), reader), Is.False);
  96. });
  97. // test deny list
  98. reader = new AccessReaderComponent();
  99. reader.AccessLists.Add(new HashSet<ProtoId<AccessLevelPrototype>> { "A" });
  100. reader.DenyTags.Add("B");
  101. Assert.Multiple(() =>
  102. {
  103. Assert.That(system.AreAccessTagsAllowed(new List<ProtoId<AccessLevelPrototype>> { "A" }, reader), Is.True);
  104. Assert.That(system.AreAccessTagsAllowed(new List<ProtoId<AccessLevelPrototype>> { "B" }, reader), Is.False);
  105. Assert.That(system.AreAccessTagsAllowed(new List<ProtoId<AccessLevelPrototype>> { "A", "B" }, reader), Is.False);
  106. Assert.That(system.AreAccessTagsAllowed(Array.Empty<ProtoId<AccessLevelPrototype>>(), reader), Is.False);
  107. });
  108. });
  109. await pair.CleanReturnAsync();
  110. }
  111. }
  112. }