packages feed

language-thrift-0.5.0.0: test/Language/Thrift/TypesSpec.hs

{-# LANGUAGE OverloadedStrings #-}
module Language.Thrift.TypesSpec (spec) where

import Test.Hspec
import Test.Hspec.QuickCheck
import Text.PrettyPrint.Leijen (Doc)
import Text.Parser.Token       (whiteSpace)

import Language.Thrift.Arbitrary ()
import TestUtils

import qualified Language.Thrift.Parser as P
import qualified Language.Thrift.Pretty as PP

spec :: Spec
spec =
    describe "Parser and Printer" $ do

        prop "can round-trip type references" $
            roundtrip PP.typeReference P.typeReference

        prop "can round-trip constant values" $
            roundtrip PP.constantValue P.constantValue

        prop "can round-trip typedefs" $
            roundtrip PP.typedef (whiteSpace >> P.typedef)

        prop "can round-trip enums" $
            roundtrip PP.enum (whiteSpace >> P.enum)

        prop "can round-trip structs" $
            roundtrip PP.struct (whiteSpace >> P.struct)

        prop "can round-trip unions" $
            roundtrip PP.union (whiteSpace >> P.union)

        prop "can round-trip exceptions" $
            roundtrip PP.exception (whiteSpace >> P.exception)

        prop "can round-trip senums" $
            roundtrip PP.senum (whiteSpace >> P.senum)

        prop "can round-trip services" $
            roundtrip PP.service (whiteSpace >> P.service)

        prop "can round-trip constants" $
            roundtrip PP.constant (whiteSpace >> P.constant)

        prop "can round-trip includes" $
            roundtrip (const PP.include) (whiteSpace >> P.include)

        prop "can round-trip namespaces" $
            roundtrip (const PP.namespace) (whiteSpace >> P.namespace)

        prop "can round-trip documents" $
            roundtrip PP.program P.program


roundtrip
    :: (Show a, Eq a) => (PP.Config -> a -> Doc) -> Parser a -> a -> IO ()
roundtrip printer parser value =
    assertParses parser value (show $ printer (PP.Config 4) value)