1d7656641SJorge Gorbe Moya""" 2d7656641SJorge Gorbe MoyaTest lldb data formatter callback-based matching. 3d7656641SJorge Gorbe Moya""" 4d7656641SJorge Gorbe Moya 5d7656641SJorge Gorbe Moyaimport lldb 6d7656641SJorge Gorbe Moyafrom lldbsuite.test.decorators import * 7d7656641SJorge Gorbe Moyafrom lldbsuite.test.lldbtest import * 8d7656641SJorge Gorbe Moyafrom lldbsuite.test import lldbutil 9d7656641SJorge Gorbe Moya 10d7656641SJorge Gorbe Moya 11d7656641SJorge Gorbe Moyaclass PythonSynthDataFormatterTestCase(TestBase): 12d7656641SJorge Gorbe Moya def setUp(self): 13d7656641SJorge Gorbe Moya # Call super's setUp(). 14d7656641SJorge Gorbe Moya TestBase.setUp(self) 15d7656641SJorge Gorbe Moya # Find the line number to break at. 16*2238dcc3SJonas Devlieghere self.line = line_number("main.cpp", "// Set break point at this line.") 17d7656641SJorge Gorbe Moya 18868186cfSJorge Gorbe Moya def test_callback_matchers_api_registration(self): 19d7656641SJorge Gorbe Moya """Test data formatter commands.""" 20d7656641SJorge Gorbe Moya self.build() 21d7656641SJorge Gorbe Moya 22d7656641SJorge Gorbe Moya _, process, thread, _ = lldbutil.run_to_line_breakpoint( 23*2238dcc3SJonas Devlieghere self, lldb.SBFileSpec("main.cpp"), self.line 24*2238dcc3SJonas Devlieghere ) 25d7656641SJorge Gorbe Moya 26d7656641SJorge Gorbe Moya # Print derived without a formatter. 27*2238dcc3SJonas Devlieghere self.expect("frame variable derived", substrs=["x = 2222", "y = 3333"]) 28d7656641SJorge Gorbe Moya 29d7656641SJorge Gorbe Moya # now set up a summary function that uses a python callback to match 30d7656641SJorge Gorbe Moya # classes that derive from `Base`. 31*2238dcc3SJonas Devlieghere self.runCmd( 32*2238dcc3SJonas Devlieghere "command script import --allow-reload ./formatters_with_callback.py" 33*2238dcc3SJonas Devlieghere ) 34*2238dcc3SJonas Devlieghere self.runCmd( 35*2238dcc3SJonas Devlieghere "script formatters_with_callback.register_formatters(lldb.debugger)" 36*2238dcc3SJonas Devlieghere ) 37d7656641SJorge Gorbe Moya 38d7656641SJorge Gorbe Moya # Now `derived` should use our callback summary + synthetic children. 39*2238dcc3SJonas Devlieghere self.expect( 40*2238dcc3SJonas Devlieghere "frame variable derived", 41*2238dcc3SJonas Devlieghere substrs=["hello from callback summary", "synthetic_child = 9999"], 42*2238dcc3SJonas Devlieghere ) 43d7656641SJorge Gorbe Moya 44d7656641SJorge Gorbe Moya # But not other classes. 45*2238dcc3SJonas Devlieghere self.expect( 46*2238dcc3SJonas Devlieghere "frame variable base", 47*2238dcc3SJonas Devlieghere matching=False, 48*2238dcc3SJonas Devlieghere substrs=["hello from callback summary"], 49*2238dcc3SJonas Devlieghere ) 50*2238dcc3SJonas Devlieghere self.expect("frame variable base", substrs=["x = 1111"]) 51d7656641SJorge Gorbe Moya 52*2238dcc3SJonas Devlieghere self.expect( 53*2238dcc3SJonas Devlieghere "frame variable nd", matching=False, substrs=["hello from callback summary"] 54*2238dcc3SJonas Devlieghere ) 55*2238dcc3SJonas Devlieghere self.expect("frame variable nd", substrs=["z = 4444"]) 56868186cfSJorge Gorbe Moya 57868186cfSJorge Gorbe Moya def test_callback_matchers_cli_registration(self): 58868186cfSJorge Gorbe Moya """Test data formatter commands.""" 59868186cfSJorge Gorbe Moya self.build() 60868186cfSJorge Gorbe Moya 61868186cfSJorge Gorbe Moya _, process, thread, _ = lldbutil.run_to_line_breakpoint( 62*2238dcc3SJonas Devlieghere self, lldb.SBFileSpec("main.cpp"), self.line 63*2238dcc3SJonas Devlieghere ) 64868186cfSJorge Gorbe Moya 65868186cfSJorge Gorbe Moya # Print derived without a formatter. 66*2238dcc3SJonas Devlieghere self.expect("frame variable derived", substrs=["x = 2222", "y = 3333"]) 67868186cfSJorge Gorbe Moya 68868186cfSJorge Gorbe Moya # now set up a summary function that uses a python callback to match 69868186cfSJorge Gorbe Moya # classes that derive from `Base`. 70*2238dcc3SJonas Devlieghere self.runCmd( 71*2238dcc3SJonas Devlieghere "command script import --allow-reload ./formatters_with_callback.py" 72*2238dcc3SJonas Devlieghere ) 73*2238dcc3SJonas Devlieghere self.runCmd( 74*2238dcc3SJonas Devlieghere "type summary add -e -s 'hello from callback summary' " 75*2238dcc3SJonas Devlieghere "--recognizer-function formatters_with_callback.derives_from_base" 76*2238dcc3SJonas Devlieghere ) 77*2238dcc3SJonas Devlieghere self.runCmd( 78*2238dcc3SJonas Devlieghere "type synth add -l formatters_with_callback.SynthProvider " 79*2238dcc3SJonas Devlieghere "--recognizer-function formatters_with_callback.derives_from_base" 80*2238dcc3SJonas Devlieghere ) 81868186cfSJorge Gorbe Moya 82868186cfSJorge Gorbe Moya # Now `derived` should use our callback summary + synthetic children. 83*2238dcc3SJonas Devlieghere self.expect( 84*2238dcc3SJonas Devlieghere "frame variable derived", 85*2238dcc3SJonas Devlieghere substrs=["hello from callback summary", "synthetic_child = 9999"], 86*2238dcc3SJonas Devlieghere ) 87868186cfSJorge Gorbe Moya 88868186cfSJorge Gorbe Moya # But not other classes. 89*2238dcc3SJonas Devlieghere self.expect( 90*2238dcc3SJonas Devlieghere "frame variable base", 91*2238dcc3SJonas Devlieghere matching=False, 92*2238dcc3SJonas Devlieghere substrs=["hello from callback summary"], 93*2238dcc3SJonas Devlieghere ) 94*2238dcc3SJonas Devlieghere self.expect("frame variable base", substrs=["x = 1111"]) 95868186cfSJorge Gorbe Moya 96*2238dcc3SJonas Devlieghere self.expect( 97*2238dcc3SJonas Devlieghere "frame variable nd", matching=False, substrs=["hello from callback summary"] 98*2238dcc3SJonas Devlieghere ) 99*2238dcc3SJonas Devlieghere self.expect("frame variable nd", substrs=["z = 4444"]) 100