packages feed

natskell-0.0.0.1: test/Unit/PongSpec.hs

{-# LANGUAGE OverloadedStrings #-}

module PongSpec (spec) where

import           Control.Monad
import qualified Data.ByteString           as BS
import qualified Data.ByteString.Lazy      as LBS
import           Parser.API
    ( ParseStep (Emit)
    , ParsedMessage (ParsedPong)
    , parse
    )
import           Parser.Attoparsec         (parserApi)
import           Test.Hspec
import           Text.Printf
import           Transformers.Transformers
import           Types.Pong
import           Validators.Validators

spec :: Spec
spec = do
  cases
  validateCase

explicitParserCases :: [(BS.ByteString, Pong)]
explicitParserCases = [("PONG\r\n", Pong)]

explicitTransformerCases :: [(Pong, BS.ByteString)]
explicitTransformerCases = map (\(a,b) -> (b,a)) explicitParserCases

cases = parallel $ do
  describe "generic parser" $ do
    forM_ explicitParserCases $ \(input, want) -> do
      it (printf "correctly parses explicit case %s" (show input)) $ do
        let output = parse parserApi input
        output `shouldBe` Emit (ParsedPong want) ""
  describe "PONG transformer" $ do
    forM_ explicitTransformerCases $ \(input, want) -> do
      it (printf "correctly transforms %s" (show input)) $ do
        LBS.toStrict (transform input) `shouldBe` want

validateCase = parallel $ do
  describe "PONG validater" $ do
    it "correctly validates PONG" $ do
      validate Pong `shouldBe` Right ()