From 5ae7b6a68253806c4251b243bfa48aeaf274e57b Mon Sep 17 00:00:00 2001
From: Jens Nolte <git@queezle.net>
Date: Wed, 25 Aug 2021 00:49:39 +0200
Subject: [PATCH] Add tests for Disposable and ResourceManager

---
 quasar.cabal                  |  1 +
 test/Quasar/DisposableSpec.hs | 43 +++++++++++++++++++++++++++++++++++
 2 files changed, 44 insertions(+)
 create mode 100644 test/Quasar/DisposableSpec.hs

diff --git a/quasar.cabal b/quasar.cabal
index 07e78f5..3022eef 100644
--- a/quasar.cabal
+++ b/quasar.cabal
@@ -103,6 +103,7 @@ test-suite quasar-test
   main-is: Spec.hs
   other-modules:
     Quasar.AwaitableSpec
+    Quasar.DisposableSpec
     Quasar.ObservableSpec
     Quasar.Observable.ObservableHashMapSpec
     Quasar.Observable.ObservablePrioritySpec
diff --git a/test/Quasar/DisposableSpec.hs b/test/Quasar/DisposableSpec.hs
new file mode 100644
index 0000000..b410e80
--- /dev/null
+++ b/test/Quasar/DisposableSpec.hs
@@ -0,0 +1,43 @@
+module Quasar.DisposableSpec (spec) where
+
+import Control.Concurrent
+import Control.Monad (void)
+import Prelude
+import Test.Hspec
+import Quasar.Awaitable
+import Quasar.Disposable
+
+spec :: Spec
+spec = parallel $ do
+  describe "Disposable" $ do
+    describe "noDisposable" $ do
+      it "can be disposed" $ do
+        awaitIO =<< dispose noDisposable
+
+      it "can be awaited" $ do
+        awaitIO (isDisposed noDisposable)
+        pure () :: IO ()
+
+  describe "ResourceManager" $ do
+    it "can be created" $ do
+      void newResourceManager
+
+    it "can be created and disposed" $ do
+      resourceManager <- newResourceManager
+      awaitIO =<< dispose resourceManager
+
+    it "can be created and disposed" $ do
+      withResourceManager \_ -> pure ()
+
+    it "can \"dispose\" a noDisposable" $ do
+      withResourceManager \resourceManager -> do
+        attachDisposable resourceManager noDisposable
+
+    it "can dispose an awaitable that is completed asynchronously" $ do
+      avar <- newAsyncVar :: IO (AsyncVar ())
+      void $ forkIO $ do
+        threadDelay 100000
+        putAsyncVar_ avar ()
+
+      withResourceManager \resourceManager -> do
+        attachDisposable resourceManager (alreadyDisposing avar)
-- 
GitLab