packages feed

musig2-0.1.0: test/MonoidPubNonce.hs

{-# LANGUAGE OverloadedStrings #-}
{-# OPTIONS_GHC -Wno-unrecognised-pragmas #-}

{-# HLINT ignore "Monoid law, right identity" #-}
{-# HLINT ignore "Monoid law, left identity" #-}

module MonoidPubNonce (propertyMonoidPubNonce) where

import Crypto.Curve.Secp256k1.MuSig2 (PubNonce)
import Test.Tasty
import Test.Tasty.QuickCheck as QC
import Util ()

propertyMonoidPubNonce :: TestTree
propertyMonoidPubNonce =
  testGroup
    "Monoid Laws for PubNonce"
    [ testProperty "Left Identity" prop_leftIdentity
    , testProperty "Right Identity" prop_rightIdentity
    , testProperty "Associativity" prop_associativity
    ]

-- | Left identity 'Monoid' law.
prop_leftIdentity :: PubNonce -> Property
prop_leftIdentity x = mempty <> x === x

-- | Right identity 'Monoid' law.
prop_rightIdentity :: PubNonce -> Property
prop_rightIdentity x = x <> mempty === x

-- | Associativity 'Monoid' law.
prop_associativity :: PubNonce -> PubNonce -> PubNonce -> Property
prop_associativity x y z = (x <> y) <> z === x <> (y <> z)