"""
Test some SBValue APIs.
"""

import lldb
from lldbsuite.test import lldbutil
from lldbsuite.test.decorators import *
from lldbsuite.test.lldbtest import *


class ValueAPITestCase(TestBase):
    SHARED_BUILD_TESTCASE = False

    def setUp(self):
        # Call super's setUp().
        TestBase.setUp(self)
        # We'll use the test method name as the exe_name.
        self.exe_name = self.testMethodName
        # Find the line number to of function 'c'.
        self.line = line_number("main.c", "// Break at this line")

    @expectedFailureAll(oslist=["windows"], bugnumber="llvm.org/pr24772")
    def test(self):
        """Exercise some SBValue APIs."""
        d = {"EXE": self.exe_name}
        self.build(dictionary=d)
        self.setTearDownCleanup(dictionary=d)
        exe = self.getBuildArtifact(self.exe_name)

        # Create a target by the debugger.
        target = self.dbg.CreateTarget(exe)
        self.assertTrue(target, VALID_TARGET)

        # Create the breakpoint inside function 'main'.
        breakpoint = target.BreakpointCreateByLocation("main.c", self.line)
        self.assertTrue(breakpoint, VALID_BREAKPOINT)

        # Now launch the process, and do not stop at entry point.
        process = target.LaunchSimple(None, None, self.get_process_working_directory())
        self.assertTrue(process, PROCESS_IS_VALID)

        # Get Frame #0.
        self.assertState(process.GetState(), lldb.eStateStopped)
        thread = lldbutil.get_stopped_thread(process, lldb.eStopReasonBreakpoint)
        self.assertTrue(
            thread.IsValid(),
            "There should be a thread stopped due to breakpoint condition",
        )
        frame0 = thread.GetFrameAtIndex(0)

        # Get global variable 'days_of_week'.
        list = target.FindGlobalVariables("days_of_week", 1)
        days_of_week = list.GetValueAtIndex(0)
        self.assertTrue(days_of_week, VALID_VARIABLE)
        self.assertEqual(days_of_week.GetNumChildren(), 7, VALID_VARIABLE)
        self.DebugSBValue(days_of_week)

        # Use this to test the "child" and "children" accessors:
        children = days_of_week.children
        self.assertEqual(len(children), 7, VALID_VARIABLE)
        for i in range(0, len(children)):
            day = days_of_week.child[i]
            list_day = children[i]
            self.assertNotEqual(day, None)
            self.assertNotEqual(list_day, None)
            self.assertEqual(day.GetSummary(), list_day.GetSummary(), VALID_VARIABLE)

        # Spot check the actual value:
        first_day = days_of_week.child[1]
        self.assertEqual(first_day.GetSummary(), '"Monday"', VALID_VARIABLE)

        # Get global variable 'weekdays'.
        list = target.FindGlobalVariables("weekdays", 1)
        weekdays = list.GetValueAtIndex(0)
        self.assertTrue(weekdays, VALID_VARIABLE)
        self.assertEqual(weekdays.GetNumChildren(), 5, VALID_VARIABLE)
        self.DebugSBValue(weekdays)

        # Get global variable 'g_table'.
        list = target.FindGlobalVariables("g_table", 1)
        g_table = list.GetValueAtIndex(0)
        self.assertTrue(g_table, VALID_VARIABLE)
        self.assertEqual(g_table.GetNumChildren(), 2, VALID_VARIABLE)
        self.DebugSBValue(g_table)

        fmt = lldbutil.BasicFormatter()
        cvf = lldbutil.ChildVisitingFormatter(indent_child=2)
        rdf = lldbutil.RecursiveDescentFormatter(indent_child=2)
        if self.TraceOn():
            print(fmt.format(days_of_week))
            print(cvf.format(days_of_week))
            print(cvf.format(weekdays))
            print(rdf.format(g_table))

        # Get variable 'my_int_ptr'.
        value = frame0.FindVariable("my_int_ptr")
        self.assertTrue(value, VALID_VARIABLE)
        self.DebugSBValue(value)

        # Get what 'my_int_ptr' points to.
        pointed = value.GetChildAtIndex(0)
        self.assertTrue(pointed, VALID_VARIABLE)
        self.DebugSBValue(pointed)

        # While we are at it, verify that 'my_int_ptr' points to 'g_my_int'.
        symbol = target.ResolveLoadAddress(int(pointed.GetLocation(), 0)).GetSymbol()
        self.assertTrue(symbol)
        self.expect(symbol.GetName(), exe=False, startstr="g_my_int")

        # Get variable 'str_ptr'.
        value = frame0.FindVariable("str_ptr")
        self.assertTrue(value, VALID_VARIABLE)
        self.DebugSBValue(value)

        # SBValue::TypeIsPointerType() should return true.
        self.assertTrue(value.TypeIsPointerType())

        # Verify the SBValue::GetByteSize() API is working correctly.
        arch = self.getArchitecture()
        if arch == "i386":
            self.assertEqual(value.GetByteSize(), 4)
        elif arch == "x86_64":
            self.assertEqual(value.GetByteSize(), 8)

        # Get child at index 5 => 'Friday'.
        child = value.GetChildAtIndex(5, lldb.eNoDynamicValues, True)
        self.assertTrue(child, VALID_VARIABLE)
        self.DebugSBValue(child)

        self.expect(child.GetSummary(), exe=False, substrs=["Friday"])

        # Now try to get at the same variable using GetValueForExpressionPath().
        # These two SBValue objects should have the same value.
        val2 = value.GetValueForExpressionPath("[5]")
        self.assertTrue(val2, VALID_VARIABLE)
        self.DebugSBValue(val2)
        self.assertTrue(
            child.GetValue() == val2.GetValue()
            and child.GetSummary() == val2.GetSummary()
        )

        val_i = target.EvaluateExpression("i")
        val_s = target.EvaluateExpression("s")
        val_a = target.EvaluateExpression("a")
        self.assertTrue(val_s.member["a"].GetAddress().IsValid(), VALID_VARIABLE)
        self.assertTrue(val_s.member["a"].AddressOf(), VALID_VARIABLE)
        self.assertTrue(val_a.Cast(val_i.GetType()).AddressOf(), VALID_VARIABLE)

        # Test some other cases of the Cast API.  We allow casts from one struct type
        # to another, which is a little weird, but we don't support casting from a
        # smaller type to a larger when the underlying data is not in the inferior,
        # since then we have no way to fetch the out-of-bounds values.
        # For an expression that references a variable, or a FindVariable result,
        # or an SBValue made from an address and a type, we can get back to the target,
        # so those will work.  Make sure they do and get the right extra values as well.

        # We're casting everything to the type of "f", so get that first:
        f_var = frame0.FindVariable("f")
        self.assertSuccess(f_var.error, "Got f")
        bigger_type = f_var.GetType()

        # First try a value that we got from FindVariable
        container = frame0.FindVariable("my_container")
        self.assertSuccess(container.error, "Found my_container")
        fv_small = container.GetValueForExpressionPath(".data.small")
        self.assertSuccess(fv_small.error, "Found small in my_container")
        fv_cast = fv_small.Cast(bigger_type)
        self.assertSuccess(fv_cast.error, "Can cast up from FindVariable")
        child_checks = [
            ValueCheck(name="a", value="33", type="int"),
            ValueCheck(name="b", value="44", type="int"),
            ValueCheck(name="c", value="55", type="int"),
        ]
        cast_check = ValueCheck(type=bigger_type.name, children=child_checks)

        # Now try one we made with expr.  This one should fail, because expr
        # stores the "canonical value" in host memory, and doesn't know how
        # to augment that from the live address.
        expr_cont = frame0.EvaluateExpression("my_container")
        self.assertSuccess(expr_cont.error, "Got my_container by expr")
        expr_small = expr_cont.GetValueForExpressionPath(".data.small")
        self.assertSuccess(expr_small.error, "Got small by expr")
        expr_cast = expr_small.Cast(bigger_type)
        self.assertFailure(expr_cast.error, msg="Cannot cast expr result")

        # Now try one we made with CreateValueFromAddress.  That will succeed
        # because this directly tracks the inferior memory.
        small_addr = fv_small.addr
        self.assertTrue(small_addr.IsValid())
        small_type = fv_small.GetType()
        vfa_small = target.CreateValueFromAddress(
            "small_from_addr", small_addr, small_type
        )
        self.assertSuccess(vfa_small.error, "Made small from address")
        vfa_cast = vfa_small.Cast(bigger_type)
        self.assertSuccess(vfa_cast.error, "Made a cast from vfa_small")
        cast_check.check_value(self, vfa_cast, "Cast of ValueFromAddress succeeds")

        # Next try ValueObject created from data.  They should fail as there's no
        # way to grow the data:
        data_small = target.CreateValueFromData(
            "small_from_data", fv_small.data, fv_small.type
        )
        self.assertSuccess(data_small.error, "Made a valid object from data")
        data_cast = data_small.Cast(bigger_type)
        self.assertFailure(data_cast.error, msg="Cannot cast data backed SBValue")

        # Now check casting from a larger type to a smaller, we can always do this,
        # so just test one case:
        weird_cast = f_var.Cast(val_s.GetType())
        self.assertSuccess(weird_cast.GetError(), "Can cast from a larger to a smaller")
        self.assertEqual(
            weird_cast.member["a"].GetValueAsSigned(0),
            33,
            "Got the right value",
        )

        # Check that lldb.value implements truth testing.
        self.assertFalse(lldb.value(frame0.FindVariable("bogus")))
        self.assertTrue(lldb.value(frame0.FindVariable("uinthex")))

        self.assertEqual(
            int(lldb.value(frame0.FindVariable("uinthex"))),
            3768803088,
            "uinthex == 3768803088",
        )
        self.assertEqual(
            int(lldb.value(frame0.FindVariable("sinthex"))),
            -526164208,
            "sinthex == -526164208",
        )

        # Check value_iter works correctly.
        for v in [
            lldb.value(frame0.FindVariable("uinthex")),
            lldb.value(frame0.FindVariable("sinthex")),
        ]:
            self.assertTrue(v)

        self.assertEqual(
            frame0.FindVariable("uinthex").GetValueAsUnsigned(),
            3768803088,
            "unsigned uinthex == 3768803088",
        )
        self.assertEqual(
            frame0.FindVariable("sinthex").GetValueAsUnsigned(),
            3768803088,
            "unsigned sinthex == 3768803088",
        )

        self.assertEqual(
            frame0.FindVariable("uinthex").GetValueAsSigned(),
            -526164208,
            "signed uinthex == -526164208",
        )
        self.assertEqual(
            frame0.FindVariable("sinthex").GetValueAsSigned(),
            -526164208,
            "signed sinthex == -526164208",
        )

        # Check that hex value printing works as expected.
        self.assertEqual(
            frame0.FindVariable("fixed_int_ptr").GetValue(),
            "0x000000aa" if target.addr_size == 4 else "0x00000000000000aa",
        )
        self.runCmd(
            "settings set target.show-hex-variable-values-with-leading-zeroes false"
        )
        self.assertEqual(
            frame0.FindVariable("another_fixed_int_ptr").GetValue(),
            "0xaa",
        )
        a_null_int_ptr = frame0.FindVariable("a_null_int_ptr")
        self.assertEqual(a_null_int_ptr.GetValue(), "0x0")

        # Check that dereferencing a null pointer produces reasonable results
        # (does not crash).
        self.assertEqual(
            a_null_int_ptr.Dereference().GetError().GetCString(), "parent is NULL"
        )
        self.assertEqual(
            a_null_int_ptr.Dereference().GetLoadAddress(), lldb.LLDB_INVALID_ADDRESS
        )
