packages feed

silvi-0.1.0: tests/TestAll.hs

{-# LANGUAGE DataKinds #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE TypeApplications #-}

import Control.Monad
import Data.Text (Text)
import Silvi.Random
import Silvi.Types
import Savage
import Savage.Randy (sample)
import qualified Data.Text as T
import qualified Data.Text.IO as TIO
import qualified Silvi.Encode as E
import qualified Topaz.Rec as Topaz

-- /begin Fallback section
-- These functions are provided in the event of failure;
-- they expose more details to the tester.
testAnnounce :: Text -> IO ()
testAnnounce x = do
  TIO.putStrLn "================================"
  replicateM_ ((32 - T.length x) `div` 2) (TIO.putStr "=") 
  TIO.putStr x
  replicateM_ ((32 - T.length x) `div` 2) (TIO.putStr "=") 
  TIO.putStrLn "" 
  TIO.putStrLn "================================"

success :: Text -> IO ()
success x = do
  TIO.putStrLn ""
  TIO.putStrLn $ "Succeeded: " `T.append` x

ms :: Silvi a -> Text -> IO ()
ms s name = do
  testAnnounce name
  let ot :: Gen (IO ())
      ot = fmap (Topaz.traverse_ E.print) s
      ok :: IO (IO ())
      ok = sample ot
  join ok
  success name

fallback :: IO ()
fallback = do
  ms (randLog @('[ 'FieldBracketNum   ])) "BracketNum"
  ms (randLog @('[ 'FieldHttpMethod   ])) "HttpMethod"
  ms (randLog @('[ 'FieldHttpStatus   ])) "HttpStatus"
  ms (randLog @('[ 'FieldHttpVersion  ])) "HttpVersion"
  ms (randLog @('[ 'FieldHttpProtocol ])) "HttpProtocol"
  ms (randLog @('[ 'FieldUrl          ])) "Url"
  ms (randLog @('[ 'FieldUserId       ])) "UserId"
  ms (randLog @('[ 'FieldObjSize      ])) "ObjSize"
  ms (randLog @('[ 'FieldIPv4         ])) "IPv4"
  ms (randLog @('[ 'FieldIPv6         ])) "IPv6"
  ms (randLog @('[ 'FieldTimestamp    ])) "OffsetDatetime"
  ms (randLog @('[ 'FieldOffset       ])) "Offset"
  ms (randLog @('[ 'FieldDatetime     ])) "Datetime"
  ms (randLog @('[ 'FieldDate         ])) "Date"
  ms (randLog @('[ 'FieldYear         ])) "Year"
  ms (randLog @('[ 'FieldMonth        ])) "Month"
  ms (randLog @('[ 'FieldDayOfMonth   ])) "DayOfMonth"
  ms (randLog @('[ 'FieldTimeOfDay    ])) "TimeOfDay"
--
-- /end Fallback section

main :: IO ()
main = printMany 100 randAllTypesLog

type AllTypesLog = '[ 'FieldBracketNum
                    , 'FieldHttpMethod
                    , 'FieldHttpStatus
                    , 'FieldHttpVersion
                    , 'FieldHttpProtocol 
                    , 'FieldUrl
                    , 'FieldUserId
                    , 'FieldObjSize
                    , 'FieldIPv4
                    , 'FieldIPv6
                    , 'FieldTimestamp
                    , 'FieldOffset
                    , 'FieldDatetime
                    , 'FieldDate
                    , 'FieldYear
                    , 'FieldMonth
                    , 'FieldDayOfMonth
                    , 'FieldTimeOfDay
                    ]

randAllTypesLog :: Silvi AllTypesLog
randAllTypesLog = randLog @AllTypesLog