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