module Test.Hspec.Server.Core where

import qualified Test.Hspec as Hspec
import qualified Test.HUnit as HUnit
import Control.Monad.IO.Class
import Control.Monad.Trans.Reader
import Test.Hspec.Server.Type

getServerData :: ServerType dat => ServerExample dat dat
getServerData = ask

getServerOS :: ServerType dat => ServerExample dat (Maybe ServerOS)
getServerOS = do 
  d <- ask
  return $ stOS d

includes' :: (ServerType dat, Sets s) => s -> s -> ServerExample dat ()
includes' org ex =
  liftIO $ flip HUnit.assertBool (include org ex) $ concat
    [ "Expected status was ", show ex
    , " but received status was ", show org
    ]

includes :: (ServerType dat, Sets s) => ServerExample dat s -> s -> ServerExample dat ()
includes org' ex = do
  org <- org'
  org `includes'` ex

(@>=) :: (ServerType dat, Sets s) => ServerExample dat s -> s -> ServerExample dat ()
(@>=) = includes
infix 1 @>= 

(@==) :: (ServerType dat, Sets s) => ServerExample dat s -> s -> ServerExample dat ()
(@==) org' ex = do
  org <- org'
  liftIO $ Hspec.shouldBe org ex
infix 1 @==