packages feed

sydtest-typed-process-0.0.0.0: src/Test/Syd/Process/Typed.hs

{-# LANGUAGE DataKinds #-}
{-# LANGUAGE TypeOperators #-}

module Test.Syd.Process.Typed where

import System.Process.Typed
import Test.Syd

-- | Run a given process while a test is running and give access to a process handle as an inner resource.
--
-- See 'typedProcessSetupFunc'.
typedProcessSpec :: ProcessConfig stdin stdout stderr -> TestDefM outers (Process stdin stdout stderr) result -> TestDefM outers () result
typedProcessSpec pc = setupAround $ typedProcessSetupFunc pc

-- | Run a given process while a group of tests is running and give access to a process handle as an outer resource.
--
-- See 'typedProcessSetupFunc'.
--
-- == __FOOTGUN__
--
-- The process will be shared accross multiple tests.
-- This may well be a good idea because starting the process can be prohibitively expensive to do around every test.
-- However, sharing the process means that tests could be sharing state.
-- When using this function, it is important to implement some form of cleaning the state before every test.
-- It is also important to use 'sequential' if some such state is maintained (and cleaned) so that the state is not cleaned while another test is running.
outerTypedProcessSpec :: ProcessConfig stdin stdout stderr -> TestDefM (Process stdin stdout stderr ': outers) inner result -> TestDefM outers inner result
outerTypedProcessSpec pc = setupAroundAll $ typedProcessSetupFunc pc

-- | Set up a process beforehand and stop it afterwards.
--
-- The process will be terminated using 'stopProcess'.
typedProcessSetupFunc :: ProcessConfig stdin stdout stderr -> SetupFunc (Process stdin stdout stderr)
typedProcessSetupFunc pc = bracketSetupFunc (startProcess pc) stopProcess