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

from __future__ import print_function


import os
import sys
import time
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__)

    @add_test_categories(['pyapi'])
    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.assertTrue(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()")
