packages feed

looksee-trip-0.7.0: src/Test/Looksee/Trip.hs

module Test.Looksee.Trip
  ( Cmp
  , cmpEq
  , ExpectP
  , expectParse
  , expectParsePretty
  , expectParseT
  , expectParseTPretty
  , expectRendered
  )
where

import Data.Text (Text)
import Looksee (Err, Parser, ParserT, parse, parseT)
import Prettyprinter (Pretty (..), defaultLayoutOptions, layoutPretty)
import Prettyprinter.Render.Text (renderStrict)
import PropUnit (MonadTest, (===))
import Test.Daytripper (Expect, expectDuring, mkExpect)

prettyText :: (Pretty a) => a -> Text
prettyText = renderStrict . layoutPretty defaultLayoutOptions . pretty

type Cmp e m a = Maybe a -> Either (Err e) a -> m ()

cmpEq :: (MonadTest m, Eq e, Show e, Eq a, Show a) => Cmp e m a
cmpEq ma ea = maybe (Left Nothing) Right ma === either (Left . Just) Right ea

type ExpectP e m a = Expect m a Text (Either (Err e) a)

expectParse :: (MonadTest m) => (a -> Text) -> Parser e a -> Cmp e m a -> ExpectP e m a
expectParse printer parser = mkExpect enc dec
 where
  enc = pure . printer
  dec = pure . parse parser

expectParsePretty :: (MonadTest m, Pretty a) => Parser e a -> Cmp e m a -> ExpectP e m a
expectParsePretty = expectParse prettyText

expectParseT :: (MonadTest m) => (a -> Text) -> ParserT e m a -> Cmp e m a -> ExpectP e m a
expectParseT printer parser = mkExpect enc dec
 where
  enc = pure . printer
  dec = parseT parser

expectParseTPretty :: (MonadTest m, Pretty a) => ParserT e m a -> Cmp e m a -> ExpectP e m a
expectParseTPretty = expectParseT prettyText

expectRendered :: (MonadTest m) => Text -> ExpectP e m a -> ExpectP e m a
expectRendered = expectDuring . const . flip (===)