{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE UndecidableInstances #-}
module Main
( main
)
where
import Data.ByteString (ByteString)
import Data.ByteString qualified as BS
import Data.Maybe (isJust, isNothing)
import Test.Daytripper (Expect, MonadExpect (..), daytripperMain, mkExpect, mkFileRT, mkPropRT, mkUnitRT, testRT)
import Test.Falsify.Generator qualified as Gen
import Test.Tasty (testGroup)
type Cmp m = Maybe ByteString -> Maybe ByteString -> m ()
expec :: MonadExpect 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 :: MonadExpect m => Expect m ByteString ByteString (Maybe ByteString)
expecOk =
expec $
maybe
(expectAssertBool "expected Just" . isJust)
(\a mc -> expectAssertEq mc (Just a))
expecFail = expec (const (expectAssertBool "expected Nothing" . isNothing))
main :: IO ()
main =
daytripperMain $
testGroup "Daytripper" $
fmap
testRT
[ mkPropRT "prop" expecOk (Gen.choose (pure "a") (pure "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
]