1"""
2Test basic std::vector<bool> functionality.
3"""
4
5from lldbsuite.test.decorators import *
6from lldbsuite.test.lldbtest import *
7from lldbsuite.test import lldbutil
8
9
10class TestBoolVector(TestBase):
11
12    @add_test_categories(["libc++"])
13    @skipIf(compiler=no_match("clang"))
14    def test(self):
15        self.build()
16
17        lldbutil.run_to_source_breakpoint(self,
18                                          "// Set break point at this line.",
19                                          lldb.SBFileSpec("main.cpp"))
20
21        vector_type = "std::vector<bool>"
22        size_type = vector_type + "::size_type"
23
24        self.runCmd("settings set target.import-std-module true")
25
26        self.expect_expr("a",
27                         result_type=vector_type,
28                         result_children=[
29                             ValueCheck(value="false"),
30                             ValueCheck(value="true"),
31                             ValueCheck(value="false"),
32                             ValueCheck(value="true"),
33                         ])
34        self.expect_expr("a.size()", result_type=size_type, result_value="4")
35        # FIXME: Without the casting the result can't be materialized.
36        self.expect_expr("(bool)a.front()",
37                         result_type="bool",
38                         result_value="false")
39        self.expect_expr("(bool)a[1]", result_type="bool", result_value="true")
40        self.expect_expr("(bool)a.back()",
41                         result_type="bool",
42                         result_value="true")
43
44        self.expect_expr("(bool)*a.begin()",
45                         result_type="bool",
46                         result_value="false")
47        self.expect_expr("(bool)*a.rbegin()",
48                         result_type="bool",
49                         result_value="true")
50