199451b44SJordan Rupprecht"""
299451b44SJordan RupprechtTest lldb data formatter subsystem.
399451b44SJordan Rupprecht"""
499451b44SJordan Rupprecht
599451b44SJordan Rupprecht
699451b44SJordan Rupprecht
799451b44SJordan Rupprechtimport lldb
899451b44SJordan Rupprechtfrom lldbsuite.test.lldbtest import *
999451b44SJordan Rupprechtimport lldbsuite.test.lldbutil as lldbutil
1099451b44SJordan Rupprecht
1199451b44SJordan Rupprecht
1299451b44SJordan Rupprechtclass AdvDataFormatterTestCase(TestBase):
1399451b44SJordan Rupprecht
1499451b44SJordan Rupprecht    def setUp(self):
1599451b44SJordan Rupprecht        # Call super's setUp().
1699451b44SJordan Rupprecht        TestBase.setUp(self)
1799451b44SJordan Rupprecht        # Find the line number to break at.
1899451b44SJordan Rupprecht        self.line = line_number('main.cpp', '// Set break point at this line.')
1999451b44SJordan Rupprecht
2099451b44SJordan Rupprecht    def test_with_run_command(self):
2199451b44SJordan Rupprecht        """Test that that file and class static variables display correctly."""
2299451b44SJordan Rupprecht        self.build()
2399451b44SJordan Rupprecht        self.runCmd("file " + self.getBuildArtifact("a.out"), CURRENT_EXECUTABLE_SET)
2499451b44SJordan Rupprecht
2599451b44SJordan Rupprecht        lldbutil.run_break_set_by_file_and_line(
2699451b44SJordan Rupprecht            self, "main.cpp", self.line, num_expected_locations=1, loc_exact=True)
2799451b44SJordan Rupprecht
2899451b44SJordan Rupprecht        self.runCmd("run", RUN_SUCCEEDED)
2999451b44SJordan Rupprecht
3099451b44SJordan Rupprecht        # The stop reason of the thread should be breakpoint.
3199451b44SJordan Rupprecht        self.expect("thread list", STOPPED_DUE_TO_BREAKPOINT,
3299451b44SJordan Rupprecht                    substrs=['stopped',
3399451b44SJordan Rupprecht                             'stop reason = breakpoint'])
3499451b44SJordan Rupprecht
3599451b44SJordan Rupprecht        # This is the function to remove the custom formats in order to have a
3699451b44SJordan Rupprecht        # clean slate for the next test case.
3799451b44SJordan Rupprecht        def cleanup():
3899451b44SJordan Rupprecht            self.runCmd('type format clear', check=False)
3999451b44SJordan Rupprecht            self.runCmd('type summary clear', check=False)
4099451b44SJordan Rupprecht            self.runCmd(
4199451b44SJordan Rupprecht                "settings set target.max-children-count 256",
4299451b44SJordan Rupprecht                check=False)
4399451b44SJordan Rupprecht
4499451b44SJordan Rupprecht        # Execute the cleanup function during test case tear down.
4599451b44SJordan Rupprecht        self.addTearDownHook(cleanup)
4699451b44SJordan Rupprecht
4799451b44SJordan Rupprecht        self.runCmd("type summary add --summary-string \"pippo\" \"i_am_cool\"")
4899451b44SJordan Rupprecht
4999451b44SJordan Rupprecht        self.runCmd(
5099451b44SJordan Rupprecht            "type summary add --summary-string \"pluto\" -x \"i_am_cool[a-z]*\"")
5199451b44SJordan Rupprecht
5299451b44SJordan Rupprecht        self.expect("frame variable cool_boy",
5399451b44SJordan Rupprecht                    substrs=['pippo'])
5499451b44SJordan Rupprecht
5599451b44SJordan Rupprecht        self.expect("frame variable cooler_boy",
5699451b44SJordan Rupprecht                    substrs=['pluto'])
5799451b44SJordan Rupprecht
5899451b44SJordan Rupprecht        self.runCmd("type summary delete i_am_cool")
5999451b44SJordan Rupprecht
6099451b44SJordan Rupprecht        self.expect("frame variable cool_boy",
6199451b44SJordan Rupprecht                    substrs=['pluto'])
6299451b44SJordan Rupprecht
6399451b44SJordan Rupprecht        self.runCmd("type summary clear")
6499451b44SJordan Rupprecht
6599451b44SJordan Rupprecht        self.runCmd(
66*3abd063fSPavel Labath            "type summary add --summary-string \"${var[]}\" -x \"^int\\[[0-9]\\]")
6799451b44SJordan Rupprecht
6899451b44SJordan Rupprecht        self.expect("frame variable int_array",
6999451b44SJordan Rupprecht                    substrs=['1,2,3,4,5'])
70*3abd063fSPavel Labath        self.expect("frame variable const_int_array",
71*3abd063fSPavel Labath                    substrs=['11,12,13,14,15'])
7299451b44SJordan Rupprecht
7399451b44SJordan Rupprecht        # this will fail if we don't do [] as regex correctly
7499451b44SJordan Rupprecht        self.runCmd(
7599451b44SJordan Rupprecht            'type summary add --summary-string "${var[].integer}" "i_am_cool[]')
7699451b44SJordan Rupprecht
7799451b44SJordan Rupprecht        self.expect("frame variable cool_array",
7899451b44SJordan Rupprecht                    substrs=['1,1,1,1,6'])
7999451b44SJordan Rupprecht
8099451b44SJordan Rupprecht        self.runCmd("type summary clear")
8199451b44SJordan Rupprecht
8299451b44SJordan Rupprecht        self.runCmd(
8399451b44SJordan Rupprecht            "type summary add --summary-string \"${var[1-0]%x}\" \"int\"")
8499451b44SJordan Rupprecht
8599451b44SJordan Rupprecht        self.expect("frame variable iAmInt",
8699451b44SJordan Rupprecht                    substrs=['01'])
8799451b44SJordan Rupprecht
8899451b44SJordan Rupprecht        self.runCmd(
8999451b44SJordan Rupprecht            "type summary add --summary-string \"${var[0-1]%x}\" \"int\"")
9099451b44SJordan Rupprecht
9199451b44SJordan Rupprecht        self.expect("frame variable iAmInt",
9299451b44SJordan Rupprecht                    substrs=['01'])
9399451b44SJordan Rupprecht
9499451b44SJordan Rupprecht        self.runCmd("type summary clear")
9599451b44SJordan Rupprecht
9699451b44SJordan Rupprecht        self.runCmd("type summary add --summary-string \"${var[0-1]%x}\" int")
9799451b44SJordan Rupprecht        self.runCmd(
9899451b44SJordan Rupprecht            "type summary add --summary-string \"${var[0-31]%x}\" float")
9999451b44SJordan Rupprecht
10099451b44SJordan Rupprecht        self.expect("frame variable *pointer",
10199451b44SJordan Rupprecht                    substrs=['0x',
10299451b44SJordan Rupprecht                             '2'])
10399451b44SJordan Rupprecht
10499451b44SJordan Rupprecht        # check fix for <rdar://problem/11338654> LLDB crashes when using a
10599451b44SJordan Rupprecht        # "type summary" that uses bitfields with no format
10699451b44SJordan Rupprecht        self.runCmd("type summary add --summary-string \"${var[0-1]}\" int")
10799451b44SJordan Rupprecht        self.expect("frame variable iAmInt",
10899451b44SJordan Rupprecht                    substrs=['9 1'])
10999451b44SJordan Rupprecht
11099451b44SJordan Rupprecht        self.expect("frame variable cool_array[3].floating",
11199451b44SJordan Rupprecht                    substrs=['0x'])
11299451b44SJordan Rupprecht
11399451b44SJordan Rupprecht        self.runCmd(
11499451b44SJordan Rupprecht            "type summary add --summary-string \"low bits are ${*var[0-1]} tgt is ${*var}\" \"int *\"")
11599451b44SJordan Rupprecht
11699451b44SJordan Rupprecht        self.expect("frame variable pointer",
11799451b44SJordan Rupprecht                    substrs=['low bits are',
11899451b44SJordan Rupprecht                             'tgt is 6'])
11999451b44SJordan Rupprecht
12099451b44SJordan Rupprecht        self.expect(
12199451b44SJordan Rupprecht            "frame variable int_array --summary-string \"${*var[0-1]}\"",
12299451b44SJordan Rupprecht            substrs=['3'])
12399451b44SJordan Rupprecht
12499451b44SJordan Rupprecht        self.runCmd("type summary clear")
12599451b44SJordan Rupprecht
12699451b44SJordan Rupprecht        self.runCmd(
12799451b44SJordan Rupprecht            'type summary add --summary-string \"${var[0-1]}\" -x \"int\[[0-9]\]\"')
12899451b44SJordan Rupprecht
12999451b44SJordan Rupprecht        self.expect("frame variable int_array",
13099451b44SJordan Rupprecht                    substrs=['1,2'])
13199451b44SJordan Rupprecht
13299451b44SJordan Rupprecht        self.runCmd(
13399451b44SJordan Rupprecht            'type summary add --summary-string \"${var[0-1]}\" "int[]"')
13499451b44SJordan Rupprecht
13599451b44SJordan Rupprecht        self.expect("frame variable int_array",
13699451b44SJordan Rupprecht                    substrs=['1,2'])
13799451b44SJordan Rupprecht
13899451b44SJordan Rupprecht        # Test the patterns are matched in reverse-chronological order.
13999451b44SJordan Rupprecht        self.runCmd(
14099451b44SJordan Rupprecht            'type summary add --summary-string \"${var[2-3]}\" "int[]"')
14199451b44SJordan Rupprecht
14299451b44SJordan Rupprecht        self.expect("frame variable int_array",
14399451b44SJordan Rupprecht                    substrs=['3,4'])
14499451b44SJordan Rupprecht
14599451b44SJordan Rupprecht        self.runCmd("type summary clear")
14699451b44SJordan Rupprecht
14799451b44SJordan Rupprecht        self.runCmd("type summary add -c -x \"i_am_cool\[[0-9]\]\"")
14899451b44SJordan Rupprecht        self.runCmd("type summary add -c i_am_cool")
14999451b44SJordan Rupprecht
15099451b44SJordan Rupprecht        self.expect(
15199451b44SJordan Rupprecht            "frame variable cool_array",
15299451b44SJordan Rupprecht            substrs=[
15399451b44SJordan Rupprecht                '[0]',
15499451b44SJordan Rupprecht                'integer',
15599451b44SJordan Rupprecht                'floating',
15699451b44SJordan Rupprecht                'character',
15799451b44SJordan Rupprecht                '[1]',
15899451b44SJordan Rupprecht                'integer',
15999451b44SJordan Rupprecht                'floating',
16099451b44SJordan Rupprecht                'character',
16199451b44SJordan Rupprecht                '[2]',
16299451b44SJordan Rupprecht                'integer',
16399451b44SJordan Rupprecht                'floating',
16499451b44SJordan Rupprecht                'character',
16599451b44SJordan Rupprecht                '[3]',
16699451b44SJordan Rupprecht                'integer',
16799451b44SJordan Rupprecht                'floating',
16899451b44SJordan Rupprecht                'character',
16999451b44SJordan Rupprecht                '[4]',
17099451b44SJordan Rupprecht                'integer',
17199451b44SJordan Rupprecht                'floating',
17299451b44SJordan Rupprecht                'character',
17399451b44SJordan Rupprecht            ])
17499451b44SJordan Rupprecht
17599451b44SJordan Rupprecht        self.runCmd(
17699451b44SJordan Rupprecht            "type summary add --summary-string \"int = ${*var.int_pointer}, float = ${*var.float_pointer}\" IWrapPointers")
17799451b44SJordan Rupprecht
17899451b44SJordan Rupprecht        self.expect("frame variable wrapper",
17999451b44SJordan Rupprecht                    substrs=['int = 4',
18099451b44SJordan Rupprecht                             'float = 1.1'])
18199451b44SJordan Rupprecht
18299451b44SJordan Rupprecht        self.runCmd(
18399451b44SJordan Rupprecht            "type summary add --summary-string \"low bits = ${*var.int_pointer[2]}\" IWrapPointers -p")
18499451b44SJordan Rupprecht
18599451b44SJordan Rupprecht        self.expect("frame variable wrapper",
18699451b44SJordan Rupprecht                    substrs=['low bits = 1'])
18799451b44SJordan Rupprecht
18899451b44SJordan Rupprecht        self.expect("frame variable *wrap_pointer",
18999451b44SJordan Rupprecht                    substrs=['low bits = 1'])
19099451b44SJordan Rupprecht
19199451b44SJordan Rupprecht        self.runCmd("type summary clear")
19299451b44SJordan Rupprecht
19399451b44SJordan Rupprecht        self.expect(
19499451b44SJordan Rupprecht            "frame variable int_array --summary-string \"${var[0][0-2]%hex}\"",
19599451b44SJordan Rupprecht            substrs=[
19699451b44SJordan Rupprecht                '0x',
19799451b44SJordan Rupprecht                '7'])
19899451b44SJordan Rupprecht
19999451b44SJordan Rupprecht        self.runCmd("type summary clear")
20099451b44SJordan Rupprecht
20199451b44SJordan Rupprecht        self.runCmd(
20299451b44SJordan Rupprecht            "type summary add --summary-string \"${*var[].x[0-3]%hex} is a bitfield on a set of integers\" -x \"SimpleWithPointers\[[0-9]\]\"")
20399451b44SJordan Rupprecht
20499451b44SJordan Rupprecht        self.expect(
20599451b44SJordan Rupprecht            "frame variable couple --summary-string \"${*var.sp.x[0-2]} are low bits of integer ${*var.sp.x}. If I pretend it is an array I get ${var.sp.x[0-5]}\"",
20699451b44SJordan Rupprecht            substrs=[
20799451b44SJordan Rupprecht                '1 are low bits of integer 9.',
20899451b44SJordan Rupprecht                'If I pretend it is an array I get [9,'])
20999451b44SJordan Rupprecht
21099451b44SJordan Rupprecht        # if the summary has an error, we still display the value
21199451b44SJordan Rupprecht        self.expect(
21299451b44SJordan Rupprecht            "frame variable couple --summary-string \"${*var.sp.foo[0-2]\"",
21399451b44SJordan Rupprecht            substrs=[
21499451b44SJordan Rupprecht                '(Couple) couple = {',
21599451b44SJordan Rupprecht                'x = 0x',
21699451b44SJordan Rupprecht                'y = 0x',
21799451b44SJordan Rupprecht                'z = 0x',
21899451b44SJordan Rupprecht                's = 0x'])
21999451b44SJordan Rupprecht
22099451b44SJordan Rupprecht        self.runCmd(
22199451b44SJordan Rupprecht            "type summary add --summary-string \"${*var.sp.x[0-2]} are low bits of integer ${*var.sp.x}. If I pretend it is an array I get ${var.sp.x[0-5]}\" Couple")
22299451b44SJordan Rupprecht
22399451b44SJordan Rupprecht        self.expect("frame variable sparray",
22499451b44SJordan Rupprecht                    substrs=['[0x0000000f,0x0000000c,0x00000009]'])
22599451b44SJordan Rupprecht
22699451b44SJordan Rupprecht        # check that we can format a variable in a summary even if a format is
22799451b44SJordan Rupprecht        # defined for its datatype
22899451b44SJordan Rupprecht        self.runCmd("type format add -f hex int")
22999451b44SJordan Rupprecht        self.runCmd(
23099451b44SJordan Rupprecht            "type summary add --summary-string \"x=${var.x%d}\" Simple")
23199451b44SJordan Rupprecht
23299451b44SJordan Rupprecht        self.expect("frame variable a_simple_object",
23399451b44SJordan Rupprecht                    substrs=['x=3'])
23499451b44SJordan Rupprecht
23599451b44SJordan Rupprecht        self.expect("frame variable a_simple_object", matching=False,
23699451b44SJordan Rupprecht                    substrs=['0x0'])
23799451b44SJordan Rupprecht
23899451b44SJordan Rupprecht        # now check that the default is applied if we do not hand out a format
23999451b44SJordan Rupprecht        self.runCmd("type summary add --summary-string \"x=${var.x}\" Simple")
24099451b44SJordan Rupprecht
24199451b44SJordan Rupprecht        self.expect("frame variable a_simple_object", matching=False,
24299451b44SJordan Rupprecht                    substrs=['x=3'])
24399451b44SJordan Rupprecht
24499451b44SJordan Rupprecht        self.expect("frame variable a_simple_object", matching=True,
24599451b44SJordan Rupprecht                    substrs=['x=0x00000003'])
24699451b44SJordan Rupprecht
24779ac5bbbSShafik Yaghmour        self.expect_var_path("constInt", value='0x0000002a')
24879ac5bbbSShafik Yaghmour
24979ac5bbbSShafik Yaghmour        self.expect_var_path("volatileInt", value='0x0000002b')
25079ac5bbbSShafik Yaghmour
25179ac5bbbSShafik Yaghmour        self.expect_var_path("constVolatileInt", value='0x0000002c')
25279ac5bbbSShafik Yaghmour
25399451b44SJordan Rupprecht        # check that we can correctly cap the number of children shown
25499451b44SJordan Rupprecht        self.runCmd("settings set target.max-children-count 5")
25599451b44SJordan Rupprecht
25699451b44SJordan Rupprecht        self.expect('frame variable a_long_guy', matching=True,
25799451b44SJordan Rupprecht                    substrs=['a_1',
25899451b44SJordan Rupprecht                             'b_1',
25999451b44SJordan Rupprecht                             'c_1',
26099451b44SJordan Rupprecht                             'd_1',
26199451b44SJordan Rupprecht                             'e_1',
26299451b44SJordan Rupprecht                             '...'])
26399451b44SJordan Rupprecht
26499451b44SJordan Rupprecht        # check that no further stuff is printed (not ALL values are checked!)
26599451b44SJordan Rupprecht        self.expect('frame variable a_long_guy', matching=False,
26699451b44SJordan Rupprecht                    substrs=['f_1',
26799451b44SJordan Rupprecht                             'g_1',
26899451b44SJordan Rupprecht                             'h_1',
26999451b44SJordan Rupprecht                             'i_1',
27099451b44SJordan Rupprecht                             'j_1',
27199451b44SJordan Rupprecht                             'q_1',
27299451b44SJordan Rupprecht                             'a_2',
27399451b44SJordan Rupprecht                             'f_2',
27499451b44SJordan Rupprecht                             't_2',
27599451b44SJordan Rupprecht                             'w_2'])
27699451b44SJordan Rupprecht
27799451b44SJordan Rupprecht        self.runCmd("settings set target.max-children-count 1")
27899451b44SJordan Rupprecht        self.expect('frame variable a_long_guy', matching=True,
27999451b44SJordan Rupprecht                    substrs=['a_1',
28099451b44SJordan Rupprecht                             '...'])
28199451b44SJordan Rupprecht        self.expect('frame variable a_long_guy', matching=False,
28299451b44SJordan Rupprecht                    substrs=['b_1',
28399451b44SJordan Rupprecht                             'c_1',
28499451b44SJordan Rupprecht                             'd_1',
28599451b44SJordan Rupprecht                             'e_1'])
28699451b44SJordan Rupprecht        self.expect('frame variable a_long_guy', matching=False,
28799451b44SJordan Rupprecht                    substrs=['f_1',
28899451b44SJordan Rupprecht                             'g_1',
28999451b44SJordan Rupprecht                             'h_1',
29099451b44SJordan Rupprecht                             'i_1',
29199451b44SJordan Rupprecht                             'j_1',
29299451b44SJordan Rupprecht                             'q_1',
29399451b44SJordan Rupprecht                             'a_2',
29499451b44SJordan Rupprecht                             'f_2',
29599451b44SJordan Rupprecht                             't_2',
29699451b44SJordan Rupprecht                             'w_2'])
29799451b44SJordan Rupprecht
29899451b44SJordan Rupprecht        self.runCmd("settings set target.max-children-count 30")
29999451b44SJordan Rupprecht        self.expect('frame variable a_long_guy', matching=True,
30099451b44SJordan Rupprecht                    substrs=['a_1',
30199451b44SJordan Rupprecht                             'b_1',
30299451b44SJordan Rupprecht                             'c_1',
30399451b44SJordan Rupprecht                             'd_1',
30499451b44SJordan Rupprecht                             'e_1',
30599451b44SJordan Rupprecht                             'z_1',
30699451b44SJordan Rupprecht                             'a_2',
30799451b44SJordan Rupprecht                             'b_2',
30899451b44SJordan Rupprecht                             'c_2',
30999451b44SJordan Rupprecht                             'd_2',
31099451b44SJordan Rupprecht                             '...'])
31199451b44SJordan Rupprecht        self.expect('frame variable a_long_guy', matching=False,
31299451b44SJordan Rupprecht                    substrs=['e_2',
31399451b44SJordan Rupprecht                             'n_2',
31499451b44SJordan Rupprecht                             'r_2',
31599451b44SJordan Rupprecht                             'i_2',
31699451b44SJordan Rupprecht                             'k_2',
31799451b44SJordan Rupprecht                             'o_2'])
31899451b44SJordan Rupprecht
31999451b44SJordan Rupprecht        # override the cap
32099451b44SJordan Rupprecht        self.expect(
32199451b44SJordan Rupprecht            'frame variable a_long_guy --show-all-children',
32299451b44SJordan Rupprecht            matching=True,
32399451b44SJordan Rupprecht            substrs=[
32499451b44SJordan Rupprecht                'a_1',
32599451b44SJordan Rupprecht                'b_1',
32699451b44SJordan Rupprecht                'c_1',
32799451b44SJordan Rupprecht                'd_1',
32899451b44SJordan Rupprecht                'e_1',
32999451b44SJordan Rupprecht                'z_1',
33099451b44SJordan Rupprecht                'a_2',
33199451b44SJordan Rupprecht                'b_2',
33299451b44SJordan Rupprecht                'c_2',
33399451b44SJordan Rupprecht                'd_2'])
33499451b44SJordan Rupprecht        self.expect(
33599451b44SJordan Rupprecht            'frame variable a_long_guy --show-all-children',
33699451b44SJordan Rupprecht            matching=True,
33799451b44SJordan Rupprecht            substrs=[
33899451b44SJordan Rupprecht                'e_2',
33999451b44SJordan Rupprecht                'i_2',
34099451b44SJordan Rupprecht                'k_2',
34199451b44SJordan Rupprecht                'n_2',
34299451b44SJordan Rupprecht                'o_2',
34399451b44SJordan Rupprecht                'r_2',
34499451b44SJordan Rupprecht            ])
34599451b44SJordan Rupprecht        self.expect(
34699451b44SJordan Rupprecht            'frame variable a_long_guy --show-all-children',
34799451b44SJordan Rupprecht            matching=False,
34899451b44SJordan Rupprecht            substrs=['...'])
349