{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE UndecidableInstances #-}
module Main
( main
)
where
import Data.ByteString (ByteString)
import Data.ByteString qualified as BS
import Data.Maybe (isJust, isNothing)
import PropUnit (MonadTest, assert, testGroup, (===))
import PropUnit.Hedgehog.Gen qualified as Gen
import Test.Daytripper (Expect, daytripperMain, mkExpect, mkFileRT, mkPropRT, mkUnitRT, testRT)
type Cmp m = Maybe ByteString -> Maybe ByteString -> m ()
expec :: (Monad m) => Cmp m -> Expect m ByteString ByteString (Maybe ByteString)
expec = mkExpect enc dec
where
enc a = pure (a <> a)
dec b =
pure $
let a = BS.take (div (BS.length b) 2) b
in if b == a <> a
then Just a
else Nothing
expecOk, expecFail :: (MonadTest m) => Expect m ByteString ByteString (Maybe ByteString)
expecOk =
expec $
maybe
(assert . isJust)
(\a mc -> mc === Just a)
expecFail = expec (const (assert . isNothing))
main :: IO ()
main =
daytripperMain $ \lim ->
testGroup "Daytripper" $
fmap
(testRT (Just lim))
[ mkPropRT "prop" expecOk (Gen.element ["a", "b"])
, mkUnitRT "unit" expecOk "a"
, mkFileRT "file just" expecOk "testdata/b.txt" (Just "b")
, mkFileRT "file nothing" expecOk "testdata/c.txt" Nothing
, mkFileRT "file fail" expecFail "testdata/x.txt" Nothing
]