forAll :: ∀ e a f. Foldable f => (a -> String) -> String -> f a -> (a -> Aff e Unit) -> Spec e Unit
safareli opened this issue · 6 comments
What are thoughts on adding something like this this?
forAll :: ∀ e a f. Foldable f => (a -> String) -> String -> f a -> (a -> Aff e Unit) -> Spec e Unit
forAll itTitle title arb f = describe title do
for_ arb \a -> it (itTitle a) (f a)
...
forAll _.str "format (unformat a) = a" arb \({ str }) -> do
(format $ unformat str) `shouldEqual` (Right str)
...
I have been using for_
in it
block but if some test case fails then other items are not tested and you can't see them in log. using this function you can see each item in log and all of them will be executed.
Yeah, this does seem useful. I have some questions/considerations:
- The name
forAll
feels like it's too close toforall
. Would prefer something closer toit
, as it's basically a "multi-it". Perhapsthey
? - I'd prefer to drop the outer
describe
in this definition, keeping it a bit simpler, and not making an assumption that you want a separate level for the foldable. I'm not sure, but you might want to do something like:describe "many things" do they show [2, 4] \n -> (n `mod` 2) `shouldEqual` 0 they show [4, 8] \n -> (n `mod` 4) `shouldEqual` 0
- And as a last thing, is the argument order the way we want? Not saying it isn't, but you might have feedback on that.
Thanks for the suggestion!
- dropping out
describe
is good idea. they
seems good to me.
so at this point it looks like:
they :: ∀ e a f. Foldable f => (a -> String) -> f a -> (a -> Aff e Unit) -> Aff e Unit
they itTitle arb f = for_ arb \a -> it (itTitle a) (f a)
...
describe "format (unformat a) = a" do
they show arb \(str) -> (format $ unformat str) `shouldEqual` (Right str)
...
About order:
I don't have strong opinion on it, but If we leave f
as last argument, then we have two options:
NAME itTitle arb f
, infix usage:itTitle `NAME` arb f
NAME arb itTitle f
, infix usage:arb `NAME` itTitle f
I can't think of a good name (english is not my native language) but there might be some name which will best fit this usage. maybethat
? (show `that` validDates parseAndUnparseComutes
)
Yeah, I could not come with any specific order either, as it doesn't read naturally anyway. I think we should go with what you already have:
they :: ∀ e a f. Foldable f => (a -> String) -> f a -> (a -> Aff e Unit) -> Aff e Unit
Would you like to submit this as a PR?
Would you like to submit this as a PR?
Yes!