"""
Test lldb data formatter subsystem.
"""


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


class SyntheticFilterRecomputingTestCase(TestBase):
    def setUp(self):
        # Call super's setUp().
        TestBase.setUp(self)
        # Find the line number to break at.
        self.line = line_number("main.m", "// Set break point at this line.")

    @skipUnlessDarwin
    def test_rdar12437442_with_run_command(self):
        """Test that we update SBValues correctly as dynamic types change."""
        self.build()
        self.runCmd("file " + self.getBuildArtifact("a.out"), CURRENT_EXECUTABLE_SET)

        lldbutil.run_break_set_by_file_and_line(
            self, "main.m", self.line, num_expected_locations=1, loc_exact=True
        )

        self.runCmd("run", RUN_SUCCEEDED)

        # The stop reason of the thread should be breakpoint.
        self.expect(
            "thread list",
            STOPPED_DUE_TO_BREAKPOINT,
            substrs=["stopped", "stop reason = breakpoint"],
        )

        # This is the function to remove the custom formats in order to have a
        # clean slate for the next test case.
        def cleanup():
            self.runCmd("type format clear", check=False)
            self.runCmd("type summary clear", check=False)
            self.runCmd("type synth clear", check=False)

        # Execute the cleanup function during test case tear down.
        self.addTearDownHook(cleanup)

        # Now run the bulk of the test
        id_x = (
            self.dbg.GetSelectedTarget()
            .GetProcess()
            .GetSelectedThread()
            .GetSelectedFrame()
            .FindVariable("x")
        )
        id_x.SetPreferDynamicValue(lldb.eDynamicCanRunTarget)
        id_x.SetPreferSyntheticValue(True)

        if self.TraceOn():
            self.runCmd("expr --dynamic-type run-target --ptr-depth 1 -- x")

        self.assertEqual(
            id_x.GetSummary(), '@"5 elements"', "array does not get correct summary"
        )

        self.runCmd("next")
        self.runCmd("frame select 0")

        id_x = (
            self.dbg.GetSelectedTarget()
            .GetProcess()
            .GetSelectedThread()
            .GetSelectedFrame()
            .FindVariable("x")
        )
        id_x.SetPreferDynamicValue(lldb.eDynamicCanRunTarget)
        id_x.SetPreferSyntheticValue(True)

        if self.TraceOn():
            self.runCmd("expr --dynamic-type run-target --ptr-depth 1 -- x")

        self.assertEqual(
            id_x.GetNumChildren(), 7, "dictionary does not have 7 children"
        )
        id_x.SetPreferSyntheticValue(False)
        self.assertNotEqual(
            id_x.GetNumChildren(), 7, "dictionary still looks synthetic"
        )
        id_x.SetPreferSyntheticValue(True)
        self.assertEqual(
            id_x.GetSummary(),
            "7 key/value pairs",
            "dictionary does not get correct summary",
        )
