packages feed

hocd-0.1.3.0: test/ParseSpec.hs

{-# LANGUAGE QuasiQuotes #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE TemplateHaskell #-}

module ParseSpec where

import Data.ByteString (ByteString)
import Data.Word (Word32)
import HOCD.Parse (parseGetReg, parseMem, parseRegisters)
import HOCD.Types (RegisterInfo(..), RegisterName(..))
import Test.Hspec (Spec, it, shouldBe)
import Text.RawString.QQ

import qualified Data.Attoparsec.ByteString.Char8
import qualified Data.Map.Strict

spec :: Spec
spec = do
  it "parses read-memory sample" $ do
    Data.Attoparsec.ByteString.Char8.parseOnly
      parseMem
      "0xABCDFF 0x001122"
    `shouldBe`
    (Right [0xABCDFF, 0x1122 :: Word32])

  it "parses registers sample" $ do
    Data.Attoparsec.ByteString.Char8.parseOnly
      parseRegisters
      regsSample
    `shouldBe`
    ( Right
    $ Data.Map.Strict.fromList
      [ ( RegisterName "primask"
        , RegisterInfo
          { registerInfoSize = 1
          , registerInfoValue = Nothing
          , registerInfoDirty = False
          , registerInfoGroup = "arm v7m registers"
          }
        )
      , ( RegisterName "test"
        , RegisterInfo
          { registerInfoSize = 32
          , registerInfoValue = Nothing
          , registerInfoDirty = False
          , registerInfoGroup = "Cortex-M DWT registers"
          }
        )
      , ( RegisterName "r0"
        , RegisterInfo
          { registerInfoSize = 32
          , registerInfoValue = pure 0x0000D3C2
          , registerInfoDirty = True
          , registerInfoGroup = "arm v7m registers"
          }
        )
      , ( RegisterName "r1"
        , RegisterInfo
          { registerInfoSize = 32
          , registerInfoValue = pure 0xFD61F31C
          , registerInfoDirty = False
          , registerInfoGroup = "arm v7m registers"
          }
        )
      ]
    )

  it "parses get_reg response" $ do
    Data.Attoparsec.ByteString.Char8.parseOnly
      (parseGetReg (RegisterName "pc"))
      "pc 0x1234"
    `shouldBe`
    Right (0x1234 :: Word32)


regsSample :: ByteString
regsSample = [r|===== arm v7m registers
(0) r0 (/32): 0x0000D3C2 (dirty)
(1) r1 (/32): 0xFD61F31C
(20) primask (/1)
===== Cortex-M DWT registers
(123) test (/32)
|]