content: #!/usr/bin/env runhaskell
  import Distribution.Simple
  import qualified Data.List as L
  import System.Directory
  import qualified Data.Char as Ch
  import System.Process (runCommand,waitForProcess)
  
  isHaskellFile file = ".lhs" `L.isSuffixOf` file || ".hs" `L.isSuffixOf` file
  
  moduleName file = L.takeWhile  (/= '.') file
  
  isRequested :: [String] -> String -> Bool
  isRequested requestedTests test = 
    (map Ch.toLower test) `elem` (map (map Ch.toLower) requestedTests)
  
  testMain args _ _ _ = do
    files <- getDirectoryContents "tests"
    let testFiles = filter isHaskellFile files
    let testModules = if null args
                        then map moduleName testFiles
                        else filter (isRequested args) (map moduleName testFiles)
    let testFuncs = map (++ ".main") testModules
    let testExpr = "sequence [ " ++ concat (L.intersperse "," testFuncs) ++ 
                   " ] >>= \\cases -> runTestTT (TestList cases)"
    let moduleLine = concat (L.intersperse " " testModules)
    let cmd = "cd tests && ghc  -XNoMonomorphismRestriction -fglasgow-exts " ++
              "-package HUnit -package parsec-2.1.0.1 -i:../src -e \"" ++ 
              testExpr ++ " >> return ()\" " ++ moduleLine
    putStrLn "Testing command is:"
    putStrLn cmd
    putStrLn "\nLoading tests..."
    handle <- runCommand cmd
    waitForProcess handle
    putStrLn "Testing complete.  Errors reported above (if any)."
  
  
  main = defaultMainWithHooks (simpleUserHooks { runTests = testMain })
  