1c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan"""
2c617a4cb4a451be9d7e97d7af6e165d282b5390fSean CallananTests that ObjC member variables are available where they should be.
3c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan"""
4431d839a33e9a274e705f7a268a1c9de2ffc2da2Jim Inghamimport lldb
5c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callananfrom lldbtest import *
6431d839a33e9a274e705f7a268a1c9de2ffc2da2Jim Inghamimport lldbutil
7c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan
8c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callananclass ObjCSelfTestCase(TestBase):
9c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan
10c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan    mydir = os.path.join("lang", "objc", "self")
11c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan
12c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan    @unittest2.skipUnless(sys.platform.startswith("darwin"), "requires Darwin")
1321b1984e161b0cadee331d32bfd721eccfdf4b1fJohnny Chen    @dsym_test
14c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan    def test_with_dsym_and_run_command(self):
15c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan        """Test that the appropriate member variables are available when stopped in Objective-C class and instance methods"""
16c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan        self.buildDsym()
17c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan        self.self_commands()
18c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan
1940c9d75f2f6402227fed4e0a25daf18b683cb5e7Daniel Malea    @unittest2.skipUnless(sys.platform.startswith("darwin"), "requires Darwin")
2021b1984e161b0cadee331d32bfd721eccfdf4b1fJohnny Chen    @dwarf_test
21c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan    def test_with_dwarf_and_run_command(self):
22c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan        """Test that the appropriate member variables are available when stopped in Objective-C class and instance methods"""
23c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan        self.buildDwarf()
24c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan        self.self_commands()
25c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan
26c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan    def setUp(self):
27c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan        TestBase.setUp(self)
28c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan
29c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan    def set_breakpoint(self, line):
30431d839a33e9a274e705f7a268a1c9de2ffc2da2Jim Ingham        lldbutil.run_break_set_by_file_and_line (self, "main.m", line, num_expected_locations=1, loc_exact=True)
31c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan
32c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan    def self_commands(self):
33c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan        """Test that the appropriate member variables are available when stopped in Objective-C class and instance methods"""
34c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan        self.runCmd("file a.out", CURRENT_EXECUTABLE_SET)
35c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan
36c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan        self.set_breakpoint(line_number('main.m', '// breakpoint 1'))
37c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan        self.set_breakpoint(line_number('main.m', '// breakpoint 2'))
38c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan
39c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan        self.runCmd("process launch", RUN_SUCCEEDED)
40c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan
41c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan        self.expect("expression -- m_a = 2",
42c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan                    startstr = "(int) $0 = 2")
43c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan
44c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan        self.runCmd("process continue")
45c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan
46c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan        # This would be disallowed if we enforced const.  But we don't.
47c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan        self.expect("expression -- m_a = 2",
48c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan                    error=True)
49c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan
50c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan        self.expect("expression -- s_a",
51c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan                    startstr = "(int) $1 = 5")
52c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan
53c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callananif __name__ == '__main__':
54c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan    import atexit
55c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan    lldb.SBDebugger.Initialize()
56c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan    atexit.register(lambda: lldb.SBDebugger.Terminate())
57c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan    unittest2.main()
58