1*99451b44SJordan Rupprecht""" 2*99451b44SJordan RupprechtTest stepping into std::function 3*99451b44SJordan Rupprecht""" 4*99451b44SJordan Rupprecht 5*99451b44SJordan Rupprecht 6*99451b44SJordan Rupprecht 7*99451b44SJordan Rupprechtimport lldb 8*99451b44SJordan Rupprechtfrom lldbsuite.test.decorators import * 9*99451b44SJordan Rupprechtfrom lldbsuite.test.lldbtest import * 10*99451b44SJordan Rupprechtfrom lldbsuite.test import lldbutil 11*99451b44SJordan Rupprecht 12*99451b44SJordan Rupprecht 13*99451b44SJordan Rupprechtclass LibCxxFunctionSteppingIntoCallableTestCase(TestBase): 14*99451b44SJordan Rupprecht 15*99451b44SJordan Rupprecht NO_DEBUG_INFO_TESTCASE = True 16*99451b44SJordan Rupprecht 17*99451b44SJordan Rupprecht @add_test_categories(["libc++"]) 18*99451b44SJordan Rupprecht def test(self): 19*99451b44SJordan Rupprecht """Test that std::function as defined by libc++ is correctly printed by LLDB""" 20*99451b44SJordan Rupprecht self.build() 21*99451b44SJordan Rupprecht 22*99451b44SJordan Rupprecht self.main_source = "main.cpp" 23*99451b44SJordan Rupprecht self.main_source_spec = lldb.SBFileSpec(self.main_source) 24*99451b44SJordan Rupprecht self.source_foo_line = line_number( 25*99451b44SJordan Rupprecht self.main_source, '// Source foo start line') 26*99451b44SJordan Rupprecht self.source_lambda_f2_line = line_number( 27*99451b44SJordan Rupprecht self.main_source, '// Source lambda used by f2 start line') 28*99451b44SJordan Rupprecht self.source_lambda_f3_line = line_number( 29*99451b44SJordan Rupprecht self.main_source, '// Source lambda used by f3 start line') 30*99451b44SJordan Rupprecht self.source_bar_operator_line = line_number( 31*99451b44SJordan Rupprecht self.main_source, '// Source Bar::operator()() start line') 32*99451b44SJordan Rupprecht self.source_bar_add_num_line = line_number( 33*99451b44SJordan Rupprecht self.main_source, '// Source Bar::add_num start line') 34*99451b44SJordan Rupprecht self.source_main_invoking_f1 = line_number( 35*99451b44SJordan Rupprecht self.main_source, '// Source main invoking f1') 36*99451b44SJordan Rupprecht 37*99451b44SJordan Rupprecht (target, process, thread, bkpt) = lldbutil.run_to_source_breakpoint( 38*99451b44SJordan Rupprecht self, "// Set break point at this line.", self.main_source_spec) 39*99451b44SJordan Rupprecht 40*99451b44SJordan Rupprecht thread.StepInto() 41*99451b44SJordan Rupprecht self.assertEqual( thread.GetFrameAtIndex(0).GetLineEntry().GetLine(), self.source_main_invoking_f1 ) ; 42*99451b44SJordan Rupprecht self.assertEqual( thread.GetFrameAtIndex(0).GetLineEntry().GetFileSpec().GetFilename(), self.main_source) ; 43*99451b44SJordan Rupprecht 44*99451b44SJordan Rupprecht thread.StepInto() 45*99451b44SJordan Rupprecht self.assertEqual( thread.GetFrameAtIndex(0).GetLineEntry().GetLine(), self.source_foo_line ) ; 46*99451b44SJordan Rupprecht self.assertEqual( thread.GetFrameAtIndex(0).GetLineEntry().GetFileSpec().GetFilename(), self.main_source) ; 47*99451b44SJordan Rupprecht process.Continue() 48*99451b44SJordan Rupprecht 49*99451b44SJordan Rupprecht thread.StepInto() 50*99451b44SJordan Rupprecht self.assertEqual( thread.GetFrameAtIndex(0).GetLineEntry().GetLine(), self.source_lambda_f2_line ) ; 51*99451b44SJordan Rupprecht self.assertEqual( thread.GetFrameAtIndex(0).GetLineEntry().GetFileSpec().GetFilename(), self.main_source) ; 52*99451b44SJordan Rupprecht process.Continue() 53*99451b44SJordan Rupprecht 54*99451b44SJordan Rupprecht thread.StepInto() 55*99451b44SJordan Rupprecht self.assertEqual( thread.GetFrameAtIndex(0).GetLineEntry().GetLine(), self.source_lambda_f3_line ) ; 56*99451b44SJordan Rupprecht self.assertEqual( thread.GetFrameAtIndex(0).GetLineEntry().GetFileSpec().GetFilename(), self.main_source) ; 57*99451b44SJordan Rupprecht process.Continue() 58*99451b44SJordan Rupprecht 59*99451b44SJordan Rupprecht # TODO reenable this case when std::function formatter supports 60*99451b44SJordan Rupprecht # general callable object case. 61*99451b44SJordan Rupprecht #thread.StepInto() 62*99451b44SJordan Rupprecht #self.assertEqual( thread.GetFrameAtIndex(0).GetLineEntry().GetLine(), self.source_bar_operator_line ) ; 63*99451b44SJordan Rupprecht #self.assertEqual( thread.GetFrameAtIndex(0).GetLineEntry().GetFileSpec().GetFilename(), self.main_source) ; 64*99451b44SJordan Rupprecht #process.Continue() 65*99451b44SJordan Rupprecht 66*99451b44SJordan Rupprecht thread.StepInto() 67*99451b44SJordan Rupprecht self.assertEqual( thread.GetFrameAtIndex(0).GetLineEntry().GetLine(), self.source_bar_add_num_line ) ; 68*99451b44SJordan Rupprecht self.assertEqual( thread.GetFrameAtIndex(0).GetLineEntry().GetFileSpec().GetFilename(), self.main_source) ; 69*99451b44SJordan Rupprecht process.Continue() 70