packages feed

daytripper-0.2.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 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
        ]