@@ -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 {
0 commit comments