{-# LANGUAGE DataKinds #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE IncoherentInstances #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE TypeOperators #-}
{-# OPTIONS_GHC -fno-warn-redundant-constraints #-}
module Test.Syd.Def.Specify
(
describe,
it,
itWithOuter,
itWithBoth,
itWithAll,
specify,
specifyWithOuter,
specifyWithBoth,
specifyWithAll,
prop,
xdescribe,
xit,
xitWithOuter,
xitWithBoth,
xitWithAll,
xspecify,
xspecifyWithOuter,
xspecifyWithBoth,
xspecifyWithAll,
pending,
pendingWith,
)
where
import Control.Monad.RWS.Strict
import qualified Data.Text as T
import GHC.Stack
import Test.QuickCheck
import Test.QuickCheck.IO ()
import Test.Syd.Def.TestDefM
import Test.Syd.HList
import Test.Syd.Run
import Test.Syd.SpecDef
describe ::
String ->
TestDefM outers inner () ->
TestDefM outers inner ()
describe :: String -> TestDefM outers inner () -> TestDefM outers inner ()
describe String
s =
let t :: Text
t = String -> Text
T.pack String
s
in (TestDefEnv -> TestDefEnv)
-> TestDefM outers inner () -> TestDefM outers inner ()
forall r (m :: * -> *) a. MonadReader r m => (r -> r) -> m a -> m a
local (\TestDefEnv
tde -> TestDefEnv
tde {testDefEnvDescriptionPath :: [Text]
testDefEnvDescriptionPath = Text
t Text -> [Text] -> [Text]
forall a. a -> [a] -> [a]
: TestDefEnv -> [Text]
testDefEnvDescriptionPath TestDefEnv
tde})
(TestDefM outers inner () -> TestDefM outers inner ())
-> (TestDefM outers inner () -> TestDefM outers inner ())
-> TestDefM outers inner ()
-> TestDefM outers inner ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ([SpecDefTree outers inner ()] -> [SpecDefTree outers inner ()])
-> TestDefM outers inner () -> TestDefM outers inner ()
forall w (m :: * -> *) a. MonadWriter w m => (w -> w) -> m a -> m a
censor ((SpecDefTree outers inner ()
-> [SpecDefTree outers inner ()] -> [SpecDefTree outers inner ()]
forall a. a -> [a] -> [a]
: []) (SpecDefTree outers inner () -> [SpecDefTree outers inner ()])
-> ([SpecDefTree outers inner ()] -> SpecDefTree outers inner ())
-> [SpecDefTree outers inner ()]
-> [SpecDefTree outers inner ()]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text
-> [SpecDefTree outers inner ()] -> SpecDefTree outers inner ()
forall (outers :: [*]) inner extra.
Text
-> SpecDefForest outers inner extra
-> SpecDefTree outers inner extra
DefDescribeNode Text
t)
xdescribe :: String -> TestDefM outers inner () -> TestDefM outers inner ()
xdescribe :: String -> TestDefM outers inner () -> TestDefM outers inner ()
xdescribe String
s TestDefM outers inner ()
_ = String -> TestDefM outers inner ()
forall (outers :: [*]) inner. String -> TestDefM outers inner ()
pending String
s
it ::
forall outers inner test.
(HasCallStack, IsTest test, Arg1 test ~ (), Arg2 test ~ inner) =>
String ->
test ->
TestDefM outers inner ()
it :: String -> test -> TestDefM outers inner ()
it String
s test
t = do
TestRunSettings
sets <- (TestDefEnv -> TestRunSettings)
-> TestDefM outers inner TestRunSettings
forall r (m :: * -> *) a. MonadReader r m => (r -> a) -> m a
asks TestDefEnv -> TestRunSettings
testDefEnvTestRunSettings
let testDef :: TDef
(ProgressReporter
-> ((HList outers -> inner -> IO ()) -> IO ()) -> IO TestRunResult)
testDef =
TDef :: forall value. value -> CallStack -> TDef value
TDef
{ testDefVal :: ProgressReporter
-> ((HList outers -> inner -> IO ()) -> IO ()) -> IO TestRunResult
testDefVal = \ProgressReporter
progressReporter (HList outers -> inner -> IO ()) -> IO ()
supplyArgs ->
test
-> TestRunSettings
-> ProgressReporter
-> ((Arg1 test -> Arg2 test -> IO ()) -> IO ())
-> IO TestRunResult
forall e.
IsTest e =>
e
-> TestRunSettings
-> ProgressReporter
-> ((Arg1 e -> Arg2 e -> IO ()) -> IO ())
-> IO TestRunResult
runTest
test
t
TestRunSettings
sets
ProgressReporter
progressReporter
( \Arg1 test -> Arg2 test -> IO ()
func -> (HList outers -> inner -> IO ()) -> IO ()
supplyArgs (\HList outers
_ inner
arg2 -> Arg1 test -> Arg2 test -> IO ()
func () inner
Arg2 test
arg2)
),
testDefCallStack :: CallStack
testDefCallStack = CallStack
HasCallStack => CallStack
callStack
}
[SpecDefTree outers inner ()] -> TestDefM outers inner ()
forall w (m :: * -> *). MonadWriter w m => w -> m ()
tell [Text
-> TDef
(ProgressReporter
-> ((HList outers -> inner -> IO ()) -> IO ()) -> IO TestRunResult)
-> ()
-> SpecDefTree outers inner ()
forall (outers :: [*]) inner extra.
Text
-> TDef
(ProgressReporter
-> ((HList outers -> inner -> IO ()) -> IO ()) -> IO TestRunResult)
-> extra
-> SpecDefTree outers inner extra
DefSpecifyNode (String -> Text
T.pack String
s) TDef
(ProgressReporter
-> ((HList outers -> inner -> IO ()) -> IO ()) -> IO TestRunResult)
testDef ()]
xit ::
forall outers inner test.
(HasCallStack, IsTest test, Arg1 test ~ (), Arg2 test ~ inner) =>
String ->
test ->
TestDefM outers inner ()
xit :: String -> test -> TestDefM outers inner ()
xit String
s test
_ = String -> TestDefM outers inner ()
forall (outers :: [*]) inner. String -> TestDefM outers inner ()
pending String
s
specify ::
forall outers inner test.
(HasCallStack, IsTest test, Arg1 test ~ (), Arg2 test ~ inner) =>
String ->
test ->
TestDefM outers inner ()
specify :: String -> test -> TestDefM outers inner ()
specify = String -> test -> TestDefM outers inner ()
forall (outers :: [*]) inner test.
(HasCallStack, IsTest test, Arg1 test ~ (), Arg2 test ~ inner) =>
String -> test -> TestDefM outers inner ()
it
xspecify ::
forall outers inner test.
(HasCallStack, IsTest test, Arg1 test ~ (), Arg2 test ~ inner) =>
String ->
test ->
TestDefM outers inner ()
xspecify :: String -> test -> TestDefM outers inner ()
xspecify = String -> test -> TestDefM outers inner ()
forall (outers :: [*]) inner test.
(HasCallStack, IsTest test, Arg1 test ~ (), Arg2 test ~ inner) =>
String -> test -> TestDefM outers inner ()
xit
itWithOuter ::
(HasCallStack, IsTest test, Arg1 test ~ inner, Arg2 test ~ outer) =>
String ->
test ->
TestDefM (outer ': otherOuters) inner ()
itWithOuter :: String -> test -> TestDefM (outer : otherOuters) inner ()
itWithOuter String
s test
t = do
TestRunSettings
sets <- (TestDefEnv -> TestRunSettings)
-> TestDefM (outer : otherOuters) inner TestRunSettings
forall r (m :: * -> *) a. MonadReader r m => (r -> a) -> m a
asks TestDefEnv -> TestRunSettings
testDefEnvTestRunSettings
let testDef :: TDef
(ProgressReporter
-> ((HList (outer : otherOuters) -> inner -> IO ()) -> IO ())
-> IO TestRunResult)
testDef =
TDef :: forall value. value -> CallStack -> TDef value
TDef
{ testDefVal :: ProgressReporter
-> ((HList (outer : otherOuters) -> inner -> IO ()) -> IO ())
-> IO TestRunResult
testDefVal = \ProgressReporter
progressReporter (HList (outer : otherOuters) -> inner -> IO ()) -> IO ()
supplyArgs ->
test
-> TestRunSettings
-> ProgressReporter
-> ((Arg1 test -> Arg2 test -> IO ()) -> IO ())
-> IO TestRunResult
forall e.
IsTest e =>
e
-> TestRunSettings
-> ProgressReporter
-> ((Arg1 e -> Arg2 e -> IO ()) -> IO ())
-> IO TestRunResult
runTest
test
t
TestRunSettings
sets
ProgressReporter
progressReporter
(\Arg1 test -> Arg2 test -> IO ()
func -> (HList (outer : otherOuters) -> inner -> IO ()) -> IO ()
supplyArgs ((HList (outer : otherOuters) -> inner -> IO ()) -> IO ())
-> (HList (outer : otherOuters) -> inner -> IO ()) -> IO ()
forall a b. (a -> b) -> a -> b
$ \(HCons e
outerArgs HList l
_) inner
innerArg -> Arg1 test -> Arg2 test -> IO ()
func inner
Arg1 test
innerArg e
Arg2 test
outerArgs),
testDefCallStack :: CallStack
testDefCallStack = CallStack
HasCallStack => CallStack
callStack
}
[SpecDefTree (outer : otherOuters) inner ()]
-> TestDefM (outer : otherOuters) inner ()
forall w (m :: * -> *). MonadWriter w m => w -> m ()
tell [Text
-> TDef
(ProgressReporter
-> ((HList (outer : otherOuters) -> inner -> IO ()) -> IO ())
-> IO TestRunResult)
-> ()
-> SpecDefTree (outer : otherOuters) inner ()
forall (outers :: [*]) inner extra.
Text
-> TDef
(ProgressReporter
-> ((HList outers -> inner -> IO ()) -> IO ()) -> IO TestRunResult)
-> extra
-> SpecDefTree outers inner extra
DefSpecifyNode (String -> Text
T.pack String
s) TDef
(ProgressReporter
-> ((HList (outer : otherOuters) -> inner -> IO ()) -> IO ())
-> IO TestRunResult)
testDef ()]
xitWithOuter ::
(HasCallStack, IsTest test, Arg1 test ~ inner, Arg2 test ~ outer) =>
String ->
test ->
TestDefM (outer ': otherOuters) inner ()
xitWithOuter :: String -> test -> TestDefM (outer : otherOuters) inner ()
xitWithOuter String
s test
_ = String -> TestDefM (outer : otherOuters) inner ()
forall (outers :: [*]) inner. String -> TestDefM outers inner ()
pending String
s
specifyWithOuter ::
(HasCallStack, IsTest test, Arg1 test ~ inner, Arg2 test ~ outer) =>
String ->
test ->
TestDefM (outer ': otherOuters) inner ()
specifyWithOuter :: String -> test -> TestDefM (outer : otherOuters) inner ()
specifyWithOuter = String -> test -> TestDefM (outer : otherOuters) inner ()
forall test inner outer (otherOuters :: [*]).
(HasCallStack, IsTest test, Arg1 test ~ inner,
Arg2 test ~ outer) =>
String -> test -> TestDefM (outer : otherOuters) inner ()
itWithOuter
xspecifyWithOuter ::
(HasCallStack, IsTest test, Arg1 test ~ inner, Arg2 test ~ outer) =>
String ->
test ->
TestDefM (outer ': otherOuters) inner ()
xspecifyWithOuter :: String -> test -> TestDefM (outer : otherOuters) inner ()
xspecifyWithOuter = String -> test -> TestDefM (outer : otherOuters) inner ()
forall test inner outer (otherOuters :: [*]).
(HasCallStack, IsTest test, Arg1 test ~ inner,
Arg2 test ~ outer) =>
String -> test -> TestDefM (outer : otherOuters) inner ()
xitWithOuter
itWithBoth ::
( HasCallStack,
IsTest test,
Arg1 test ~ outer,
Arg2 test ~ inner
) =>
String ->
test ->
TestDefM (outer ': otherOuters) inner ()
itWithBoth :: String -> test -> TestDefM (outer : otherOuters) inner ()
itWithBoth String
s test
t = do
TestRunSettings
sets <- (TestDefEnv -> TestRunSettings)
-> TestDefM (outer : otherOuters) inner TestRunSettings
forall r (m :: * -> *) a. MonadReader r m => (r -> a) -> m a
asks TestDefEnv -> TestRunSettings
testDefEnvTestRunSettings
let testDef :: TDef
(ProgressReporter
-> ((HList (outer : otherOuters) -> inner -> IO ()) -> IO ())
-> IO TestRunResult)
testDef =
TDef :: forall value. value -> CallStack -> TDef value
TDef
{ testDefVal :: ProgressReporter
-> ((HList (outer : otherOuters) -> inner -> IO ()) -> IO ())
-> IO TestRunResult
testDefVal = \ProgressReporter
progressReporter (HList (outer : otherOuters) -> inner -> IO ()) -> IO ()
supplyArgs ->
test
-> TestRunSettings
-> ProgressReporter
-> ((Arg1 test -> Arg2 test -> IO ()) -> IO ())
-> IO TestRunResult
forall e.
IsTest e =>
e
-> TestRunSettings
-> ProgressReporter
-> ((Arg1 e -> Arg2 e -> IO ()) -> IO ())
-> IO TestRunResult
runTest
test
t
TestRunSettings
sets
ProgressReporter
progressReporter
(\Arg1 test -> Arg2 test -> IO ()
func -> (HList (outer : otherOuters) -> inner -> IO ()) -> IO ()
supplyArgs ((HList (outer : otherOuters) -> inner -> IO ()) -> IO ())
-> (HList (outer : otherOuters) -> inner -> IO ()) -> IO ()
forall a b. (a -> b) -> a -> b
$ \(HCons e
outerArgs HList l
_) inner
innerArg -> Arg1 test -> Arg2 test -> IO ()
func e
Arg1 test
outerArgs inner
Arg2 test
innerArg),
testDefCallStack :: CallStack
testDefCallStack = CallStack
HasCallStack => CallStack
callStack
}
[SpecDefTree (outer : otherOuters) inner ()]
-> TestDefM (outer : otherOuters) inner ()
forall w (m :: * -> *). MonadWriter w m => w -> m ()
tell [Text
-> TDef
(ProgressReporter
-> ((HList (outer : otherOuters) -> inner -> IO ()) -> IO ())
-> IO TestRunResult)
-> ()
-> SpecDefTree (outer : otherOuters) inner ()
forall (outers :: [*]) inner extra.
Text
-> TDef
(ProgressReporter
-> ((HList outers -> inner -> IO ()) -> IO ()) -> IO TestRunResult)
-> extra
-> SpecDefTree outers inner extra
DefSpecifyNode (String -> Text
T.pack String
s) TDef
(ProgressReporter
-> ((HList (outer : otherOuters) -> inner -> IO ()) -> IO ())
-> IO TestRunResult)
testDef ()]
xitWithBoth ::
( HasCallStack,
IsTest test,
Arg1 test ~ outer,
Arg2 test ~ inner
) =>
String ->
test ->
TestDefM (outer ': otherOuters) inner ()
xitWithBoth :: String -> test -> TestDefM (outer : otherOuters) inner ()
xitWithBoth String
s test
_ = String -> TestDefM (outer : otherOuters) inner ()
forall (outers :: [*]) inner. String -> TestDefM outers inner ()
pending String
s
specifyWithBoth ::
( HasCallStack,
IsTest test,
Arg1 test ~ outer,
Arg2 test ~ inner
) =>
String ->
test ->
TestDefM (outer ': otherOuters) inner ()
specifyWithBoth :: String -> test -> TestDefM (outer : otherOuters) inner ()
specifyWithBoth = String -> test -> TestDefM (outer : otherOuters) inner ()
forall test outer inner (otherOuters :: [*]).
(HasCallStack, IsTest test, Arg1 test ~ outer,
Arg2 test ~ inner) =>
String -> test -> TestDefM (outer : otherOuters) inner ()
itWithBoth
xspecifyWithBoth ::
( HasCallStack,
IsTest test,
Arg1 test ~ outer,
Arg2 test ~ inner
) =>
String ->
test ->
TestDefM (outer ': otherOuters) inner ()
xspecifyWithBoth :: String -> test -> TestDefM (outer : otherOuters) inner ()
xspecifyWithBoth = String -> test -> TestDefM (outer : otherOuters) inner ()
forall test outer inner (otherOuters :: [*]).
(HasCallStack, IsTest test, Arg1 test ~ outer,
Arg2 test ~ inner) =>
String -> test -> TestDefM (outer : otherOuters) inner ()
xitWithBoth
itWithAll ::
( HasCallStack,
IsTest test,
Arg1 test ~ HList outers,
Arg2 test ~ inner
) =>
String ->
test ->
TestDefM outers inner ()
itWithAll :: String -> test -> TestDefM outers inner ()
itWithAll String
s test
t = do
TestRunSettings
sets <- (TestDefEnv -> TestRunSettings)
-> TestDefM outers inner TestRunSettings
forall r (m :: * -> *) a. MonadReader r m => (r -> a) -> m a
asks TestDefEnv -> TestRunSettings
testDefEnvTestRunSettings
let testDef :: TDef
(ProgressReporter
-> ((HList outers -> inner -> IO ()) -> IO ()) -> IO TestRunResult)
testDef =
TDef :: forall value. value -> CallStack -> TDef value
TDef
{ testDefVal :: ProgressReporter
-> ((HList outers -> inner -> IO ()) -> IO ()) -> IO TestRunResult
testDefVal = \ProgressReporter
progressReporter (HList outers -> inner -> IO ()) -> IO ()
supplyArgs ->
test
-> TestRunSettings
-> ProgressReporter
-> ((Arg1 test -> Arg2 test -> IO ()) -> IO ())
-> IO TestRunResult
forall e.
IsTest e =>
e
-> TestRunSettings
-> ProgressReporter
-> ((Arg1 e -> Arg2 e -> IO ()) -> IO ())
-> IO TestRunResult
runTest
test
t
TestRunSettings
sets
ProgressReporter
progressReporter
(\Arg1 test -> Arg2 test -> IO ()
func -> (HList outers -> inner -> IO ()) -> IO ()
supplyArgs HList outers -> inner -> IO ()
Arg1 test -> Arg2 test -> IO ()
func),
testDefCallStack :: CallStack
testDefCallStack = CallStack
HasCallStack => CallStack
callStack
}
[SpecDefTree outers inner ()] -> TestDefM outers inner ()
forall w (m :: * -> *). MonadWriter w m => w -> m ()
tell [Text
-> TDef
(ProgressReporter
-> ((HList outers -> inner -> IO ()) -> IO ()) -> IO TestRunResult)
-> ()
-> SpecDefTree outers inner ()
forall (outers :: [*]) inner extra.
Text
-> TDef
(ProgressReporter
-> ((HList outers -> inner -> IO ()) -> IO ()) -> IO TestRunResult)
-> extra
-> SpecDefTree outers inner extra
DefSpecifyNode (String -> Text
T.pack String
s) TDef
(ProgressReporter
-> ((HList outers -> inner -> IO ()) -> IO ()) -> IO TestRunResult)
testDef ()]
xitWithAll ::
( HasCallStack,
IsTest test,
Arg1 test ~ HList outers,
Arg2 test ~ inner
) =>
String ->
test ->
TestDefM outers inner ()
xitWithAll :: String -> test -> TestDefM outers inner ()
xitWithAll String
s test
_ = String -> TestDefM outers inner ()
forall (outers :: [*]) inner. String -> TestDefM outers inner ()
pending String
s
specifyWithAll ::
( HasCallStack,
IsTest test,
Arg1 test ~ HList outers,
Arg2 test ~ inner
) =>
String ->
test ->
TestDefM outers inner ()
specifyWithAll :: String -> test -> TestDefM outers inner ()
specifyWithAll = String -> test -> TestDefM outers inner ()
forall test (outers :: [*]) inner.
(HasCallStack, IsTest test, Arg1 test ~ HList outers,
Arg2 test ~ inner) =>
String -> test -> TestDefM outers inner ()
itWithAll
xspecifyWithAll ::
( HasCallStack,
IsTest test,
Arg1 test ~ HList outers,
Arg2 test ~ inner
) =>
String ->
test ->
TestDefM outers inner ()
xspecifyWithAll :: String -> test -> TestDefM outers inner ()
xspecifyWithAll = String -> test -> TestDefM outers inner ()
forall test (outers :: [*]) inner.
(HasCallStack, IsTest test, Arg1 test ~ HList outers,
Arg2 test ~ inner) =>
String -> test -> TestDefM outers inner ()
xitWithAll
prop :: Testable prop => String -> prop -> Spec
prop :: String -> prop -> Spec
prop String
s prop
p = String -> Property -> Spec
forall (outers :: [*]) inner test.
(HasCallStack, IsTest test, Arg1 test ~ (), Arg2 test ~ inner) =>
String -> test -> TestDefM outers inner ()
it String
s (Property -> Spec) -> Property -> Spec
forall a b. (a -> b) -> a -> b
$ prop -> Property
forall prop. Testable prop => prop -> Property
property prop
p
pending :: String -> TestDefM outers inner ()
pending :: String -> TestDefM outers inner ()
pending String
s = [SpecDefTree outers inner ()] -> TestDefM outers inner ()
forall w (m :: * -> *). MonadWriter w m => w -> m ()
tell [Text -> Maybe Text -> SpecDefTree outers inner ()
forall (outers :: [*]) inner extra.
Text -> Maybe Text -> SpecDefTree outers inner extra
DefPendingNode (String -> Text
T.pack String
s) Maybe Text
forall a. Maybe a
Nothing]
pendingWith :: String -> String -> TestDefM outers inner ()
pendingWith :: String -> String -> TestDefM outers inner ()
pendingWith String
description String
reasonWhyItsPending = [SpecDefTree outers inner ()] -> TestDefM outers inner ()
forall w (m :: * -> *). MonadWriter w m => w -> m ()
tell [Text -> Maybe Text -> SpecDefTree outers inner ()
forall (outers :: [*]) inner extra.
Text -> Maybe Text -> SpecDefTree outers inner extra
DefPendingNode (String -> Text
T.pack String
description) (Text -> Maybe Text
forall a. a -> Maybe a
Just (String -> Text
T.pack String
reasonWhyItsPending))]