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