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