packages feed

sexpresso-1.0.0.2: test/Print_Unittests.hs

{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE FlexibleInstances, MultiParamTypeClasses #-}

module Print_Unittests (
  printTestTree
  )where

import Data.Void
import Test.Tasty
import Test.Tasty.HUnit
import Test.Tasty.SmallCheck as SC
import Test.SmallCheck.Series
import Text.Megaparsec
import Text.Megaparsec.Char
import qualified Data.Text as T
import Data.SExpresso.SExpr
import Data.SExpresso.Print
import Data.SExpresso.Parse

type Parser = Parsec Void T.Text

instance (Serial m b, Serial m a) => Serial m (SExpr b a) where
  series = cons1 SAtom \/ cons2 SList

printer :: SExprPrinter () Integer
printer = mkPrinter (T.pack . show)

pDigit :: Parser Integer
pDigit = do
  sign <- optional (char '-')
  n <- fmap read (some digitChar)
  case sign of
    Nothing -> return n
    Just _ -> return (-1 * n)

sexpParser :: SExprParser Parser () Integer
sexpParser = plainSExprParser pDigit

printTestTree :: TestTree
printTestTree = testGroup "Print.hs unit tests" $
  [testGroup "flatPrint" [
      testCase "Empty SList" $ flatPrint printer (SList () [] :: Sexp Integer) @?= "()",
      testCase "Singleton SList" $ flatPrint printer (SList () [SAtom 1] :: Sexp Integer) @?= "(1)",
      testCase "SList 1/3" $ flatPrint printer (SList () [SAtom 1, SAtom 2, SAtom 3] :: Sexp Integer) @?= "(1 2 3)",
      testCase "SList 2/3" $ flatPrint printer (SList () [SAtom 1, SList () [SAtom 2], SAtom 3] :: Sexp Integer) @?= "(1 (2) 3)",
      testCase "SList 3/3" $ flatPrint printer (SList () [SList () [SAtom 1], SAtom 2, SList () [SAtom 3]] :: Sexp Integer) @?= "((1) 2 (3))",
      testCase "SAtom" $ flatPrint printer (SAtom 3 :: Sexp Integer) @?= "3",
      SC.testProperty "decodeOne inverse of flatPrint" $
      \s -> parse (decodeOne sexpParser) "" (flatPrint printer (s :: Sexp Integer)) == Right s
      ]
  ]