Version 0.9.39 of the Tupelo library <https://github.com/cloojure/tupelo>
has been released.
Tupelo is a library of helper and convenience functions to make working
with Clojure simpler, easier, and more bulletproof.
I've been working on some parsing & validation code recently and had
occasion to use a very handy function in the unit tests. Often during
testing we wish to validate only part of a return value, and ignore certain
parts that are non-deterministic or otherwise non-diffable. Think of
values like a timestamp, UUID, or the `#db/id` value in Datomic. The value
of fields like these cannot be predicted in advance and are normally not
germane to problem under test.
In my problem, I have been making small "records" that look like this:
[:range {:low low
:high high
:fn-validate (fn [arg] (<= low arg high))}]
In this case, I can't just do an equals comparison in a unit test since one
cannot easily compare a function object to see if it is the expected value.
One could use `extract-keys` or similar and test a derived record, but that
is extra work (esp. for nested arrays & maps) and obscures the simple goal
of the test.
Enter the Tupelo function `wild-match`
<https://github.com/cloojure/tupelo#fast--simple-wild-card-matches>. It
allows one to use a wild card :* to ignore values in a vector and/or map
that we don't care about. In this case we can write the tests:
(is (wild-match? [:range {:low 123 :high 456 :fn-validate :*}] (parse-
and-transform "123..456")))
(is (wild-match? [:range {:low 123 :high 456 :fn-validate :*}] (parse-
and-transform "123 .. 456")))
(is (wild-match? [:range {:low 123 :high 456 :fn-validate :*}] (parse-
and-transform " 123 .. 456 ")))
(is (wild-match? [:range {:low -123 :high -45 :fn-validate :*}] (parse-
and-transform "-123..-45")))
We just use the :* wildcard to ignore the fields we don't care about, and
`wild-match?` takes care of the rest. Note that it works equally well on
vectors & on maps. The function signature is:
(wild-match? pattern & values)
Note that, since we put the pattern first, we can match multiple data
values simultaneously:
(wild-match? {:a :* :b 2}
{:a 1 :b 2}) ;=> true
(wild-match? [1 :* 3]
[1 2 3]
[1 9 3] )) ;=> true
(wild-match? {:a :* :b 2}
{:a [1 2 3] :b 2}) ;=> true
Enjoy,
Alan
--
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to [email protected]
Note that posts from new members are moderated - please be patient with your
first post.
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en
---
You received this message because you are subscribed to the Google Groups
"Clojure" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.