| """ |
| Test LLDB's std::ranges::ref_view formatter |
| """ |
| |
| import lldb |
| from lldbsuite.test.decorators import * |
| from lldbsuite.test.lldbtest import * |
| from lldbsuite.test import lldbutil |
| |
| |
| class LibcxxRangesRefViewDataFormatterTestCase(TestBase): |
| def check_string_vec_children(self): |
| return [ |
| ValueCheck(name="[0]", summary='"First"'), |
| ValueCheck(name="[1]", summary='"Second"'), |
| ValueCheck(name="[2]", summary='"Third"'), |
| ValueCheck(name="[3]", summary='"Fourth"'), |
| ] |
| |
| def check_string_vec_ref_view(self): |
| return ValueCheck( |
| name="*__range_", |
| summary="size=4", |
| children=self.check_string_vec_children(), |
| ) |
| |
| def check_foo(self): |
| return ValueCheck(name="vec", children=self.check_string_vec_children()) |
| |
| @add_test_categories(["libc++"]) |
| @skipIf(compiler=no_match("clang")) |
| @skipIf(compiler="clang", compiler_version=["<", "16.0"]) |
| def test_with_run_command(self): |
| """Test that std::ranges::ref_view is formatted correctly when printed.""" |
| self.build() |
| (self.target, process, thread, bkpt) = lldbutil.run_to_source_breakpoint( |
| self, "Break here", lldb.SBFileSpec("main.cpp", False) |
| ) |
| |
| # Check ref_view over a std::string |
| self.expect_var_path( |
| "single", children=[ValueCheck(name="*__range_", summary='"First"')] |
| ) |
| |
| # Check all_view, which is a ref_view in this case |
| self.expect_var_path("all", children=[self.check_string_vec_ref_view()]) |
| |
| # Check take_view format. Embeds a ref_view |
| self.expect_var_path( |
| "subset", |
| children=[ |
| ValueCheck(children=[self.check_string_vec_ref_view()]), |
| ValueCheck(name="__count_", value="2"), |
| ], |
| ) |
| |
| lldbutil.continue_to_breakpoint(self.process(), bkpt) |
| |
| # Check ref_view over custom type 'struct Foo' |
| self.expect_var_path( |
| "view", |
| children=[ |
| ValueCheck( |
| name="*__range_", |
| children=[ |
| ValueCheck(name="[0]", type="Foo", children=[self.check_foo()]), |
| ValueCheck(name="[1]", type="Foo", children=[self.check_foo()]), |
| ], |
| ) |
| ], |
| ) |