1"""
2Tests expression evaluation in context of an object.
3"""
4
5import lldb
6import lldbsuite.test.lldbutil as lldbutil
7from lldbsuite.test.lldbtest import *
8
9class ContextObjectTestCase(TestBase):
10
11    def test_context_object(self):
12        """Tests expression evaluation in context of an object."""
13        self.build()
14
15        (target, process, thread, bkpt) = lldbutil.run_to_source_breakpoint(self, '// Break here', self.main_source_spec)
16        frame = thread.GetFrameAtIndex(0)
17
18        #
19        # Test C++ struct variable and reference-to-struct variable
20        #
21        for obj in "cpp_struct", "cpp_struct_ref":
22            obj_val = frame.FindVariable(obj)
23            self.assertTrue(obj_val.IsValid())
24
25            # Test an empty expression evaluation
26            value = obj_val.EvaluateExpression("")
27            self.assertFalse(value.IsValid())
28            self.assertFalse(value.GetError().Success())
29
30            # Test retrieveing of a field (not a local with the same name)
31            value = obj_val.EvaluateExpression("field")
32            self.assertTrue(value.IsValid())
33            self.assertSuccess(value.GetError())
34            self.assertEqual(value.GetValueAsSigned(), 1111)
35
36            # Test functions evaluation
37            value = obj_val.EvaluateExpression("function()")
38            self.assertTrue(value.IsValid())
39            self.assertSuccess(value.GetError())
40            self.assertEqual(value.GetValueAsSigned(), 2222)
41
42            # Test that we retrieve the right global
43            value = obj_val.EvaluateExpression("global.field")
44            self.assertTrue(value.IsValid())
45            self.assertSuccess(value.GetError())
46            self.assertEqual(value.GetValueAsSigned(), 1111)
47
48        #
49        # Test C++ union variable
50        #
51
52        obj_val = frame.FindVariable("cpp_union")
53        self.assertTrue(obj_val.IsValid())
54
55        # Test retrieveing of a field
56        value = obj_val.EvaluateExpression("field_int")
57        self.assertTrue(value.IsValid())
58        self.assertSuccess(value.GetError())
59        self.assertEqual(value.GetValueAsSigned(), 5555)
60
61        #
62        # Test C++ scalar
63        #
64
65        obj_val = frame.FindVariable("cpp_scalar")
66        self.assertTrue(obj_val.IsValid())
67
68        # Test an expression evaluation
69        value = obj_val.EvaluateExpression("1")
70        self.assertFalse(value.IsValid())
71        self.assertFalse(value.GetError().Success())
72
73        #
74        # Test C++ array
75        #
76
77        obj_val = frame.FindVariable("cpp_array")
78        self.assertTrue(obj_val.IsValid())
79
80        # Test an expression evaluation
81        value = obj_val.EvaluateExpression("1")
82        self.assertFalse(value.IsValid())
83        self.assertFalse(value.GetError().Success())
84
85        # Test retrieveing of an element's field
86        value = obj_val.GetValueForExpressionPath("[7]").EvaluateExpression("field")
87        self.assertTrue(value.IsValid())
88        self.assertSuccess(value.GetError())
89        self.assertEqual(value.GetValueAsSigned(), 1111)
90
91        #
92        # Test C++ pointer
93        #
94
95        obj_val = frame.FindVariable("cpp_pointer")
96        self.assertTrue(obj_val.IsValid())
97
98        # Test an expression evaluation
99        value = obj_val.EvaluateExpression("1")
100        self.assertFalse(value.IsValid())
101        self.assertFalse(value.GetError().Success())
102
103        # Test retrieveing of a dereferenced object's field
104        value = obj_val.Dereference().EvaluateExpression("field")
105        self.assertTrue(value.IsValid())
106        self.assertSuccess(value.GetError())
107        self.assertEqual(value.GetValueAsSigned(), 1111)
108
109        #
110        # Test C++ computation result
111        #
112
113        obj_val = frame.EvaluateExpression("cpp_namespace::GetCppStruct()")
114        self.assertTrue(obj_val.IsValid())
115
116        # Test an expression evaluation
117        value = obj_val.EvaluateExpression("1")
118        self.assertTrue(value.IsValid())
119        self.assertFalse(value.GetError().Success())
120
121        #
122        # Test C++ computation result located in debuggee memory
123        #
124
125        obj_val = frame.EvaluateExpression("cpp_namespace::GetCppStructPtr()")
126        self.assertTrue(obj_val.IsValid())
127
128        # Test an expression evaluation
129        value = obj_val.EvaluateExpression("1")
130        self.assertFalse(value.IsValid())
131        self.assertFalse(value.GetError().Success())
132
133        # Test retrieveing of a dereferenced object's field
134        value = obj_val.Dereference().EvaluateExpression("field")
135        self.assertTrue(value.IsValid())
136        self.assertSuccess(value.GetError())
137        self.assertEqual(value.GetValueAsSigned(), 1111)
138
139    def setUp(self):
140        TestBase.setUp(self)
141
142        self.main_source = "main.cpp"
143        self.main_source_spec = lldb.SBFileSpec(self.main_source)
144