uncomplicate.fluokitten.test
Macros that generate Midje tests for various laws that
categorical concepts have to satisfy. You should use these tests
to check if your implementations of clojure protocols are valid
beyond what the compiler can assert.
applicative-law1
macro
(applicative-law1 f x & xs)
Generates a test that checks if the applicative functor x
satisfies the first applicative law:
(fapply (pure x f) x) => (fmap f x)
applicative-law2-identity
macro
(applicative-law2-identity x)
Generates a test that checks if the applicative functor x
satisfies the second applicative law:
(fapply (pure x identity) x) => x
applicative-law3-composition
macro
(applicative-law3-composition u v x & xs)
Generates a test that checks if the applicative functor x
satisfies the third applicative law:
(<*> (pure x (curry comp)) u v x)
=> (fapply u (fapply v x))
applicative-law4-homomorphism
macro
(applicative-law4-homomorphism ap f x & xs)
Generates a test that checks if the applicative functor x
satisfies the fourth applicative law:
(fapply (pure a f) (pure a x)) => (f x)
applicative-law5-interchange
macro
(applicative-law5-interchange ap f x & xs)
Generates a test that checks if the applicative functor x
satisfies the fifth applicative law:
(fapply u (pure a y)) => (fapply (pure a fn(% y)) u)
check-eq
(check-eq expected)
(check-eq expected actual)
Midje checker that check for the equality of contents in contexts such
as references and reducibles.
fapply-keeps-type
macro
(fapply-keeps-type f x & xs)
Generates a test that checks if the applicative functor x's
implementation of fapply keeps the type of x when the function
inside f is applied to its content.
fmap-keeps-type
macro
(fmap-keeps-type f x & xs)
Generates a test that checks if the functor x's implementation of
fmap keeps the type of x when f is applied to its content.
functor-law2
macro
(functor-law2 f x)
(functor-law2 f g x & xs)
Generates a test that checks if the functor x satisfies
the Second Functor Law:
(fmap (comp f g)) => (fmap f (fmap g))
or, when applied to a concrete functor:
(fmap (comp f g) x) => (fmap f (fmap g x))
magma-op-keeps-type
macro
(magma-op-keeps-type x y & ys)
Generates a test that checks if the operation op is closed on magma x.
monad-law1-left-identity
macro
(monad-law1-left-identity m g x & xs)
Generates a test that checks if the monad x
satisfies the first monad law:
(bind (pure m x) f) => (g x)
monad-law2-right-identity
macro
(monad-law2-right-identity m)
Generates a test that checks if the monad x
satisfies the secondmonad law:
(bind m (pure m)) => m
monad-law3-associativity
macro
(monad-law3-associativity f g m & ms)
Generates a test that checks if the monad x
satisfies the third monad law:
(bind m (fn [x] (bind (f x) g)
monoid-identity-law
macro
(monoid-identity-law x & xs)
Generates a test that checks whether the Monoid implementation x
satisfies the monoid identity law, i.e. if identity element for op
exists:
(op x (id x)) => x
(op (id x) x) => x
semigroup-op-associativity
macro
(semigroup-op-associativity x y & ys)
Generates a test that checks if x and op form a semigroup,
i.e whether op is associative:
(op (op a b)) => (op a (op b c))