-- | "Test.Util.Framework" is a super-module that re-exports other modules
-- pertaining to TDD, so that they can be imported under a single module.
--
-- HUnit's @Test@ type is renamed to 'HTest', and test-framework's to 'TTest'.
-- The same renaming scheme, with the addition that @Q@ is prepended for
-- QuickCheck, has been applied to the following names:
--
--  * 'Test'
--
--  * 'assert'
--
--  * 'State'
--
--  * 'test'
--
-- 'Test.QuickCheck.Property.Result' is renamed to 'SingleResult'; 'reason'
-- in this module cannot be renamed, so it is unfortunately not exported.
--
-- Unfortunately, Haskell's design makes it inconvenient to rename classes.
-- In this module, 'Testable' is not re-exported from any module.
module Test.Util.Framework
    ( module Test.HUnit
    , module Test.QuickCheck
    , module Test.QuickCheck.All
    , module Test.QuickCheck.Arbitrary
    , module Test.QuickCheck.Function
    , module Test.QuickCheck.Gen
    , module Test.QuickCheck.Modifiers
    , module Test.QuickCheck.Monadic
    , module Test.QuickCheck.Poly
    , module Test.QuickCheck.Property
    , module Test.QuickCheck.State
    , module Test.QuickCheck.Test
    , module Test.QuickCheck.Text
    , module Test.Framework
    , module Test.Framework.Providers.HUnit
    , module Test.Framework.Providers.QuickCheck2

    , HTest
    , TTest
    , qAssert
    , QState
    , qTest
    , SingleResult
    ) where

import           System.Random (StdGen)
import           Test.HUnit hiding (Test, Testable, assert, State, test)
import qualified Test.HUnit
import           Test.QuickCheck hiding (Testable)
import           Test.QuickCheck.All
import           Test.QuickCheck.Arbitrary
import           Test.QuickCheck.Function
import           Test.QuickCheck.Gen
import           Test.QuickCheck.Modifiers
import           Test.QuickCheck.Monadic hiding (assert)
import qualified Test.QuickCheck.Monadic
import           Test.QuickCheck.Poly
import           Test.QuickCheck.Property hiding (Result(reason))
import qualified Test.QuickCheck.Property
import           Test.QuickCheck.State hiding (State)
import qualified Test.QuickCheck.State
import           Test.QuickCheck.Test hiding (test)
import qualified Test.QuickCheck.Test
import           Test.QuickCheck.Text
import           Test.Framework hiding (Test)
import qualified Test.Framework
import           Test.Framework.Providers.HUnit
import           Test.Framework.Providers.QuickCheck2

-- | Alias for 'Test.HUnit.Test'.
type HTest = Test.HUnit.Test

-- | Alias for 'Test.Framework.Test'.
type TTest = Test.Framework.Test

-- | Alias for 'Test.QuickCheck.Monadic.assert'.
qAssert :: (Monad m) => Bool -> PropertyM m ()
qAssert = Test.QuickCheck.Monadic.assert

-- | Alias for 'Test.QuickCheck.State.State'.
type QState = Test.QuickCheck.State.State

-- | Alias for 'Test.QuickCheck.Test.test'.
qTest :: QState -> (StdGen -> Int -> Prop) -> IO Result
qTest = Test.QuickCheck.Test.test

-- | Alias for 'Test.QuickCheck.Property.Result'.
type SingleResult = Test.QuickCheck.Property.Result