{-# 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 :: forall (outers :: [*]) inner.
String -> TestDefM outers inner () -> TestDefM outers inner ()
describe String
s =
let t :: Text
t = String -> Text
T.pack String
s
in forall r (m :: * -> *) a. MonadReader r m => (r -> r) -> m a -> m a
local (\TestDefEnv
tde -> TestDefEnv
tde {testDefEnvDescriptionPath :: [Text]
testDefEnvDescriptionPath = Text
t forall a. a -> [a] -> [a]
: TestDefEnv -> [Text]
testDefEnvDescriptionPath TestDefEnv
tde})
forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall w (m :: * -> *) a. MonadWriter w m => (w -> w) -> m a -> m a
censor ((forall a. a -> [a] -> [a]
: []) forall b c a. (b -> c) -> (a -> b) -> a -> c
. 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 :: forall (outers :: [*]) inner.
String -> TestDefM outers inner () -> TestDefM outers inner ()
xdescribe String
s = forall (outers :: [*]) inner.
String -> TestDefM outers inner () -> TestDefM outers inner ()
describe String
s forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall w (m :: * -> *) a. MonadWriter w m => (w -> w) -> m a -> m a
censor (forall (outers :: [*]) inner result.
Maybe Text
-> SpecDefForest outers inner result
-> SpecDefForest outers inner result
markSpecForestAsPending forall a. Maybe a
Nothing)
it ::
forall outers inner test.
(HasCallStack, IsTest test, Arg1 test ~ (), Arg2 test ~ inner) =>
String ->
test ->
TestDefM outers inner ()
it :: forall (outers :: [*]) inner test.
(HasCallStack, IsTest test, Arg1 test ~ (), Arg2 test ~ inner) =>
String -> test -> TestDefM outers inner ()
it String
s test
t = forall a. HasCallStack => (HasCallStack => a) -> a
withFrozenCallStack forall a b. (a -> b) -> a -> b
$ do
TestRunSettings
sets <- 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
{ testDefVal :: ProgressReporter
-> ((HList outers -> inner -> IO ()) -> IO ()) -> IO TestRunResult
testDefVal = \ProgressReporter
progressReporter (HList outers -> inner -> IO ()) -> IO ()
supplyArgs ->
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)
),
testDefCallStack :: CallStack
testDefCallStack = HasCallStack => CallStack
callStack
}
forall w (m :: * -> *). MonadWriter w m => w -> m ()
tell [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 :: forall (outers :: [*]) inner test.
(HasCallStack, IsTest test, Arg1 test ~ (), Arg2 test ~ inner) =>
String -> test -> TestDefM outers inner ()
xit String
s test
_ = 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 :: forall (outers :: [*]) inner test.
(HasCallStack, IsTest test, Arg1 test ~ (), Arg2 test ~ inner) =>
String -> test -> TestDefM outers inner ()
specify String
s test
t = forall a. HasCallStack => (HasCallStack => a) -> a
withFrozenCallStack forall a b. (a -> b) -> a -> b
$ forall (outers :: [*]) inner test.
(HasCallStack, IsTest test, Arg1 test ~ (), Arg2 test ~ inner) =>
String -> test -> TestDefM outers inner ()
it String
s test
t
xspecify ::
forall outers inner test.
(HasCallStack, IsTest test, Arg1 test ~ (), Arg2 test ~ inner) =>
String ->
test ->
TestDefM outers inner ()
xspecify :: forall (outers :: [*]) inner test.
(HasCallStack, IsTest test, Arg1 test ~ (), Arg2 test ~ inner) =>
String -> test -> TestDefM outers inner ()
xspecify = 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 :: forall test inner outer (otherOuters :: [*]).
(HasCallStack, IsTest test, Arg1 test ~ inner,
Arg2 test ~ outer) =>
String -> test -> TestDefM (outer : otherOuters) inner ()
itWithOuter String
s test
t = forall a. HasCallStack => (HasCallStack => a) -> a
withFrozenCallStack forall a b. (a -> b) -> a -> b
$ do
TestRunSettings
sets <- 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
{ testDefVal :: ProgressReporter
-> ((HList (outer : otherOuters) -> inner -> IO ()) -> IO ())
-> IO TestRunResult
testDefVal = \ProgressReporter
progressReporter (HList (outer : otherOuters) -> inner -> IO ()) -> IO ()
supplyArgs ->
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 forall a b. (a -> b) -> a -> b
$ \(HCons e
outerArgs HList l
_) inner
innerArg -> Arg1 test -> Arg2 test -> IO ()
func inner
innerArg e
outerArgs),
testDefCallStack :: CallStack
testDefCallStack = HasCallStack => CallStack
callStack
}
forall w (m :: * -> *). MonadWriter w m => w -> m ()
tell [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 :: forall test inner outer (otherOuters :: [*]).
(HasCallStack, IsTest test, Arg1 test ~ inner,
Arg2 test ~ outer) =>
String -> test -> TestDefM (outer : otherOuters) inner ()
xitWithOuter String
s test
_ = 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 :: forall test inner outer (otherOuters :: [*]).
(HasCallStack, IsTest test, Arg1 test ~ inner,
Arg2 test ~ outer) =>
String -> test -> TestDefM (outer : otherOuters) inner ()
specifyWithOuter String
s test
t = forall a. HasCallStack => (HasCallStack => a) -> a
withFrozenCallStack forall a b. (a -> b) -> a -> b
$ forall test inner outer (otherOuters :: [*]).
(HasCallStack, IsTest test, Arg1 test ~ inner,
Arg2 test ~ outer) =>
String -> test -> TestDefM (outer : otherOuters) inner ()
itWithOuter String
s test
t
xspecifyWithOuter ::
(HasCallStack, IsTest test, Arg1 test ~ inner, Arg2 test ~ outer) =>
String ->
test ->
TestDefM (outer ': otherOuters) inner ()
xspecifyWithOuter :: forall test inner outer (otherOuters :: [*]).
(HasCallStack, IsTest test, Arg1 test ~ inner,
Arg2 test ~ outer) =>
String -> test -> TestDefM (outer : otherOuters) inner ()
xspecifyWithOuter = 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 :: forall test outer inner (otherOuters :: [*]).
(HasCallStack, IsTest test, Arg1 test ~ outer,
Arg2 test ~ inner) =>
String -> test -> TestDefM (outer : otherOuters) inner ()
itWithBoth String
s test
t = forall a. HasCallStack => (HasCallStack => a) -> a
withFrozenCallStack forall a b. (a -> b) -> a -> b
$ do
TestRunSettings
sets <- 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
{ testDefVal :: ProgressReporter
-> ((HList (outer : otherOuters) -> inner -> IO ()) -> IO ())
-> IO TestRunResult
testDefVal = \ProgressReporter
progressReporter (HList (outer : otherOuters) -> inner -> IO ()) -> IO ()
supplyArgs ->
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 forall a b. (a -> b) -> a -> b
$ \(HCons e
outerArgs HList l
_) inner
innerArg -> Arg1 test -> Arg2 test -> IO ()
func e
outerArgs inner
innerArg),
testDefCallStack :: CallStack
testDefCallStack = HasCallStack => CallStack
callStack
}
forall w (m :: * -> *). MonadWriter w m => w -> m ()
tell [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 :: forall test outer inner (otherOuters :: [*]).
(HasCallStack, IsTest test, Arg1 test ~ outer,
Arg2 test ~ inner) =>
String -> test -> TestDefM (outer : otherOuters) inner ()
xitWithBoth String
s test
_ = 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 :: forall test outer inner (otherOuters :: [*]).
(HasCallStack, IsTest test, Arg1 test ~ outer,
Arg2 test ~ inner) =>
String -> test -> TestDefM (outer : otherOuters) inner ()
specifyWithBoth String
s test
t = forall a. HasCallStack => (HasCallStack => a) -> a
withFrozenCallStack forall a b. (a -> b) -> a -> b
$ forall test outer inner (otherOuters :: [*]).
(HasCallStack, IsTest test, Arg1 test ~ outer,
Arg2 test ~ inner) =>
String -> test -> TestDefM (outer : otherOuters) inner ()
itWithBoth String
s test
t
xspecifyWithBoth ::
( HasCallStack,
IsTest test,
Arg1 test ~ outer,
Arg2 test ~ inner
) =>
String ->
test ->
TestDefM (outer ': otherOuters) inner ()
xspecifyWithBoth :: forall test outer inner (otherOuters :: [*]).
(HasCallStack, IsTest test, Arg1 test ~ outer,
Arg2 test ~ inner) =>
String -> test -> TestDefM (outer : otherOuters) inner ()
xspecifyWithBoth = 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 :: forall test (outers :: [*]) inner.
(HasCallStack, IsTest test, Arg1 test ~ HList outers,
Arg2 test ~ inner) =>
String -> test -> TestDefM outers inner ()
itWithAll String
s test
t = forall a. HasCallStack => (HasCallStack => a) -> a
withFrozenCallStack forall a b. (a -> b) -> a -> b
$ do
TestRunSettings
sets <- 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
{ testDefVal :: ProgressReporter
-> ((HList outers -> inner -> IO ()) -> IO ()) -> IO TestRunResult
testDefVal = \ProgressReporter
progressReporter (HList outers -> inner -> IO ()) -> IO ()
supplyArgs ->
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 Arg1 test -> Arg2 test -> IO ()
func),
testDefCallStack :: CallStack
testDefCallStack = HasCallStack => CallStack
callStack
}
forall w (m :: * -> *). MonadWriter w m => w -> m ()
tell [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 :: forall test (outers :: [*]) inner.
(HasCallStack, IsTest test, Arg1 test ~ HList outers,
Arg2 test ~ inner) =>
String -> test -> TestDefM outers inner ()
xitWithAll String
s test
_ = 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 :: forall test (outers :: [*]) inner.
(HasCallStack, IsTest test, Arg1 test ~ HList outers,
Arg2 test ~ inner) =>
String -> test -> TestDefM outers inner ()
specifyWithAll String
s test
t = forall a. HasCallStack => (HasCallStack => a) -> a
withFrozenCallStack forall a b. (a -> b) -> a -> b
$ forall test (outers :: [*]) inner.
(HasCallStack, IsTest test, Arg1 test ~ HList outers,
Arg2 test ~ inner) =>
String -> test -> TestDefM outers inner ()
itWithAll String
s test
t
xspecifyWithAll ::
( HasCallStack,
IsTest test,
Arg1 test ~ HList outers,
Arg2 test ~ inner
) =>
String ->
test ->
TestDefM outers inner ()
xspecifyWithAll :: forall test (outers :: [*]) inner.
(HasCallStack, IsTest test, Arg1 test ~ HList outers,
Arg2 test ~ inner) =>
String -> test -> TestDefM outers inner ()
xspecifyWithAll = 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 :: forall prop. Testable prop => String -> prop -> Spec
prop String
s prop
p = forall a. HasCallStack => (HasCallStack => a) -> a
withFrozenCallStack forall a b. (a -> b) -> a -> b
$ forall (outers :: [*]) inner test.
(HasCallStack, IsTest test, Arg1 test ~ (), Arg2 test ~ inner) =>
String -> test -> TestDefM outers inner ()
it String
s forall a b. (a -> b) -> a -> b
$ forall prop. Testable prop => prop -> Property
property prop
p
pending :: String -> TestDefM outers inner ()
pending :: forall (outers :: [*]) inner. String -> TestDefM outers inner ()
pending String
s = forall w (m :: * -> *). MonadWriter w m => w -> m ()
tell [forall (outers :: [*]) inner extra.
Text -> Maybe Text -> SpecDefTree outers inner extra
DefPendingNode (String -> Text
T.pack String
s) forall a. Maybe a
Nothing]
pendingWith :: String -> String -> TestDefM outers inner ()
pendingWith :: forall (outers :: [*]) inner.
String -> String -> TestDefM outers inner ()
pendingWith String
description String
reasonWhyItsPending = forall w (m :: * -> *). MonadWriter w m => w -> m ()
tell [forall (outers :: [*]) inner extra.
Text -> Maybe Text -> SpecDefTree outers inner extra
DefPendingNode (String -> Text
T.pack String
description) (forall a. a -> Maybe a
Just (String -> Text
T.pack String
reasonWhyItsPending))]