packages feed

cleveland-0.2.0: test/TestSuite/Cleveland/PublicKeyToAddress.hs

-- SPDX-FileCopyrightText: 2021 Oxhead Alpha
-- SPDX-License-Identifier: LicenseRef-MIT-OA

-- | Test for the calculation of an address from its public key. See [#354]
module TestSuite.Cleveland.PublicKeyToAddress
  ( test_publicKeyToAddress
  ) where

import Hedgehog (forAll, property, withTests)
import Hedgehog.Gen qualified as Gen
import Hedgehog.Range qualified as Range
import Test.Tasty (TestTree)
import Test.Tasty.Hedgehog (testProperty)
import Unsafe qualified (fromJust)

import Lorentz as L hiding (comment)
import Test.Cleveland
import Test.Cleveland.Instances ()
import Test.Cleveland.Internal.Abstract (SpecificOrDefaultAlias(..))

publicKeyToAddress :: Contract PublicKey (Maybe Address) ()
publicKeyToAddress = defaultContract $
  L.car #
  L.hashKey #
  L.implicitAccount #
  L.address #
  L.some #
  L.nil #
  L.pair

test_publicKeyToAddress :: TestTree
test_publicKeyToAddress =
  testProperty "The address is calculated correctly from the given public key" $
    withTests 200 $ property $ do
      alias <- fromString <$> (forAll $ Gen.string (Range.linear 0 100) Gen.unicode)
      testScenarioProps $ scenario $ scenario' alias

scenario' :: (MonadCleveland caps m) => Alias -> m ()
scenario' alias = do
  c <- originateSimple @PublicKey @(Maybe Address) "publicKeyToAddress" Nothing publicKeyToAddress

  addr1 <- newAddress $ SpecificAlias alias
  addr1pk <- getPublicKey addr1

  call c CallDefault addr1pk
  addr2 <- Unsafe.fromJust <$> getStorage @(Maybe Address) c

  addr1 @== addr2