Skip to content

forAll :: ∀ e a f. Foldable f => (a -> String) -> String -> f a -> (a -> Aff e Unit) -> Spec e Unit #49

Open

Description

@safareli

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.

Activity

  1. felixSchl commented on Apr 25, 2017

    @felixSchl
    Collaborator

    I would welcome utility functions like these as I have been re-inventing that wheel many times over for neodoc

  2. mostalive commented on Apr 26, 2017

    @mostalive
    Collaborator
  3. owickstrom commented on Apr 27, 2017

    @owickstrom
    Collaborator

    Yeah, this does seem useful. I have some questions/considerations:

    • The name forAll feels like it's too close to forall. Would prefer something closer to it, as it's basically a "multi-it". Perhaps they?
    • 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!

  4. safareli commented on Apr 27, 2017

    @safareli
    MemberAuthor
    • 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. maybe that? (show `that` validDates parseAndUnparseComutes)
  5. owickstrom commented on Apr 28, 2017

    @owickstrom
    Collaborator

    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?

  6. safareli commented on Apr 28, 2017

    @safareli
    MemberAuthor

    Would you like to submit this as a PR?

    Yes!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions