packages feed

cleveland-0.1.1: morley-test/Test/Views.hs

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

-- | Tests on views-related primitives.
module Test.Views
  ( test_ViewsSets
  ) where

import Test.Tasty (TestTree, testGroup)
import Test.Tasty.HUnit (assertBool, testCase, (@?=))

import Morley.Michelson.Typed

dummyViewCode :: Integer -> ViewCode arg st arg
dummyViewCode id' = CAR :# PUSH (VInt id') :# DROP

dummyView :: HasCallStack => Text -> Integer -> View 'TUnit 'TUnit 'TUnit
dummyView name id' = View
  { vName = unsafe $ mkViewName name
  , vArgument = starNotes
  , vReturn = starNotes
  , vCode = dummyViewCode id'
  }

dummySomeView :: HasCallStack => Text -> Integer -> SomeView 'TUnit
dummySomeView = SomeView ... dummyView

test_ViewsSets :: TestTree
test_ViewsSets = testGroup "Views sets"
  [ testGroup "Instant construction"
    [ testCase "Can create views set with constructor" $
        assertBool "Failed to construct" $
          mkViewsSet [dummySomeView "a" 1, dummySomeView "b" 2]
          & isRight

    , testCase "Duplicate views cause failure" $
        mkViewsSet [dummySomeView "a" 1, dummySomeView "b" 2, dummySomeView "a" 3]
          @?= Left (DuplicatedViewName (unsafe $ mkViewName "a"))

    ]

  , testGroup "Incremental construction"
    [ testCase "Can incrementally build views set" $
        assertBool "Failed to construct" $
          pure emptyViewsSet
            >>= addViewToSet (dummyView "a" 1)
            >>= addViewToSet (dummyView "b" 2)
          & isRight

    , testCase "Duplicate views cause failure" $
        ( pure emptyViewsSet
          >>= addViewToSet (dummyView "a" 1)
          >>= addViewToSet (dummyView "b" 2)
          >>= addViewToSet (dummyView "a" 3)
        ) @?= Left (DuplicatedViewName (unsafe $ mkViewName "a"))

    ]

  , testGroup "Lookup"
    let viewsSet1 = unsafe $ mkViewsSet
          [ dummySomeView "" 0
          , dummySomeView "a" 1
          ]
    in
    [ testCase "Can find a present view" $ do
        lookupView (unsafe $ mkViewName "") viewsSet1
          @?= Just (dummySomeView "" 0)
        lookupView (unsafe $ mkViewName "a") viewsSet1
          @?= Just (dummySomeView "a" 1)

    , testCase "Fail to find a non-existent view" $
        lookupView (unsafe $ mkViewName "x") viewsSet1
          @?= Nothing

    ]

  ]