1""" 2Test stepping into std::function 3""" 4 5 6import lldb 7from lldbsuite.test.decorators import * 8from lldbsuite.test.lldbtest import * 9from lldbsuite.test import lldbutil 10 11 12class LibCxxFunctionSteppingIntoCallableTestCase(TestBase): 13 NO_DEBUG_INFO_TESTCASE = True 14 15 @add_test_categories(["libc++"]) 16 def test(self): 17 """Test that std::function as defined by libc++ is correctly printed by LLDB""" 18 self.build() 19 20 self.main_source = "main.cpp" 21 self.main_source_spec = lldb.SBFileSpec(self.main_source) 22 self.source_foo_line = line_number(self.main_source, "// Source foo start line") 23 self.source_lambda_f2_line = line_number( 24 self.main_source, "// Source lambda used by f2 start line" 25 ) 26 self.source_lambda_f3_line = line_number( 27 self.main_source, "// Source lambda used by f3 start line" 28 ) 29 self.source_bar_operator_line = line_number( 30 self.main_source, "// Source Bar::operator()() start line" 31 ) 32 self.source_bar_add_num_line = line_number( 33 self.main_source, "// Source Bar::add_num start line" 34 ) 35 self.source_main_invoking_f1 = line_number( 36 self.main_source, "// Source main invoking f1" 37 ) 38 39 (target, process, thread, bkpt) = lldbutil.run_to_source_breakpoint( 40 self, "// Set break point at this line.", self.main_source_spec 41 ) 42 43 thread.StepInto() 44 self.assertEqual( 45 thread.GetFrameAtIndex(0).GetLineEntry().GetLine(), 46 self.source_main_invoking_f1, 47 ) 48 self.assertEqual( 49 thread.GetFrameAtIndex(0).GetLineEntry().GetFileSpec().GetFilename(), 50 self.main_source, 51 ) 52 53 thread.StepInto() 54 self.assertEqual( 55 thread.GetFrameAtIndex(0).GetLineEntry().GetLine(), self.source_foo_line 56 ) 57 self.assertEqual( 58 thread.GetFrameAtIndex(0).GetLineEntry().GetFileSpec().GetFilename(), 59 self.main_source, 60 ) 61 process.Continue() 62 63 thread.StepInto() 64 self.assertEqual( 65 thread.GetFrameAtIndex(0).GetLineEntry().GetLine(), 66 self.source_lambda_f2_line, 67 ) 68 self.assertEqual( 69 thread.GetFrameAtIndex(0).GetLineEntry().GetFileSpec().GetFilename(), 70 self.main_source, 71 ) 72 process.Continue() 73 74 thread.StepInto() 75 self.assertEqual( 76 thread.GetFrameAtIndex(0).GetLineEntry().GetLine(), 77 self.source_lambda_f3_line, 78 ) 79 self.assertEqual( 80 thread.GetFrameAtIndex(0).GetLineEntry().GetFileSpec().GetFilename(), 81 self.main_source, 82 ) 83 process.Continue() 84 85 # TODO reenable this case when std::function formatter supports 86 # general callable object case. 87 # thread.StepInto() 88 # self.assertEqual( thread.GetFrameAtIndex(0).GetLineEntry().GetLine(), self.source_bar_operator_line ) ; 89 # self.assertEqual( thread.GetFrameAtIndex(0).GetLineEntry().GetFileSpec().GetFilename(), self.main_source) ; 90 # process.Continue() 91 92 thread.StepInto() 93 self.assertEqual( 94 thread.GetFrameAtIndex(0).GetLineEntry().GetLine(), 95 self.source_bar_add_num_line, 96 ) 97 self.assertEqual( 98 thread.GetFrameAtIndex(0).GetLineEntry().GetFileSpec().GetFilename(), 99 self.main_source, 100 ) 101 process.Continue() 102