packages feed

qute-0.1.0: test/State.hs

-- SPDX-FileCopyrightText: 2026 Sören Tempel <soeren+git@soeren-tempel.net>
--
-- SPDX-License-Identifier: GPL-3.0-only

module State (stateTests) where

import Control.Monad.State.Strict (evalStateT)
import Data.Word (Word8)
import Language.QBE.Simulator.Default.Expression qualified as D
import Language.QBE.Simulator.Default.State (Env, loadObj, mkEnv)
import Language.QBE.Types qualified as QBE
import Test.Tasty
import Test.Tasty.HUnit

stateTests :: TestTree
stateTests =
  testGroup
    "Test the default state implementation"
    [ testCase "loadObj returns end address" $
        do
          let obj = QBE.OItem QBE.Byte [QBE.DString "foobar"]

          env <- mkEnv [] 0x1000 128 :: IO (Env D.RegVal Word8)
          res <- evalStateT (loadObj 0x1000 obj) env

          res @?= 0x1006,
      -- TODO: Turn this into a QuickCheck 'testProperty'.
      testCase "loadObj return value is aligned with QBE.dataSize" $
        do
          let o1 = QBE.OItem QBE.Byte [QBE.DString "foobar"]
          let o2 = QBE.OItem (QBE.Base QBE.Word) [QBE.DConst $ QBE.Number 23]

          env <- mkEnv [] 0x0 128 :: IO (Env D.RegVal Word8)
          res <- evalStateT (loadObj 0x0 o1 >>= flip loadObj o2) env

          -- No padding inserted.
          res @?= 10

          -- The same calculation should be performed by QBE.dataSize.
          let ds = QBE.DataDef [] (QBE.GlobalIdent "d") Nothing [o1, o2]
          10 @?= QBE.dataSize ds
    ]