1""" 2Test basic std::vector functionality. 3""" 4 5from lldbsuite.test.decorators import * 6from lldbsuite.test.lldbtest import * 7from lldbsuite.test import lldbutil 8 9 10class TestBasicVector(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 self.runCmd("settings set target.import-std-module true") 22 23 vector_type = "std::vector<int>" 24 size_type = vector_type + "::size_type" 25 iterator = vector_type + "::iterator" 26 # LLDB's formatter provides us with a artificial 'item' member. 27 iterator_children = [ValueCheck(name="item")] 28 riterator = vector_type + "::reverse_iterator" 29 riterator_children = [ 30 ValueCheck(name="__t"), 31 ValueCheck(name="current") 32 ] 33 34 self.expect_expr("a", 35 result_type=vector_type, 36 result_children=[ 37 ValueCheck(value="3"), 38 ValueCheck(value="1"), 39 ValueCheck(value="2") 40 ]) 41 self.expect_expr("a.size()", result_type=size_type, result_value="3") 42 front = self.expect_expr("a.front()", result_value="3") 43 value_type = front.GetDisplayTypeName() 44 self.assertIn(value_type, [ 45 "std::vector<int>::value_type", # Pre-D112976 46 "std::__vector_base<int, std::allocator<int> >::value_type", # Post-D112976 47 ]) 48 self.expect_expr("a[1]", result_type=value_type, result_value="1") 49 self.expect_expr("a.back()", result_type=value_type, result_value="2") 50 51 self.expect("expr std::sort(a.begin(), a.end())") 52 self.expect_expr("a.front()", result_type=value_type, result_value="1") 53 self.expect_expr("a[1]", result_type=value_type, result_value="2") 54 self.expect_expr("a.back()", result_type=value_type, result_value="3") 55 56 self.expect("expr std::reverse(a.begin(), a.end())") 57 self.expect_expr("a.front()", result_type=value_type, result_value="3") 58 self.expect_expr("a[1]", result_type=value_type, result_value="2") 59 self.expect_expr("a.back()", result_type=value_type, result_value="1") 60 61 self.expect_expr("a.begin()", 62 result_type=iterator, 63 result_children=iterator_children) 64 self.expect_expr("a.rbegin()", 65 result_type=riterator, 66 result_children=riterator_children) 67 68 self.expect_expr("*a.begin()", result_type="int", result_value="3") 69 self.expect_expr("*a.rbegin()", result_type="int", result_value="1") 70 71 self.expect("expr a.pop_back()") 72 self.expect_expr("a.back()", result_type=value_type, result_value="2") 73 self.expect_expr("a.size()", result_type=size_type, result_value="2") 74 75 self.expect_expr("a.at(0)", result_type=value_type, result_value="3") 76 77 self.expect("expr a.push_back(4)") 78 self.expect_expr("a.back()", result_type=value_type, result_value="4") 79 self.expect_expr("a.size()", result_type=size_type, result_value="3") 80 81 self.expect("expr a.emplace_back(5)") 82 self.expect_expr("a.back()", result_type=value_type, result_value="5") 83 self.expect_expr("a.size()", result_type=size_type, result_value="4") 84 85 self.expect_expr("a", 86 result_children=[ 87 ValueCheck(value="3"), 88 ValueCheck(value="2"), 89 ValueCheck(value="4"), 90 ValueCheck(value="5") 91 ]) 92 93 # Test that the typedef'd vector type can be substituted. 94 self.expect("expr b.emplace_back(6)") 95 self.expect_expr("b", result_type="vector_long", 96 result_children=[ 97 ValueCheck(value="3"), 98 ValueCheck(value="1"), 99 ValueCheck(value="2"), 100 ValueCheck(value="6"), 101 ]) 102