1import lldb
2from lldbsuite.test.decorators import *
3from lldbsuite.test.lldbtest import *
4from lldbsuite.test import lldbutil
5
6USE_LIBSTDCPP = "USE_LIBSTDCPP"
7USE_LIBCPP = "USE_LIBCPP"
8
9
10class GenericDequeDataFormatterTestCase(TestBase):
11    def findVariable(self, name):
12        var = self.frame().FindVariable(name)
13        self.assertTrue(var.IsValid())
14        return var
15
16    def getVariableType(self, name):
17        var = self.findVariable(name)
18        return var.GetType().GetDisplayTypeName()
19
20    def check_size(self, var_name, size):
21        var = self.findVariable(var_name)
22        self.assertEqual(var.GetNumChildren(), size)
23
24    def do_test(self, stdlib_type):
25        self.build(dictionary={stdlib_type: "1"})
26        lldbutil.run_to_source_breakpoint(
27            self, "break here", lldb.SBFileSpec("main.cpp")
28        )
29
30        self.expect_expr("empty", result_children=[])
31        self.expect_expr(
32            "deque_1",
33            result_children=[
34                ValueCheck(name="[0]", value="1"),
35            ],
36        )
37        self.expect_expr(
38            "deque_3",
39            result_children=[
40                ValueCheck(name="[0]", value="3"),
41                ValueCheck(name="[1]", value="1"),
42                ValueCheck(name="[2]", value="2"),
43            ],
44        )
45
46        self.check_size("deque_200_small", 200)
47        for i in range(0, 100):
48            self.expect_var_path(
49                "deque_200_small[%d]" % (i),
50                children=[
51                    ValueCheck(name="a", value=str(-99 + i)),
52                    ValueCheck(name="b", value=str(-100 + i)),
53                    ValueCheck(name="c", value=str(-101 + i)),
54                ],
55            )
56            self.expect_var_path(
57                "deque_200_small[%d]" % (i + 100),
58                children=[
59                    ValueCheck(name="a", value=str(i)),
60                    ValueCheck(name="b", value=str(1 + i)),
61                    ValueCheck(name="c", value=str(2 + i)),
62                ],
63            )
64
65        self.check_size("deque_200_large", 200)
66        for i in range(0, 100):
67            self.expect_var_path(
68                "deque_200_large[%d]" % (i),
69                children=[
70                    ValueCheck(name="a", value=str(-99 + i)),
71                    ValueCheck(name="b", value=str(-100 + i)),
72                    ValueCheck(name="c", value=str(-101 + i)),
73                    ValueCheck(name="d"),
74                ],
75            )
76            self.expect_var_path(
77                "deque_200_large[%d]" % (i + 100),
78                children=[
79                    ValueCheck(name="a", value=str(i)),
80                    ValueCheck(name="b", value=str(1 + i)),
81                    ValueCheck(name="c", value=str(2 + i)),
82                    ValueCheck(name="d"),
83                ],
84            )
85
86    @add_test_categories(["libstdcxx"])
87    def test_libstdcpp(self):
88        self.do_test(USE_LIBSTDCPP)
89
90    @add_test_categories(["libc++"])
91    def test_libcpp(self):
92        self.do_test(USE_LIBCPP)
93