dahdit-test-0.6.0: src/Test/Dahdit/Daytripper.hs
module Test.Dahdit.Daytripper
( Cmp
, expectCodec
, expectCodecOk
, expectCodecErr
, expectBytes
, expectText
, expectStatic
)
where
import Control.Monad.IO.Class (MonadIO (..))
import Dahdit (Binary, ByteCount (..), GetError, StaticByteSized (..), decodeEnd, encode)
import Data.ByteString (ByteString)
import Data.ByteString qualified as BS
import Data.Either (isLeft, isRight)
import Data.Proxy (Proxy (..))
import Data.Text (Text)
import Data.Text.Encoding qualified as TE
import Data.Word (Word8)
import PropUnit (MonadTest, assert, (===))
import Test.Daytripper (Expect, expectDuring, mkExpect)
type Cmp m a = Maybe a -> Either GetError a -> m ()
expectCodec :: (MonadTest m, MonadIO m, Binary a) => Cmp m a -> Expect m a ByteString (Either GetError a)
expectCodec = mkExpect enc dec
where
enc = liftIO . encode
dec = liftIO . fmap fst . decodeEnd
expectCodecOk :: (MonadTest m, MonadIO m, Binary a, Eq a, Show a) => Expect m a ByteString (Either GetError a)
expectCodecOk = expectCodec (maybe (assert . isRight) (\a x -> x === Right a))
expectCodecErr :: (MonadTest m, MonadIO m, Binary a) => Expect m a ByteString (Either GetError a)
expectCodecErr = expectCodec (const (assert . isLeft))
expectBytes :: (MonadTest m) => [Word8] -> Expect m a ByteString c -> Expect m a ByteString c
expectBytes ws = expectDuring (\_ bs -> bs === BS.pack ws)
expectText :: (MonadTest m) => Text -> Expect m a ByteString c -> Expect m a ByteString c
expectText t = expectDuring (\_ bs -> bs === TE.encodeUtf8 t)
proxyBefore :: Expect m a b c -> Proxy a
proxyBefore _ = Proxy
expectStatic :: (MonadTest m, StaticByteSized a) => Expect m a ByteString c -> Expect m a ByteString c
expectStatic ex =
let len = unByteCount (staticByteSize (proxyBefore ex))
in expectDuring (\_ bs -> BS.length bs === len) ex