brintos

brintos / llvm-project-archived public Read only

0
0
Text · 5.6 KiB · 50076b7 Raw
153 lines · python
1"""2Test lldb data formatter subsystem.3"""4 5 6import lldb7from lldbsuite.test.lldbtest import *8import lldbsuite.test.lldbutil as lldbutil9 10 11class ScriptDataFormatterTestCase(TestBase):12    def test_with_run_command(self):13        """Test data formatter commands."""14        self.build()15        self.data_formatter_commands()16 17    def setUp(self):18        # Call super's setUp().19        TestBase.setUp(self)20        # Find the line number to break at.21        self.line = line_number("main.cpp", "// Set break point at this line.")22 23    def data_formatter_commands(self):24        """Test that that file and class static variables display correctly."""25        self.runCmd("file " + self.getBuildArtifact("a.out"), CURRENT_EXECUTABLE_SET)26 27        lldbutil.run_break_set_by_file_and_line(28            self, "main.cpp", self.line, num_expected_locations=1, loc_exact=True29        )30 31        self.runCmd("run", RUN_SUCCEEDED)32 33        # The stop reason of the thread should be breakpoint.34        self.expect(35            "thread list",36            STOPPED_DUE_TO_BREAKPOINT,37            substrs=["stopped", "stop reason = breakpoint"],38        )39 40        # This is the function to remove the custom formats in order to have a41        # clean slate for the next test case.42        def cleanup():43            self.runCmd("type format clear", check=False)44            self.runCmd("type summary clear", check=False)45 46        # Execute the cleanup function during test case tear down.47        self.addTearDownHook(cleanup)48 49        # Set the script here to ease the formatting50        script = "a = valobj.GetChildMemberWithName('integer'); a_val = a.GetValue(); str = 'Hello from Python, ' + a_val + ' time'; return str + ('!' if a_val == '1' else 's!');"51 52        self.runCmd('type summary add i_am_cool --python-script "%s"' % script)53        self.expect("type summary list i_am_cool", substrs=[script])54 55        self.expect("frame variable one", substrs=["Hello from Python", "1 time!"])56 57        self.expect("frame variable two", substrs=["Hello from Python", "4 times!"])58 59        self.runCmd("n")  # skip ahead to make values change60 61        self.expect(62            "frame variable three",63            substrs=["Hello from Python, 10 times!", "Hello from Python, 4 times!"],64        )65 66        self.runCmd("n")  # skip ahead to make values change67 68        self.expect("frame variable two", substrs=["Hello from Python", "1 time!"])69 70        script = "a = valobj.GetChildMemberWithName('integer'); a_val = a.GetValue(); str = 'int says ' + a_val; return str;"71 72        # Check that changes in the script are immediately reflected73        self.runCmd('type summary add i_am_cool --python-script "%s"' % script)74 75        self.expect("frame variable two", substrs=["int says 1"])76 77        self.expect("frame variable twoptr", substrs=["int says 1"])78 79        # Change the summary80        self.runCmd(81            'type summary add --summary-string "int says ${var.integer}, and float says ${var.floating}" i_am_cool'82        )83 84        self.expect("frame variable two", substrs=["int says 1", "and float says 2.71"])85        # Try it for pointers86        self.expect(87            "frame variable twoptr", substrs=["int says 1", "and float says 2.71"]88        )89 90        # Force a failure for pointers91        self.runCmd('type summary add i_am_cool -p --python-script "%s"' % script)92 93        self.expect(94            "frame variable twoptr", matching=False, substrs=["and float says 2.71"]95        )96 97        script = "return 'Python summary'"98 99        self.runCmd(100            'type summary add --name test_summary --python-script "%s"' % script101        )102 103        # attach the Python named summary to someone104        self.expect(105            "frame variable one --summary test_summary", substrs=["Python summary"]106        )107 108        # should not bind to the type109        self.expect("frame variable two", matching=False, substrs=["Python summary"])110 111        # and should not stick to the variable112        self.expect("frame variable one", matching=False, substrs=["Python summary"])113 114        self.runCmd('type summary add i_am_cool --summary-string "Text summary"')115 116        # should be temporary only117        self.expect("frame variable one", matching=False, substrs=["Python summary"])118 119        # use the type summary120        self.expect("frame variable two", substrs=["Text summary"])121 122        self.runCmd("n")  # skip ahead to make values change123 124        # both should use the type summary now125        self.expect("frame variable one", substrs=["Text summary"])126 127        self.expect("frame variable two", substrs=["Text summary"])128 129        # disable type summary for pointers, and make a Python regex summary130        self.runCmd('type summary add i_am_cool -p --summary-string "Text summary"')131        self.runCmd('type summary add -x cool --python-script "%s"' % script)132 133        # variables should stick to the type summary134        self.expect("frame variable one", substrs=["Text summary"])135 136        self.expect("frame variable two", substrs=["Text summary"])137 138        # array and pointer should match the Python one139        self.expect("frame variable twoptr", substrs=["Python summary"])140 141        self.expect("frame variable array", substrs=["Python summary"])142 143        # return pointers to the type summary144        self.runCmd('type summary add i_am_cool --summary-string "Text summary"')145 146        self.expect("frame variable one", substrs=["Text summary"])147 148        self.expect("frame variable two", substrs=["Text summary"])149 150        self.expect("frame variable twoptr", substrs=["Text summary"])151 152        self.expect("frame variable array", substrs=["Python summary"])153