199451b44SJordan Rupprecht"""Test Python APIs for working with formatters"""
299451b44SJordan Rupprecht
399451b44SJordan Rupprechtfrom __future__ import print_function
499451b44SJordan Rupprecht
599451b44SJordan Rupprecht
699451b44SJordan Rupprechtimport lldb
799451b44SJordan Rupprechtfrom lldbsuite.test.decorators import *
899451b44SJordan Rupprechtfrom lldbsuite.test.lldbtest import *
999451b44SJordan Rupprechtfrom lldbsuite.test import lldbutil
1099451b44SJordan Rupprecht
1199451b44SJordan Rupprecht
1299451b44SJordan Rupprechtclass SBFormattersAPITestCase(TestBase):
1399451b44SJordan Rupprecht    NO_DEBUG_INFO_TESTCASE = True
1499451b44SJordan Rupprecht
1599451b44SJordan Rupprecht    def setUp(self):
1699451b44SJordan Rupprecht        # Call super's setUp().
1799451b44SJordan Rupprecht        TestBase.setUp(self)
1899451b44SJordan Rupprecht        self.line = line_number('main.cpp', '// Set break point at this line.')
1999451b44SJordan Rupprecht
2099451b44SJordan Rupprecht    def test_formatters_api(self):
2199451b44SJordan Rupprecht        """Test Python APIs for working with formatters"""
2299451b44SJordan Rupprecht        self.build()
2399451b44SJordan Rupprecht        self.setTearDownCleanup()
2499451b44SJordan Rupprecht
2599451b44SJordan Rupprecht        """Test Python APIs for working with formatters"""
2699451b44SJordan Rupprecht        self.runCmd("file " + self.getBuildArtifact("a.out"),
2799451b44SJordan Rupprecht                    CURRENT_EXECUTABLE_SET)
2899451b44SJordan Rupprecht
2999451b44SJordan Rupprecht        lldbutil.run_break_set_by_file_and_line(
3099451b44SJordan Rupprecht            self, "main.cpp", self.line, num_expected_locations=1,
3199451b44SJordan Rupprecht            loc_exact=True)
3299451b44SJordan Rupprecht
3399451b44SJordan Rupprecht        self.runCmd("run", RUN_SUCCEEDED)
3499451b44SJordan Rupprecht
3599451b44SJordan Rupprecht        # The stop reason of the thread should be breakpoint.
3699451b44SJordan Rupprecht        self.expect("thread list", STOPPED_DUE_TO_BREAKPOINT,
3799451b44SJordan Rupprecht                    substrs=['stopped',
3899451b44SJordan Rupprecht                             'stop reason = breakpoint'])
3999451b44SJordan Rupprecht
4099451b44SJordan Rupprecht        # This is the function to remove the custom formats in order to have a
4199451b44SJordan Rupprecht        # clean slate for the next test case.
4299451b44SJordan Rupprecht        def cleanup():
4399451b44SJordan Rupprecht            self.runCmd('type format clear', check=False)
4499451b44SJordan Rupprecht            self.runCmd('type summary clear', check=False)
4599451b44SJordan Rupprecht            self.runCmd('type filter clear', check=False)
4699451b44SJordan Rupprecht            self.runCmd('type synthetic clear', check=False)
4799451b44SJordan Rupprecht            self.runCmd('type category delete foobar', check=False)
4899451b44SJordan Rupprecht            self.runCmd('type category delete JASSynth', check=False)
4999451b44SJordan Rupprecht            self.runCmd('type category delete newbar', check=False)
5099451b44SJordan Rupprecht
5199451b44SJordan Rupprecht        # Execute the cleanup function during test case tear down.
5299451b44SJordan Rupprecht        self.addTearDownHook(cleanup)
5399451b44SJordan Rupprecht
5499451b44SJordan Rupprecht        format = lldb.SBTypeFormat(lldb.eFormatHex)
5599451b44SJordan Rupprecht        category = self.dbg.GetDefaultCategory()
5699451b44SJordan Rupprecht        category.AddTypeFormat(lldb.SBTypeNameSpecifier("int"), format)
5799451b44SJordan Rupprecht
5899451b44SJordan Rupprecht        self.expect("frame variable foo.A",
5999451b44SJordan Rupprecht                    substrs=['0x00000001'])
6099451b44SJordan Rupprecht        self.expect("frame variable foo.E", matching=False,
6199451b44SJordan Rupprecht                    substrs=['b8cca70a'])
6299451b44SJordan Rupprecht
6399451b44SJordan Rupprecht        category.AddTypeFormat(lldb.SBTypeNameSpecifier("long"), format)
6499451b44SJordan Rupprecht        self.expect("frame variable foo.A",
6599451b44SJordan Rupprecht                    substrs=['0x00000001'])
6699451b44SJordan Rupprecht        self.expect("frame variable foo.E",
6799451b44SJordan Rupprecht                    substrs=['b8cca70a'])
6899451b44SJordan Rupprecht
6999451b44SJordan Rupprecht        format.SetFormat(lldb.eFormatOctal)
7099451b44SJordan Rupprecht        category.AddTypeFormat(lldb.SBTypeNameSpecifier("int"), format)
7199451b44SJordan Rupprecht        self.expect("frame variable foo.A",
7299451b44SJordan Rupprecht                    substrs=[' 01'])
7399451b44SJordan Rupprecht        self.expect("frame variable foo.E",
7499451b44SJordan Rupprecht                    substrs=['b8cca70a'])
7599451b44SJordan Rupprecht
7699451b44SJordan Rupprecht        category.DeleteTypeFormat(lldb.SBTypeNameSpecifier("int"))
7799451b44SJordan Rupprecht        category.DeleteTypeFormat(lldb.SBTypeNameSpecifier("long"))
7899451b44SJordan Rupprecht        self.expect("frame variable foo.A", matching=False,
7999451b44SJordan Rupprecht                    substrs=[' 01'])
8099451b44SJordan Rupprecht        self.expect("frame variable foo.E", matching=False,
8199451b44SJordan Rupprecht                    substrs=['b8cca70a'])
8299451b44SJordan Rupprecht
8399451b44SJordan Rupprecht        summary = lldb.SBTypeSummary.CreateWithSummaryString(
8499451b44SJordan Rupprecht            "the hello world you'll never see")
8599451b44SJordan Rupprecht        summary.SetSummaryString('hello world')
8699451b44SJordan Rupprecht        new_category = self.dbg.GetCategory("foobar")
8799451b44SJordan Rupprecht        self.assertFalse(
8899451b44SJordan Rupprecht            new_category.IsValid(),
8999451b44SJordan Rupprecht            "getting a non-existing category worked")
9099451b44SJordan Rupprecht        new_category = self.dbg.CreateCategory("foobar")
9199451b44SJordan Rupprecht        new_category.SetEnabled(True)
9299451b44SJordan Rupprecht        new_category.AddTypeSummary(
9399451b44SJordan Rupprecht            lldb.SBTypeNameSpecifier(
9499451b44SJordan Rupprecht                "^.*t$",
9599451b44SJordan Rupprecht                True,  # is_regexp
9699451b44SJordan Rupprecht            ), summary)
9799451b44SJordan Rupprecht
9899451b44SJordan Rupprecht        self.expect("frame variable foo.A",
9999451b44SJordan Rupprecht                    substrs=['hello world'])
10099451b44SJordan Rupprecht        self.expect("frame variable foo.E", matching=False,
10199451b44SJordan Rupprecht                    substrs=['hello world'])
10299451b44SJordan Rupprecht        self.expect("frame variable foo.B",
10399451b44SJordan Rupprecht                    substrs=['hello world'])
10499451b44SJordan Rupprecht        self.expect("frame variable foo.F",
10599451b44SJordan Rupprecht                    substrs=['hello world'])
10699451b44SJordan Rupprecht        new_category.SetEnabled(False)
10799451b44SJordan Rupprecht        self.expect("frame variable foo.A", matching=False,
10899451b44SJordan Rupprecht                    substrs=['hello world'])
10999451b44SJordan Rupprecht        self.expect("frame variable foo.E", matching=False,
11099451b44SJordan Rupprecht                    substrs=['hello world'])
11199451b44SJordan Rupprecht        self.expect("frame variable foo.B", matching=False,
11299451b44SJordan Rupprecht                    substrs=['hello world'])
11399451b44SJordan Rupprecht        self.expect("frame variable foo.F", matching=False,
11499451b44SJordan Rupprecht                    substrs=['hello world'])
11599451b44SJordan Rupprecht        self.dbg.DeleteCategory(new_category.GetName())
11699451b44SJordan Rupprecht        self.expect("frame variable foo.A", matching=False,
11799451b44SJordan Rupprecht                    substrs=['hello world'])
11899451b44SJordan Rupprecht        self.expect("frame variable foo.E", matching=False,
11999451b44SJordan Rupprecht                    substrs=['hello world'])
12099451b44SJordan Rupprecht        self.expect("frame variable foo.B", matching=False,
12199451b44SJordan Rupprecht                    substrs=['hello world'])
12299451b44SJordan Rupprecht        self.expect("frame variable foo.F", matching=False,
12399451b44SJordan Rupprecht                    substrs=['hello world'])
12499451b44SJordan Rupprecht
12599451b44SJordan Rupprecht        filter = lldb.SBTypeFilter(0)
12699451b44SJordan Rupprecht        filter.AppendExpressionPath("A")
12799451b44SJordan Rupprecht        filter.AppendExpressionPath("D")
128*0ed758b2SDave Lee        self.assertEqual(
129*0ed758b2SDave Lee            filter.GetNumberOfExpressionPaths(), 2,
13099451b44SJordan Rupprecht            "filter with two items does not have two items")
13199451b44SJordan Rupprecht
13299451b44SJordan Rupprecht        category.AddTypeFilter(lldb.SBTypeNameSpecifier("JustAStruct"), filter)
13399451b44SJordan Rupprecht        self.expect("frame variable foo",
13499451b44SJordan Rupprecht                    substrs=['A = 1', 'D = 6.28'])
13599451b44SJordan Rupprecht        self.expect("frame variable foo", matching=False,
13699451b44SJordan Rupprecht                    substrs=['B = ', 'C = ', 'E = ', 'F = '])
13799451b44SJordan Rupprecht
13899451b44SJordan Rupprecht        category.DeleteTypeFilter(
13999451b44SJordan Rupprecht            lldb.SBTypeNameSpecifier(
14099451b44SJordan Rupprecht                "JustAStruct", True))
14199451b44SJordan Rupprecht        self.expect("frame variable foo",
14299451b44SJordan Rupprecht                    substrs=['A = 1', 'D = 6.28'])
14399451b44SJordan Rupprecht        self.expect("frame variable foo", matching=False,
14499451b44SJordan Rupprecht                    substrs=['B = ', 'C = ', 'E = ', 'F = '])
14599451b44SJordan Rupprecht
14699451b44SJordan Rupprecht        category.DeleteTypeFilter(
14799451b44SJordan Rupprecht            lldb.SBTypeNameSpecifier(
14899451b44SJordan Rupprecht                "JustAStruct", False))
14999451b44SJordan Rupprecht        self.expect("frame variable foo",
15099451b44SJordan Rupprecht                    substrs=['A = 1', 'D = 6.28'])
15199451b44SJordan Rupprecht        self.expect("frame variable foo", matching=True,
15299451b44SJordan Rupprecht                    substrs=['B = ', 'C = ', 'E = ', 'F = '])
15399451b44SJordan Rupprecht
15499451b44SJordan Rupprecht        self.runCmd("command script import --allow-reload ./synth.py")
15599451b44SJordan Rupprecht
15699451b44SJordan Rupprecht        self.expect("frame variable foo", matching=False,
15799451b44SJordan Rupprecht                    substrs=['X = 1'])
15899451b44SJordan Rupprecht
15999451b44SJordan Rupprecht        self.dbg.GetCategory("JASSynth").SetEnabled(True)
16099451b44SJordan Rupprecht        self.expect("frame variable foo", matching=True,
16199451b44SJordan Rupprecht                    substrs=['X = 1'])
16299451b44SJordan Rupprecht
16399451b44SJordan Rupprecht        self.dbg.GetCategory("CCCSynth").SetEnabled(True)
16499451b44SJordan Rupprecht        self.expect(
16599451b44SJordan Rupprecht            "frame variable ccc",
16699451b44SJordan Rupprecht            matching=True,
16799451b44SJordan Rupprecht            substrs=[
16899451b44SJordan Rupprecht                'CCC object with leading value (int) a = 111',
16999451b44SJordan Rupprecht                'a = 111',
17099451b44SJordan Rupprecht                'b = 222',
17199451b44SJordan Rupprecht                'c = 333'])
17299451b44SJordan Rupprecht
17399451b44SJordan Rupprecht        foo_var = self.dbg.GetSelectedTarget().GetProcess(
17499451b44SJordan Rupprecht        ).GetSelectedThread().GetSelectedFrame().FindVariable('foo')
17599451b44SJordan Rupprecht        self.assertTrue(foo_var.IsValid(), 'could not find foo')
17699451b44SJordan Rupprecht        self.assertTrue(
17799451b44SJordan Rupprecht            foo_var.GetDeclaration().IsValid(),
17899451b44SJordan Rupprecht            'foo declaration is invalid')
17999451b44SJordan Rupprecht
180*0ed758b2SDave Lee        self.assertEqual(
181*0ed758b2SDave Lee            foo_var.GetNumChildren(), 2,
18299451b44SJordan Rupprecht            'synthetic value has wrong number of child items (synth)')
183*0ed758b2SDave Lee        self.assertEqual(
184*0ed758b2SDave Lee            foo_var.GetChildMemberWithName('X').GetValueAsUnsigned(), 1,
18599451b44SJordan Rupprecht            'foo_synth.X has wrong value (synth)')
18699451b44SJordan Rupprecht        self.assertFalse(
18799451b44SJordan Rupprecht            foo_var.GetChildMemberWithName('B').IsValid(),
18899451b44SJordan Rupprecht            'foo_synth.B is valid but should not (synth)')
18999451b44SJordan Rupprecht
19099451b44SJordan Rupprecht        self.dbg.GetCategory("JASSynth").SetEnabled(False)
19199451b44SJordan Rupprecht        foo_var = self.dbg.GetSelectedTarget().GetProcess(
19299451b44SJordan Rupprecht        ).GetSelectedThread().GetSelectedFrame().FindVariable('foo')
19399451b44SJordan Rupprecht        self.assertTrue(foo_var.IsValid(), 'could not find foo')
19499451b44SJordan Rupprecht
19599451b44SJordan Rupprecht        self.assertFalse(
19699451b44SJordan Rupprecht            foo_var.GetNumChildren() == 2,
19799451b44SJordan Rupprecht            'still seeing synthetic value')
19899451b44SJordan Rupprecht
19999451b44SJordan Rupprecht        filter = lldb.SBTypeFilter(0)
20099451b44SJordan Rupprecht        filter.AppendExpressionPath("A")
20199451b44SJordan Rupprecht        filter.AppendExpressionPath("D")
20299451b44SJordan Rupprecht        category.AddTypeFilter(lldb.SBTypeNameSpecifier("JustAStruct"), filter)
20399451b44SJordan Rupprecht        self.expect("frame variable foo",
20499451b44SJordan Rupprecht                    substrs=['A = 1', 'D = 6.28'])
20599451b44SJordan Rupprecht
20699451b44SJordan Rupprecht        foo_var = self.dbg.GetSelectedTarget().GetProcess(
20799451b44SJordan Rupprecht        ).GetSelectedThread().GetSelectedFrame().FindVariable('foo')
20899451b44SJordan Rupprecht        self.assertTrue(foo_var.IsValid(), 'could not find foo')
20999451b44SJordan Rupprecht
210*0ed758b2SDave Lee        self.assertEqual(
211*0ed758b2SDave Lee            foo_var.GetNumChildren(), 2,
21299451b44SJordan Rupprecht            'synthetic value has wrong number of child items (filter)')
213*0ed758b2SDave Lee        self.assertEqual(
214*0ed758b2SDave Lee            foo_var.GetChildMemberWithName('X').GetValueAsUnsigned(), 0,
21599451b44SJordan Rupprecht            'foo_synth.X has wrong value (filter)')
216*0ed758b2SDave Lee        self.assertEqual(
217*0ed758b2SDave Lee            foo_var.GetChildMemberWithName('A').GetValueAsUnsigned(), 1,
21899451b44SJordan Rupprecht            'foo_synth.A has wrong value (filter)')
21999451b44SJordan Rupprecht
22099451b44SJordan Rupprecht        self.assertTrue(filter.ReplaceExpressionPathAtIndex(
22199451b44SJordan Rupprecht            0, "C"), "failed to replace an expression path in filter")
22299451b44SJordan Rupprecht        self.expect("frame variable foo",
22399451b44SJordan Rupprecht                    substrs=['A = 1', 'D = 6.28'])
22499451b44SJordan Rupprecht        category.AddTypeFilter(lldb.SBTypeNameSpecifier("JustAStruct"), filter)
22599451b44SJordan Rupprecht        self.expect("frame variable foo",
22699451b44SJordan Rupprecht                    substrs=["C = 'e'", 'D = 6.28'])
22799451b44SJordan Rupprecht        category.AddTypeFilter(lldb.SBTypeNameSpecifier("FooType"), filter)
22899451b44SJordan Rupprecht        filter.ReplaceExpressionPathAtIndex(1, "F")
22999451b44SJordan Rupprecht        self.expect("frame variable foo",
23099451b44SJordan Rupprecht                    substrs=["C = 'e'", 'D = 6.28'])
23199451b44SJordan Rupprecht        category.AddTypeFilter(lldb.SBTypeNameSpecifier("JustAStruct"), filter)
23299451b44SJordan Rupprecht        self.expect("frame variable foo",
23399451b44SJordan Rupprecht                    substrs=["C = 'e'", 'F = 0'])
23499451b44SJordan Rupprecht        self.expect("frame variable bar",
23599451b44SJordan Rupprecht                    substrs=["C = 'e'", 'D = 6.28'])
23699451b44SJordan Rupprecht
23799451b44SJordan Rupprecht        foo_var = self.dbg.GetSelectedTarget().GetProcess(
23899451b44SJordan Rupprecht        ).GetSelectedThread().GetSelectedFrame().FindVariable('foo')
23999451b44SJordan Rupprecht        self.assertTrue(foo_var.IsValid(), 'could not find foo')
240*0ed758b2SDave Lee        self.assertEqual(
241*0ed758b2SDave Lee            foo_var.GetChildMemberWithName('C').GetValueAsUnsigned(), ord('e'),
24299451b44SJordan Rupprecht            'foo_synth.C has wrong value (filter)')
24399451b44SJordan Rupprecht
24499451b44SJordan Rupprecht        chosen = self.dbg.GetFilterForType(
24599451b44SJordan Rupprecht            lldb.SBTypeNameSpecifier("JustAStruct"))
246*0ed758b2SDave Lee        self.assertEqual(
247*0ed758b2SDave Lee            chosen.count, 2,
24899451b44SJordan Rupprecht            "wrong filter found for JustAStruct")
249*0ed758b2SDave Lee        self.assertEqual(
250*0ed758b2SDave Lee            chosen.GetExpressionPathAtIndex(0), 'C',
25199451b44SJordan Rupprecht            "wrong item at index 0 for JustAStruct")
252*0ed758b2SDave Lee        self.assertEqual(
253*0ed758b2SDave Lee            chosen.GetExpressionPathAtIndex(1), 'F',
25499451b44SJordan Rupprecht            "wrong item at index 1 for JustAStruct")
25599451b44SJordan Rupprecht
25699451b44SJordan Rupprecht        self.assertFalse(
25799451b44SJordan Rupprecht            category.DeleteTypeFilter(
25899451b44SJordan Rupprecht                lldb.SBTypeNameSpecifier("NoSuchType")),
25999451b44SJordan Rupprecht            "deleting a non-existing filter worked")
26099451b44SJordan Rupprecht        self.assertFalse(
26199451b44SJordan Rupprecht            category.DeleteTypeSummary(
26299451b44SJordan Rupprecht                lldb.SBTypeNameSpecifier("NoSuchType")),
26399451b44SJordan Rupprecht            "deleting a non-existing summary worked")
26499451b44SJordan Rupprecht        self.assertFalse(
26599451b44SJordan Rupprecht            category.DeleteTypeFormat(
26699451b44SJordan Rupprecht                lldb.SBTypeNameSpecifier("NoSuchType")),
26799451b44SJordan Rupprecht            "deleting a non-existing format worked")
26899451b44SJordan Rupprecht        self.assertFalse(
26999451b44SJordan Rupprecht            category.DeleteTypeSynthetic(
27099451b44SJordan Rupprecht                lldb.SBTypeNameSpecifier("NoSuchType")),
27199451b44SJordan Rupprecht            "deleting a non-existing synthetic worked")
27299451b44SJordan Rupprecht
27399451b44SJordan Rupprecht        self.assertFalse(
27499451b44SJordan Rupprecht            category.DeleteTypeFilter(
27599451b44SJordan Rupprecht                lldb.SBTypeNameSpecifier("")),
27699451b44SJordan Rupprecht            "deleting a filter for '' worked")
27799451b44SJordan Rupprecht        self.assertFalse(
27899451b44SJordan Rupprecht            category.DeleteTypeSummary(
27999451b44SJordan Rupprecht                lldb.SBTypeNameSpecifier("")),
28099451b44SJordan Rupprecht            "deleting a summary for '' worked")
28199451b44SJordan Rupprecht        self.assertFalse(
28299451b44SJordan Rupprecht            category.DeleteTypeFormat(
28399451b44SJordan Rupprecht                lldb.SBTypeNameSpecifier("")),
28499451b44SJordan Rupprecht            "deleting a format for '' worked")
28599451b44SJordan Rupprecht        self.assertFalse(
28699451b44SJordan Rupprecht            category.DeleteTypeSynthetic(
28799451b44SJordan Rupprecht                lldb.SBTypeNameSpecifier("")),
28899451b44SJordan Rupprecht            "deleting a synthetic for '' worked")
28999451b44SJordan Rupprecht
29099451b44SJordan Rupprecht        try:
29199451b44SJordan Rupprecht            self.assertFalse(
29299451b44SJordan Rupprecht                category.AddTypeSummary(
29399451b44SJordan Rupprecht                    lldb.SBTypeNameSpecifier("NoneSuchType"),
29499451b44SJordan Rupprecht                    None),
29599451b44SJordan Rupprecht                "adding a summary valued None worked")
29699451b44SJordan Rupprecht        except:
29799451b44SJordan Rupprecht            pass
29899451b44SJordan Rupprecht        else:
29999451b44SJordan Rupprecht            self.assertFalse(True, "adding a summary valued None worked")
30099451b44SJordan Rupprecht
30199451b44SJordan Rupprecht        try:
30299451b44SJordan Rupprecht            self.assertFalse(
30399451b44SJordan Rupprecht                category.AddTypeFilter(
30499451b44SJordan Rupprecht                    lldb.SBTypeNameSpecifier("NoneSuchType"),
30599451b44SJordan Rupprecht                    None),
30699451b44SJordan Rupprecht                "adding a filter valued None worked")
30799451b44SJordan Rupprecht        except:
30899451b44SJordan Rupprecht            pass
30999451b44SJordan Rupprecht        else:
31099451b44SJordan Rupprecht            self.assertFalse(True, "adding a filter valued None worked")
31199451b44SJordan Rupprecht
31299451b44SJordan Rupprecht        try:
31399451b44SJordan Rupprecht            self.assertFalse(
31499451b44SJordan Rupprecht                category.AddTypeSynthetic(
31599451b44SJordan Rupprecht                    lldb.SBTypeNameSpecifier("NoneSuchType"),
31699451b44SJordan Rupprecht                    None),
31799451b44SJordan Rupprecht                "adding a synthetic valued None worked")
31899451b44SJordan Rupprecht        except:
31999451b44SJordan Rupprecht            pass
32099451b44SJordan Rupprecht        else:
32199451b44SJordan Rupprecht            self.assertFalse(True, "adding a synthetic valued None worked")
32299451b44SJordan Rupprecht
32399451b44SJordan Rupprecht        try:
32499451b44SJordan Rupprecht            self.assertFalse(
32599451b44SJordan Rupprecht                category.AddTypeFormat(
32699451b44SJordan Rupprecht                    lldb.SBTypeNameSpecifier("NoneSuchType"),
32799451b44SJordan Rupprecht                    None),
32899451b44SJordan Rupprecht                "adding a format valued None worked")
32999451b44SJordan Rupprecht        except:
33099451b44SJordan Rupprecht            pass
33199451b44SJordan Rupprecht        else:
33299451b44SJordan Rupprecht            self.assertFalse(True, "adding a format valued None worked")
33399451b44SJordan Rupprecht
33499451b44SJordan Rupprecht        self.assertFalse(
33599451b44SJordan Rupprecht            category.AddTypeSummary(
33699451b44SJordan Rupprecht                lldb.SBTypeNameSpecifier("EmptySuchType"),
33799451b44SJordan Rupprecht                lldb.SBTypeSummary()),
33899451b44SJordan Rupprecht            "adding a summary without value worked")
33999451b44SJordan Rupprecht        self.assertFalse(
34099451b44SJordan Rupprecht            category.AddTypeFilter(
34199451b44SJordan Rupprecht                lldb.SBTypeNameSpecifier("EmptySuchType"),
34299451b44SJordan Rupprecht                lldb.SBTypeFilter()),
34399451b44SJordan Rupprecht            "adding a filter without value worked")
34499451b44SJordan Rupprecht        self.assertFalse(
34599451b44SJordan Rupprecht            category.AddTypeSynthetic(
34699451b44SJordan Rupprecht                lldb.SBTypeNameSpecifier("EmptySuchType"),
34799451b44SJordan Rupprecht                lldb.SBTypeSynthetic()),
34899451b44SJordan Rupprecht            "adding a synthetic without value worked")
34999451b44SJordan Rupprecht        self.assertFalse(
35099451b44SJordan Rupprecht            category.AddTypeFormat(
35199451b44SJordan Rupprecht                lldb.SBTypeNameSpecifier("EmptySuchType"),
35299451b44SJordan Rupprecht                lldb.SBTypeFormat()),
35399451b44SJordan Rupprecht            "adding a format without value worked")
35499451b44SJordan Rupprecht
35599451b44SJordan Rupprecht        self.assertFalse(
35699451b44SJordan Rupprecht            category.AddTypeSummary(
35799451b44SJordan Rupprecht                lldb.SBTypeNameSpecifier(""),
35899451b44SJordan Rupprecht                lldb.SBTypeSummary.CreateWithSummaryString("")),
35999451b44SJordan Rupprecht            "adding a summary for an invalid type worked")
36099451b44SJordan Rupprecht        self.assertFalse(
36199451b44SJordan Rupprecht            category.AddTypeFilter(
36299451b44SJordan Rupprecht                lldb.SBTypeNameSpecifier(""),
36399451b44SJordan Rupprecht                lldb.SBTypeFilter(0)),
36499451b44SJordan Rupprecht            "adding a filter for an invalid type worked")
36599451b44SJordan Rupprecht        self.assertFalse(
36699451b44SJordan Rupprecht            category.AddTypeSynthetic(
36799451b44SJordan Rupprecht                lldb.SBTypeNameSpecifier(""),
36899451b44SJordan Rupprecht                lldb.SBTypeSynthetic.CreateWithClassName("")),
36999451b44SJordan Rupprecht            "adding a synthetic for an invalid type worked")
37099451b44SJordan Rupprecht        self.assertFalse(
37199451b44SJordan Rupprecht            category.AddTypeFormat(
37299451b44SJordan Rupprecht                lldb.SBTypeNameSpecifier(""),
37399451b44SJordan Rupprecht                lldb.SBTypeFormat(
37499451b44SJordan Rupprecht                    lldb.eFormatHex)),
37599451b44SJordan Rupprecht            "adding a format for an invalid type worked")
37699451b44SJordan Rupprecht
37799451b44SJordan Rupprecht        new_category = self.dbg.CreateCategory("newbar")
37899451b44SJordan Rupprecht        new_category.AddTypeSummary(
37999451b44SJordan Rupprecht            lldb.SBTypeNameSpecifier("JustAStruct"),
38099451b44SJordan Rupprecht            lldb.SBTypeSummary.CreateWithScriptCode("return 'hello scripted world';"))
38199451b44SJordan Rupprecht        self.expect("frame variable foo", matching=False,
38299451b44SJordan Rupprecht                    substrs=['hello scripted world'])
38399451b44SJordan Rupprecht        new_category.SetEnabled(True)
38499451b44SJordan Rupprecht        self.expect("frame variable foo", matching=True,
38599451b44SJordan Rupprecht                    substrs=['hello scripted world'])
38699451b44SJordan Rupprecht
38799451b44SJordan Rupprecht        self.expect("frame variable foo_ptr", matching=True,
38899451b44SJordan Rupprecht                    substrs=['hello scripted world'])
38999451b44SJordan Rupprecht        new_category.AddTypeSummary(
39099451b44SJordan Rupprecht            lldb.SBTypeNameSpecifier("JustAStruct"),
39199451b44SJordan Rupprecht            lldb.SBTypeSummary.CreateWithScriptCode(
39299451b44SJordan Rupprecht                "return 'hello scripted world';",
39399451b44SJordan Rupprecht                lldb.eTypeOptionSkipPointers))
39499451b44SJordan Rupprecht        self.expect("frame variable foo", matching=True,
39599451b44SJordan Rupprecht                    substrs=['hello scripted world'])
39699451b44SJordan Rupprecht
39799451b44SJordan Rupprecht        frame = self.dbg.GetSelectedTarget().GetProcess(
39899451b44SJordan Rupprecht        ).GetSelectedThread().GetSelectedFrame()
39999451b44SJordan Rupprecht        foo_ptr = frame.FindVariable("foo_ptr")
40099451b44SJordan Rupprecht        summary = foo_ptr.GetTypeSummary()
40199451b44SJordan Rupprecht
40299451b44SJordan Rupprecht        self.assertFalse(
40399451b44SJordan Rupprecht            summary.IsValid(),
40499451b44SJordan Rupprecht            "summary found for foo* when none was planned")
40599451b44SJordan Rupprecht
40699451b44SJordan Rupprecht        self.expect("frame variable foo_ptr", matching=False,
40799451b44SJordan Rupprecht                    substrs=['hello scripted world'])
40899451b44SJordan Rupprecht
40999451b44SJordan Rupprecht        new_category.AddTypeSummary(
41099451b44SJordan Rupprecht            lldb.SBTypeNameSpecifier("JustAStruct"),
41199451b44SJordan Rupprecht            lldb.SBTypeSummary.CreateWithSummaryString(
41299451b44SJordan Rupprecht                "hello static world",
41399451b44SJordan Rupprecht                lldb.eTypeOptionNone))
41499451b44SJordan Rupprecht
41599451b44SJordan Rupprecht        summary = foo_ptr.GetTypeSummary()
41699451b44SJordan Rupprecht
41799451b44SJordan Rupprecht        self.assertTrue(
41899451b44SJordan Rupprecht            summary.IsValid(),
41999451b44SJordan Rupprecht            "no summary found for foo* when one was in place")
420*0ed758b2SDave Lee        self.assertEqual(
421*0ed758b2SDave Lee            summary.GetData(), "hello static world",
42299451b44SJordan Rupprecht            "wrong summary found for foo*")
42399451b44SJordan Rupprecht
42499451b44SJordan Rupprecht        self.expect("frame variable e1", substrs=["I am an empty Empty1 {}"])
42599451b44SJordan Rupprecht        self.expect("frame variable e2", substrs=["I am an empty Empty2"])
42699451b44SJordan Rupprecht        self.expect(
42799451b44SJordan Rupprecht            "frame variable e2",
42899451b44SJordan Rupprecht            substrs=["I am an empty Empty2 {}"],
42999451b44SJordan Rupprecht            matching=False)
43099451b44SJordan Rupprecht
43199451b44SJordan Rupprecht        self.assertTrue(
43299451b44SJordan Rupprecht            self.dbg.GetCategory(
43399451b44SJordan Rupprecht                lldb.eLanguageTypeObjC) is not None,
43499451b44SJordan Rupprecht            "ObjC category is None")
43599451b44SJordan Rupprecht
43699451b44SJordan Rupprecht    def test_force_synth_off(self):
43799451b44SJordan Rupprecht        """Test that one can have the public API return non-synthetic SBValues if desired"""
43899451b44SJordan Rupprecht        self.build(dictionary={'EXE': 'no_synth'})
43999451b44SJordan Rupprecht        self.setTearDownCleanup()
44099451b44SJordan Rupprecht
44199451b44SJordan Rupprecht        self.runCmd("file " + self.getBuildArtifact("no_synth"),
44299451b44SJordan Rupprecht                    CURRENT_EXECUTABLE_SET)
44399451b44SJordan Rupprecht
44499451b44SJordan Rupprecht        lldbutil.run_break_set_by_file_and_line(
44599451b44SJordan Rupprecht            self, "main.cpp", self.line, num_expected_locations=1, loc_exact=True)
44699451b44SJordan Rupprecht
44799451b44SJordan Rupprecht        self.runCmd("run", RUN_SUCCEEDED)
44899451b44SJordan Rupprecht
44999451b44SJordan Rupprecht        # The stop reason of the thread should be breakpoint.
45099451b44SJordan Rupprecht        self.expect("thread list", STOPPED_DUE_TO_BREAKPOINT,
45199451b44SJordan Rupprecht                    substrs=['stopped',
45299451b44SJordan Rupprecht                             'stop reason = breakpoint'])
45399451b44SJordan Rupprecht
45499451b44SJordan Rupprecht        # This is the function to remove the custom formats in order to have a
45599451b44SJordan Rupprecht        # clean slate for the next test case.
45699451b44SJordan Rupprecht        def cleanup():
45799451b44SJordan Rupprecht            self.runCmd('type format clear', check=False)
45899451b44SJordan Rupprecht            self.runCmd('type summary clear', check=False)
45999451b44SJordan Rupprecht            self.runCmd('type filter clear', check=False)
46099451b44SJordan Rupprecht            self.runCmd('type synthetic clear', check=False)
46199451b44SJordan Rupprecht            self.runCmd('type category delete foobar', check=False)
46299451b44SJordan Rupprecht            self.runCmd('type category delete JASSynth', check=False)
46399451b44SJordan Rupprecht            self.runCmd('type category delete newbar', check=False)
46499451b44SJordan Rupprecht            self.runCmd('settings set target.enable-synthetic-value true')
46599451b44SJordan Rupprecht
46699451b44SJordan Rupprecht        # Execute the cleanup function during test case tear down.
46799451b44SJordan Rupprecht        self.addTearDownHook(cleanup)
46899451b44SJordan Rupprecht
46999451b44SJordan Rupprecht        frame = self.dbg.GetSelectedTarget().GetProcess(
47099451b44SJordan Rupprecht        ).GetSelectedThread().GetSelectedFrame()
47199451b44SJordan Rupprecht        int_vector = frame.FindVariable("int_vector")
47299451b44SJordan Rupprecht        if self.TraceOn():
47399451b44SJordan Rupprecht            print(int_vector)
474*0ed758b2SDave Lee        self.assertEqual(
475*0ed758b2SDave Lee            int_vector.GetNumChildren(), 0,
47699451b44SJordan Rupprecht            'synthetic vector is empty')
47799451b44SJordan Rupprecht
47899451b44SJordan Rupprecht        self.runCmd('settings set target.enable-synthetic-value false')
47999451b44SJordan Rupprecht        frame = self.dbg.GetSelectedTarget().GetProcess(
48099451b44SJordan Rupprecht        ).GetSelectedThread().GetSelectedFrame()
48199451b44SJordan Rupprecht        int_vector = frame.FindVariable("int_vector")
48299451b44SJordan Rupprecht        if self.TraceOn():
48399451b44SJordan Rupprecht            print(int_vector)
48499451b44SJordan Rupprecht        self.assertFalse(
48599451b44SJordan Rupprecht            int_vector.GetNumChildren() == 0,
48699451b44SJordan Rupprecht            '"physical" vector is not empty')
48799451b44SJordan Rupprecht
48899451b44SJordan Rupprecht        self.runCmd('settings set target.enable-synthetic-value true')
48999451b44SJordan Rupprecht        frame = self.dbg.GetSelectedTarget().GetProcess(
49099451b44SJordan Rupprecht        ).GetSelectedThread().GetSelectedFrame()
49199451b44SJordan Rupprecht        int_vector = frame.FindVariable("int_vector")
49299451b44SJordan Rupprecht        if self.TraceOn():
49399451b44SJordan Rupprecht            print(int_vector)
494*0ed758b2SDave Lee        self.assertEqual(
495*0ed758b2SDave Lee            int_vector.GetNumChildren(), 0,
49699451b44SJordan Rupprecht            'synthetic vector is still empty')
497