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