Skip to content

Commit 959ecec

Browse files
committed
io-sim: Fix flushTQueue to maintain
1 parent b1ff8fa commit 959ecec

File tree

2 files changed

+23
-5
lines changed

2 files changed

+23
-5
lines changed

io-sim/src/Control/Monad/IOSim/STM.hs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -96,9 +96,9 @@ tryPeekTQueueDefault (TQueue queue) = do
9696

9797
flushTQueueDefault :: MonadSTM m => TQueueDefault m a -> STM m [a]
9898
flushTQueueDefault (TQueue queue) = do
99-
xs <- uncurry (++) <$> readTVar queue
99+
(xs, ys) <- readTVar queue
100100
writeTVar queue ([], [])
101-
pure xs
101+
pure (xs <> reverse ys)
102102

103103
unGetTQueueDefault :: MonadSTM m => TQueueDefault m a -> a -> STM m ()
104104
unGetTQueueDefault (TQueue queue) a = do

io-sim/test/Test/Control/Monad/IOSim.hs

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -177,7 +177,11 @@ tests =
177177
prop_registerDelayCancellable_IO
178178
]
179179
, testGroup "MonadSTM"
180-
[ testProperty "flushTQueue empties the queue" prop_flushTQueue ]
180+
[ testGroup "flushTQueue"
181+
[ testProperty "empties the queue" prop_flushTQueueEmpties
182+
, testProperty "maintains FIFO order" prop_flushTQueueOrder
183+
]
184+
]
181185
]
182186

183187
--
@@ -1350,8 +1354,9 @@ prop_registerDelayCancellable_IO =
13501354
cancelTimeout
13511355
awaitTimeout
13521356

1353-
prop_flushTQueue :: Property
1354-
prop_flushTQueue =
1357+
-- | Test that 'flushTQueue' empties the queue.
1358+
prop_flushTQueueEmpties :: Property
1359+
prop_flushTQueueEmpties =
13551360
ioProperty emptyQueueAfterFlush
13561361
.&&. runSimOrThrow emptyQueueAfterFlush
13571362

@@ -1363,6 +1368,19 @@ emptyQueueAfterFlush = do
13631368
_ <- flushTQueue q
13641369
isEmptyTQueue q
13651370

1371+
-- | Test that 'flushTQueue' returns values in FIFO order.
1372+
prop_flushTQueueOrder :: [Int] -> Property
1373+
prop_flushTQueueOrder entries =
1374+
ioProperty (writeAndFlushQueue entries >>= \actual -> pure $ actual === entries)
1375+
.&&. runSimOrThrow (writeAndFlushQueue entries) === entries
1376+
1377+
writeAndFlushQueue :: MonadSTM m => [Int] -> m [Int]
1378+
writeAndFlushQueue entries =
1379+
atomically $ do
1380+
q <- newTQueue
1381+
forM_ entries $ writeTQueue q
1382+
flushTQueue q
1383+
13661384
--
13671385
-- Utils
13681386
--

0 commit comments

Comments
 (0)