packages feed

hix-0.9.0: testing/Hix/Test/Hedgehog.hs

module Hix.Test.Hedgehog where

import Data.List.Extra (takeEnd, zipWithLongest)
import qualified Data.Text as Text
import Hedgehog (TestT, evalEither, (===))

eqLines ::
  ∀ m .
  Monad m =>
  HasCallStack =>
  Text ->
  Text ->
  TestT m ()
eqLines l r =
  withFrozenCallStack do
    take common linesL === take common linesR
    if ll > lr
    then trailing "missing lines: " linesL
    else if lr > ll
    then trailing "extra lines: " linesR
    else unit
  where
    trailing desc ls = fail (toString (desc <> Text.unlines (drop common ls)))
    common = min ll lr
    ll = length linesL
    lr = length linesR
    linesL = Text.lines l
    linesR = Text.lines r

assertRight ::
  ∀ a m e .
  Eq a =>
  Show e =>
  Show a =>
  Monad m =>
  HasCallStack =>
  a ->
  Either e a ->
  TestT m ()
assertRight a =
  withFrozenCallStack do
    (===) a <=< evalEither

listEqZip ::
  ∀ m a .
  Monad m =>
  HasCallStack =>
  Eq a =>
  Show a =>
  [a] ->
  [a] ->
  TestT m ()
listEqZip target actual =
  withFrozenCallStack do
    for_ (zip [0 :: Natural ..] (zipWithLongest (,) target actual)) \case
      (i, (Just t, Just l)) -> (i, t) === (i, l)
      _ | [] <- actual -> fail "Result list is empty."
      _ -> target === actual

listEqTail ::
  ∀ m a .
  Monad m =>
  HasCallStack =>
  Eq a =>
  Show a =>
  [a] ->
  [a] ->
  TestT m ()
listEqTail target actual =
  withFrozenCallStack do
    target === takeEnd (length target) actual