Skip to content

Commit 437a65f

Browse files
authored
Fix TryGetEntitySystem and GetEntitySystemOrNull throwing with uninitialized EntitySystemManager (space-wizards#6512)
1 parent 1666a3a commit 437a65f

2 files changed

Lines changed: 35 additions & 2 deletions

File tree

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
using NUnit.Framework;
2+
using Robust.Shared.GameObjects;
3+
4+
namespace Robust.Shared.IntegrationTests.GameObjects;
5+
6+
[TestFixture]
7+
public sealed class EntitySystemManagerUninitializedTests
8+
{
9+
private class DummySystem : EntitySystem;
10+
11+
[Test]
12+
public void TryDoesNotThrow()
13+
{
14+
var systems = new EntitySystemManager();
15+
16+
// These should not throw even with an uninitalized entity system manager
17+
Assert.DoesNotThrow(() => systems.TryGetEntitySystem(out DummySystem? _));
18+
Assert.DoesNotThrow(() => systems.TryGetEntitySystem(typeof(DummySystem), out _));
19+
Assert.DoesNotThrow(() => systems.GetEntitySystemOrNull<DummySystem>());
20+
21+
Assert.That(systems.TryGetEntitySystem(out DummySystem? _), Is.False);
22+
Assert.That(systems.TryGetEntitySystem(typeof(DummySystem), out _), Is.False);
23+
Assert.That(systems.GetEntitySystemOrNull<DummySystem>(), Is.Null);
24+
}
25+
}

Robust.Shared/GameObjects/EntitySystemManager.cs

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,10 @@ public T GetEntitySystem<T>()
8484

8585
public T? GetEntitySystemOrNull<T>() where T : IEntitySystem
8686
{
87+
// ReSharper disable once ConditionIsAlwaysTrueOrFalseAccordingToNullableAPIContract
88+
if (SystemDependencyCollection == null)
89+
return default;
90+
8791
SystemDependencyCollection.TryResolveType<T>(out var system);
8892
return system;
8993
}
@@ -126,7 +130,9 @@ public void Resolve<T1, T2, T3, T4>([NotNull] ref T1? instance1, [NotNull] ref T
126130
public bool TryGetEntitySystem<T>([NotNullWhen(true)] out T? entitySystem)
127131
where T : IEntitySystem
128132
{
129-
return SystemDependencyCollection.TryResolveType<T>(out entitySystem);
133+
entitySystem = default;
134+
// ReSharper disable once ConditionalAccessQualifierIsNonNullableAccordingToAPIContract
135+
return SystemDependencyCollection?.TryResolveType(out entitySystem) ?? false;
130136
}
131137

132138
/// <inheritdoc />
@@ -383,7 +389,9 @@ public IEnumerable<Type> GetEntitySystemTypes()
383389

384390
public bool TryGetEntitySystem(Type sysType, [NotNullWhen(true)] out object? system)
385391
{
386-
return SystemDependencyCollection.TryResolveType(sysType, out system);
392+
system = null;
393+
// ReSharper disable once ConditionalAccessQualifierIsNonNullableAccordingToAPIContract
394+
return SystemDependencyCollection?.TryResolveType(sysType, out system) ?? false;
387395
}
388396

389397
public object GetEntitySystem(Type sysType)

0 commit comments

Comments
 (0)