#!/usr/bin/runhugs -- $Id: quickcheck,v 1.4 2003/01/08 15:09:22 shae Exp $ -- This file defines a command -- quickCheck -- which invokes quickCheck on all properties defined in the files given as -- arguments, by generating an input script for hugs and then invoking it. -- quickCheck recognises the options -- +names print the name of each property before checking it -- -names do not print property names (the default) -- Other options (beginning with + or -) are passed unchanged to hugs. -- -- Change the first line of this file to the location of runhugs on your -- system. -- Make the file executable. -- -- TODO: -- someone on #haskell asked about supporting QC tests inside LaTeX, ex. \{begin} \{end}, how? -- add a verbosity switch that uses verboseCheck instead of quickCheck import System import List main :: IO () main = do as<-getArgs sequence_ (map (process (filter isOption as)) (filter (not.isOption) as)) -- ugly hack for .lhs files, is there a better way? unlit [] = [] unlit x = if (head x) == '>' then (tail x) else x process opts file = let (namesOpt,opts') = getOption "names" "-names" opts in do xs<-readFile file let names = nub$ filter (\x -> (("> prop_" `isPrefixOf` x) || ("prop_" `isPrefixOf` x))) (map (fst.head.lex.unlit) (lines xs)) if null names then putStr (file++": no properties to check\n") else do writeFile "hugsin"$ unlines ((":l "++file): [(if namesOpt=="+names" then "putStr \""++p++": \" >> " else "") ++ "QuickCheck.quickCheck "++p | p<-names]) system ("./ghci "++options opts'++"