| """Test calling functions in class methods.""" | |
| import lldb | |
| from lldbsuite.test.decorators import * | |
| from lldbsuite.test.lldbtest import * | |
| from lldbsuite.test import lldbutil | |
| class TestObjCClassMethod(TestBase): | |
| def setUp(self): | |
| # Call super's setUp(). | |
| TestBase.setUp(self) | |
| # Find the line numbers to break inside main(). | |
| self.main_source = lldb.SBFileSpec("class.m") | |
| NO_DEBUG_INFO_TESTCASE = True | |
| @skipUnlessDarwin | |
| @add_test_categories(["pyapi"]) | |
| def test_without_class_stubs(self): | |
| self.do_test_with_python_api() | |
| def do_test_with_python_api(self): | |
| """Test calling functions in class methods.""" | |
| self.build() | |
| target, process, thread, bkpt = lldbutil.run_to_source_breakpoint( | |
| self, "Set a breakpoint here", self.main_source | |
| ) | |
| # Now make sure we can call a function in the class method we've | |
| # stopped in. | |
| frame = thread.GetFrameAtIndex(0) | |
| self.assertTrue(frame, "Got a valid frame 0 frame.") | |
| # First check that we can call a class method: | |
| cmd_value = frame.EvaluateExpression( | |
| '(int)[Foo doSomethingWithString:@"Hello"]' | |
| ) | |
| if self.TraceOn(): | |
| if cmd_value.IsValid(): | |
| print("cmd_value is valid") | |
| print("cmd_value has the value %d" % cmd_value.GetValueAsUnsigned()) | |
| self.assertTrue(cmd_value.IsValid()) | |
| self.assertEqual(cmd_value.GetValueAsUnsigned(), 5) | |
| # Now check that we can step INTO class methods: | |
| thread.StepInto() | |
| frame = thread.GetFrameAtIndex(0) | |
| self.assertEqual( | |
| frame.name, "+[Foo doSomethingWithString:]", "Stopped in class method" | |
| ) |