xref: /llvm-project/lldb/test/API/python_api/formatters/TestFormattersSBAPI.py (revision 82af55983d75d4a821b76ee926b19725ec7fa889)
199451b44SJordan Rupprecht"""Test Python APIs for working with formatters"""
299451b44SJordan Rupprecht
399451b44SJordan Rupprechtimport lldb
499451b44SJordan Rupprechtfrom lldbsuite.test.decorators import *
599451b44SJordan Rupprechtfrom lldbsuite.test.lldbtest import *
699451b44SJordan Rupprechtfrom lldbsuite.test import lldbutil
799451b44SJordan Rupprecht
899451b44SJordan Rupprecht
999451b44SJordan Rupprechtclass SBFormattersAPITestCase(TestBase):
1099451b44SJordan Rupprecht    NO_DEBUG_INFO_TESTCASE = True
1199451b44SJordan Rupprecht
1299451b44SJordan Rupprecht    def setUp(self):
1399451b44SJordan Rupprecht        # Call super's setUp().
1499451b44SJordan Rupprecht        TestBase.setUp(self)
152238dcc3SJonas Devlieghere        self.line = line_number("main.cpp", "// Set break point at this line.")
1699451b44SJordan Rupprecht
1799451b44SJordan Rupprecht    def test_formatters_api(self):
1899451b44SJordan Rupprecht        """Test Python APIs for working with formatters"""
1999451b44SJordan Rupprecht        self.build()
2099451b44SJordan Rupprecht        self.setTearDownCleanup()
2199451b44SJordan Rupprecht
2299451b44SJordan Rupprecht        """Test Python APIs for working with formatters"""
232238dcc3SJonas Devlieghere        self.runCmd("file " + self.getBuildArtifact("a.out"), CURRENT_EXECUTABLE_SET)
2499451b44SJordan Rupprecht
2599451b44SJordan Rupprecht        lldbutil.run_break_set_by_file_and_line(
262238dcc3SJonas Devlieghere            self, "main.cpp", self.line, num_expected_locations=1, loc_exact=True
272238dcc3SJonas Devlieghere        )
2899451b44SJordan Rupprecht
2999451b44SJordan Rupprecht        self.runCmd("run", RUN_SUCCEEDED)
3099451b44SJordan Rupprecht
3199451b44SJordan Rupprecht        # The stop reason of the thread should be breakpoint.
322238dcc3SJonas Devlieghere        self.expect(
332238dcc3SJonas Devlieghere            "thread list",
342238dcc3SJonas Devlieghere            STOPPED_DUE_TO_BREAKPOINT,
352238dcc3SJonas Devlieghere            substrs=["stopped", "stop reason = breakpoint"],
362238dcc3SJonas Devlieghere        )
3799451b44SJordan Rupprecht
3899451b44SJordan Rupprecht        # This is the function to remove the custom formats in order to have a
3999451b44SJordan Rupprecht        # clean slate for the next test case.
4099451b44SJordan Rupprecht        def cleanup():
412238dcc3SJonas Devlieghere            self.runCmd("type format clear", check=False)
422238dcc3SJonas Devlieghere            self.runCmd("type summary clear", check=False)
432238dcc3SJonas Devlieghere            self.runCmd("type filter clear", check=False)
442238dcc3SJonas Devlieghere            self.runCmd("type synthetic clear", check=False)
452238dcc3SJonas Devlieghere            self.runCmd("type category delete foobar", check=False)
462238dcc3SJonas Devlieghere            self.runCmd("type category delete JASSynth", check=False)
472238dcc3SJonas Devlieghere            self.runCmd("type category delete newbar", check=False)
4899451b44SJordan Rupprecht
4999451b44SJordan Rupprecht        # Execute the cleanup function during test case tear down.
5099451b44SJordan Rupprecht        self.addTearDownHook(cleanup)
5199451b44SJordan Rupprecht
5299451b44SJordan Rupprecht        format = lldb.SBTypeFormat(lldb.eFormatHex)
5399451b44SJordan Rupprecht        category = self.dbg.GetDefaultCategory()
5499451b44SJordan Rupprecht        category.AddTypeFormat(lldb.SBTypeNameSpecifier("int"), format)
5599451b44SJordan Rupprecht
562238dcc3SJonas Devlieghere        self.expect("frame variable foo.A", substrs=["0x00000001"])
572238dcc3SJonas Devlieghere        self.expect("frame variable foo.E", matching=False, substrs=["b8cca70a"])
5899451b44SJordan Rupprecht
5999451b44SJordan Rupprecht        category.AddTypeFormat(lldb.SBTypeNameSpecifier("long"), format)
602238dcc3SJonas Devlieghere        self.expect("frame variable foo.A", substrs=["0x00000001"])
612238dcc3SJonas Devlieghere        self.expect("frame variable foo.E", substrs=["b8cca70a"])
6299451b44SJordan Rupprecht
6399451b44SJordan Rupprecht        format.SetFormat(lldb.eFormatOctal)
6499451b44SJordan Rupprecht        category.AddTypeFormat(lldb.SBTypeNameSpecifier("int"), format)
652238dcc3SJonas Devlieghere        self.expect("frame variable foo.A", substrs=[" 01"])
662238dcc3SJonas Devlieghere        self.expect("frame variable foo.E", substrs=["b8cca70a"])
6799451b44SJordan Rupprecht
6899451b44SJordan Rupprecht        category.DeleteTypeFormat(lldb.SBTypeNameSpecifier("int"))
6999451b44SJordan Rupprecht        category.DeleteTypeFormat(lldb.SBTypeNameSpecifier("long"))
702238dcc3SJonas Devlieghere        self.expect("frame variable foo.A", matching=False, substrs=[" 01"])
712238dcc3SJonas Devlieghere        self.expect("frame variable foo.E", matching=False, substrs=["b8cca70a"])
7299451b44SJordan Rupprecht
7399451b44SJordan Rupprecht        summary = lldb.SBTypeSummary.CreateWithSummaryString(
742238dcc3SJonas Devlieghere            "the hello world you'll never see"
752238dcc3SJonas Devlieghere        )
762238dcc3SJonas Devlieghere        summary.SetSummaryString("hello world")
7799451b44SJordan Rupprecht        new_category = self.dbg.GetCategory("foobar")
7899451b44SJordan Rupprecht        self.assertFalse(
792238dcc3SJonas Devlieghere            new_category.IsValid(), "getting a non-existing category worked"
802238dcc3SJonas Devlieghere        )
8199451b44SJordan Rupprecht        new_category = self.dbg.CreateCategory("foobar")
8299451b44SJordan Rupprecht        new_category.SetEnabled(True)
8399451b44SJordan Rupprecht        new_category.AddTypeSummary(
8499451b44SJordan Rupprecht            lldb.SBTypeNameSpecifier(
8599451b44SJordan Rupprecht                "^.*t$",
8699451b44SJordan Rupprecht                True,  # is_regexp
872238dcc3SJonas Devlieghere            ),
882238dcc3SJonas Devlieghere            summary,
892238dcc3SJonas Devlieghere        )
9099451b44SJordan Rupprecht
912238dcc3SJonas Devlieghere        self.expect("frame variable foo.A", substrs=["hello world"])
922238dcc3SJonas Devlieghere        self.expect("frame variable foo.E", matching=False, substrs=["hello world"])
932238dcc3SJonas Devlieghere        self.expect("frame variable foo.B", substrs=["hello world"])
942238dcc3SJonas Devlieghere        self.expect("frame variable foo.F", substrs=["hello world"])
9599451b44SJordan Rupprecht        new_category.SetEnabled(False)
962238dcc3SJonas Devlieghere        self.expect("frame variable foo.A", matching=False, substrs=["hello world"])
972238dcc3SJonas Devlieghere        self.expect("frame variable foo.E", matching=False, substrs=["hello world"])
982238dcc3SJonas Devlieghere        self.expect("frame variable foo.B", matching=False, substrs=["hello world"])
992238dcc3SJonas Devlieghere        self.expect("frame variable foo.F", matching=False, substrs=["hello world"])
10099451b44SJordan Rupprecht        self.dbg.DeleteCategory(new_category.GetName())
1012238dcc3SJonas Devlieghere        self.expect("frame variable foo.A", matching=False, substrs=["hello world"])
1022238dcc3SJonas Devlieghere        self.expect("frame variable foo.E", matching=False, substrs=["hello world"])
1032238dcc3SJonas Devlieghere        self.expect("frame variable foo.B", matching=False, substrs=["hello world"])
1042238dcc3SJonas Devlieghere        self.expect("frame variable foo.F", matching=False, substrs=["hello world"])
10599451b44SJordan Rupprecht
10699451b44SJordan Rupprecht        filter = lldb.SBTypeFilter(0)
10799451b44SJordan Rupprecht        filter.AppendExpressionPath("A")
10899451b44SJordan Rupprecht        filter.AppendExpressionPath("D")
1090ed758b2SDave Lee        self.assertEqual(
1102238dcc3SJonas Devlieghere            filter.GetNumberOfExpressionPaths(),
1112238dcc3SJonas Devlieghere            2,
1122238dcc3SJonas Devlieghere            "filter with two items does not have two items",
1132238dcc3SJonas Devlieghere        )
11499451b44SJordan Rupprecht
11599451b44SJordan Rupprecht        category.AddTypeFilter(lldb.SBTypeNameSpecifier("JustAStruct"), filter)
1162238dcc3SJonas Devlieghere        self.expect("frame variable foo", substrs=["A = 1", "D = 6.28"])
1172238dcc3SJonas Devlieghere        self.expect(
1182238dcc3SJonas Devlieghere            "frame variable foo",
1192238dcc3SJonas Devlieghere            matching=False,
1202238dcc3SJonas Devlieghere            substrs=["B = ", "C = ", "E = ", "F = "],
1212238dcc3SJonas Devlieghere        )
12299451b44SJordan Rupprecht
1232238dcc3SJonas Devlieghere        category.DeleteTypeFilter(lldb.SBTypeNameSpecifier("JustAStruct", True))
1242238dcc3SJonas Devlieghere        self.expect("frame variable foo", substrs=["A = 1", "D = 6.28"])
1252238dcc3SJonas Devlieghere        self.expect(
1262238dcc3SJonas Devlieghere            "frame variable foo",
1272238dcc3SJonas Devlieghere            matching=False,
1282238dcc3SJonas Devlieghere            substrs=["B = ", "C = ", "E = ", "F = "],
1292238dcc3SJonas Devlieghere        )
13099451b44SJordan Rupprecht
1312238dcc3SJonas Devlieghere        category.DeleteTypeFilter(lldb.SBTypeNameSpecifier("JustAStruct", False))
1322238dcc3SJonas Devlieghere        self.expect("frame variable foo", substrs=["A = 1", "D = 6.28"])
1332238dcc3SJonas Devlieghere        self.expect(
1342238dcc3SJonas Devlieghere            "frame variable foo",
1352238dcc3SJonas Devlieghere            matching=True,
1362238dcc3SJonas Devlieghere            substrs=["B = ", "C = ", "E = ", "F = "],
1372238dcc3SJonas Devlieghere        )
13899451b44SJordan Rupprecht
13999451b44SJordan Rupprecht        self.runCmd("command script import --allow-reload ./synth.py")
14099451b44SJordan Rupprecht
1412238dcc3SJonas Devlieghere        self.expect("frame variable foo", matching=False, substrs=["X = 1"])
14299451b44SJordan Rupprecht
14399451b44SJordan Rupprecht        self.dbg.GetCategory("JASSynth").SetEnabled(True)
1442238dcc3SJonas Devlieghere        self.expect("frame variable foo", matching=True, substrs=["X = 1"])
14599451b44SJordan Rupprecht
146*82af5598SVincent Belliard        self.dbg.GetCategory("CCCSynth2").SetEnabled(True)
147*82af5598SVincent Belliard        self.expect(
148*82af5598SVincent Belliard            "frame variable ccc",
149*82af5598SVincent Belliard            matching=True,
150*82af5598SVincent Belliard            substrs=[
151*82af5598SVincent Belliard                "CCC object with leading synthetic value (int) b = 222",
152*82af5598SVincent Belliard                "a = 111",
153*82af5598SVincent Belliard                "b = 222",
154*82af5598SVincent Belliard                "c = 333",
155*82af5598SVincent Belliard            ],
156*82af5598SVincent Belliard        )
157*82af5598SVincent Belliard        self.dbg.GetCategory("CCCSynth2").SetEnabled(False)
158*82af5598SVincent Belliard
15999451b44SJordan Rupprecht        self.dbg.GetCategory("CCCSynth").SetEnabled(True)
16099451b44SJordan Rupprecht        self.expect(
16199451b44SJordan Rupprecht            "frame variable ccc",
16299451b44SJordan Rupprecht            matching=True,
16399451b44SJordan Rupprecht            substrs=[
1642238dcc3SJonas Devlieghere                "CCC object with leading value (int) a = 111",
1652238dcc3SJonas Devlieghere                "a = 111",
1662238dcc3SJonas Devlieghere                "b = 222",
1672238dcc3SJonas Devlieghere                "c = 333",
1682238dcc3SJonas Devlieghere            ],
1692238dcc3SJonas Devlieghere        )
17099451b44SJordan Rupprecht
171*82af5598SVincent Belliard        self.dbg.GetCategory("BarIntSynth").SetEnabled(True)
172*82af5598SVincent Belliard        self.expect(
173*82af5598SVincent Belliard            "frame variable bar_int",
174*82af5598SVincent Belliard            matching=True,
175*82af5598SVincent Belliard            substrs=[
176*82af5598SVincent Belliard                "(int) bar_int = 20 bar_int synthetic: No value",
177*82af5598SVincent Belliard            ],
178*82af5598SVincent Belliard        )
179*82af5598SVincent Belliard
1802238dcc3SJonas Devlieghere        foo_var = (
1812238dcc3SJonas Devlieghere            self.dbg.GetSelectedTarget()
1822238dcc3SJonas Devlieghere            .GetProcess()
1832238dcc3SJonas Devlieghere            .GetSelectedThread()
1842238dcc3SJonas Devlieghere            .GetSelectedFrame()
1852238dcc3SJonas Devlieghere            .FindVariable("foo")
1862238dcc3SJonas Devlieghere        )
1872238dcc3SJonas Devlieghere        self.assertTrue(foo_var.IsValid(), "could not find foo")
18899451b44SJordan Rupprecht        self.assertTrue(
1892238dcc3SJonas Devlieghere            foo_var.GetDeclaration().IsValid(), "foo declaration is invalid"
1902238dcc3SJonas Devlieghere        )
19199451b44SJordan Rupprecht
1920ed758b2SDave Lee        self.assertEqual(
1932238dcc3SJonas Devlieghere            foo_var.GetNumChildren(),
1942238dcc3SJonas Devlieghere            2,
1952238dcc3SJonas Devlieghere            "synthetic value has wrong number of child items (synth)",
1962238dcc3SJonas Devlieghere        )
1970ed758b2SDave Lee        self.assertEqual(
1982238dcc3SJonas Devlieghere            foo_var.GetChildMemberWithName("X").GetValueAsUnsigned(),
1992238dcc3SJonas Devlieghere            1,
2002238dcc3SJonas Devlieghere            "foo_synth.X has wrong value (synth)",
2012238dcc3SJonas Devlieghere        )
20299451b44SJordan Rupprecht        self.assertFalse(
2032238dcc3SJonas Devlieghere            foo_var.GetChildMemberWithName("B").IsValid(),
2042238dcc3SJonas Devlieghere            "foo_synth.B is valid but should not (synth)",
2052238dcc3SJonas Devlieghere        )
20699451b44SJordan Rupprecht
20799451b44SJordan Rupprecht        self.dbg.GetCategory("JASSynth").SetEnabled(False)
2082238dcc3SJonas Devlieghere        foo_var = (
2092238dcc3SJonas Devlieghere            self.dbg.GetSelectedTarget()
2102238dcc3SJonas Devlieghere            .GetProcess()
2112238dcc3SJonas Devlieghere            .GetSelectedThread()
2122238dcc3SJonas Devlieghere            .GetSelectedFrame()
2132238dcc3SJonas Devlieghere            .FindVariable("foo")
2142238dcc3SJonas Devlieghere        )
2152238dcc3SJonas Devlieghere        self.assertTrue(foo_var.IsValid(), "could not find foo")
21699451b44SJordan Rupprecht
2179c246882SJordan Rupprecht        self.assertNotEqual(foo_var.GetNumChildren(), 2, "still seeing synthetic value")
21899451b44SJordan Rupprecht
21999451b44SJordan Rupprecht        filter = lldb.SBTypeFilter(0)
22099451b44SJordan Rupprecht        filter.AppendExpressionPath("A")
22199451b44SJordan Rupprecht        filter.AppendExpressionPath("D")
22299451b44SJordan Rupprecht        category.AddTypeFilter(lldb.SBTypeNameSpecifier("JustAStruct"), filter)
2232238dcc3SJonas Devlieghere        self.expect("frame variable foo", substrs=["A = 1", "D = 6.28"])
22499451b44SJordan Rupprecht
2252238dcc3SJonas Devlieghere        foo_var = (
2262238dcc3SJonas Devlieghere            self.dbg.GetSelectedTarget()
2272238dcc3SJonas Devlieghere            .GetProcess()
2282238dcc3SJonas Devlieghere            .GetSelectedThread()
2292238dcc3SJonas Devlieghere            .GetSelectedFrame()
2302238dcc3SJonas Devlieghere            .FindVariable("foo")
2312238dcc3SJonas Devlieghere        )
2322238dcc3SJonas Devlieghere        self.assertTrue(foo_var.IsValid(), "could not find foo")
23399451b44SJordan Rupprecht
2340ed758b2SDave Lee        self.assertEqual(
2352238dcc3SJonas Devlieghere            foo_var.GetNumChildren(),
2362238dcc3SJonas Devlieghere            2,
2372238dcc3SJonas Devlieghere            "synthetic value has wrong number of child items (filter)",
2382238dcc3SJonas Devlieghere        )
2390ed758b2SDave Lee        self.assertEqual(
2402238dcc3SJonas Devlieghere            foo_var.GetChildMemberWithName("X").GetValueAsUnsigned(),
2412238dcc3SJonas Devlieghere            0,
2422238dcc3SJonas Devlieghere            "foo_synth.X has wrong value (filter)",
2432238dcc3SJonas Devlieghere        )
2440ed758b2SDave Lee        self.assertEqual(
2452238dcc3SJonas Devlieghere            foo_var.GetChildMemberWithName("A").GetValueAsUnsigned(),
2462238dcc3SJonas Devlieghere            1,
2472238dcc3SJonas Devlieghere            "foo_synth.A has wrong value (filter)",
2482238dcc3SJonas Devlieghere        )
24999451b44SJordan Rupprecht
2502238dcc3SJonas Devlieghere        self.assertTrue(
2512238dcc3SJonas Devlieghere            filter.ReplaceExpressionPathAtIndex(0, "C"),
2522238dcc3SJonas Devlieghere            "failed to replace an expression path in filter",
2532238dcc3SJonas Devlieghere        )
2542238dcc3SJonas Devlieghere        self.expect("frame variable foo", substrs=["A = 1", "D = 6.28"])
25599451b44SJordan Rupprecht        category.AddTypeFilter(lldb.SBTypeNameSpecifier("JustAStruct"), filter)
2562238dcc3SJonas Devlieghere        self.expect("frame variable foo", substrs=["C = 'e'", "D = 6.28"])
25799451b44SJordan Rupprecht        category.AddTypeFilter(lldb.SBTypeNameSpecifier("FooType"), filter)
25899451b44SJordan Rupprecht        filter.ReplaceExpressionPathAtIndex(1, "F")
2592238dcc3SJonas Devlieghere        self.expect("frame variable foo", substrs=["C = 'e'", "D = 6.28"])
26099451b44SJordan Rupprecht        category.AddTypeFilter(lldb.SBTypeNameSpecifier("JustAStruct"), filter)
2612238dcc3SJonas Devlieghere        self.expect("frame variable foo", substrs=["C = 'e'", "F = 0"])
2622238dcc3SJonas Devlieghere        self.expect("frame variable bar", substrs=["C = 'e'", "D = 6.28"])
26399451b44SJordan Rupprecht
2642238dcc3SJonas Devlieghere        foo_var = (
2652238dcc3SJonas Devlieghere            self.dbg.GetSelectedTarget()
2662238dcc3SJonas Devlieghere            .GetProcess()
2672238dcc3SJonas Devlieghere            .GetSelectedThread()
2682238dcc3SJonas Devlieghere            .GetSelectedFrame()
2692238dcc3SJonas Devlieghere            .FindVariable("foo")
2702238dcc3SJonas Devlieghere        )
2712238dcc3SJonas Devlieghere        self.assertTrue(foo_var.IsValid(), "could not find foo")
2720ed758b2SDave Lee        self.assertEqual(
2732238dcc3SJonas Devlieghere            foo_var.GetChildMemberWithName("C").GetValueAsUnsigned(),
2742238dcc3SJonas Devlieghere            ord("e"),
2752238dcc3SJonas Devlieghere            "foo_synth.C has wrong value (filter)",
2762238dcc3SJonas Devlieghere        )
27799451b44SJordan Rupprecht
2782238dcc3SJonas Devlieghere        chosen = self.dbg.GetFilterForType(lldb.SBTypeNameSpecifier("JustAStruct"))
2792238dcc3SJonas Devlieghere        self.assertEqual(chosen.count, 2, "wrong filter found for JustAStruct")
2800ed758b2SDave Lee        self.assertEqual(
2812238dcc3SJonas Devlieghere            chosen.GetExpressionPathAtIndex(0),
2822238dcc3SJonas Devlieghere            "C",
2832238dcc3SJonas Devlieghere            "wrong item at index 0 for JustAStruct",
2842238dcc3SJonas Devlieghere        )
2850ed758b2SDave Lee        self.assertEqual(
2862238dcc3SJonas Devlieghere            chosen.GetExpressionPathAtIndex(1),
2872238dcc3SJonas Devlieghere            "F",
2882238dcc3SJonas Devlieghere            "wrong item at index 1 for JustAStruct",
2892238dcc3SJonas Devlieghere        )
29099451b44SJordan Rupprecht
29199451b44SJordan Rupprecht        self.assertFalse(
2922238dcc3SJonas Devlieghere            category.DeleteTypeFilter(lldb.SBTypeNameSpecifier("NoSuchType")),
2932238dcc3SJonas Devlieghere            "deleting a non-existing filter worked",
2942238dcc3SJonas Devlieghere        )
29599451b44SJordan Rupprecht        self.assertFalse(
2962238dcc3SJonas Devlieghere            category.DeleteTypeSummary(lldb.SBTypeNameSpecifier("NoSuchType")),
2972238dcc3SJonas Devlieghere            "deleting a non-existing summary worked",
2982238dcc3SJonas Devlieghere        )
29999451b44SJordan Rupprecht        self.assertFalse(
3002238dcc3SJonas Devlieghere            category.DeleteTypeFormat(lldb.SBTypeNameSpecifier("NoSuchType")),
3012238dcc3SJonas Devlieghere            "deleting a non-existing format worked",
3022238dcc3SJonas Devlieghere        )
30399451b44SJordan Rupprecht        self.assertFalse(
3042238dcc3SJonas Devlieghere            category.DeleteTypeSynthetic(lldb.SBTypeNameSpecifier("NoSuchType")),
3052238dcc3SJonas Devlieghere            "deleting a non-existing synthetic worked",
3062238dcc3SJonas Devlieghere        )
30799451b44SJordan Rupprecht
30899451b44SJordan Rupprecht        self.assertFalse(
3092238dcc3SJonas Devlieghere            category.DeleteTypeFilter(lldb.SBTypeNameSpecifier("")),
3102238dcc3SJonas Devlieghere            "deleting a filter for '' worked",
3112238dcc3SJonas Devlieghere        )
31299451b44SJordan Rupprecht        self.assertFalse(
3132238dcc3SJonas Devlieghere            category.DeleteTypeSummary(lldb.SBTypeNameSpecifier("")),
3142238dcc3SJonas Devlieghere            "deleting a summary for '' worked",
3152238dcc3SJonas Devlieghere        )
31699451b44SJordan Rupprecht        self.assertFalse(
3172238dcc3SJonas Devlieghere            category.DeleteTypeFormat(lldb.SBTypeNameSpecifier("")),
3182238dcc3SJonas Devlieghere            "deleting a format for '' worked",
3192238dcc3SJonas Devlieghere        )
32099451b44SJordan Rupprecht        self.assertFalse(
3212238dcc3SJonas Devlieghere            category.DeleteTypeSynthetic(lldb.SBTypeNameSpecifier("")),
3222238dcc3SJonas Devlieghere            "deleting a synthetic for '' worked",
3232238dcc3SJonas Devlieghere        )
32499451b44SJordan Rupprecht
32599451b44SJordan Rupprecht        try:
32699451b44SJordan Rupprecht            self.assertFalse(
3272238dcc3SJonas Devlieghere                category.AddTypeSummary(lldb.SBTypeNameSpecifier("NoneSuchType"), None),
3282238dcc3SJonas Devlieghere                "adding a summary valued None worked",
3292238dcc3SJonas Devlieghere            )
33099451b44SJordan Rupprecht        except:
33199451b44SJordan Rupprecht            pass
33299451b44SJordan Rupprecht        else:
33399451b44SJordan Rupprecht            self.assertFalse(True, "adding a summary valued None worked")
33499451b44SJordan Rupprecht
33599451b44SJordan Rupprecht        try:
33699451b44SJordan Rupprecht            self.assertFalse(
3372238dcc3SJonas Devlieghere                category.AddTypeFilter(lldb.SBTypeNameSpecifier("NoneSuchType"), None),
3382238dcc3SJonas Devlieghere                "adding a filter valued None worked",
3392238dcc3SJonas Devlieghere            )
34099451b44SJordan Rupprecht        except:
34199451b44SJordan Rupprecht            pass
34299451b44SJordan Rupprecht        else:
34399451b44SJordan Rupprecht            self.assertFalse(True, "adding a filter valued None worked")
34499451b44SJordan Rupprecht
34599451b44SJordan Rupprecht        try:
34699451b44SJordan Rupprecht            self.assertFalse(
34799451b44SJordan Rupprecht                category.AddTypeSynthetic(
3482238dcc3SJonas Devlieghere                    lldb.SBTypeNameSpecifier("NoneSuchType"), None
3492238dcc3SJonas Devlieghere                ),
3502238dcc3SJonas Devlieghere                "adding a synthetic valued None worked",
3512238dcc3SJonas Devlieghere            )
35299451b44SJordan Rupprecht        except:
35399451b44SJordan Rupprecht            pass
35499451b44SJordan Rupprecht        else:
35599451b44SJordan Rupprecht            self.assertFalse(True, "adding a synthetic valued None worked")
35699451b44SJordan Rupprecht
35799451b44SJordan Rupprecht        try:
35899451b44SJordan Rupprecht            self.assertFalse(
3592238dcc3SJonas Devlieghere                category.AddTypeFormat(lldb.SBTypeNameSpecifier("NoneSuchType"), None),
3602238dcc3SJonas Devlieghere                "adding a format valued None worked",
3612238dcc3SJonas Devlieghere            )
36299451b44SJordan Rupprecht        except:
36399451b44SJordan Rupprecht            pass
36499451b44SJordan Rupprecht        else:
36599451b44SJordan Rupprecht            self.assertFalse(True, "adding a format valued None worked")
36699451b44SJordan Rupprecht
36799451b44SJordan Rupprecht        self.assertFalse(
36899451b44SJordan Rupprecht            category.AddTypeSummary(
3692238dcc3SJonas Devlieghere                lldb.SBTypeNameSpecifier("EmptySuchType"), lldb.SBTypeSummary()
3702238dcc3SJonas Devlieghere            ),
3712238dcc3SJonas Devlieghere            "adding a summary without value worked",
3722238dcc3SJonas Devlieghere        )
37399451b44SJordan Rupprecht        self.assertFalse(
37499451b44SJordan Rupprecht            category.AddTypeFilter(
3752238dcc3SJonas Devlieghere                lldb.SBTypeNameSpecifier("EmptySuchType"), lldb.SBTypeFilter()
3762238dcc3SJonas Devlieghere            ),
3772238dcc3SJonas Devlieghere            "adding a filter without value worked",
3782238dcc3SJonas Devlieghere        )
37999451b44SJordan Rupprecht        self.assertFalse(
38099451b44SJordan Rupprecht            category.AddTypeSynthetic(
3812238dcc3SJonas Devlieghere                lldb.SBTypeNameSpecifier("EmptySuchType"), lldb.SBTypeSynthetic()
3822238dcc3SJonas Devlieghere            ),
3832238dcc3SJonas Devlieghere            "adding a synthetic without value worked",
3842238dcc3SJonas Devlieghere        )
38599451b44SJordan Rupprecht        self.assertFalse(
38699451b44SJordan Rupprecht            category.AddTypeFormat(
3872238dcc3SJonas Devlieghere                lldb.SBTypeNameSpecifier("EmptySuchType"), lldb.SBTypeFormat()
3882238dcc3SJonas Devlieghere            ),
3892238dcc3SJonas Devlieghere            "adding a format without value worked",
3902238dcc3SJonas Devlieghere        )
39199451b44SJordan Rupprecht
39299451b44SJordan Rupprecht        self.assertFalse(
39399451b44SJordan Rupprecht            category.AddTypeSummary(
39499451b44SJordan Rupprecht                lldb.SBTypeNameSpecifier(""),
3952238dcc3SJonas Devlieghere                lldb.SBTypeSummary.CreateWithSummaryString(""),
3962238dcc3SJonas Devlieghere            ),
3972238dcc3SJonas Devlieghere            "adding a summary for an invalid type worked",
3982238dcc3SJonas Devlieghere        )
39999451b44SJordan Rupprecht        self.assertFalse(
4002238dcc3SJonas Devlieghere            category.AddTypeFilter(lldb.SBTypeNameSpecifier(""), lldb.SBTypeFilter(0)),
4012238dcc3SJonas Devlieghere            "adding a filter for an invalid type worked",
4022238dcc3SJonas Devlieghere        )
40399451b44SJordan Rupprecht        self.assertFalse(
40499451b44SJordan Rupprecht            category.AddTypeSynthetic(
40599451b44SJordan Rupprecht                lldb.SBTypeNameSpecifier(""),
4062238dcc3SJonas Devlieghere                lldb.SBTypeSynthetic.CreateWithClassName(""),
4072238dcc3SJonas Devlieghere            ),
4082238dcc3SJonas Devlieghere            "adding a synthetic for an invalid type worked",
4092238dcc3SJonas Devlieghere        )
41099451b44SJordan Rupprecht        self.assertFalse(
41199451b44SJordan Rupprecht            category.AddTypeFormat(
4122238dcc3SJonas Devlieghere                lldb.SBTypeNameSpecifier(""), lldb.SBTypeFormat(lldb.eFormatHex)
4132238dcc3SJonas Devlieghere            ),
4142238dcc3SJonas Devlieghere            "adding a format for an invalid type worked",
4152238dcc3SJonas Devlieghere        )
41699451b44SJordan Rupprecht
41799451b44SJordan Rupprecht        new_category = self.dbg.CreateCategory("newbar")
41899451b44SJordan Rupprecht        new_category.AddTypeSummary(
41999451b44SJordan Rupprecht            lldb.SBTypeNameSpecifier("JustAStruct"),
4202238dcc3SJonas Devlieghere            lldb.SBTypeSummary.CreateWithScriptCode("return 'hello scripted world';"),
4212238dcc3SJonas Devlieghere        )
4222238dcc3SJonas Devlieghere        self.expect(
4232238dcc3SJonas Devlieghere            "frame variable foo", matching=False, substrs=["hello scripted world"]
4242238dcc3SJonas Devlieghere        )
42599451b44SJordan Rupprecht        new_category.SetEnabled(True)
4262238dcc3SJonas Devlieghere        self.expect(
4272238dcc3SJonas Devlieghere            "frame variable foo", matching=True, substrs=["hello scripted world"]
4282238dcc3SJonas Devlieghere        )
42999451b44SJordan Rupprecht
4302238dcc3SJonas Devlieghere        self.expect(
4312238dcc3SJonas Devlieghere            "frame variable foo_ptr", matching=True, substrs=["hello scripted world"]
4322238dcc3SJonas Devlieghere        )
43399451b44SJordan Rupprecht        new_category.AddTypeSummary(
43499451b44SJordan Rupprecht            lldb.SBTypeNameSpecifier("JustAStruct"),
43599451b44SJordan Rupprecht            lldb.SBTypeSummary.CreateWithScriptCode(
4362238dcc3SJonas Devlieghere                "return 'hello scripted world';", lldb.eTypeOptionSkipPointers
4372238dcc3SJonas Devlieghere            ),
4382238dcc3SJonas Devlieghere        )
4392238dcc3SJonas Devlieghere        self.expect(
4402238dcc3SJonas Devlieghere            "frame variable foo", matching=True, substrs=["hello scripted world"]
4412238dcc3SJonas Devlieghere        )
44299451b44SJordan Rupprecht
4432238dcc3SJonas Devlieghere        frame = (
4442238dcc3SJonas Devlieghere            self.dbg.GetSelectedTarget()
4452238dcc3SJonas Devlieghere            .GetProcess()
4462238dcc3SJonas Devlieghere            .GetSelectedThread()
4472238dcc3SJonas Devlieghere            .GetSelectedFrame()
4482238dcc3SJonas Devlieghere        )
44999451b44SJordan Rupprecht        foo_ptr = frame.FindVariable("foo_ptr")
45099451b44SJordan Rupprecht        summary = foo_ptr.GetTypeSummary()
45199451b44SJordan Rupprecht
45299451b44SJordan Rupprecht        self.assertFalse(
4532238dcc3SJonas Devlieghere            summary.IsValid(), "summary found for foo* when none was planned"
4542238dcc3SJonas Devlieghere        )
45599451b44SJordan Rupprecht
4562238dcc3SJonas Devlieghere        self.expect(
4572238dcc3SJonas Devlieghere            "frame variable foo_ptr", matching=False, substrs=["hello scripted world"]
4582238dcc3SJonas Devlieghere        )
45999451b44SJordan Rupprecht
46099451b44SJordan Rupprecht        new_category.AddTypeSummary(
46199451b44SJordan Rupprecht            lldb.SBTypeNameSpecifier("JustAStruct"),
46299451b44SJordan Rupprecht            lldb.SBTypeSummary.CreateWithSummaryString(
4632238dcc3SJonas Devlieghere                "hello static world", lldb.eTypeOptionNone
4642238dcc3SJonas Devlieghere            ),
4652238dcc3SJonas Devlieghere        )
46699451b44SJordan Rupprecht
46799451b44SJordan Rupprecht        summary = foo_ptr.GetTypeSummary()
46899451b44SJordan Rupprecht
46999451b44SJordan Rupprecht        self.assertTrue(
4702238dcc3SJonas Devlieghere            summary.IsValid(), "no summary found for foo* when one was in place"
4712238dcc3SJonas Devlieghere        )
4720ed758b2SDave Lee        self.assertEqual(
4732238dcc3SJonas Devlieghere            summary.GetData(), "hello static world", "wrong summary found for foo*"
4742238dcc3SJonas Devlieghere        )
47599451b44SJordan Rupprecht
47699451b44SJordan Rupprecht        self.expect("frame variable e1", substrs=["I am an empty Empty1 {}"])
47799451b44SJordan Rupprecht        self.expect("frame variable e2", substrs=["I am an empty Empty2"])
47899451b44SJordan Rupprecht        self.expect(
4792238dcc3SJonas Devlieghere            "frame variable e2", substrs=["I am an empty Empty2 {}"], matching=False
4802238dcc3SJonas Devlieghere        )
48199451b44SJordan Rupprecht
4829c246882SJordan Rupprecht        self.assertIsNotNone(
4839c246882SJordan Rupprecht            self.dbg.GetCategory(lldb.eLanguageTypeObjC), "ObjC category is None"
4842238dcc3SJonas Devlieghere        )
48599451b44SJordan Rupprecht
48699451b44SJordan Rupprecht    def test_force_synth_off(self):
48799451b44SJordan Rupprecht        """Test that one can have the public API return non-synthetic SBValues if desired"""
4882238dcc3SJonas Devlieghere        self.build(dictionary={"EXE": "no_synth"})
48999451b44SJordan Rupprecht        self.setTearDownCleanup()
49099451b44SJordan Rupprecht
4912238dcc3SJonas Devlieghere        self.runCmd("file " + self.getBuildArtifact("no_synth"), CURRENT_EXECUTABLE_SET)
49299451b44SJordan Rupprecht
49399451b44SJordan Rupprecht        lldbutil.run_break_set_by_file_and_line(
4942238dcc3SJonas Devlieghere            self, "main.cpp", self.line, num_expected_locations=1, loc_exact=True
4952238dcc3SJonas Devlieghere        )
49699451b44SJordan Rupprecht
49799451b44SJordan Rupprecht        self.runCmd("run", RUN_SUCCEEDED)
49899451b44SJordan Rupprecht
49999451b44SJordan Rupprecht        # The stop reason of the thread should be breakpoint.
5002238dcc3SJonas Devlieghere        self.expect(
5012238dcc3SJonas Devlieghere            "thread list",
5022238dcc3SJonas Devlieghere            STOPPED_DUE_TO_BREAKPOINT,
5032238dcc3SJonas Devlieghere            substrs=["stopped", "stop reason = breakpoint"],
5042238dcc3SJonas Devlieghere        )
50599451b44SJordan Rupprecht
50699451b44SJordan Rupprecht        # This is the function to remove the custom formats in order to have a
50799451b44SJordan Rupprecht        # clean slate for the next test case.
50899451b44SJordan Rupprecht        def cleanup():
5092238dcc3SJonas Devlieghere            self.runCmd("type format clear", check=False)
5102238dcc3SJonas Devlieghere            self.runCmd("type summary clear", check=False)
5112238dcc3SJonas Devlieghere            self.runCmd("type filter clear", check=False)
5122238dcc3SJonas Devlieghere            self.runCmd("type synthetic clear", check=False)
5132238dcc3SJonas Devlieghere            self.runCmd("type category delete foobar", check=False)
5142238dcc3SJonas Devlieghere            self.runCmd("type category delete JASSynth", check=False)
5152238dcc3SJonas Devlieghere            self.runCmd("type category delete newbar", check=False)
5162238dcc3SJonas Devlieghere            self.runCmd("settings set target.enable-synthetic-value true")
51799451b44SJordan Rupprecht
51899451b44SJordan Rupprecht        # Execute the cleanup function during test case tear down.
51999451b44SJordan Rupprecht        self.addTearDownHook(cleanup)
52099451b44SJordan Rupprecht
5212238dcc3SJonas Devlieghere        frame = (
5222238dcc3SJonas Devlieghere            self.dbg.GetSelectedTarget()
5232238dcc3SJonas Devlieghere            .GetProcess()
5242238dcc3SJonas Devlieghere            .GetSelectedThread()
5252238dcc3SJonas Devlieghere            .GetSelectedFrame()
5262238dcc3SJonas Devlieghere        )
52799451b44SJordan Rupprecht        int_vector = frame.FindVariable("int_vector")
52899451b44SJordan Rupprecht        if self.TraceOn():
52999451b44SJordan Rupprecht            print(int_vector)
5302238dcc3SJonas Devlieghere        self.assertEqual(int_vector.GetNumChildren(), 0, "synthetic vector is empty")
53199451b44SJordan Rupprecht
5322238dcc3SJonas Devlieghere        self.runCmd("settings set target.enable-synthetic-value false")
5332238dcc3SJonas Devlieghere        frame = (
5342238dcc3SJonas Devlieghere            self.dbg.GetSelectedTarget()
5352238dcc3SJonas Devlieghere            .GetProcess()
5362238dcc3SJonas Devlieghere            .GetSelectedThread()
5372238dcc3SJonas Devlieghere            .GetSelectedFrame()
5382238dcc3SJonas Devlieghere        )
53999451b44SJordan Rupprecht        int_vector = frame.FindVariable("int_vector")
54099451b44SJordan Rupprecht        if self.TraceOn():
54199451b44SJordan Rupprecht            print(int_vector)
5429c246882SJordan Rupprecht        self.assertNotEqual(
5439c246882SJordan Rupprecht            int_vector.GetNumChildren(), 0, '"physical" vector is not empty'
5442238dcc3SJonas Devlieghere        )
54599451b44SJordan Rupprecht
5462238dcc3SJonas Devlieghere        self.runCmd("settings set target.enable-synthetic-value true")
5472238dcc3SJonas Devlieghere        frame = (
5482238dcc3SJonas Devlieghere            self.dbg.GetSelectedTarget()
5492238dcc3SJonas Devlieghere            .GetProcess()
5502238dcc3SJonas Devlieghere            .GetSelectedThread()
5512238dcc3SJonas Devlieghere            .GetSelectedFrame()
5522238dcc3SJonas Devlieghere        )
55399451b44SJordan Rupprecht        int_vector = frame.FindVariable("int_vector")
55499451b44SJordan Rupprecht        if self.TraceOn():
55599451b44SJordan Rupprecht            print(int_vector)
5560ed758b2SDave Lee        self.assertEqual(
5572238dcc3SJonas Devlieghere            int_vector.GetNumChildren(), 0, "synthetic vector is still empty"
5582238dcc3SJonas Devlieghere        )
559