packages feed

musig2-0.1.0: test/MonoidProjective.hs

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

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

module MonoidProjective (propertyMonoidProjective) where

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

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

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

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

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