diff --git a/tests/Tgstation.Server.Host.Tests/Utils/TestReferenceCountingContainer.cs b/tests/Tgstation.Server.Host.Tests/Utils/TestReferenceCountingContainer.cs new file mode 100644 index 0000000000..f517d66de2 --- /dev/null +++ b/tests/Tgstation.Server.Host.Tests/Utils/TestReferenceCountingContainer.cs @@ -0,0 +1,56 @@ +using Microsoft.VisualStudio.TestTools.UnitTesting; + +namespace Tgstation.Server.Host.Utils.Tests +{ + [TestClass] + public sealed class TestReferenceCountingContainer + { + interface IInterface + { + } + + sealed class Implementation : IInterface + { + } + + sealed class Lock : ReferenceCounter + { + public IInterface PubInstance => Instance; + } + + + [TestMethod] + public void TestReferenceCounting() + { + var impl = new Implementation(); + var container = new ReferenceCountingContainer(impl); + + Assert.IsTrue(container.OnZeroReferences.IsCompleted); + + var ref1 = container.AddReference(); + + Assert.AreSame(ref1.PubInstance, impl); + + var task = container.OnZeroReferences; + + Assert.AreSame(task, container.OnZeroReferences); + Assert.IsFalse(task.IsCompleted); + + ref1.Dispose(); + + Assert.IsTrue(task.IsCompleted); + Assert.IsTrue(container.OnZeroReferences.IsCompleted); + + ref1.Dispose(); + Assert.IsTrue(container.OnZeroReferences.IsCompleted); + + var ref2 = container.AddReference(); + Assert.IsFalse((task = container.OnZeroReferences).IsCompleted); + + + ref2.Dispose(); + Assert.IsTrue(task.IsCompleted); + Assert.IsTrue(container.OnZeroReferences.IsCompleted); + } + } +}