DependencyCollection is now thread safe.

We can now safely run stuff in parallel with registrations and all that goodness.
This commit is contained in:
Pieter-Jan Briers
2022-12-17 00:38:15 +01:00
parent 52588bee92
commit d1eb70da07
6 changed files with 286 additions and 163 deletions

View File

@@ -0,0 +1,43 @@
using NUnit.Framework;
using Robust.Shared.IoC;
namespace Robust.UnitTesting.Shared.IoC;
[TestFixture]
[TestOf(typeof(DependencyCollection))]
[Parallelizable]
internal sealed class DependencyCollectionTest
{
/// <summary>
/// Tests that registering two interfaces with the same implementation results in a single instance being shared.
/// </summary>
[Test]
public void TestRegisterSameImplementation()
{
var deps = new DependencyCollection();
deps.Register<IA, C>();
deps.Register<IB, C>();
deps.BuildGraph();
var a = deps.Resolve<IA>();
var b = deps.Resolve<IB>();
Assert.That(a, Is.EqualTo(b), () => "A & B instances must be reference equal");
}
private interface IA
{
}
private interface IB
{
}
private sealed class C : IA, IB
{
}
}

View File

@@ -135,6 +135,8 @@ namespace Robust.UnitTesting.Shared.IoC
IoCManager.RegisterInstance<IIoCTestPriorities>(obj);
IoCManager.BuildGraph();
Assert.That(IoCManager.Resolve<IIoCTestPriorities>(), Is.EqualTo(obj));
}
@@ -151,10 +153,10 @@ namespace Robust.UnitTesting.Shared.IoC
public void IoCRegInstancesBeforeBuildGraph()
{
var instanceA = new DependencyA();
IoCManager.RegisterInstance<DependencyA>(instanceA, deferInject: true);
IoCManager.RegisterInstance<DependencyA>(instanceA);
var instanceB = new DependencyB();
IoCManager.RegisterInstance<DependencyB>(instanceB, deferInject: true);
IoCManager.RegisterInstance<DependencyB>(instanceB);
IoCManager.BuildGraph();
@@ -173,7 +175,7 @@ namespace Robust.UnitTesting.Shared.IoC
IoCManager.Register<DependencyA, DependencyA>();
var instanceB = new DependencyB();
IoCManager.RegisterInstance<DependencyB>(instanceB, deferInject: true);
IoCManager.RegisterInstance<DependencyB>(instanceB);
IoCManager.BuildGraph();
@@ -189,7 +191,7 @@ namespace Robust.UnitTesting.Shared.IoC
public void IoCRegInstanceDepBeforeBuildGraph()
{
var instanceB = new DependencyB();
IoCManager.RegisterInstance<DependencyB>(instanceB, deferInject: true);
IoCManager.RegisterInstance<DependencyB>(instanceB);
IoCManager.Register<DependencyA, DependencyA>();