From 247e2704ac158655d08a20edef5be755e9c9c51c Mon Sep 17 00:00:00 2001 From: Jens Nolte <git@queezle.net> Date: Wed, 25 Aug 2021 18:23:36 +0200 Subject: [PATCH] Add more tests --- src/Quasar/Awaitable.hs | 2 +- test/Quasar/AsyncSpec.hs | 2 +- test/Quasar/DisposableSpec.hs | 26 ++++++++++++++++++++++++++ 3 files changed, 28 insertions(+), 2 deletions(-) diff --git a/src/Quasar/Awaitable.hs b/src/Quasar/Awaitable.hs index 5a16f0a..cecbcd7 100644 --- a/src/Quasar/Awaitable.hs +++ b/src/Quasar/Awaitable.hs @@ -156,7 +156,7 @@ class Monad m => MonadQuerySTM m where querySTM :: (forall a. STM a -> m a) querySTM transaction = unsafeQuerySTM $ (Just <$> transaction) `orElse` pure Nothing - -- | Run an "STM` transaction. `retry` MUST NOT be used + -- | Run an "STM` transaction. `retry` MUST NOT be used. unsafeQuerySTM :: (forall a. STM (Maybe a) -> m a) unsafeQuerySTM transaction = querySTM $ maybe retry pure =<< transaction diff --git a/test/Quasar/AsyncSpec.hs b/test/Quasar/AsyncSpec.hs index f6c0a1f..0ece2a9 100644 --- a/test/Quasar/AsyncSpec.hs +++ b/test/Quasar/AsyncSpec.hs @@ -22,7 +22,7 @@ spec = parallel $ do tryTakeMVar m1 `shouldReturn` Just () tryTakeMVar m2 `shouldReturn` Just () - xit "can continue after awaiting an already finished operation" $ do + it "can pass a value through async and await" $ do withDefaultAsyncManager (await =<< async (pure 42 :: AsyncIO Int)) `shouldReturn` 42 it "can await the result of an async that is completed later" $ do diff --git a/test/Quasar/DisposableSpec.hs b/test/Quasar/DisposableSpec.hs index 0acc9e0..3bb1d13 100644 --- a/test/Quasar/DisposableSpec.hs +++ b/test/Quasar/DisposableSpec.hs @@ -24,6 +24,27 @@ spec = parallel $ do awaitIO (isDisposed noDisposable) pure () :: IO () + + describe "newDisposable" $ do + it "signals it's disposed state" $ do + disposable <- newDisposable $ pure $ pure () + void $ forkIO $ threadDelay 100000 >> disposeIO disposable + awaitIO (isDisposed disposable) + pure () :: IO () + + it "can be disposed multiple times" $ do + disposable <- newDisposable $ pure $ pure () + disposeIO disposable + disposeIO disposable + awaitIO (isDisposed disposable) + + it "can be disposed in parallel" $ do + disposable <- newDisposable $ pure () <$ threadDelay 100000 + void $ forkIO $ disposeIO disposable + disposeIO disposable + awaitIO (isDisposed disposable) + + describe "ResourceManager" $ do it "can be created" $ do void newResourceManager @@ -75,3 +96,8 @@ spec = parallel $ do withResourceManager \resourceManager -> attachDisposeAction resourceManager $ throwIO $ TestException \TestException -> True + + it "can attach an disposable that is disposed asynchronously" $ do + withResourceManager \resourceManager -> do + disposable <- attachDisposeAction resourceManager $ pure () <$ threadDelay 100000 + void $ forkIO $ disposeIO disposable -- GitLab