packages feed

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

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

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

import Data.Proxy (Proxy(..))

import Instances.Language.Haskell.TH ()

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

import Spec.Utils (matchesTextShowSpec)

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

import TextShow (fromString)
import TextShow.Language.Haskell.TH (showbName')

main :: IO ()
main = hspec spec

spec :: Spec
spec = parallel $ do
#if MIN_VERSION_template_haskell(2,9,0)
    describe "AnnLookup" $
        matchesTextShowSpec (Proxy :: Proxy AnnLookup)
    describe "AnnTarget" $
        matchesTextShowSpec (Proxy :: Proxy AnnTarget)
#endif
#if MIN_VERSION_template_haskell(2,11,0)
    describe "Bang" $
        matchesTextShowSpec (Proxy :: Proxy Bang)
#endif
    describe "Body" $
        matchesTextShowSpec (Proxy :: Proxy Body)
    describe "Callconv" $
        matchesTextShowSpec (Proxy :: Proxy Callconv)
#if MIN_VERSION_template_haskell(2,5,0) && !(MIN_VERSION_template_haskell(2,7,0))
    describe "ClassInstance" $
        matchesTextShowSpec (Proxy :: Proxy ClassInstance)
#endif
    describe "Clause" $
        matchesTextShowSpec (Proxy :: Proxy Clause)
    describe "Con" $
        matchesTextShowSpec (Proxy :: Proxy Con)
    describe "Dec" $
        matchesTextShowSpec (Proxy :: Proxy Dec)
#if MIN_VERSION_template_haskell(2,11,0)
    describe "DecidedStrictness" $
        matchesTextShowSpec (Proxy :: Proxy DecidedStrictness)
#endif
#if MIN_VERSION_template_haskell(2,12,0)
    describe "DerivClause" $
        matchesTextShowSpec (Proxy :: Proxy DerivClause)
    describe "DerivStrategy" $
        matchesTextShowSpec (Proxy :: Proxy DerivStrategy)
#endif
    describe "Doc" $
        matchesTextShowSpec (Proxy :: Proxy Doc)
    describe "Exp" $
        matchesTextShowSpec (Proxy :: Proxy Exp)
    describe "FamFlavour" $
        matchesTextShowSpec (Proxy :: Proxy FamFlavour)
#if MIN_VERSION_template_haskell(2,11,0)
    describe "FamilyResultSig" $
        matchesTextShowSpec (Proxy :: Proxy FamilyResultSig)
#endif
    describe "Fixity" $
        matchesTextShowSpec (Proxy :: Proxy Fixity)
    describe "FixityDirection" $
        matchesTextShowSpec (Proxy :: Proxy FixityDirection)
    describe "Foreign" $
        matchesTextShowSpec (Proxy :: Proxy Foreign)
    describe "FunDep" $
        matchesTextShowSpec (Proxy :: Proxy FunDep)
    describe "Guard" $
        matchesTextShowSpec (Proxy :: Proxy Guard)
    describe "Info" $
        matchesTextShowSpec (Proxy :: Proxy Info)
#if MIN_VERSION_template_haskell(2,11,0)
    describe "InjectivityAnn" $
        matchesTextShowSpec (Proxy :: Proxy InjectivityAnn)
#endif
#if MIN_VERSION_template_haskell(2,8,0)
    describe "Inline" $
        matchesTextShowSpec (Proxy :: Proxy Inline)
#else
    describe "InlineSpec" $
        matchesTextShowSpec (Proxy :: Proxy InlineSpec)
#endif
    describe "Kind" $
        matchesTextShowSpec (Proxy :: Proxy Kind)
    describe "Lit" $
        matchesTextShowSpec (Proxy :: Proxy Lit)
    describe "Loc" $
        matchesTextShowSpec (Proxy :: Proxy Loc)
    describe "Match" $
        matchesTextShowSpec (Proxy :: Proxy Match)
    describe "ModName" $
        matchesTextShowSpec (Proxy :: Proxy ModName)
#if MIN_VERSION_template_haskell(2,9,0)
    describe "Module" $
        matchesTextShowSpec (Proxy :: Proxy Module)
    describe "ModuleInfo" $
        matchesTextShowSpec (Proxy :: Proxy ModuleInfo)
#endif
    describe "Name" $
        matchesTextShowSpec (Proxy :: Proxy Name)
    describe "showbName'" $
        prop "has the same output as showName" prop_showName'
    describe "NameFlavour" $
        matchesTextShowSpec (Proxy :: Proxy NameFlavour)
    describe "NameSpace" $
        matchesTextShowSpec (Proxy :: Proxy NameSpace)
    describe "OccName" $
        matchesTextShowSpec (Proxy :: Proxy OccName)
#if MIN_VERSION_template_haskell(2,11,0)
    describe "Overlap" $
        matchesTextShowSpec (Proxy :: Proxy Overlap)
#endif
    describe "Pat" $
        matchesTextShowSpec (Proxy :: Proxy Pat)
#if MIN_VERSION_template_haskell(2,12,0)
    describe "PatSynArgs" $
        matchesTextShowSpec (Proxy :: Proxy PatSynArgs)
    describe "PatSynDir" $
        matchesTextShowSpec (Proxy :: Proxy PatSynDir)
#endif
#if MIN_VERSION_template_haskell(2,8,0)
    describe "Phases" $
        matchesTextShowSpec (Proxy :: Proxy Phases)
#endif
    describe "PkgName" $
        matchesTextShowSpec (Proxy :: Proxy PkgName)
    describe "Pred" $
        matchesTextShowSpec (Proxy :: Proxy Pred)
    describe "Pragma" $
        matchesTextShowSpec (Proxy :: Proxy Pragma)
    describe "Range" $
        matchesTextShowSpec (Proxy :: Proxy Range)
#if MIN_VERSION_template_haskell(2,9,0)
    describe "Role" $
        matchesTextShowSpec (Proxy :: Proxy Role)
#endif
#if MIN_VERSION_template_haskell(2,8,0)
    describe "RuleBndr" $
        matchesTextShowSpec (Proxy :: Proxy RuleBndr)
    describe "RuleMatch" $
        matchesTextShowSpec (Proxy :: Proxy RuleMatch)
#endif
    describe "Safety" $
        matchesTextShowSpec (Proxy :: Proxy Safety)
#if MIN_VERSION_template_haskell(2,11,0)
    describe "SourceStrictness" $
        matchesTextShowSpec (Proxy :: Proxy SourceStrictness)
    describe "SourceUnpackedness" $
        matchesTextShowSpec (Proxy :: Proxy SourceUnpackedness)
#endif
    describe "Stmt" $
        matchesTextShowSpec (Proxy :: Proxy Stmt)
    describe "Strict" $
        matchesTextShowSpec (Proxy :: Proxy Strict)
#if MIN_VERSION_template_haskell(2,8,0)
    describe "TyLit" $
        matchesTextShowSpec (Proxy :: Proxy TyLit)
#endif
    describe "Type" $
        matchesTextShowSpec (Proxy :: Proxy Type)
#if MIN_VERSION_template_haskell(2,11,0)
    describe "TypeFamilyHead" $
        matchesTextShowSpec (Proxy :: Proxy TypeFamilyHead)
#endif
#if MIN_VERSION_template_haskell(2,9,0)
    describe "TySynEqn" $
        matchesTextShowSpec (Proxy :: Proxy TySynEqn)
#endif
    describe "TyVarBndr" $
        matchesTextShowSpec (Proxy :: Proxy TyVarBndr)

-- | 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