[Haskell-cafe] packages and QuickCheck

Conal Elliott conal at conal.net
Tue Sep 9 11:55:49 EDT 2008


Hi Sean.

Thanks a bunch for these tips.  I haven't used the flags feature of cabal
before, and i don't seem to be able to get it right.  I have:

Flag test
  Description: Enable testing
  Default:     False

And I get "Warning: unamb.cabal: Unknown section type: flag ignoring...".
If I indent, I instead get "These flags are used without having been
defined: test".  Any idea what I'm doing wrong here?

  - Conal


On Tue, Sep 9, 2008 at 4:32 PM, Sean Leather <leather at cs.uu.nl> wrote:

>
>  How do folks like to package up QuickCheck tests for their libraries?  In
>>>> the main library?  As a separate repo & package?  Same repo & separate
>>>> package?  Keeping tests with the tested code allows testing of non-exported
>>>> functionality, but can add quite a lot of clutter.
>>>>
>>>
>>> I have QuickCheck properties plus HUnit tests, but I think the question
>>> is the same. For me, it's in the same repository and shipped with the
>>> package source. I think that if you ship source (even via Hackage), you
>>> should also ship tests. So, if somebody wants to modify the source, they can
>>> run the tests. And making it convenient to test is very important, so I have
>>> "cabal test" (or "runhaskell Setup.hs test" without cabal-install)
>>> configured to run the tests. I don't think tests should (in general) be part
>>> of the user-visible API, so I have them external to the module hierarchy.
>>>
>>
>> How do you set up cabal to do these tests?
>>
>
> I use the "runTests" hook in Distribution.Simple. The code below works on
> Windows and Mac, because that's what we use.
>
> \begin{code}
> module Main (main) where
>
> import Distribution.Simple
> import System.Cmd (system)
> import System.FilePath ((</>))
>
> main :: IO ()
> main = defaultMainWithHooks hooks where
>   hooks = simpleUserHooks { runTests = runTests' }
>
> runTests' _ _ _ _ = system cmd >> return ()
>   where testdir = "dist" </> "build" </> "test"
>         testcmd = "." </> "test"
>         cmd = "cd " ++ testdir ++ " && " ++ testcmd
> \end{code}
>
> Do your libraries depend on HUnit?
>>
>
> No, because I use an ultra-secret trick. ;) I have a Library in my .cabal
> file and an Executable for testing. Part of the test description follows.
>
> \begin{cabal}
> Executable test
>   hs-source-dirs:       src, tests, examples
>   main-is:              Main.hs
>
>   -- Only enable the build-depends here if configured with "-ftest". This
>   -- keeps users from having to install QuickCheck 2 in order to use EMGM.
>   if flag(test)
>     build-depends:      QuickCheck >= 2.0, HUnit >= 1.2
>   else
>     buildable:          False
> \end{cabal}
>
> With that last flag-based if/else, I hide the dependencies for normal
> building ('test' by default is False). If 'test' is False, then the
> executable also cannot be built.
>
> Where do you like to place your tests?  In the functionality modules?  A
>> parallel structure?  A single Test.hs file somewhere?
>>
>
> In a separate "tests" directory at the same level as the "src" directory
> containing the module hierarchy. It has a number of files, mostly one per
> module tested.
>
>
>> Testing non-exported functionality without exporting the test interface
>>> seems difficult in general. Is there a way to hide part of a module
>>> interface with Cabal? Then, you could have a 'test' function exported from
>>> each module for testing but hidden for release.
>>>
>>
>> My current leaning is to split a package "foo" into packages "foo" and
>>>> "foo-test"
>>>>
>>>
>>> What benefit does this provide?
>>>
>>
>> It keeps the library and its dependencies small.  Probably some of the
>> alternatives do as well.  For testing, I'm using checkers<http://haskell.org/haskellwiki/Checkers>in addition to QuickCheck, and I'd prefer not to make casual library users
>> have to pull in those libraries as well.
>>
>
> Ah, so you're handling the same problem we are in a different way. Nice!
>
> Sean
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://www.haskell.org/pipermail/haskell-cafe/attachments/20080909/359d6e33/attachment.htm


More information about the Haskell-Cafe mailing list