hspec-tables: Table-driven (by-example) HSpec tests

[ library, mit, testing ] [ Propose Tags ]

Table-driven (by-example) HSpec tests

[Skip to Readme]
Versions [faq] 0.0.1
Change log CHANGELOG.md
Dependencies base (>= && <4.15), hspec-core (==2.7.*) [details]
License MIT
Copyright 2020 Marcin Rzeźnicki
Author Marcin Rzeźnicki
Maintainer Marcin Rzeźnicki <marcin.rzeznicki@gmail.com>
Revised Revision 1 made by rzeznik at 2020-05-18T11:45:34Z
Category Testing
Home page https://github.com/marcin-rzeznicki/hspec-tables
Bug tracker https://github.com/marcin-rzeznicki/hspec-tables/issues
Source repo head: git clone https://github.com/marcin-rzeznicki/hspec-tables.git
Uploaded by rzeznik at 2020-04-27T20:50:17Z
Distributions NixOS:0.0.1
Downloads 101 total (5 in the last 30 days)
Rating (no votes yet) [estimated by Bayesian average]
Your Rating
  • λ
  • λ
  • λ
Status Hackage Matrix CI
Docs uploaded by user
Build status unknown [no reports yet]


[Index] [Quick Jump]


Note: This package has metadata revisions in the cabal description newer than included in the tarball. To unpack the package including the revisions, use 'cabal get'.

Maintainer's Corner

For package maintainers and hackage trustees

Readme for hspec-tables-0.0.1

[back to package description]


Hackage Stackage Lts Stackage Nightly MIT license Build Status

Test.Hspec.Tables allows you to define table-driven (or, by-example) HSpec tests. For example:

import Test.Hspec
import Test.Hspec.Tables

example1 :: Spec
example1 =
  describe "multiplication table" $
      ("x", "y", "result")
      [ (0, 0, 0),
        (0, 1, 0),
        (0, 2, 0),
        (1, 0, 0),
        (1, 1, 1),
        (1, 2, 2),
        (2, 0, 0),
        (2, 1, 2),
        (2, 2, 4)
      (\a b expected -> a * b == expected)


example2 :: Spec
example2 =
  describe "reverse" $
      ("list", "reversed")
      [("abc", "cba"), ("", ""), ("0123456", "6543210")]
      (shouldBe . reverse)

When you run these, you'll see that each row becomes a seperate test labelled with show row (so the requirement for rows is to consist of elements that have a Show instance):

Example specs
  multiplication table

Finished in 0.0008 seconds
12 examples, 0 failures

The byExample method is type-safe. The table header must be a 2- to 7- element tuple of String and you must provide the same number of "columns" or it doesn't compile. So if you attempted to write:

example1 :: Spec
example1 =
      ("x", "y", "result") -- 3 columns
      [ (0, 0, 0, 0) ]     -- 4 columns
      (\a b c expected -> a * b * c == expected)

then you should get the following error, hopefully guiding to what the problem is

    • Couldn't match type ‘([Char], [Char], [Char])’
                     with ‘(String, String, String, String)’
      Expected type: Test.Hspec.Tables.Header
                       (Integer, Integer, Integer, Integer)
        Actual type: ([Char], [Char], [Char])

The assertion function will match the table type, so if your table is of shape (a, b, c) then the assertion is assumed to be of type (Example e) => a -> b -> c -> e (ie. it's always curried). Example comes from HSpec


  • You can define tables up-to 7 columns (adding columns beyond that requires providing an instance of the Table type-class)