morley-1.3.0: bench/Main.hs
-- SPDX-FileCopyrightText: 2020 Tocqueville Group
--
-- SPDX-License-Identifier: LicenseRef-MIT-TQ
module Main (main) where
import qualified Data.Map as M
import Gauge.Main (bench, nf, defaultMain, bgroup)
import Text.Megaparsec (parse)
import Michelson.Interpret (interpret)
import Michelson.Parser as P
import Michelson.Runtime (prepareContract)
import Michelson.Test.Import
import Michelson.Test.Dummy
import Michelson.Text
import Michelson.TypeCheck as T
import Michelson.Typed as T
import Tezos.Address
import Util.IO
main :: IO ()
main = do
let
basicFp = "../../contracts/basic1.tz"
stringCallerFp = "../../contracts/string_caller.tz"
callSelfFp = "../../contracts/call_self_several_times.tz"
sq2Fp = "../../contracts/testassert_square2.mtz"
contractPaths = [basicFp, stringCallerFp, callSelfFp, sq2Fp]
contracts <- traverse (\x -> (x,) <$> readFileUtf8 x) contractPaths
let makeParseBench (filename, code) =
bench filename $ nf (parse P.program filename) code
preparedContracts <- evaluateNF =<< traverse (\x -> (x,) <$> prepareContract (Just x)) contractPaths
let
makeTypeCheckBench (filename, contract) = bench filename $
nf (T.typeCheckContract (M.fromList [])) contract
(_, basicC) <- importContract basicFp
(_, stringCallerC) <- importContract stringCallerFp
(_, callSelfC) <- importContract callSelfFp
(_, sq2C) <- importContract sq2Fp
let
basicBench = bench basicFp
(nf
(interpret (T.cCode basicC) T.epcPrimitive T.VUnit (T.VList [T.VInt 0]))
dummyContractEnv
)
dummyAddress = detGenKeyAddress "thegreatandpowerful"
dummyString = mkMTextUnsafe "TGAP"
stringCallerBench = bench stringCallerFp
(nf
(interpret (T.cCode stringCallerC) T.epcPrimitive (T.toVal dummyString) (T.toVal dummyAddress))
dummyContractEnv
)
callSelfBench = bench callSelfFp
(nf
(interpret (T.cCode callSelfC) T.epcPrimitive (T.toVal (100 :: Integer)) (T.toVal (0 :: Natural)))
dummyContractEnv
)
sq2Bench = bench sq2Fp
(nf
(interpret (T.cCode sq2C) T.epcPrimitive (T.toVal (100 :: Integer, 200 :: Integer)) T.VUnit)
dummyContractEnv
)
defaultMain
[ bgroup "parsing" $ map makeParseBench contracts
, bgroup "type-checking" $ map makeTypeCheckBench preparedContracts
, bgroup "interpreting" $ [basicBench, stringCallerBench, callSelfBench, sq2Bench]
]