"""
Test Getting the expression path for registers works correctly
"""

import lldb
from lldbsuite.test import lldbutil
from lldbsuite.test.decorators import *
from lldbsuite.test.lldbtest import TestBase, VALID_BREAKPOINT, VALID_TARGET


class TestExprPathRegisters(TestBase):
    NO_DEBUG_INFO_TESTCASE = True

    def verify_register_path(self, reg_value: lldb.SBValue):
        stream = lldb.SBStream()
        reg_name = reg_value.name
        self.assertTrue(
            reg_value.GetExpressionPath(stream),
            f"Expected an expression path for register {reg_name}.",
        )
        reg_expr_path = stream.GetData()
        self.assertEqual(reg_expr_path, f"${reg_name}")

    def test_float_registers(self):
        """Verify the expression path of the registers is valid."""
        self.build()
        _, _, thread, _ = lldbutil.run_to_name_breakpoint(self, "my_foo")
        frame = thread.GetSelectedFrame()
        self.assertTrue(frame, "Expected a valid Frame.")

        # possible floating point register on some cpus.
        register_names = [
            "xmm0",
            "ymm0",
            "v0",
            "v1",
            "f0",
            "f1",
            "d0",
            "d1",
            "vr0",
            "vr1",
            "st0",
            "st1",
        ]
        for name in register_names:
            reg_value = frame.FindRegister(name)
            # some the register will not be available for the cpu
            # only verify if it is valid.
            if reg_value:
                self.verify_register_path(reg_value)

    @requireNotWasm("wasm exposes no registers")
    def test_all_registers(self):
        """Test all the registers that is avaiable on the machine"""
        self.build()
        _, _, thread, _ = lldbutil.run_to_name_breakpoint(self, "my_foo")
        frame = thread.GetSelectedFrame()
        self.assertTrue(frame, "Expected a valid Frame.")

        register_sets = frame.GetRegisters()
        self.assertTrue(register_sets.IsValid(), "Expected Frame Registers")

        for register_set in register_sets:
            for register in register_set.children:
                self.verify_register_path(register)
