{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE OverloadedLists #-}
{-# LANGUAGE OverloadedStrings #-}
import qualified Data.ByteString.Char8 as S
import qualified Data.ByteString.Lazy.Char8 as L
import Data.Complex
import qualified Data.IntMap as IntMap
import qualified Data.IntSet as IntSet
import qualified Data.Map as Map
import Data.Ratio
import qualified Data.Sequence as Seq
import qualified Data.Set as Set
import qualified Data.Text as T
import qualified Data.Text.Encoding as T
import qualified Data.Text.Lazy as TL
import qualified Data.Vector as V
import qualified Data.Vector.Primitive as VP
import qualified Data.Vector.Storable as VS
import qualified Data.Vector.Unboxed as VU
import GHC.Generics
import Test.Tasty
import Test.Tasty.HUnit
import Text.PrettyPrint.Generic
data Foo = Foo { fooA :: Int, fooB :: String } deriving Generic
instance Pretty Foo
data Bar a = Bar { barA :: Foo, barB :: a } deriving Generic
instance Pretty a => Pretty (Bar a)
data Baz = Baz1 | Baz2 Int | Baz3 Foo (Bar Baz) deriving Generic
instance Pretty Baz
main :: IO ()
main =
defaultMain $ testGroup "test cases"
[ testCase "()" $
prettyShow' () @?= "()"
, testCase "Char" $
prettyShow' 'a' @?= "'a'"
, testCase "Int" $
prettyShow' (123 :: Int) @?= "123"
, testCase "Integer" $
prettyShow' (2^100 :: Integer) @?= "1267650600228229401496703205376"
, testCase "Float" $
prettyShow' (pi :: Float) @?= "3.1415927"
, testCase "Double" $
prettyShow' (pi :: Double) @?= "3.141592653589793"
, testCase "String" $
prettyShow' ("Hello" :: String) @?= "\"Hello\""
, testCase "Bool" $
prettyShow' True @?= "True"
, testCase "Rational" $
prettyShow' (123 % 456 :: Rational) @?= "41 % 152"
, testCase "Complex" $
prettyShow' (123 :+ 456 :: Complex Double) @?= "123.0 :+ 456.0"
, testCase "List" $
prettyShow' ([1..5] :: [Int]) @?= "[ 1, 2, 3, 4, 5 ]"
, testCase "2-tuple" $
prettyShow' ('a', 'b') @?= "('a', 'b')"
, testCase "3-tuple" $
prettyShow' ('a', 'b', 'c') @?= "('a', 'b', 'c')"
, testCase "4-tuple" $
prettyShow' ('a', 'b', 'c', 'd') @?= "('a', 'b', 'c', 'd')"
, testCase "5-tuple" $
prettyShow' ('a', 'b', 'c', 'd', 'e') @?= "('a', 'b', 'c', 'd', 'e')"
, testCase "6-tuple" $
prettyShow' ('a', 'b', 'c', 'd', 'e', 'f') @?= "('a', 'b', 'c', 'd', 'e', 'f')"
, testCase "7-tuple" $
prettyShow' ('a', 'b', 'c', 'd', 'e', 'f', 'g') @?= "('a', 'b', 'c', 'd', 'e', 'f', 'g')"
, testCase "Maybe 1" $
prettyShow' (Nothing :: Maybe Int) @?= "Nothing"
, testCase "Maybe 2" $
prettyShow' (Just 123 :: Maybe Int) @?= "Just 123"
, testCase "Maybe 3" $
prettyShow' (Just (Just 123) :: Maybe (Maybe Int)) @?= "Just (Just 123)"
, testCase "Either 1" $
prettyShow' (Left "Left" :: Either String Double) @?= "Left \"Left\""
, testCase "Either 2" $
prettyShow' (Right pi :: Either String Double) @?= "Right 3.141592653589793"
, testCase "Strict ByteString" $
prettyShow' (T.encodeUtf8 "日本語" :: S.ByteString) @?= "\"日本語\""
, testCase "Lazy ByteString" $
prettyShow' (L.fromStrict $ T.encodeUtf8 "日本語" :: L.ByteString) @?= "\"日本語\""
, testCase "Strict Text" $
prettyShow' ("日本語" :: T.Text) @?= "\"日本語\""
, testCase "Lazy Text" $
prettyShow' ("日本語" :: TL.Text) @?= "\"日本語\""
, testCase "Set" $
prettyShow' (["foo", "bar", "baz"] :: Set.Set String) @?= "[ \"bar\", \"baz\", \"foo\" ]"
, testCase "IntSet" $
prettyShow' ([1..5] :: IntSet.IntSet) @?= "[ 1, 2, 3, 4, 5 ]"
, testCase "Map" $
prettyShow' ([("foo", 123), ("bar", 456)] :: Map.Map String Int) @?= "{ \"bar\": 456, \"foo\": 123 }"
, testCase "IntMap" $
prettyShow' ([(123, "foo"), (456, "bar")] :: IntMap.IntMap String) @?= "{ 123: \"foo\", 456: \"bar\" }"
, testCase "Seq" $
prettyShow' ([1..5] :: Seq.Seq Int) @?= "[ 1, 2, 3, 4, 5 ]"
, testCase "Vector" $
prettyShow' ([1..5] :: V.Vector Int) @?= "[ 1, 2, 3, 4, 5 ]"
, testCase "Primitive Vector" $
prettyShow' ([1..5] :: VP.Vector Int) @?= "[ 1, 2, 3, 4, 5 ]"
, testCase "Storable Vector" $
prettyShow' ([1..5] :: VS.Vector Int) @?= "[ 1, 2, 3, 4, 5 ]"
, testCase "Unboxed Vector" $
prettyShow' ([1..5] :: VU.Vector Int) @?= "[ 1, 2, 3, 4, 5 ]"
, testCase "User defined 1" $
prettyShow' (Foo 123 "foo") @?= "Foo { fooA = 123, fooB = \"foo\" }"
, testCase "User defined 2" $
prettyShow' (Bar (Foo 123 "foo") (Just True)) @?= "Bar { barA = Foo { fooA = 123\n , fooB = \"foo\" }\n , barB = Just True }"
, testCase "User defined 3" $
prettyShow' Baz1 @?= "Baz1"
, testCase "User defined 4" $
prettyShow' (Baz2 123) @?= "Baz2 123"
, testCase "User defined 5" $
prettyShow' (Baz3 (Foo 123 "foo") (Bar (Foo 456 "bar") Baz1)) @?= "Baz3 Foo { fooA = 123\n , fooB = \"foo\" }\n Bar { barA = Foo { fooA = 456\n , fooB = \"bar\" }\n , barB = Baz1 }"
]