packages feed

text-show-instances-0.4: tests/Spec/Language/Haskell/THSpec.hs

{-# LANGUAGE CPP #-}
{-|
Module:      Spec.Language.Haskell.THSpec
Copyright:   (C) 2014-2015 Ryan Scott
License:     BSD-style (see the file LICENSE)
Maintainer:  Ryan Scott
Stability:   Experimental
Portability: GHC

@QuickCheck@ properties for data types in the @template-haskell@ library.
-}
module Spec.Language.Haskell.THSpec (main, spec) where

import Instances.Language.Haskell.TH ()

import Language.Haskell.TH.PprLib
import Language.Haskell.TH.Syntax

import Spec.Utils (prop_matchesShow)

import Test.Hspec (Spec, describe, hspec, parallel)
import Test.Hspec.QuickCheck (prop)

import Text.Show.Text (fromString)
import Text.Show.Text.Language.Haskell.TH (showbName')

main :: IO ()
main = hspec spec

spec :: Spec
spec = parallel . describe "Text.Show.Text.Language.Haskell.TH" $ do
#if MIN_VERSION_template_haskell(2,9,0)
    prop "AnnLookup instance"       (prop_matchesShow :: Int -> AnnLookup -> Bool)
    prop "AnnTarget instance"       (prop_matchesShow :: Int -> AnnTarget -> Bool)
#endif
    prop "Body instance"            (prop_matchesShow :: Int -> Body -> Bool)
    prop "Callconv instance"        (prop_matchesShow :: Int -> Callconv -> Bool)
#if MIN_VERSION_template_haskell(2,5,0) && !(MIN_VERSION_template_haskell(2,7,0))
    prop "ClassInstance instance"   (prop_matchesShow :: Int -> ClassInstance -> Bool)
#endif
    prop "Clause instance"          (prop_matchesShow :: Int -> Clause -> Bool)
    prop "Con instance"             (prop_matchesShow :: Int -> Con -> Bool)
    prop "Dec instance"             (prop_matchesShow :: Int -> Dec -> Bool)
    prop "Exp instance"             (prop_matchesShow :: Int -> Exp -> Bool)
    prop "FamFlavour instance"      (prop_matchesShow :: Int -> FamFlavour -> Bool)
    prop "Fixity instance"          (prop_matchesShow :: Int -> Fixity -> Bool)
    prop "FixityDirection instance" (prop_matchesShow :: Int -> FixityDirection -> Bool)
    prop "Foreign instance"         (prop_matchesShow :: Int -> Foreign -> Bool)
    prop "FunDep instance"          (prop_matchesShow :: Int -> FunDep -> Bool)
    prop "Guard instance"           (prop_matchesShow :: Int -> Guard -> Bool)
    prop "Info instance"            (prop_matchesShow :: Int -> Info -> Bool)
#if MIN_VERSION_template_haskell(2,8,0)
    prop "Inline instance"          (prop_matchesShow :: Int -> Inline -> Bool)
#else
    prop "InlineSpec instance"      (prop_matchesShow :: Int -> InlineSpec -> Bool)
#endif
    prop "Kind instance"            (prop_matchesShow :: Int -> Kind -> Bool)
    prop "Lit instance"             (prop_matchesShow :: Int -> Lit -> Bool)
    prop "Loc instance"             (prop_matchesShow :: Int -> Loc -> Bool)
    prop "Match instance"           (prop_matchesShow :: Int -> Match -> Bool)
    prop "ModName instance"         (prop_matchesShow :: Int -> ModName -> Bool)
#if MIN_VERSION_template_haskell(2,9,0)
    prop "Module instance"          (prop_matchesShow :: Int -> Module -> Bool)
    prop "ModuleInfo instance"      (prop_matchesShow :: Int -> ModuleInfo -> Bool)
#endif
    prop "Name instance"            (prop_matchesShow :: Int -> Name -> Bool)
    prop "showbName' output"        prop_showName'
    prop "OccName instance"         (prop_matchesShow :: Int -> OccName -> Bool)
    prop "Pat instance"             (prop_matchesShow :: Int -> Pat -> Bool)
#if MIN_VERSION_template_haskell(2,8,0)
    prop "Phases instance"          (prop_matchesShow :: Int -> Phases -> Bool)
#endif
    prop "PkgName instance"         (prop_matchesShow :: Int -> PkgName -> Bool)
    prop "Pred instance"            (prop_matchesShow :: Int -> Pred -> Bool)
    prop "Pragma instance"          (prop_matchesShow :: Int -> Pragma -> Bool)
    prop "Range instance"           (prop_matchesShow :: Int -> Range -> Bool)
#if MIN_VERSION_template_haskell(2,9,0)
    prop "Role instance"            (prop_matchesShow :: Int -> Role -> Bool)
#endif
#if MIN_VERSION_template_haskell(2,8,0)
    prop "RuleBndr instance"        (prop_matchesShow :: Int -> RuleBndr -> Bool)
    prop "RuleMatch instance"       (prop_matchesShow :: Int -> RuleMatch -> Bool)
#endif
    prop "Safety instance"          (prop_matchesShow :: Int -> Safety -> Bool)
    prop "Stmt instance"            (prop_matchesShow :: Int -> Stmt -> Bool)
    prop "Strict instance"          (prop_matchesShow :: Int -> Strict -> Bool)
#if MIN_VERSION_template_haskell(2,8,0)
    prop "TyLit instance"           (prop_matchesShow :: Int -> TyLit -> Bool)
#endif
    prop "Type instance"            (prop_matchesShow :: Int -> Type -> Bool)
#if MIN_VERSION_template_haskell(2,9,0)
    prop "TySynEqn instance"        (prop_matchesShow :: Int -> TySynEqn -> Bool)
#endif
    prop "TyVarBndr instance"       (prop_matchesShow :: Int -> TyVarBndr -> Bool)
    prop "Doc instance"             (prop_matchesShow :: Int -> Doc -> Bool)

-- | Verifies that `showName'` and `showbName'` have the same output.
prop_showName' :: NameIs -> Name -> Bool
prop_showName' nameIs name = fromString (showName' nameIs name) == showbName' nameIs name