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