Skip to content

Commit d5b9b5f

Browse files
committed
Test interleaved enqueue/dequeue.
1 parent b4982f4 commit d5b9b5f

File tree

2 files changed

+43
-0
lines changed

2 files changed

+43
-0
lines changed

DependencyQueue.Tests/DependencyQueueTests.cs

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -825,6 +825,46 @@ public void Complete_NotEnqueued()
825825
queue.ShouldHaveTopic("y", providedBy: [itemY]);
826826
}
827827

828+
[Test]
829+
public void DequeueThenEnqueue()
830+
{
831+
using var queue = new Queue();
832+
833+
var itemA = queue.Enqueue("a", value: new());
834+
var itemB = queue.Enqueue("b", value: new(), requires: ["a"]);
835+
836+
queue.Dequeue().ShouldBeSameAs(itemA);
837+
838+
// Pretend that processing of itemA enqueues itemC
839+
var itemC = queue.Enqueue("c", value: new(), requires: ["b"]);
840+
841+
// Dequeueing should still work
842+
queue.Complete(itemA);
843+
queue.Dequeue().ShouldBeSameAs(itemB);
844+
queue.Complete(itemB);
845+
queue.Dequeue().ShouldBeSameAs(itemC);
846+
847+
// Pretend that processing of itemC enqueues itemD, which is invalid
848+
// unprovided ↓
849+
var itemD = queue.Enqueue("d", value: new(), requires: ["k"]);
850+
851+
// Dequeueing should report the invalidity
852+
queue.Complete(itemC);
853+
Should.Throw<InvalidDependencyQueueException>(() => queue.Dequeue())
854+
.Errors
855+
.ShouldHaveSingleItem()
856+
.ShouldBeOfType<DependencyQueueUnprovidedTopicError<Value>>()
857+
.Topic.Name.ShouldBe("k");
858+
859+
// Now enqueue itemK, which resolves the invalidity
860+
var itemK = queue.Enqueue("k", value: new());
861+
862+
// Dequeueing should now work
863+
queue.Dequeue().ShouldBeSameAs(itemK); queue.Complete(itemK);
864+
queue.Dequeue().ShouldBeSameAs(itemD); queue.Complete(itemD);
865+
queue.Dequeue().ShouldBeNull();
866+
}
867+
828868
[Test]
829869
public void Clear_Ok()
830870
{

README.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,9 @@ By default, topic names use case-sensitive ordinal comparison. To use
152152
different comparison rules, pass a `StringComparer` instance to the queue
153153
constructor.
154154

155+
While typical uses of DependencyQueue involve separate enqueue and dequeue
156+
phases, the queue supports interleaved enqueue and dequeue operations.
157+
155158
### Dequeueing Items
156159

157160
To dequeue (remove) an item, call `Dequeue()` or `DequeueAsync()`. Both

0 commit comments

Comments
 (0)