1"""
2Test lldb data formatter subsystem.
3"""
4
5
6
7import lldb
8from lldbsuite.test.decorators import *
9from lldbsuite.test.lldbtest import *
10from lldbsuite.test import lldbutil
11
12
13class NSDictionarySyntheticTestCase(TestBase):
14
15    mydir = TestBase.compute_mydir(__file__)
16
17    def setUp(self):
18        # Call super's setUp().
19        TestBase.setUp(self)
20        # Find the line number to break at.
21        self.line = line_number('main.m', '// Set break point at this line.')
22
23    @skipUnlessDarwin
24    def test_rdar11988289_with_run_command(self):
25        """Test that NSDictionary reports its synthetic children properly."""
26        self.build()
27        self.runCmd("file " + self.getBuildArtifact("a.out"), CURRENT_EXECUTABLE_SET)
28
29        lldbutil.run_break_set_by_file_and_line(
30            self, "main.m", self.line, num_expected_locations=1, loc_exact=True)
31
32        self.runCmd("run", RUN_SUCCEEDED)
33
34        # The stop reason of the thread should be breakpoint.
35        self.expect("thread list", STOPPED_DUE_TO_BREAKPOINT,
36                    substrs=['stopped',
37                             'stop reason = breakpoint'])
38
39        # This is the function to remove the custom formats in order to have a
40        # clean slate for the next test case.
41        def cleanup():
42            self.runCmd('type format clear', check=False)
43            self.runCmd('type summary clear', check=False)
44            self.runCmd('type synth clear', check=False)
45
46        # Execute the cleanup function during test case tear down.
47        self.addTearDownHook(cleanup)
48
49        # Now check that we are displaying Cocoa classes correctly
50        self.expect('frame variable dictionary',
51                    substrs=['3 key/value pairs'])
52        self.expect('frame variable mutabledict',
53                    substrs=['4 key/value pairs'])
54        self.expect(
55            'frame variable dictionary --ptr-depth 1',
56            substrs=[
57                '3 key/value pairs',
58                '[0] = ',
59                'key = 0x',
60                'value = 0x',
61                '[1] = ',
62                '[2] = '])
63        self.expect(
64            'frame variable mutabledict --ptr-depth 1',
65            substrs=[
66                '4 key/value pairs',
67                '[0] = ',
68                'key = 0x',
69                'value = 0x',
70                '[1] = ',
71                '[2] = ',
72                '[3] = '])
73        self.expect(
74            'frame variable dictionary --ptr-depth 1 --dynamic-type no-run-target',
75            substrs=[
76                '3 key/value pairs',
77                '@"bar"',
78                '@"2 elements"',
79                '@"baz"',
80                '2 key/value pairs'])
81        self.expect(
82            'frame variable mutabledict --ptr-depth 1 --dynamic-type no-run-target',
83            substrs=[
84                '4 key/value pairs',
85                '(int)23',
86                '@"123"',
87                '@"http://www.apple.com"',
88                '@"sourceofstuff"',
89                '3 key/value pairs'])
90        self.expect(
91            'frame variable mutabledict --ptr-depth 2 --dynamic-type no-run-target',
92            substrs=[
93                '4 key/value pairs',
94                '(int)23',
95                '@"123"',
96                '@"http://www.apple.com"',
97                '@"sourceofstuff"',
98                '3 key/value pairs',
99                '@"bar"',
100                '@"2 elements"'])
101        self.expect(
102            'frame variable mutabledict --ptr-depth 3 --dynamic-type no-run-target',
103            substrs=[
104                '4 key/value pairs',
105                '(int)23',
106                '@"123"',
107                '@"http://www.apple.com"',
108                '@"sourceofstuff"',
109                '3 key/value pairs',
110                '@"bar"',
111                '@"2 elements"',
112                '(int)1',
113                '@"two"'])
114
115        self.assertTrue(
116            self.frame().FindVariable("dictionary").MightHaveChildren(),
117            "dictionary says it does not have children!")
118        self.assertTrue(
119            self.frame().FindVariable("mutabledict").MightHaveChildren(),
120            "mutable says it does not have children!")
121