*** Keywords **

Create Platform
             Execute Command          mach create
             Execute Command          using sysbus
             Execute Command          machine LoadPlatformDescriptionFromString "cpu: CPU.RiscV32 @ sysbus { cpuType: \\"rv32gc\\"; timeProvider: empty }"
             Execute Command          machine LoadPlatformDescriptionFromString "mem: Memory.MappedMemory @ sysbus 0x0 { size: 0x1000 }"
             Execute Command          machine LoadPlatformDescriptionFromString "uart: UART.LiteX_UART @ sysbus 0x2000"
             Execute Command          machine LoadPlatformDescriptionFromString "radio: Wireless.NRF52840_Radio @ sysbus 0x3000"

Should Throw Python Syntax Exception
             [Arguments]    ${command}
    ${out}=  Run Keyword And Expect Error  KeywordException:*
             ...                      Execute Command          ${command}
             Should Contain           ${out}      [FatalError] unexpected EOF while parsing (Line 1, Column 9)

Read Should Be Equal
             [Arguments]    ${type}    ${address}    ${value}

    ${res}=  Execute Command              sysbus Read${type} ${address}
             Should Be Equal As Integers  ${res}  ${value}

*** Test Cases ***

Should Return Syntax Error
             Create Platform

             # BlockPythonEngine
             Should Throw Python Syntax Exception
             ...                      cpu AddHook 0xC0FFEE "if error"

             # InterruptPythonEngine
             Should Throw Python Syntax Exception
             ...                      cpu AddHookAtInterruptBegin "if error"

             # BusPeripheralsHooksPythonEngine
             Should Throw Python Syntax Exception
             ...                      sysbus SetHookAfterPeripheralRead uart "if error"

             # WatchpointHookPythonEngine
             Should Throw Python Syntax Exception
             ...                      sysbus AddWatchpointHook 0xC0FFEE Byte Read "if error"

             # PacketInterceptionPythonEngine
             Execute Command          emulation CreateIEEE802_15_4Medium "wireless"
             Should Throw Python Syntax Exception
             ...                      wireless SetPacketHookFromScript radio "if error"

             # UartPythonEngine
             Should Throw Python Syntax Exception
             ...                      uart AddLineHook "foobar" "if error"

             # UserStatePythonEngine
             Should Throw Python Syntax Exception
             ...                      machine AddUserStateHook "foobar" "if error"

Should Abort On Runtime Error
             Create Platform
             Create Log Tester        1

             Execute Command          logLevel -1 cpu
             Execute Command          cpu InstallCustomInstructionHandlerFromString "11111111111111111111111100001011" "a = b"
             Execute Command          sysbus WriteDoubleWord 0x00000000 0xffffff0b
             Execute Command          cpu PC 0x00000000

             Execute Command          cpu Step
             Wait For Log Entry       Python runtime error: name 'b' is not defined
             Wait For Log Entry       CPU abort detected, halting.

PyDev Should Handle QuadWord Accesses
             Execute Command          mach create
             Execute Command          numbersMode Hexadecimal

    ${init_value} =     Set Variable  0x1234567890abcdef
    ${init_value_32} =  Evaluate      ${init_value} & 0xFFFFFFFF
    ${pydev_script} =   Catenate      SEPARATOR=\n
             ...                      """
             ...                      if request.isInit:
             ...                      \ \ value = ${init_value}
             ...                      elif request.isRead:
             ...                      \ \ request.value = value
             ...                      elif request.isWrite:
             ...                      \ \ value = request.value
             ...                      """
    ${pydev_address} =  Set Variable  0x8

             Execute Command          machine PyDevFromString ${pydev_script} ${pydev_address} 8 True
             Read Should Be Equal     QuadWord  ${pydev_address}  ${init_value}
             Read Should Be Equal     DoubleWord  ${pydev_address}  ${init_value_32}

    ${new_value} =      Set Variable  0xfedcba0987654321
             Execute Command          sysbus WriteQuadWord ${pydev_address} ${new_value}
             Read Should Be Equal     QuadWord  ${pydev_address}  ${new_value}

Should Handle Unsupported Variable Types
             Execute Command          $a=@a

    ${out}=  Run Keyword And Expect Error  KeywordException:*
             ...                      Execute Command          py $a
             Should Contain           ${out}      There was an error when executing command 'py $a': Variable type has to be a string.
