2 Test more expression command sequences with objective-c.
5 from __future__ import print_function
11 from lldbsuite.test.decorators import *
12 from lldbsuite.test.lldbtest import *
13 from lldbsuite.test import lldbutil
16 class FoundationTestCase2(TestBase):
18 mydir = TestBase.compute_mydir(__file__)
21 # Call super's setUp().
23 # Find the line numbers to break at.
25 self.lines.append(line_number('main.m', '// Break here for selector: tests'))
26 self.lines.append(line_number('main.m', '// Break here for NSArray tests'))
27 self.lines.append(line_number('main.m', '// Break here for NSString tests'))
28 self.lines.append(line_number('main.m', '// Break here for description test'))
29 self.lines.append(line_number('main.m', '// Set break point at this line'))
31 def test_more_expr_commands(self):
32 """More expression commands for objective-c."""
34 exe = os.path.join(os.getcwd(), "a.out")
35 self.runCmd("file " + exe, CURRENT_EXECUTABLE_SET)
37 # Create a bunch of breakpoints.
38 for line in self.lines:
39 lldbutil.run_break_set_by_file_and_line (self, "main.m", line, num_expected_locations=1, loc_exact=True)
41 self.runCmd("run", RUN_SUCCEEDED)
44 self.runCmd("thread backtrace")
45 self.expect("expression (char *)sel_getName(sel)",
46 substrs = ["(char *)",
49 self.runCmd("process continue")
52 self.runCmd("thread backtrace")
53 self.runCmd("process continue")
56 self.runCmd("thread backtrace")
57 self.runCmd("process continue")
60 self.runCmd("thread backtrace")
61 self.expect("expression (char *)sel_getName(_cmd)",
62 substrs = ["(char *)",
65 self.runCmd("process continue")
67 def test_NSArray_expr_commands(self):
68 """Test expression commands for NSArray."""
70 exe = os.path.join(os.getcwd(), "a.out")
71 self.runCmd("file " + exe, CURRENT_EXECUTABLE_SET)
73 # Break inside Test_NSArray:
75 lldbutil.run_break_set_by_file_and_line (self, "main.m", line, num_expected_locations=1, loc_exact=True)
77 self.runCmd("run", RUN_SUCCEEDED)
80 self.runCmd("thread backtrace")
81 self.expect("expression (int)[nil_mutable_array count]",
82 patterns = ["\(int\) \$.* = 0"])
83 self.expect("expression (int)[array1 count]",
84 patterns = ["\(int\) \$.* = 3"])
85 self.expect("expression (int)[array2 count]",
86 patterns = ["\(int\) \$.* = 3"])
87 self.expect("expression (int)array1.count",
88 patterns = ["\(int\) \$.* = 3"])
89 self.expect("expression (int)array2.count",
90 patterns = ["\(int\) \$.* = 3"])
91 self.runCmd("process continue")
93 @expectedFailureAll(oslist=["macosx"], debug_info="gmodules", bugnumber="llvm.org/pr27861")
94 def test_NSString_expr_commands(self):
95 """Test expression commands for NSString."""
97 exe = os.path.join(os.getcwd(), "a.out")
98 self.runCmd("file " + exe, CURRENT_EXECUTABLE_SET)
100 # Break inside Test_NSString:
102 lldbutil.run_break_set_by_file_and_line (self, "main.m", line, num_expected_locations=1, loc_exact=True)
104 self.runCmd("run", RUN_SUCCEEDED)
107 self.runCmd("thread backtrace")
108 self.expect("expression (int)[str length]",
109 patterns = ["\(int\) \$.* ="])
110 self.expect("expression (int)[str_id length]",
111 patterns = ["\(int\) \$.* ="])
112 self.expect("expression [str description]",
113 patterns = ["\(id\) \$.* = 0x"])
114 self.expect("expression (id)[str_id description]",
115 patterns = ["\(id\) \$.* = 0x"])
116 self.expect("expression str.length")
117 self.expect("expression str.description")
118 self.expect('expression str = @"new"')
119 self.runCmd("image lookup -t NSString")
120 self.expect('expression str = [NSString stringWithCString: "new"]')
121 self.runCmd("process continue")
123 def test_MyString_dump(self):
124 """Test dump of a known Objective-C object by dereferencing it."""
126 exe = os.path.join(os.getcwd(), "a.out")
127 self.runCmd("file " + exe, CURRENT_EXECUTABLE_SET)
131 lldbutil.run_break_set_by_file_and_line (self, "main.m", line, num_expected_locations=1, loc_exact=True)
133 self.runCmd("run", RUN_SUCCEEDED)
135 self.expect("expression --show-types -- *my",
136 patterns = ["\(MyString\) \$.* = ", "\(MyBase\)", "\(NSObject\)", "\(Class\)"])
137 self.runCmd("process continue")
139 @expectedFailureAll(archs=["i[3-6]86"])
140 def test_NSError_po(self):
141 """Test that po of the result of an unknown method doesn't require a cast."""
143 exe = os.path.join(os.getcwd(), "a.out")
144 self.runCmd("file " + exe, CURRENT_EXECUTABLE_SET)
148 lldbutil.run_break_set_by_file_and_line (self, "main.m", line, num_expected_locations=1, loc_exact=True)
150 self.runCmd("run", RUN_SUCCEEDED)
152 self.expect('po [NSError errorWithDomain:@"Hello" code:35 userInfo:@{@"NSDescription" : @"be completed."}]',
153 substrs = ["Error Domain=Hello", "Code=35", "be completed."])
154 self.runCmd("process continue")
156 def test_NSError_p(self):
157 """Test that p of the result of an unknown method does require a cast."""
159 exe = os.path.join(os.getcwd(), "a.out")
160 self.runCmd("file " + exe, CURRENT_EXECUTABLE_SET)
164 lldbutil.run_break_set_by_file_and_line (self, "main.m", line, num_expected_locations=1, loc_exact=True)
166 self.runCmd("run", RUN_SUCCEEDED)
168 self.expect("p [NSError thisMethodIsntImplemented:0]",
170 patterns = ["no known method", "cast the message send to the method's return type"])
171 self.runCmd("process continue")