-
Notifications
You must be signed in to change notification settings - Fork 129
Defining checkers for use in prerequisites
The discussion of prerequisites pointed out a special case for prerequisite arguments. Consider this:
(provided
(f even?) => 3)
The prerequisite applies when f
is called with the function even?
. It would not apply to a call like (f 2)
. That's different than checkables, where functions are applied to arguments to judge them:
(fact 4 => even?)
However, Midje's predefined checkers work the same in both positions:
(provided
(f truthy) => 3)) ; looking for a non-nil, non-false value
(fact (f) => truthy) ; looking for a non-nil, non-false value
What makes Midje's predefined checkers special? Metadata:
user=> (meta truthy)
{:midje/checker true}
The as-checker
function adds this metadata to its argument, allowing prerequisites like this:
(provided
(f (as-checker even?)) => 3)
If you're defining a function that'll often be used to match prerequisite arguments, define it the way Midje's built-in checkers are. Here's the definition for a simple checker:
(defchecker anything [actual] ...)
Here's the definition for a checker that takes an argument and produces a function:
(defchecker roughly [expected delta]
(checker [actual] ...))