packages feed

morley-upgradeable-0.3: test/Test/Lorentz/UStore/StoreClass.hs

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

-- | Tests for Lorentz 'UStore'.
module Test.Lorentz.UStore.StoreClass
  ( test_Fields
  , test_Submaps
  ) where

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

import Lorentz.ADT
import Lorentz.Run.Simple
import Lorentz.StoreClass
import Lorentz.UStore
import Lorentz.Value

data MyTemplate = MyTemplate
  { ints :: Integer |~> ()
  , flag :: UStoreField Bool
  } deriving stock (Eq, Show, Generic)

initTemplate :: MyTemplate
initTemplate = MyTemplate
  { ints = UStoreSubMap mempty
  , flag = UStoreField False
  }

data Storage = Storage
  { dummy :: ()
  , upgradeable :: UStore MyTemplate
  } deriving stock (Generic)
    deriving anyclass (IsoValue)

instance HasFieldOfType Storage name ty =>
         StoreHasField Storage name ty where
  storeFieldOps = storeFieldOpsADT

initStorage :: Storage
initStorage = Storage () (mkUStore initTemplate)

test_Fields :: [TestTree]
test_Fields =
  [ testCase "Get field" $
      mkUStore initTemplate
      &- stToField #flag
      @?= False

  , testCase "Set field" $
      (True, mkUStore initTemplate)
      &- stSetField #flag
      @?= mkUStore initTemplate{ flag = UStoreField True }

  , testCase "Nested access" $
      initStorage
      &- stToField (#upgradeable :-| #flag)
      @?= False
  ]

test_Submaps :: [TestTree]
test_Submaps =
  [ testCase "Get submap entry" $
      (5, mkUStore initTemplate)
      &- stMem #ints
      @?= False

  , testCase "Update submap entry" $
      (5, ((), mkUStore initTemplate))
      &- stInsert #ints
      @?= mkUStore initTemplate{ ints = UStoreSubMap $ one (5, ()) }
  ]