content: {-# LANGUAGE TemplateHaskell, StandaloneDeriving #-}
  import Test.FitSpec
  import Language.Haskell.Parser
  import Language.Haskell.Pretty as P
  import Language.Haskell.Syntax
  import Data.Ratio
  import Data.List (intercalate)
  import Data.Function (on)
  import Data.Char
  
  deriving instance Eq HsModule -- needed for Mutable
  
  deriveMutableCascading ''HsModule
  
  -- change ``take 5'' below to ``take n'' where n `elem` [1,2,3,4]
  -- to see surviving mutants for different refinements
  --
  -- All 5 properties should be reported as ``apparently complete''
  -- so no surviving mutants.
  properties :: (HsModule -> String) -> [Property]
  properties prettyPrint = take 5
    [ property $
        \nm loc -> (prettyPrint $ HsModule loc (Module nm) Nothing [] [])
                == "module " ++ nm ++ " where"
  
    , property $
        \nm loc -> (prettyPrint $ HsModule loc (Module nm) (Just []) [] [])
                == "module " ++ nm ++ " () where"
  
    , property $
        \nm loc -> (prettyPrint $ HsModule loc (Module nm) Nothing [] [HsFunBind []])
                == "module " ++ nm ++ " where"
  
    , property $
        \nm loc imports decls ->
             (prettyPrint $ HsModule loc (Module nm) Nothing imports decls)
         === unlines (("module " ++ nm ++ " where")
                     :(map P.prettyPrint imports
                    ++ map P.prettyPrint decls))
  
    , property $
        \nm loc imports exports decls ->
             (prettyPrint $ HsModule loc (Module nm) (Just exports) imports decls)
         === unlines (["module " ++ nm ++ " ("
                                 ++ intercalate ", " (map P.prettyPrint exports)
                                 ++ ") where"]
                   ++ map P.prettyPrint imports
                   ++ map P.prettyPrint decls)
    ]
    where
    (===) :: String -> String -> Bool
    (===) = (==) `on` (filter (not . null) . lines)
  
  main = mainWith args { names = ["prettyPrint"]
                       , timeout = 0
                       }
                  prettyPrint
                  properties
  