public void Fill_And_Grow(DequeConstructors <int> constructors) { var capCtor = constructors.Item1; var buffer = capCtor(1); buffer.PushLeft(1); Assert.AreEqual(1, buffer.Count); buffer.PushLeft(2); Assert.AreEqual(2, buffer.Count); buffer.PushLeft(3); Assert.AreEqual(3, buffer.Count); buffer.PushLeft(4); Assert.AreEqual(4, buffer.Count); buffer.PushLeft(5); Assert.AreEqual(5, buffer.Count); Assert.AreEqual(1, buffer.PopRight()); Assert.AreEqual(4, buffer.Count); Assert.AreEqual(2, buffer.PopRight()); Assert.AreEqual(3, buffer.Count); Assert.AreEqual(3, buffer.PopRight()); Assert.AreEqual(2, buffer.Count); Assert.AreEqual(4, buffer.PopRight()); Assert.AreEqual(1, buffer.Count); Assert.AreEqual(5, buffer.PopRight()); Assert.AreEqual(0, buffer.Count); }
public void InverseEnqueue_SunnyPath(DequeConstructors <int> constructors) { var capCtor = constructors.Item1; var buffer = capCtor(1); foreach (var i in Enumerable.Range(1, 100)) { buffer.PushLeft(i); Assert.AreEqual(i, buffer.PeekLeft()); Assert.AreEqual(1, buffer.PeekRight()); } }
public void ConcurrentlyPushPopWhateverOrder(DequeConstructors <int> constructors) { const int numItems = 100_000; var capCtor = constructors.Item1; var buffer = capCtor(1); var random = new Random(0); var bag = new ConcurrentBag <int>(); for (var i = 0; i < numItems; i++) { bag.Add(random.Next(0, 6)); } var numElements = 0; Parallel.For(0, bag.Count, i => { if (!bag.TryTake(out var j)) { return; } switch (j) { case 0: buffer.PushLeft(i); Interlocked.Increment(ref numElements); break; case 1: buffer.PushRight(i); Interlocked.Increment(ref numElements); break; case 2 when buffer.TryPopLeft(out _): Interlocked.Decrement(ref numElements); break; case 3 when buffer.TryPopRight(out _): Interlocked.Decrement(ref numElements); break; case 4: buffer.TryPeekLeft(out _); break; case 5: buffer.TryPeekRight(out _); break; } });
public void ConcurrentlyPush(DequeConstructors <int> constructors) { const int numItems = 5_000; var capCtor = constructors.Item1; var buffer = capCtor(1); Parallel.For(0, numItems / 2, i => buffer.PushLeft(i)); Parallel.For(numItems / 2, numItems, i => buffer.PushRight(i)); Assert.AreEqual(numItems, buffer.Count); var list = new List <int>(buffer.Count); while (0 < buffer.Count) { list.Add(buffer.PopRight()); } CollectionAssert.AreEquivalent(Enumerable.Range(0, numItems), list); }
public void SequencesOfPopsAndPushes(DequeConstructors <int> constructors) { var sequences = new[]