1# coding=utf8
2"""
3Test lldb data formatter subsystem.
4"""
5
6
7
8import lldb
9from lldbsuite.test.decorators import *
10from lldbsuite.test.lldbtest import *
11from lldbsuite.test import lldbutil
12
13
14class StdStringDataFormatterTestCase(TestBase):
15
16    def setUp(self):
17        # Call super's setUp().
18        TestBase.setUp(self)
19        # Find the line number to break at.
20        self.line = line_number('main.cpp', '// Set break point at this line.')
21
22    @add_test_categories(["libstdcxx"])
23    @expectedFailureAll(bugnumber="llvm.org/pr50861", compiler="gcc")
24    def test_with_run_command(self):
25        """Test that that file and class static variables display correctly."""
26        self.build()
27        self.runCmd("file " + self.getBuildArtifact("a.out"), CURRENT_EXECUTABLE_SET)
28
29        lldbutil.run_break_set_by_file_and_line(
30            self, "main.cpp", self.line, num_expected_locations=-1)
31
32        self.runCmd("run", RUN_SUCCEEDED)
33
34        # The stop reason of the thread should be breakpoint.
35        self.expect("thread list", STOPPED_DUE_TO_BREAKPOINT,
36                    substrs=['stopped',
37                             'stop reason = breakpoint'])
38
39        # This is the function to remove the custom formats in order to have a
40        # clean slate for the next test case.
41        def cleanup():
42            self.runCmd('type format clear', check=False)
43            self.runCmd('type summary clear', check=False)
44            self.runCmd('type filter clear', check=False)
45            self.runCmd('type synth clear', check=False)
46            self.runCmd(
47                "settings set target.max-children-count 256",
48                check=False)
49
50        # Execute the cleanup function during test case tear down.
51        self.addTearDownHook(cleanup)
52
53        var_wempty = self.frame().FindVariable('wempty')
54        var_s = self.frame().FindVariable('s')
55        var_S = self.frame().FindVariable('S')
56        var_mazeltov = self.frame().FindVariable('mazeltov')
57        var_empty = self.frame().FindVariable('empty')
58        var_q = self.frame().FindVariable('q')
59        var_Q = self.frame().FindVariable('Q')
60        var_uchar = self.frame().FindVariable('uchar')
61
62        self.assertEqual(var_wempty.GetSummary(), 'L""', "wempty summary wrong")
63        self.assertEqual(
64            var_s.GetSummary(), 'L"hello world! מזל טוב!"',
65            "s summary wrong")
66        self.assertEqual(var_S.GetSummary(), 'L"!!!!"', "S summary wrong")
67        self.assertEqual(
68            var_mazeltov.GetSummary(), 'L"מזל טוב"',
69            "mazeltov summary wrong")
70        self.assertEqual(var_empty.GetSummary(), '""', "empty summary wrong")
71        self.assertEqual(
72            var_q.GetSummary(), '"hello world"',
73            "q summary wrong")
74        self.assertEqual(
75            var_Q.GetSummary(), '"quite a long std::strin with lots of info inside it"',
76            "Q summary wrong")
77        self.assertEqual(var_uchar.GetSummary(), '"aaaaa"', "u summary wrong")
78
79        self.runCmd("next")
80
81        self.assertEqual(
82            var_S.GetSummary(), 'L"!!!!!"',
83            "new S summary wrong")
84