xref: /llvm-project/libcxx/test/std/strings/basic.string/string.modifiers/string_erase/size_size.pass.cpp (revision 9ed20568e7de53dce85f1631d7d8c1415e7930ae)
1 //===----------------------------------------------------------------------===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 
9 // <string>
10 
11 // basic_string<charT,traits,Allocator>&
12 //   erase(size_type pos = 0, size_type n = npos); // constexpr since C++20
13 
14 #include <string>
15 #include <stdexcept>
16 #include <cassert>
17 
18 #include "test_macros.h"
19 #include "min_allocator.h"
20 #include "asan_testing.h"
21 
22 template <class S>
test(S s,typename S::size_type pos,typename S::size_type n,S expected)23 TEST_CONSTEXPR_CXX20 void test(S s, typename S::size_type pos, typename S::size_type n, S expected) {
24   const typename S::size_type old_size = s.size();
25   S s0                                 = s;
26   if (pos <= old_size) {
27     s.erase(pos, n);
28     LIBCPP_ASSERT(s.__invariants());
29     assert(s[s.size()] == typename S::value_type());
30     assert(s == expected);
31     LIBCPP_ASSERT(is_string_asan_correct(s));
32   }
33 #ifndef TEST_HAS_NO_EXCEPTIONS
34   else if (!TEST_IS_CONSTANT_EVALUATED) {
35     try {
36       s.erase(pos, n);
37       assert(false);
38     } catch (std::out_of_range&) {
39       assert(pos > old_size);
40       assert(s == s0);
41     }
42   }
43 #endif
44 }
45 
46 template <class S>
test(S s,typename S::size_type pos,S expected)47 TEST_CONSTEXPR_CXX20 void test(S s, typename S::size_type pos, S expected) {
48   const typename S::size_type old_size = s.size();
49   S s0                                 = s;
50   if (pos <= old_size) {
51     s.erase(pos);
52     LIBCPP_ASSERT(s.__invariants());
53     assert(s[s.size()] == typename S::value_type());
54     assert(s == expected);
55   }
56 #ifndef TEST_HAS_NO_EXCEPTIONS
57   else if (!TEST_IS_CONSTANT_EVALUATED) {
58     try {
59       s.erase(pos);
60       assert(false);
61     } catch (std::out_of_range&) {
62       assert(pos > old_size);
63       assert(s == s0);
64     }
65   }
66 #endif
67 }
68 
69 template <class S>
test(S s,S expected)70 TEST_CONSTEXPR_CXX20 void test(S s, S expected) {
71   s.erase();
72   LIBCPP_ASSERT(s.__invariants());
73   assert(s[s.size()] == typename S::value_type());
74   assert(s == expected);
75 }
76 
77 template <class S>
test_string()78 TEST_CONSTEXPR_CXX20 void test_string() {
79   test(S(""), 0, 0, S(""));
80   test(S(""), 0, 1, S(""));
81   test(S(""), 1, 0, S("can't happen"));
82   test(S("abcde"), 0, 0, S("abcde"));
83   test(S("abcde"), 0, 1, S("bcde"));
84   test(S("abcde"), 0, 2, S("cde"));
85   test(S("abcde"), 0, 4, S("e"));
86   test(S("abcde"), 0, 5, S(""));
87   test(S("abcde"), 0, 6, S(""));
88   test(S("abcde"), 1, 0, S("abcde"));
89   test(S("abcde"), 1, 1, S("acde"));
90   test(S("abcde"), 1, 2, S("ade"));
91   test(S("abcde"), 1, 3, S("ae"));
92   test(S("abcde"), 1, 4, S("a"));
93   test(S("abcde"), 1, 5, S("a"));
94   test(S("abcde"), 2, 0, S("abcde"));
95   test(S("abcde"), 2, 1, S("abde"));
96   test(S("abcde"), 2, 2, S("abe"));
97   test(S("abcde"), 2, 3, S("ab"));
98   test(S("abcde"), 2, 4, S("ab"));
99   test(S("abcde"), 4, 0, S("abcde"));
100   test(S("abcde"), 4, 1, S("abcd"));
101   test(S("abcde"), 4, 2, S("abcd"));
102   test(S("abcde"), 5, 0, S("abcde"));
103   test(S("abcde"), 5, 1, S("abcde"));
104   test(S("abcde"), 6, 0, S("can't happen"));
105   test(S("abcdefghij"), 0, 0, S("abcdefghij"));
106   test(S("abcdefghij"), 0, 1, S("bcdefghij"));
107   test(S("abcdefghij"), 0, 5, S("fghij"));
108   test(S("abcdefghij"), 0, 9, S("j"));
109   test(S("abcdefghij"), 0, 10, S(""));
110   test(S("abcdefghij"), 0, 11, S(""));
111   test(S("abcdefghij"), 1, 0, S("abcdefghij"));
112   test(S("abcdefghij"), 1, 1, S("acdefghij"));
113   test(S("abcdefghij"), 1, 4, S("afghij"));
114   test(S("abcdefghij"), 1, 8, S("aj"));
115   test(S("abcdefghij"), 1, 9, S("a"));
116   test(S("abcdefghij"), 1, 10, S("a"));
117   test(S("abcdefghij"), 5, 0, S("abcdefghij"));
118   test(S("abcdefghij"), 5, 1, S("abcdeghij"));
119   test(S("abcdefghij"), 5, 2, S("abcdehij"));
120   test(S("abcdefghij"), 5, 4, S("abcdej"));
121   test(S("abcdefghij"), 5, 5, S("abcde"));
122   test(S("abcdefghij"), 5, 6, S("abcde"));
123   test(S("abcdefghij"), 9, 0, S("abcdefghij"));
124   test(S("abcdefghij"), 9, 1, S("abcdefghi"));
125   test(S("abcdefghij"), 9, 2, S("abcdefghi"));
126   test(S("abcdefghij"), 10, 0, S("abcdefghij"));
127   test(S("abcdefghij"), 10, 1, S("abcdefghij"));
128   test(S("abcdefghij"), 11, 0, S("can't happen"));
129   test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghijklmnopqrst"));
130   test(S("abcdefghijklmnopqrst"), 0, 1, S("bcdefghijklmnopqrst"));
131   test(S("abcdefghijklmnopqrst"), 0, 10, S("klmnopqrst"));
132   test(S("abcdefghijklmnopqrst"), 0, 19, S("t"));
133   test(S("abcdefghijklmnopqrst"), 0, 20, S(""));
134   test(S("abcdefghijklmnopqrst"), 0, 21, S(""));
135   test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghijklmnopqrst"));
136   test(S("abcdefghijklmnopqrst"), 1, 1, S("acdefghijklmnopqrst"));
137   test(S("abcdefghijklmnopqrst"), 1, 9, S("aklmnopqrst"));
138   test(S("abcdefghijklmnopqrst"), 1, 18, S("at"));
139   test(S("abcdefghijklmnopqrst"), 1, 19, S("a"));
140   test(S("abcdefghijklmnopqrst"), 1, 20, S("a"));
141   test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghijklmnopqrst"));
142   test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghijlmnopqrst"));
143   test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghijpqrst"));
144   test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghijt"));
145   test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghij"));
146   test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghij"));
147   test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghijklmnopqrst"));
148   test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghijklmnopqrs"));
149   test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghijklmnopqrs"));
150   test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghijklmnopqrst"));
151   test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghijklmnopqrst"));
152   test(S("abcdefghijklmnopqrst"), 21, 0, S("can't happen"));
153 
154   test(S(""), 0, S(""));
155   test(S(""), 1, S("can't happen"));
156   test(S("abcde"), 0, S(""));
157   test(S("abcde"), 1, S("a"));
158   test(S("abcde"), 2, S("ab"));
159   test(S("abcde"), 4, S("abcd"));
160   test(S("abcde"), 5, S("abcde"));
161   test(S("abcde"), 6, S("can't happen"));
162   test(S("abcdefghij"), 0, S(""));
163   test(S("abcdefghij"), 1, S("a"));
164   test(S("abcdefghij"), 5, S("abcde"));
165   test(S("abcdefghij"), 9, S("abcdefghi"));
166   test(S("abcdefghij"), 10, S("abcdefghij"));
167   test(S("abcdefghij"), 11, S("can't happen"));
168   test(S("abcdefghijklmnopqrst"), 0, S(""));
169   test(S("abcdefghijklmnopqrst"), 1, S("a"));
170   test(S("abcdefghijklmnopqrst"), 10, S("abcdefghij"));
171   test(S("abcdefghijklmnopqrst"), 19, S("abcdefghijklmnopqrs"));
172   test(S("abcdefghijklmnopqrst"), 20, S("abcdefghijklmnopqrst"));
173   test(S("abcdefghijklmnopqrst"), 21, S("can't happen"));
174 
175   test(S(""), S(""));
176   test(S("abcde"), S(""));
177   test(S("abcdefghij"), S(""));
178   test(S("abcdefghijklmnopqrst"), S(""));
179 }
180 
test()181 TEST_CONSTEXPR_CXX20 bool test() {
182   test_string<std::string>();
183 #if TEST_STD_VER >= 11
184   test_string<std::basic_string<char, std::char_traits<char>, min_allocator<char>>>();
185   test_string<std::basic_string<char, std::char_traits<char>, safe_allocator<char>>>();
186 #endif
187 
188   return true;
189 }
190 
main(int,char **)191 int main(int, char**) {
192   test();
193 #if TEST_STD_VER > 17
194   static_assert(test());
195 #endif
196 
197   return 0;
198 }
199