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