]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - packages/Python/lldbsuite/test/lang/cpp/template/TestTemplateArgs.py
Vendor import of lldb trunk r290819:
[FreeBSD/FreeBSD.git] / packages / Python / lldbsuite / test / lang / cpp / template / TestTemplateArgs.py
1 """
2 Test that C++ template classes that have integer parameters work correctly.
3
4 We must reconstruct the types correctly so the template types are correct
5 and display correctly, and also make sure the expression parser works and
6 is able the find all needed functions when evaluating expressions
7 """
8 import lldb
9 from lldbsuite.test.decorators import *
10 from lldbsuite.test.lldbtest import *
11 from lldbsuite.test import lldbutil
12
13
14 class TemplateArgsTestCase(TestBase):
15
16     mydir = TestBase.compute_mydir(__file__)
17
18     def prepareProcess(self):
19         self.build()
20
21         # Create a target by the debugger.
22         exe = os.path.join(os.getcwd(), "a.out")
23         target = self.dbg.CreateTarget(exe)
24         self.assertTrue(target, VALID_TARGET)
25
26         # Set breakpoints inside and outside methods that take pointers to the
27         # containing struct.
28         line = line_number('main.cpp', '// Breakpoint 1')
29         lldbutil.run_break_set_by_file_and_line(
30             self, "main.cpp", line, num_expected_locations=1, loc_exact=True)
31
32         arguments = None
33         environment = None
34
35         # Now launch the process, and do not stop at entry point.
36         process = target.LaunchSimple(
37             arguments, environment, self.get_process_working_directory())
38         self.assertTrue(process, PROCESS_IS_VALID)
39
40         # Get the thread of the process
41         self.assertTrue(
42             process.GetState() == lldb.eStateStopped,
43             PROCESS_STOPPED)
44         thread = lldbutil.get_stopped_thread(
45             process, lldb.eStopReasonBreakpoint)
46
47         # Get frame for current thread
48         return thread.GetSelectedFrame()
49
50     @expectedFailureAll(oslist=["windows"])
51     def test_integer_args(self):
52         frame = self.prepareProcess()
53
54         testpos = frame.FindVariable('testpos')
55         self.assertTrue(
56             testpos.IsValid(),
57             'make sure we find a local variabble named "testpos"')
58         self.assertTrue(testpos.GetType().GetName() == 'TestObj<1>')
59
60         expr_result = frame.EvaluateExpression("testpos.getArg()")
61         self.assertTrue(
62             expr_result.IsValid(),
63             'got a valid expression result from expression "testpos.getArg()"')
64         self.assertTrue(expr_result.GetValue() == "1", "testpos.getArg() == 1")
65         self.assertTrue(
66             expr_result.GetType().GetName() == "int",
67             'expr_result.GetType().GetName() == "int"')
68
69         testneg = frame.FindVariable('testneg')
70         self.assertTrue(
71             testneg.IsValid(),
72             'make sure we find a local variabble named "testneg"')
73         self.assertTrue(testneg.GetType().GetName() == 'TestObj<-1>')
74
75         expr_result = frame.EvaluateExpression("testneg.getArg()")
76         self.assertTrue(
77             expr_result.IsValid(),
78             'got a valid expression result from expression "testneg.getArg()"')
79         self.assertTrue(
80             expr_result.GetValue() == "-1",
81             "testneg.getArg() == -1")
82         self.assertTrue(
83             expr_result.GetType().GetName() == "int",
84             'expr_result.GetType().GetName() == "int"')
85
86     # Gcc does not generate the necessary DWARF attribute for enum template
87     # parameters.
88     @expectedFailureAll(bugnumber="llvm.org/pr28354", compiler="gcc")
89     @expectedFailureAll(oslist=["windows"])
90     def test_enum_args(self):
91         frame = self.prepareProcess()
92
93         # Make sure "member" can be displayed and also used in an expression
94         # correctly
95         member = frame.FindVariable('member')
96         self.assertTrue(
97             member.IsValid(),
98             'make sure we find a local variabble named "member"')
99         self.assertTrue(member.GetType().GetName() ==
100                         'EnumTemplate<EnumType::Member>')
101
102         expr_result = frame.EvaluateExpression("member.getMember()")
103         self.assertTrue(
104             expr_result.IsValid(),
105             'got a valid expression result from expression "member.getMember()"')
106         self.assertTrue(
107             expr_result.GetValue() == "123",
108             "member.getMember() == 123")
109         self.assertTrue(
110             expr_result.GetType().GetName() == "int",
111             'expr_result.GetType().GetName() == "int"')
112
113         # Make sure "subclass" can be displayed and also used in an expression
114         # correctly
115         subclass = frame.FindVariable('subclass')
116         self.assertTrue(
117             subclass.IsValid(),
118             'make sure we find a local variabble named "subclass"')
119         self.assertTrue(subclass.GetType().GetName() ==
120                         'EnumTemplate<EnumType::Subclass>')
121
122         expr_result = frame.EvaluateExpression("subclass.getMember()")
123         self.assertTrue(
124             expr_result.IsValid(),
125             'got a valid expression result from expression "subclass.getMember()"')
126         self.assertTrue(
127             expr_result.GetValue() == "246",
128             "subclass.getMember() == 246")
129         self.assertTrue(
130             expr_result.GetType().GetName() == "int",
131             'expr_result.GetType().GetName() == "int"')