"""Test that SBFrame::FindValue finds things but does not duplicate the entire variables list"""



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


class SBFrameFindValueTestCase(TestBase):

    mydir = TestBase.compute_mydir(__file__)
    NO_DEBUG_INFO_TESTCASE = True

    def test_formatters_api(self):
        """Test that SBFrame::FindValue finds things but does not duplicate the entire variables list"""
        self.build()
        self.setTearDownCleanup()

        exe = self.getBuildArtifact("a.out")

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

        # Set the breakpoints
        breakpoint = target.BreakpointCreateBySourceRegex(
            'Set breakpoint here', lldb.SBFileSpec("main.cpp"))
        self.assertTrue(breakpoint.GetNumLocations() > 0, VALID_BREAKPOINT)

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

        self.assertTrue(process, PROCESS_IS_VALID)

        # Frame #0 should be at our breakpoint.
        threads = lldbutil.get_threads_stopped_at_breakpoint(
            process, breakpoint)

        self.assertEquals(len(threads), 1)
        self.thread = threads[0]
        self.frame = self.thread.frames[0]
        self.assertTrue(self.frame, "Frame 0 is valid.")

        self.assertTrue(
            self.frame.GetVariables(
                True,
                True,
                False,
                True).GetSize() == 2,
            "variable count is off")
        self.assertFalse(
            self.frame.FindValue(
                "NoSuchThing",
                lldb.eValueTypeVariableArgument,
                lldb.eDynamicCanRunTarget).IsValid(),
            "found something that should not be here")
        self.assertTrue(
            self.frame.GetVariables(
                True,
                True,
                False,
                True).GetSize() == 2,
            "variable count is off after failed FindValue()")
        self.assertTrue(
            self.frame.FindValue(
                "a",
                lldb.eValueTypeVariableArgument,
                lldb.eDynamicCanRunTarget).IsValid(),
            "FindValue() didn't find an argument")
        self.assertTrue(
            self.frame.GetVariables(
                True,
                True,
                False,
                True).GetSize() == 2,
            "variable count is off after successful FindValue()")
