1"""
2Test that we are able to properly report a usable dynamic type
3"""
4
5
6
7import lldb
8from lldbsuite.test.decorators import *
9from lldbsuite.test.lldbtest import *
10from lldbsuite.test import lldbutil
11
12
13class ObjCDynamicSBTypeTestCase(TestBase):
14
15    mydir = TestBase.compute_mydir(__file__)
16
17    def setUp(self):
18        # Call super's setUp().
19        TestBase.setUp(self)
20        # We'll use the test method name as the exe_name.
21        self.exe_name = self.testMethodName
22        # Find the line number to break inside main().
23        self.main_source = "main.m"
24        self.line = line_number(self.main_source, '// Set breakpoint here.')
25
26    @skipIf(archs="i[3-6]86")
27    def test_dyn(self):
28        """Test that we are able to properly report a usable dynamic type."""
29        d = {'EXE': self.exe_name}
30        self.build(dictionary=d)
31        self.setTearDownCleanup(dictionary=d)
32
33        exe = self.getBuildArtifact(self.exe_name)
34        self.runCmd("file " + exe, CURRENT_EXECUTABLE_SET)
35
36        lldbutil.run_break_set_by_file_and_line(
37            self,
38            self.main_source,
39            self.line,
40            num_expected_locations=1,
41            loc_exact=True)
42
43        self.runCmd("run", RUN_SUCCEEDED)
44
45        v_object = self.frame().FindVariable(
46            "object").GetDynamicValue(lldb.eDynamicCanRunTarget)
47        v_base = self.frame().FindVariable(
48            "base").GetDynamicValue(lldb.eDynamicCanRunTarget)
49        self.assertEqual(
50            v_object.GetTypeName(), "MyDerivedClass *",
51            "The NSObject is properly type-named")
52        self.assertEqual(
53            v_base.GetTypeName(), "MyDerivedClass *",
54            "The Base is properly type-named")
55        object_type = v_object.GetType()
56        base_type = v_base.GetType()
57        self.assertEqual(
58            object_type.GetName(), "MyDerivedClass *",
59            "The dynamic SBType for NSObject is for the correct type")
60        self.assertEqual(
61            base_type.GetName(), "MyDerivedClass *",
62            "The dynamic SBType for Base is for the correct type")
63        object_pointee_type = object_type.GetPointeeType()
64        base_pointee_type = base_type.GetPointeeType()
65        self.assertEqual(
66            object_pointee_type.GetName(), "MyDerivedClass",
67            "The dynamic type for NSObject figures out its pointee type just fine")
68        self.assertEqual(
69            base_pointee_type.GetName(), "MyDerivedClass",
70            "The dynamic type for Base figures out its pointee type just fine")
71
72        self.assertEqual(
73            object_pointee_type.GetDirectBaseClassAtIndex(0).GetName(), "MyBaseClass",
74            "The dynamic type for NSObject can go back to its base class")
75        self.assertEqual(
76            base_pointee_type.GetDirectBaseClassAtIndex(0).GetName(), "MyBaseClass",
77            "The dynamic type for Base can go back to its base class")
78
79        self.assertTrue(object_pointee_type.GetDirectBaseClassAtIndex(0).GetType().GetDirectBaseClassAtIndex(
80            0).GetName() == "NSObject", "The dynamic type for NSObject can go up the hierarchy")
81        self.assertTrue(base_pointee_type.GetDirectBaseClassAtIndex(0).GetType().GetDirectBaseClassAtIndex(
82            0).GetName() == "NSObject", "The dynamic type for Base can go up the hierarchy")
83
84        self.assertEqual(
85            object_pointee_type.GetNumberOfFields(), 2,
86            "The dynamic type for NSObject has 2 fields")
87        self.assertEqual(
88            base_pointee_type.GetNumberOfFields(), 2,
89            "The dynamic type for Base has 2 fields")
90