packages feed

lorentz-0.3.0: test/Test/Lorentz/UParam.hs

-- SPDX-FileCopyrightText: 2020 Tocqueville Group
--
-- SPDX-License-Identifier: LicenseRef-MIT-TQ

-- | Tests for Lorentz 'UParam'.
module Test.Lorentz.UParam
  ( test_Simple_contract
  , test_ADT_conversion
  , unit_unpackUParam
  ) where

import Data.Vinyl.Core (Rec(..))
import Data.Constraint (Dict (..))
import Test.HUnit ((@?=), assertBool, Assertion)
import Test.Tasty (TestTree)
import Test.Tasty.HUnit (testCase)

import Michelson.Text
import Michelson.Interpret.Pack
import Lorentz ((/->))
import qualified Lorentz as L
import Lorentz.Base
import Lorentz.UParam
import Lorentz.Run
import Michelson.Test.Dummy

-- Test on simple contract
----------------------------------------------------------------------------

type Entries = ["add" ?: Natural, "id" ?: ()]

simpleCode :: '[UParam Entries, Integer] :-> '[Integer]
simpleCode = caseUParamT
  ( #add /-> L.add
  , #id /-> L.drop @()
  ) uparamFallbackFail

test_Simple_contract :: [TestTree]
test_Simple_contract =
  [ testCase "Passing parameter 1" $
      runSimpleCode 5 (mkUParam #add 3) @?= Right 8
  , testCase "Passing parameter 2" $
      runSimpleCode 5 (mkUParam #id ()) @?= Right 5
  , testCase "Passing illegal parameter" $
      assertBool "Expected failure" $
      isLeft $
      runSimpleCode 5 (UParamUnsafe ([mt|Nyan|], ""))
  ]
  where
    runSimpleCode initVal uparam = do
      let initStack = (Identity uparam :& initVal :& RNil)
      resStack <- interpretLorentzInstr dummyContractEnv simpleCode initStack
      let Identity res :& RNil = resStack
      return res

-- Test deconstruction
----------------------------------------------------------------------------

unit_unpackUParam :: Assertion
unit_unpackUParam = do
  unpk (mkUParam #add 3) @?=
    Right ([mt|add|], "3")
  unpk (mkUParam #id ()) @?=
    Right ([mt|id|], "()")
  unpk (UParamUnsafe ([mt|gy|], mempty)) @?=
    Left (NoSuchEntryPoint [mt|gy|])
  unpk (UParamUnsafe ([mt|add|], mempty)) @?=
    Left ArgumentUnpackFailed
  where
    unpk ::
      UParam Entries ->
      Either EntryPointLookupError (MText, String)
    unpk = fmap (second show) . unpackUParam @Show

-- Test ADT conversion
----------------------------------------------------------------------------

data Parameter1
  = MyEntryPoint1 Integer
  | MyEntryPoint2 ()
  deriving stock (Generic)

type ExpectedLinearization1 =
  [ "MyEntryPoint1" ?: Integer
  , "MyEntryPoint2" ?: ()
  ]

_checkLinearizedType
  :: Dict (UParamLinearized Parameter1 ~ ExpectedLinearization1)
_checkLinearizedType = Dict

test_ADT_conversion :: [TestTree]
test_ADT_conversion =
  [ testCase "Linearization 1.1" $
      uparamFromAdt (MyEntryPoint1 5)
        @?= UParamUnsafe ([mt|MyEntryPoint1|], packValue' (L.toVal @Integer 5))
  , testCase "Linearization 1.2" $
      uparamFromAdt (MyEntryPoint2 ())
        @?= UParamUnsafe ([mt|MyEntryPoint2|], packValue' (L.toVal ()))
  ]