""" Test lldb data formatter callback-based matching. """ import lldb from lldbsuite.test.decorators import * from lldbsuite.test.lldbtest import * from lldbsuite.test import lldbutil class PythonSynthDataFormatterTestCase(TestBase): def setUp(self): # Call super's setUp(). TestBase.setUp(self) # Find the line number to break at. self.line = line_number('main.cpp', '// Set break point at this line.') def test_callback_matchers_api_registration(self): """Test data formatter commands.""" self.build() _, process, thread, _ = lldbutil.run_to_line_breakpoint( self, lldb.SBFileSpec("main.cpp"), self.line) # Print derived without a formatter. self.expect("frame variable derived", substrs=['x = 2222', 'y = 3333']) # now set up a summary function that uses a python callback to match # classes that derive from `Base`. self.runCmd("command script import --allow-reload ./formatters_with_callback.py") self.runCmd("script formatters_with_callback.register_formatters(lldb.debugger)") # Now `derived` should use our callback summary + synthetic children. self.expect("frame variable derived", substrs=['hello from callback summary', 'synthetic_child = 9999']) # But not other classes. self.expect("frame variable base", matching=False, substrs=['hello from callback summary']) self.expect("frame variable base", substrs=['x = 1111']) self.expect("frame variable nd", matching=False, substrs=['hello from callback summary']) self.expect("frame variable nd", substrs=['z = 4444']) def test_callback_matchers_cli_registration(self): """Test data formatter commands.""" self.build() _, process, thread, _ = lldbutil.run_to_line_breakpoint( self, lldb.SBFileSpec("main.cpp"), self.line) # Print derived without a formatter. self.expect("frame variable derived", substrs=['x = 2222', 'y = 3333']) # now set up a summary function that uses a python callback to match # classes that derive from `Base`. self.runCmd("command script import --allow-reload ./formatters_with_callback.py") self.runCmd("type summary add -e -s 'hello from callback summary' " "--recognizer-function formatters_with_callback.derives_from_base") self.runCmd("type synth add -l formatters_with_callback.SynthProvider " "--recognizer-function formatters_with_callback.derives_from_base") # Now `derived` should use our callback summary + synthetic children. self.expect("frame variable derived", substrs=['hello from callback summary', 'synthetic_child = 9999']) # But not other classes. self.expect("frame variable base", matching=False, substrs=['hello from callback summary']) self.expect("frame variable base", substrs=['x = 1111']) self.expect("frame variable nd", matching=False, substrs=['hello from callback summary']) self.expect("frame variable nd", substrs=['z = 4444'])