packages feed

natskell-0.0.0.1: test/Unit/PingSpec.hs

{-# LANGUAGE OverloadedStrings #-}

module PingSpec (spec) where

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

spec :: Spec
spec = do
  parserCases
  transformerCases
  validateCase

explicitParserCases :: [(BS.ByteString, Ping)]
explicitParserCases = [("PING\r\n", Ping)]

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

parserCases = 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 (ParsedPing want) ""

transformerCases = parallel $ do
  describe "PING 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 "PING validater" $ do
    it "correctly validates PING" $ do
      validate Ping `shouldBe` Right ()