morley-1.3.0: src/Michelson/Test/Util.hs
-- SPDX-FileCopyrightText: 2020 Tocqueville Group
--
-- SPDX-License-Identifier: LicenseRef-MIT-TQ
-- | Testing utility functions used by testing framework itself or
-- intended to be used by test writers.
module Michelson.Test.Util
( leftToShowPanic
, leftToPrettyPanic
, failedProp
, succeededProp
, qcIsLeft
, qcIsRight
, roundtripTest
) where
import Data.Typeable (typeRep)
import Fmt (Buildable, pretty)
import Test.QuickCheck (Arbitrary)
import Test.QuickCheck.Property (Property, Result(..), failed, property, (===))
import Test.Tasty (TestTree)
import Test.Tasty.QuickCheck (testProperty)
leftToShowPanic :: (Show e, HasCallStack) => Either e a -> a
leftToShowPanic = either (error . show) id
leftToPrettyPanic :: (Buildable e, HasCallStack) => Either e a -> a
leftToPrettyPanic = either (error . pretty) id
----------------------------------------------------------------------------
-- Property
----------------------------------------------------------------------------
-- | A 'Property' that always failes with given message.
failedProp :: Text -> Property
failedProp r = property $ failed { reason = toString r }
-- | A 'Property' that always succeeds.
succeededProp :: Property
succeededProp = property True
-- | The 'Property' holds on `Left a`.
qcIsLeft :: Show b => Either a b -> Property
qcIsLeft = \case
Left _ -> property True
Right x -> failedProp $ "expected Left, got Right (" <> show x <> ")"
-- | The 'Property' holds on `Right b`.
qcIsRight :: Show a => Either a b -> Property
qcIsRight = \case
Right _ -> property True
Left x -> failedProp $ "expected Right, got Left (" <> show x <> ")"
----------------------------------------------------------------------------
-- Roundtrip
----------------------------------------------------------------------------
-- | This 'TestTree' contains a property based test for conversion from
-- some @x@ to some @y@ and back to @x@ (it should successfully return
-- the initial @x@).
roundtripTest ::
forall x y err.
( Show x
, Show err
, Typeable x
, Arbitrary x
, Eq x
, Eq err
)
=> (x -> y)
-> (y -> Either err x)
-> TestTree
roundtripTest xToY yToX = testProperty typeName check
where
typeName = show $ typeRep (Proxy @x)
check :: x -> Property
check x = yToX (xToY x) === Right x