packages feed

daytripper-1.0.0: test/Main.hs

{-# 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
        ]