rd-net/Test.Lifetimes/Collections/DictionaryExTest.cs (50 lines of code) (raw):

using System; using System.Collections; using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; using JetBrains.Diagnostics; using JetBrains.Lifetimes; using JetBrains.Rd.Util; using NUnit.Framework; namespace Test.Lifetimes.Collections; [TestFixture] public class DictionaryExTest : LifetimesTestBase { [Test] public void BlockingAddUniqueTest() { var dictionary = new Dictionary<string, string>(); var locker = new object(); const string key = "MyKey"; const string value = "MyValue"; Lifetime.Using(lifetime => { dictionary.BlockingAddUnique(lifetime, locker, key, value); Assert.AreEqual(1, dictionary.Count); Assert.AreEqual(value, dictionary[key]); }); Assert.AreEqual(0, dictionary.Count); lock (locker) { var task = StartTask(() => { var definition = TestLifetime.CreateNested(); StartTask(() => { Thread.Sleep(TimeSpan.FromMilliseconds(100)); Assert.AreEqual(0, dictionary.Count); definition.Terminate(); }); dictionary.BlockingAddUnique(definition.Lifetime, locker, key, value); Assert.IsTrue(definition.Lifetime.IsNotAlive); Assert.AreEqual(0, dictionary.Count); }); Assert.IsTrue(task.Wait(TimeSpan.FromSeconds(10))); } } private static Task StartTask(Action action) { return Task.Factory.StartNew(action, CancellationToken.None, TaskCreationOptions.None, TaskScheduler.Default); } }