199451b44SJordan Rupprecht""" 299451b44SJordan RupprechtTest stepping into std::function 399451b44SJordan Rupprecht""" 499451b44SJordan Rupprecht 599451b44SJordan Rupprecht 699451b44SJordan Rupprechtimport lldb 799451b44SJordan Rupprechtfrom lldbsuite.test.decorators import * 899451b44SJordan Rupprechtfrom lldbsuite.test.lldbtest import * 999451b44SJordan Rupprechtfrom lldbsuite.test import lldbutil 1099451b44SJordan Rupprecht 1199451b44SJordan Rupprecht 1299451b44SJordan Rupprechtclass LibCxxFunctionSteppingIntoCallableTestCase(TestBase): 1399451b44SJordan Rupprecht NO_DEBUG_INFO_TESTCASE = True 1499451b44SJordan Rupprecht 1599451b44SJordan Rupprecht @add_test_categories(["libc++"]) 1699451b44SJordan Rupprecht def test(self): 1799451b44SJordan Rupprecht """Test that std::function as defined by libc++ is correctly printed by LLDB""" 1899451b44SJordan Rupprecht self.build() 1999451b44SJordan Rupprecht 2099451b44SJordan Rupprecht self.main_source = "main.cpp" 2199451b44SJordan Rupprecht self.main_source_spec = lldb.SBFileSpec(self.main_source) 22*2238dcc3SJonas Devlieghere self.source_foo_line = line_number(self.main_source, "// Source foo start line") 2399451b44SJordan Rupprecht self.source_lambda_f2_line = line_number( 24*2238dcc3SJonas Devlieghere self.main_source, "// Source lambda used by f2 start line" 25*2238dcc3SJonas Devlieghere ) 2699451b44SJordan Rupprecht self.source_lambda_f3_line = line_number( 27*2238dcc3SJonas Devlieghere self.main_source, "// Source lambda used by f3 start line" 28*2238dcc3SJonas Devlieghere ) 2999451b44SJordan Rupprecht self.source_bar_operator_line = line_number( 30*2238dcc3SJonas Devlieghere self.main_source, "// Source Bar::operator()() start line" 31*2238dcc3SJonas Devlieghere ) 3299451b44SJordan Rupprecht self.source_bar_add_num_line = line_number( 33*2238dcc3SJonas Devlieghere self.main_source, "// Source Bar::add_num start line" 34*2238dcc3SJonas Devlieghere ) 3599451b44SJordan Rupprecht self.source_main_invoking_f1 = line_number( 36*2238dcc3SJonas Devlieghere self.main_source, "// Source main invoking f1" 37*2238dcc3SJonas Devlieghere ) 3899451b44SJordan Rupprecht 3999451b44SJordan Rupprecht (target, process, thread, bkpt) = lldbutil.run_to_source_breakpoint( 40*2238dcc3SJonas Devlieghere self, "// Set break point at this line.", self.main_source_spec 41*2238dcc3SJonas Devlieghere ) 4299451b44SJordan Rupprecht 4399451b44SJordan Rupprecht thread.StepInto() 44*2238dcc3SJonas Devlieghere self.assertEqual( 45*2238dcc3SJonas Devlieghere thread.GetFrameAtIndex(0).GetLineEntry().GetLine(), 46*2238dcc3SJonas Devlieghere self.source_main_invoking_f1, 47*2238dcc3SJonas Devlieghere ) 48*2238dcc3SJonas Devlieghere self.assertEqual( 49*2238dcc3SJonas Devlieghere thread.GetFrameAtIndex(0).GetLineEntry().GetFileSpec().GetFilename(), 50*2238dcc3SJonas Devlieghere self.main_source, 51*2238dcc3SJonas Devlieghere ) 5299451b44SJordan Rupprecht 5399451b44SJordan Rupprecht thread.StepInto() 54*2238dcc3SJonas Devlieghere self.assertEqual( 55*2238dcc3SJonas Devlieghere thread.GetFrameAtIndex(0).GetLineEntry().GetLine(), self.source_foo_line 56*2238dcc3SJonas Devlieghere ) 57*2238dcc3SJonas Devlieghere self.assertEqual( 58*2238dcc3SJonas Devlieghere thread.GetFrameAtIndex(0).GetLineEntry().GetFileSpec().GetFilename(), 59*2238dcc3SJonas Devlieghere self.main_source, 60*2238dcc3SJonas Devlieghere ) 6199451b44SJordan Rupprecht process.Continue() 6299451b44SJordan Rupprecht 6399451b44SJordan Rupprecht thread.StepInto() 64*2238dcc3SJonas Devlieghere self.assertEqual( 65*2238dcc3SJonas Devlieghere thread.GetFrameAtIndex(0).GetLineEntry().GetLine(), 66*2238dcc3SJonas Devlieghere self.source_lambda_f2_line, 67*2238dcc3SJonas Devlieghere ) 68*2238dcc3SJonas Devlieghere self.assertEqual( 69*2238dcc3SJonas Devlieghere thread.GetFrameAtIndex(0).GetLineEntry().GetFileSpec().GetFilename(), 70*2238dcc3SJonas Devlieghere self.main_source, 71*2238dcc3SJonas Devlieghere ) 7299451b44SJordan Rupprecht process.Continue() 7399451b44SJordan Rupprecht 7499451b44SJordan Rupprecht thread.StepInto() 75*2238dcc3SJonas Devlieghere self.assertEqual( 76*2238dcc3SJonas Devlieghere thread.GetFrameAtIndex(0).GetLineEntry().GetLine(), 77*2238dcc3SJonas Devlieghere self.source_lambda_f3_line, 78*2238dcc3SJonas Devlieghere ) 79*2238dcc3SJonas Devlieghere self.assertEqual( 80*2238dcc3SJonas Devlieghere thread.GetFrameAtIndex(0).GetLineEntry().GetFileSpec().GetFilename(), 81*2238dcc3SJonas Devlieghere self.main_source, 82*2238dcc3SJonas Devlieghere ) 8399451b44SJordan Rupprecht process.Continue() 8499451b44SJordan Rupprecht 8599451b44SJordan Rupprecht # TODO reenable this case when std::function formatter supports 8699451b44SJordan Rupprecht # general callable object case. 8799451b44SJordan Rupprecht # thread.StepInto() 8899451b44SJordan Rupprecht # self.assertEqual( thread.GetFrameAtIndex(0).GetLineEntry().GetLine(), self.source_bar_operator_line ) ; 8999451b44SJordan Rupprecht # self.assertEqual( thread.GetFrameAtIndex(0).GetLineEntry().GetFileSpec().GetFilename(), self.main_source) ; 9099451b44SJordan Rupprecht # process.Continue() 9199451b44SJordan Rupprecht 9299451b44SJordan Rupprecht thread.StepInto() 93*2238dcc3SJonas Devlieghere self.assertEqual( 94*2238dcc3SJonas Devlieghere thread.GetFrameAtIndex(0).GetLineEntry().GetLine(), 95*2238dcc3SJonas Devlieghere self.source_bar_add_num_line, 96*2238dcc3SJonas Devlieghere ) 97*2238dcc3SJonas Devlieghere self.assertEqual( 98*2238dcc3SJonas Devlieghere thread.GetFrameAtIndex(0).GetLineEntry().GetFileSpec().GetFilename(), 99*2238dcc3SJonas Devlieghere self.main_source, 100*2238dcc3SJonas Devlieghere ) 10199451b44SJordan Rupprecht process.Continue() 102