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
17 class FoundationTestCase2(TestBase):
19 mydir = TestBase.compute_mydir(__file__)
22 # Call super's setUp().
24 # Find the line numbers to break at.
29 '// Break here for selector: tests'))
33 '// Break here for NSArray tests'))
37 '// Break here for NSString tests'))
41 '// Break here for description test'))
45 '// Set break point at this line'))
47 def test_more_expr_commands(self):
48 """More expression commands for objective-c."""
50 exe = os.path.join(os.getcwd(), "a.out")
51 self.runCmd("file " + exe, CURRENT_EXECUTABLE_SET)
53 # Create a bunch of breakpoints.
54 for line in self.lines:
55 lldbutil.run_break_set_by_file_and_line(
56 self, "main.m", line, num_expected_locations=1, loc_exact=True)
58 self.runCmd("run", RUN_SUCCEEDED)
61 self.runCmd("thread backtrace")
62 self.expect("expression (char *)sel_getName(sel)",
66 self.runCmd("process continue")
69 self.runCmd("thread backtrace")
70 self.runCmd("process continue")
73 self.runCmd("thread backtrace")
74 self.runCmd("process continue")
77 self.runCmd("thread backtrace")
78 self.expect("expression (char *)sel_getName(_cmd)",
82 self.runCmd("process continue")
84 def test_NSArray_expr_commands(self):
85 """Test expression commands for NSArray."""
87 exe = os.path.join(os.getcwd(), "a.out")
88 self.runCmd("file " + exe, CURRENT_EXECUTABLE_SET)
90 # Break inside Test_NSArray:
92 lldbutil.run_break_set_by_file_and_line(
93 self, "main.m", line, num_expected_locations=1, loc_exact=True)
95 self.runCmd("run", RUN_SUCCEEDED)
98 self.runCmd("thread backtrace")
99 self.expect("expression (int)[nil_mutable_array count]",
100 patterns=["\(int\) \$.* = 0"])
101 self.expect("expression (int)[array1 count]",
102 patterns=["\(int\) \$.* = 3"])
103 self.expect("expression (int)[array2 count]",
104 patterns=["\(int\) \$.* = 3"])
105 self.expect("expression (int)array1.count",
106 patterns=["\(int\) \$.* = 3"])
107 self.expect("expression (int)array2.count",
108 patterns=["\(int\) \$.* = 3"])
109 self.runCmd("process continue")
111 def test_NSString_expr_commands(self):
112 """Test expression commands for NSString."""
114 exe = os.path.join(os.getcwd(), "a.out")
115 self.runCmd("file " + exe, CURRENT_EXECUTABLE_SET)
117 # Break inside Test_NSString:
119 lldbutil.run_break_set_by_file_and_line(
120 self, "main.m", line, num_expected_locations=1, loc_exact=True)
122 self.runCmd("run", RUN_SUCCEEDED)
125 self.runCmd("thread backtrace")
126 self.expect("expression (int)[str length]",
127 patterns=["\(int\) \$.* ="])
128 self.expect("expression (int)[str_id length]",
129 patterns=["\(int\) \$.* ="])
130 self.expect("expression (id)[str description]",
131 patterns=["\(id\) \$.* = 0x"])
132 self.expect("expression (id)[str_id description]",
133 patterns=["\(id\) \$.* = 0x"])
134 self.expect("expression str.length")
135 self.expect('expression str = @"new"')
136 self.runCmd("image lookup -t NSString")
137 self.expect('expression str = (id)[NSString stringWithCString: "new"]')
138 self.runCmd("process continue")
140 @expectedFailureAll(archs=["i[3-6]86"], bugnumber="<rdar://problem/28814052>")
141 def test_MyString_dump_with_runtime(self):
142 """Test dump of a known Objective-C object by dereferencing it."""
144 exe = os.path.join(os.getcwd(), "a.out")
145 self.runCmd("file " + exe, CURRENT_EXECUTABLE_SET)
149 lldbutil.run_break_set_by_file_and_line(
150 self, "main.m", line, num_expected_locations=1, loc_exact=True)
152 self.runCmd("run", RUN_SUCCEEDED)
155 "expression --show-types -- *my",
157 "\(MyString\) \$.* = ",
159 self.runCmd("process continue")
161 @expectedFailureAll(archs=["i[3-6]86"], bugnumber="<rdar://problem/28814052>")
162 def test_runtime_types(self):
163 """Test commands that require runtime types"""
165 exe = os.path.join(os.getcwd(), "a.out")
166 self.runCmd("file " + exe, CURRENT_EXECUTABLE_SET)
168 # Break inside Test_NSString:
170 lldbutil.run_break_set_by_source_regexp(
171 self, "NSString tests")
173 self.runCmd("run", RUN_SUCCEEDED)
176 self.runCmd("thread backtrace")
177 self.expect("expression [str length]",
178 patterns=["\(NSUInteger\) \$.* ="])
179 self.expect("expression str.length")
180 self.expect('expression str = [NSString stringWithCString: "new"]')
182 'po [NSError errorWithDomain:@"Hello" code:35 userInfo:@{@"NSDescription" : @"be completed."}]',
184 "Error Domain=Hello",
187 self.runCmd("process continue")
189 @expectedFailureAll(archs=["i[3-6]86"], bugnumber="<rdar://problem/28814052>")
190 def test_NSError_p(self):
191 """Test that p of the result of an unknown method does require a cast."""
193 exe = os.path.join(os.getcwd(), "a.out")
194 self.runCmd("file " + exe, CURRENT_EXECUTABLE_SET)
198 lldbutil.run_break_set_by_file_and_line(
199 self, "main.m", line, num_expected_locations=1, loc_exact=True)
201 self.runCmd("run", RUN_SUCCEEDED)
203 self.expect("p [NSError thisMethodIsntImplemented:0]", error=True, patterns=[
204 "no known method", "cast the message send to the method's return type"])
205 self.runCmd("process continue")