xref: /llvm-project/lldb/test/API/commands/expression/context-object-objc/TestContextObjectObjc.py (revision 4cc8f2a017c76af25234afc7c380550e9c93135c)
1"""
2Tests expression evaluation in context of an objc class.
3"""
4
5import lldb
6import lldbsuite.test.lldbutil as lldbutil
7from lldbsuite.test.decorators import *
8from lldbsuite.test.lldbtest import *
9
10class ContextObjectObjcTestCase(TestBase):
11
12    @add_test_categories(["objc"])
13    def test_context_object_objc(self):
14        """Tests expression evaluation in context of an objc class."""
15        self.build()
16
17        (target, process, thread, bkpt) = lldbutil.run_to_source_breakpoint(self, '// Break here', self.main_source_spec)
18        frame = thread.GetFrameAtIndex(0)
19
20        #
21        # Test objc class variable
22        #
23
24        obj_val = frame.FindVariable("objcClass")
25        self.assertTrue(obj_val.IsValid())
26        obj_val = obj_val.Dereference()
27        self.assertTrue(obj_val.IsValid())
28
29        # Test an empty expression evaluation
30        value = obj_val.EvaluateExpression("")
31        self.assertFalse(value.IsValid())
32        self.assertFalse(value.GetError().Success())
33
34        # Test retrieving of a field (not a local with the same name)
35        value = obj_val.EvaluateExpression("field")
36        self.assertTrue(value.IsValid())
37        self.assertSuccess(value.GetError())
38        self.assertEqual(value.GetValueAsSigned(), 1111)
39
40        # Test if the self pointer is properly evaluated
41
42        # Test retrieving of an objcClass's property through the self pointer
43        value = obj_val.EvaluateExpression("self.property")
44        self.assertTrue(value.IsValid())
45        self.assertSuccess(value.GetError())
46        self.assertEqual(value.GetValueAsSigned(), 2222)
47
48        # Test objcClass's methods evaluation through the self pointer
49        value = obj_val.EvaluateExpression("[self method]")
50        self.assertTrue(value.IsValid())
51        self.assertSuccess(value.GetError())
52        self.assertEqual(value.GetValueAsSigned(), 3333)
53
54        # Test if we can use a computation result reference object correctly
55
56        obj_val = frame.EvaluateExpression("[ObjcClass createNew]")
57        self.assertTrue(obj_val.IsValid())
58        obj_val = obj_val.Dereference()
59        self.assertTrue(obj_val.IsValid())
60
61        # Test an expression evaluation on it
62        value = obj_val.EvaluateExpression("1")
63        self.assertTrue(value.IsValid())
64        self.assertSuccess(value.GetError())
65
66        # Test retrieving of a field on it
67        value = obj_val.EvaluateExpression("field")
68        self.assertTrue(value.IsValid())
69        self.assertSuccess(value.GetError())
70        self.assertEqual(value.GetValueAsSigned(), 1111)
71
72    def setUp(self):
73        TestBase.setUp(self)
74
75        self.main_source = "main.m"
76        self.main_source_spec = lldb.SBFileSpec(self.main_source)
77