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 NSSetSyntheticTestCase(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_rdar12529957_with_run_command(self):
25        """Test that NSSet 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 set',
51                    substrs=['4 elements'])
52        self.expect('frame variable mutable',
53                    substrs=['9 elements'])
54        self.expect(
55            'frame variable set --ptr-depth 1 -d run -T',
56            substrs=[
57                '4 elements',
58                '[0]',
59                'hello',
60                '[1]',
61                '(int)2',
62                '[2]',
63                '(int)1',
64                '[3]',
65                'world',
66            ])
67        self.expect(
68            'frame variable mutable --ptr-depth 1 -d run -T',
69            substrs=[
70                '9 elements',
71                '(int)5',
72                '@"3 elements"',
73                '@"www.apple.com"',
74                '(int)3',
75                '@"world"',
76                '(int)4'])
77
78        self.runCmd("next")
79        self.expect('frame variable mutable',
80                    substrs=['0 elements'])
81
82        self.runCmd("next")
83        self.expect('frame variable mutable',
84                    substrs=['4 elements'])
85        self.expect(
86            'frame variable mutable --ptr-depth 1 -d run -T',
87            substrs=[
88                '4 elements',
89                '[0]',
90                '(int)1',
91                '[1]',
92                '(int)2',
93                '[2]',
94                'hello',
95                '[3]',
96                'world',
97            ])
98
99        self.runCmd("next")
100        self.expect('frame variable mutable', substrs=['4 elements'])
101        self.expect(
102            'frame variable mutable --ptr-depth 1 -d run -T',
103            substrs=[
104                '4 elements',
105                '[0]',
106                '(int)1',
107                '[1]',
108                '(int)2',
109                '[2]',
110                'hello',
111                '[3]',
112                'world',
113            ])
114