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


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


class PrintObjectArrayTestCase(TestBase):
    SHARED_BUILD_TESTCASE = False

    @skipUnlessDarwin
    def test_print_array(self):
        """Test that expr -O -Z works"""
        self.build()
        self.printarray_data_formatter_commands()

    @skipUnlessDarwin
    def test_print_array_no_const(self):
        """Test that expr -O -Z works"""
        disable_constant_classes = {
            "USE_SYSTEM_STDLIB": "1",  # See above.
            "CFLAGS_EXTRAS": "-fno-constant-nsnumber-literals "
            + "-fno-constant-nsarray-literals "
            + "-fno-constant-nsdictionary-literals",
        }
        # FIXME: Remove compiler when flags are available upstream.
        self.build(dictionary=disable_constant_classes, compiler="xcrun clang")
        self.printarray_data_formatter_commands()

    def setUp(self):
        # Call super's setUp().
        TestBase.setUp(self)
        # Find the line number to break at.
        self.line = line_number("main.mm", "break here")

    def printarray_data_formatter_commands(self):
        """Test that expr -O -Z works"""
        self.runCmd("file " + self.getBuildArtifact("a.out"), CURRENT_EXECUTABLE_SET)

        lldbutil.run_break_set_by_file_and_line(
            self, "main.mm", 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)

        self.expect(
            "expr --element-count 3 --object-description -- objects",
            substrs=[
                "3735928559",
                "4276993775",
                "3203398366",
                "Hello",
                "World",
                "Two =",
                "1 =",
            ],
        )
        self.expect(
            "poarray 3 objects",
            substrs=[
                "3735928559",
                "4276993775",
                "3203398366",
                "Hello",
                "World",
                "Two =",
                "1 =",
            ],
        )
        self.expect(
            "expr --element-count 3 --object-description --description-verbosity=full -- objects",
            substrs=[
                "[0] =",
                "3735928559",
                "4276993775",
                "3203398366",
                "[1] =",
                "Hello",
                "World",
                "[2] =",
                "Two =",
                "1 =",
            ],
        )
        self.expect("parray 3 objects", substrs=["[0] = 0x", "[1] = 0x", "[2] = 0x"])
        self.expect(
            "expr --element-count 3 -d run -- objects",
            substrs=["3 elements", "2 elements", "2 key/value pairs"],
        )
        self.expect(
            "expr --element-count 3 -d run --ptr-depth=1 -- objects",
            substrs=[
                "3 elements",
                "3735928559",
                "4276993775",
                "3203398366",
                "2 elements",
                '"Hello"',
                '"World"',
                "2 key/value pairs",
            ],
        )
