199451b44SJordan Rupprecht"""
299451b44SJordan RupprechtTest lldb data formatter subsystem.
399451b44SJordan Rupprecht"""
499451b44SJordan Rupprecht
599451b44SJordan Rupprecht
699451b44SJordan Rupprecht
799451b44SJordan Rupprechtimport lldb
899451b44SJordan Rupprechtfrom lldbsuite.test.decorators import *
999451b44SJordan Rupprechtfrom lldbsuite.test.lldbtest import *
1099451b44SJordan Rupprechtfrom lldbsuite.test import lldbutil
1199451b44SJordan Rupprecht
1299451b44SJordan Rupprecht
1399451b44SJordan Rupprechtclass PrintObjectArrayTestCase(TestBase):
1499451b44SJordan Rupprecht
1599451b44SJordan Rupprecht    mydir = TestBase.compute_mydir(__file__)
1699451b44SJordan Rupprecht
1799451b44SJordan Rupprecht    @skipUnlessDarwin
1899451b44SJordan Rupprecht    def test_print_array(self):
1999451b44SJordan Rupprecht        """Test that expr -O -Z works"""
2099451b44SJordan Rupprecht        self.build()
2199451b44SJordan Rupprecht        self.printarray_data_formatter_commands()
2299451b44SJordan Rupprecht
23*9d5e95d0SJonas Devlieghere    @skipUnlessDarwin
24*9d5e95d0SJonas Devlieghere    def test_print_array_no_const(self):
25*9d5e95d0SJonas Devlieghere        """Test that expr -O -Z works"""
26*9d5e95d0SJonas Devlieghere        disable_constant_classes = {
27*9d5e95d0SJonas Devlieghere            'CC':
28*9d5e95d0SJonas Devlieghere            'xcrun clang',  # FIXME: Remove when flags are available upstream.
29*9d5e95d0SJonas Devlieghere            'CFLAGS_EXTRAS':
30*9d5e95d0SJonas Devlieghere            '-fno-constant-nsnumber-literals ' +
31*9d5e95d0SJonas Devlieghere            '-fno-constant-nsarray-literals ' +
32*9d5e95d0SJonas Devlieghere            '-fno-constant-nsdictionary-literals'
33*9d5e95d0SJonas Devlieghere        }
34*9d5e95d0SJonas Devlieghere        self.build(dictionary=disable_constant_classes)
35*9d5e95d0SJonas Devlieghere        self.printarray_data_formatter_commands()
36*9d5e95d0SJonas Devlieghere
3799451b44SJordan Rupprecht    def setUp(self):
3899451b44SJordan Rupprecht        # Call super's setUp().
3999451b44SJordan Rupprecht        TestBase.setUp(self)
4099451b44SJordan Rupprecht        # Find the line number to break at.
4199451b44SJordan Rupprecht        self.line = line_number('main.mm', 'break here')
4299451b44SJordan Rupprecht
4399451b44SJordan Rupprecht    def printarray_data_formatter_commands(self):
4499451b44SJordan Rupprecht        """Test that expr -O -Z works"""
4599451b44SJordan Rupprecht        self.runCmd("file " + self.getBuildArtifact("a.out"), CURRENT_EXECUTABLE_SET)
4699451b44SJordan Rupprecht
4799451b44SJordan Rupprecht        lldbutil.run_break_set_by_file_and_line(
4899451b44SJordan Rupprecht            self, "main.mm", self.line, num_expected_locations=1, loc_exact=True)
4999451b44SJordan Rupprecht
5099451b44SJordan Rupprecht        self.runCmd("run", RUN_SUCCEEDED)
5199451b44SJordan Rupprecht
5299451b44SJordan Rupprecht        # The stop reason of the thread should be breakpoint.
5399451b44SJordan Rupprecht        self.expect("thread list", STOPPED_DUE_TO_BREAKPOINT,
5499451b44SJordan Rupprecht                    substrs=['stopped',
5599451b44SJordan Rupprecht                             'stop reason = breakpoint'])
5699451b44SJordan Rupprecht
5799451b44SJordan Rupprecht        # This is the function to remove the custom formats in order to have a
5899451b44SJordan Rupprecht        # clean slate for the next test case.
5999451b44SJordan Rupprecht        def cleanup():
6099451b44SJordan Rupprecht            self.runCmd('type format clear', check=False)
6199451b44SJordan Rupprecht            self.runCmd('type summary clear', check=False)
6299451b44SJordan Rupprecht            self.runCmd('type synth clear', check=False)
6399451b44SJordan Rupprecht
6499451b44SJordan Rupprecht        # Execute the cleanup function during test case tear down.
6599451b44SJordan Rupprecht        self.addTearDownHook(cleanup)
6699451b44SJordan Rupprecht
6799451b44SJordan Rupprecht        self.expect(
6899451b44SJordan Rupprecht            'expr --element-count 3 --object-description -- objects',
6999451b44SJordan Rupprecht            substrs=[
7099451b44SJordan Rupprecht                '3735928559',
7199451b44SJordan Rupprecht                '4276993775',
7299451b44SJordan Rupprecht                '3203398366',
7399451b44SJordan Rupprecht                'Hello',
7499451b44SJordan Rupprecht                'World',
7599451b44SJordan Rupprecht                'Two =',
7699451b44SJordan Rupprecht                '1 ='])
7799451b44SJordan Rupprecht        self.expect(
7899451b44SJordan Rupprecht            'poarray 3 objects',
7999451b44SJordan Rupprecht            substrs=[
8099451b44SJordan Rupprecht                '3735928559',
8199451b44SJordan Rupprecht                '4276993775',
8299451b44SJordan Rupprecht                '3203398366',
8399451b44SJordan Rupprecht                'Hello',
8499451b44SJordan Rupprecht                'World',
8599451b44SJordan Rupprecht                'Two =',
8699451b44SJordan Rupprecht                '1 ='])
8799451b44SJordan Rupprecht        self.expect(
8899451b44SJordan Rupprecht            'expr --element-count 3 --object-description --description-verbosity=full -- objects',
8999451b44SJordan Rupprecht            substrs=[
9099451b44SJordan Rupprecht                '[0] =',
9199451b44SJordan Rupprecht                '3735928559',
9299451b44SJordan Rupprecht                '4276993775',
9399451b44SJordan Rupprecht                '3203398366',
9499451b44SJordan Rupprecht                '[1] =',
9599451b44SJordan Rupprecht                'Hello',
9699451b44SJordan Rupprecht                'World',
9799451b44SJordan Rupprecht                '[2] =',
9899451b44SJordan Rupprecht                'Two =',
9999451b44SJordan Rupprecht                '1 ='])
10099451b44SJordan Rupprecht        self.expect(
10199451b44SJordan Rupprecht            'parray 3 objects',
10299451b44SJordan Rupprecht            substrs=[
10399451b44SJordan Rupprecht                '[0] = 0x',
10499451b44SJordan Rupprecht                '[1] = 0x',
10599451b44SJordan Rupprecht                '[2] = 0x'])
10699451b44SJordan Rupprecht        self.expect(
10799451b44SJordan Rupprecht            'expr --element-count 3 -d run -- objects',
10899451b44SJordan Rupprecht            substrs=[
10999451b44SJordan Rupprecht                '3 elements',
11099451b44SJordan Rupprecht                '2 elements',
11199451b44SJordan Rupprecht                '2 key/value pairs'])
11299451b44SJordan Rupprecht        self.expect(
11399451b44SJordan Rupprecht            'expr --element-count 3 -d run --ptr-depth=1 -- objects',
11499451b44SJordan Rupprecht            substrs=[
11599451b44SJordan Rupprecht                '3 elements',
11699451b44SJordan Rupprecht                '3735928559',
11799451b44SJordan Rupprecht                '4276993775',
11899451b44SJordan Rupprecht                '3203398366',
11999451b44SJordan Rupprecht                '2 elements',
12099451b44SJordan Rupprecht                '"Hello"',
12199451b44SJordan Rupprecht                '"World"',
12299451b44SJordan Rupprecht                '2 key/value pairs',
12399451b44SJordan Rupprecht            ])
124