{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE FunctionalDependencies #-}
module Test.HMock.Rule
( Rule,
Expectable (..),
(|->),
(|=>),
WholeMethodMatcher (SuchThat),
)
where
import Test.HMock.Internal.Rule (Rule (..), WholeMethodMatcher (..))
import {-# SOURCE #-} Test.HMock.Internal.State (MockT)
import Test.HMock.Mockable (MockableBase (Action, Matcher))
class Expectable cls name m r ex | ex -> cls name m r where
toRule :: ex -> Rule cls name m r
(|=>) ::
Expectable cls name m r ex =>
ex ->
(Action cls name m r -> MockT m r) ->
Rule cls name m r
ex
e |=> :: ex -> (Action cls name m r -> MockT m r) -> Rule cls name m r
|=> Action cls name m r -> MockT m r
r = WholeMethodMatcher cls name m r
m WholeMethodMatcher cls name m r
-> [Action cls name m r -> MockT m r] -> Rule cls name m r
forall (cls :: (* -> *) -> Constraint) (name :: Symbol)
(m :: * -> *) r.
WholeMethodMatcher cls name m r
-> [Action cls name m r -> MockT m r] -> Rule cls name m r
:=> ([Action cls name m r -> MockT m r]
rs [Action cls name m r -> MockT m r]
-> [Action cls name m r -> MockT m r]
-> [Action cls name m r -> MockT m r]
forall a. [a] -> [a] -> [a]
++ [Action cls name m r -> MockT m r
r]) where WholeMethodMatcher cls name m r
m :=> [Action cls name m r -> MockT m r]
rs = ex -> Rule cls name m r
forall (cls :: (* -> *) -> Constraint) (name :: Symbol)
(m :: * -> *) r ex.
Expectable cls name m r ex =>
ex -> Rule cls name m r
toRule ex
e
infixl 1 |=>
(|->) ::
(Monad m, Expectable cls name m r ex) =>
ex ->
r ->
Rule cls name m r
ex
m |-> :: ex -> r -> Rule cls name m r
|-> r
r = ex
m ex -> (Action cls name m r -> MockT m r) -> Rule cls name m r
forall (cls :: (* -> *) -> Constraint) (name :: Symbol)
(m :: * -> *) r ex.
Expectable cls name m r ex =>
ex -> (Action cls name m r -> MockT m r) -> Rule cls name m r
|=> MockT m r -> Action cls name m r -> MockT m r
forall a b. a -> b -> a
const (r -> MockT m r
forall (m :: * -> *) a. Monad m => a -> m a
return r
r)
infixl 1 |->
instance Expectable cls name m r (Rule cls name m r) where
toRule :: Rule cls name m r -> Rule cls name m r
toRule = Rule cls name m r -> Rule cls name m r
forall a. a -> a
id
instance Expectable cls name m r (Matcher cls name m r) where
toRule :: Matcher cls name m r -> Rule cls name m r
toRule Matcher cls name m r
m = Matcher cls name m r -> WholeMethodMatcher cls name m r
forall (cls :: (* -> *) -> Constraint) (name :: Symbol)
(m :: * -> *) r.
Matcher cls name m r -> WholeMethodMatcher cls name m r
JustMatcher Matcher cls name m r
m WholeMethodMatcher cls name m r
-> [Action cls name m r -> MockT m r] -> Rule cls name m r
forall (cls :: (* -> *) -> Constraint) (name :: Symbol)
(m :: * -> *) r.
WholeMethodMatcher cls name m r
-> [Action cls name m r -> MockT m r] -> Rule cls name m r
:=> []
instance Expectable cls name m r (WholeMethodMatcher cls name m r) where
toRule :: WholeMethodMatcher cls name m r -> Rule cls name m r
toRule WholeMethodMatcher cls name m r
m = WholeMethodMatcher cls name m r
m WholeMethodMatcher cls name m r
-> [Action cls name m r -> MockT m r] -> Rule cls name m r
forall (cls :: (* -> *) -> Constraint) (name :: Symbol)
(m :: * -> *) r.
WholeMethodMatcher cls name m r
-> [Action cls name m r -> MockT m r] -> Rule cls name m r
:=> []