packages feed

web3-0.8.4.0: unit/Language/Solidity/Test/AbiSpec.hs

{-# LANGUAGE OverloadedStrings #-}
module Language.Solidity.Test.AbiSpec where


import Test.Hspec
import Data.Either (isLeft)
import Language.Solidity.Abi


spec :: Spec
spec = do
  describe "parseSolidityType" $ 
    describe "tuple type" $ do
        it "can parses a FunctionArg with tuple type" $ do
          let maa = FunctionArg  "makerAssetAmount" "uint256" Nothing
              ma = FunctionArg "makeAddress" "address" Nothing
              tupleFA = FunctionArg "order" "tuple" (Just [maa, ma])
              eRes = parseSolidityFunctionArgType tupleFA
          eRes `shouldBe` Right (SolidityTuple 2 [SolidityUint 256, SolidityAddress])
        it "fails to parse a FunctionArg with invalid tuple" $ do
          let tupleFA = FunctionArg "order" "tuple" Nothing
              eRes = parseSolidityFunctionArgType tupleFA
          isLeft eRes `shouldBe` True 
  describe "signature" $ 
    it "can generate signature for fillOrder" $ do
      let fillOrderDec = buildFillOrderDec
          expected = "fillOrder((address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes),uint256,bytes)"
          sig = signature fillOrderDec
      sig `shouldBe` expected
  describe "methodId" $ 
    it "can generate methodId for fillOrder" $ do
      let fillOrderDec = buildFillOrderDec
          expected = "0xb4be83d5"
          mId = methodId fillOrderDec
      mId `shouldBe` expected

buildFillOrderDec :: Declaration
buildFillOrderDec = DFunction "fillOrder" False funInputs' funOutputs'
  where
    funInputs' = 
      [ makeTupleFuncArg ("order", "tuple") tupleComponents
      , makeBasicFuncArg ("takerAssetFillAmount", "uint256")
      , makeBasicFuncArg ("signature", "bytes")
      ]
    tupleComponents = 
      [ ("makerAddress", "address")           
      , ("takerAddress", "address")         
      , ("feeRecipientAddress", "address")    
      , ("senderAddress", "address")          
      , ("makerAssetAmount", "uint256")       
      , ("takerAssetAmount", "uint256")       
      , ("makerFee", "uint256")               
      , ("takerFee", "uint256")               
      , ("expirationTimeSeconds", "uint256")
      , ("salt", "uint256")                   
      , ("makerAssetData",   "bytes")
      , ("takerAssetData",   "bytes")
      ]
    funOutputs' = Nothing
    makeBasicFuncArg (n,t) = 
      FunctionArg n t Nothing
    makeTupleFuncArg (n,t) cmps = 
      FunctionArg n t (Just $ map makeBasicFuncArg cmps)