xref: /llvm-project/libcxx/test/std/strings/basic.string/string.modifiers/string_append/iterator.pass.cpp (revision 9d10d27c6746199c736427556e27f94a5d055038)
1 //===----------------------------------------------------------------------===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is dual licensed under the MIT and the University of Illinois Open
6 // Source Licenses. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 
10 // <string>
11 
12 // template<class InputIterator>
13 //   basic_string& append(InputIterator first, InputIterator last);
14 
15 #include <string>
16 #include <cassert>
17 
18 #include "test_iterators.h"
19 #include "min_allocator.h"
20 
21 template <class S, class It>
22 void
23 test(S s, It first, It last, S expected)
24 {
25     s.append(first, last);
26     assert(s.__invariants());
27     assert(s == expected);
28 }
29 
30 template <class S, class It>
31 void
32 test_exceptions(S s, It first, It last)
33 {
34 	S aCopy = s;
35     try {
36     	s.append(first, last);
37     	assert(false);
38     	}
39     catch (...) {}
40     assert(s.__invariants());
41     assert(s == aCopy);
42 }
43 
44 int main()
45 {
46     {
47     typedef std::string S;
48     const char* s = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
49     test(S(), s, s, S());
50     test(S(), s, s+1, S("A"));
51     test(S(), s, s+10, S("ABCDEFGHIJ"));
52     test(S(), s, s+52, S("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"));
53 
54     test(S("12345"), s, s, S("12345"));
55     test(S("12345"), s, s+1, S("12345A"));
56     test(S("12345"), s, s+10, S("12345ABCDEFGHIJ"));
57     test(S("12345"), s, s+52, S("12345ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"));
58 
59     test(S("1234567890"), s, s, S("1234567890"));
60     test(S("1234567890"), s, s+1, S("1234567890A"));
61     test(S("1234567890"), s, s+10, S("1234567890ABCDEFGHIJ"));
62     test(S("1234567890"), s, s+52, S("1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"));
63 
64     test(S("12345678901234567890"), s, s, S("12345678901234567890"));
65     test(S("12345678901234567890"), s, s+1, S("12345678901234567890""A"));
66     test(S("12345678901234567890"), s, s+10, S("12345678901234567890""ABCDEFGHIJ"));
67     test(S("12345678901234567890"), s, s+52,
68          S("12345678901234567890""ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"));
69 
70     test(S(), input_iterator<const char*>(s), input_iterator<const char*>(s), S());
71     test(S(), input_iterator<const char*>(s), input_iterator<const char*>(s+1), S("A"));
72     test(S(), input_iterator<const char*>(s), input_iterator<const char*>(s+10),
73          S("ABCDEFGHIJ"));
74     test(S(), input_iterator<const char*>(s), input_iterator<const char*>(s+52),
75          S("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"));
76 
77     test(S("12345"), input_iterator<const char*>(s), input_iterator<const char*>(s),
78          S("12345"));
79     test(S("12345"), input_iterator<const char*>(s), input_iterator<const char*>(s+1),
80          S("12345A"));
81     test(S("12345"), input_iterator<const char*>(s), input_iterator<const char*>(s+10),
82          S("12345ABCDEFGHIJ"));
83     test(S("12345"), input_iterator<const char*>(s), input_iterator<const char*>(s+52),
84          S("12345ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"));
85 
86     test(S("1234567890"), input_iterator<const char*>(s), input_iterator<const char*>(s),
87          S("1234567890"));
88     test(S("1234567890"), input_iterator<const char*>(s), input_iterator<const char*>(s+1),
89          S("1234567890A"));
90     test(S("1234567890"), input_iterator<const char*>(s), input_iterator<const char*>(s+10),
91          S("1234567890ABCDEFGHIJ"));
92     test(S("1234567890"), input_iterator<const char*>(s), input_iterator<const char*>(s+52),
93          S("1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"));
94 
95     test(S("12345678901234567890"), input_iterator<const char*>(s), input_iterator<const char*>(s),
96          S("12345678901234567890"));
97     test(S("12345678901234567890"), input_iterator<const char*>(s), input_iterator<const char*>(s+1),
98          S("12345678901234567890""A"));
99     test(S("12345678901234567890"), input_iterator<const char*>(s), input_iterator<const char*>(s+10),
100          S("12345678901234567890""ABCDEFGHIJ"));
101     test(S("12345678901234567890"), input_iterator<const char*>(s), input_iterator<const char*>(s+52),
102          S("12345678901234567890""ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"));
103     }
104 #if TEST_STD_VER >= 11
105     {
106     typedef std::basic_string<char, std::char_traits<char>, min_allocator<char>> S;
107     const char* s = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
108     test(S(), s, s, S());
109     test(S(), s, s+1, S("A"));
110     test(S(), s, s+10, S("ABCDEFGHIJ"));
111     test(S(), s, s+52, S("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"));
112 
113     test(S("12345"), s, s, S("12345"));
114     test(S("12345"), s, s+1, S("12345A"));
115     test(S("12345"), s, s+10, S("12345ABCDEFGHIJ"));
116     test(S("12345"), s, s+52, S("12345ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"));
117 
118     test(S("1234567890"), s, s, S("1234567890"));
119     test(S("1234567890"), s, s+1, S("1234567890A"));
120     test(S("1234567890"), s, s+10, S("1234567890ABCDEFGHIJ"));
121     test(S("1234567890"), s, s+52, S("1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"));
122 
123     test(S("12345678901234567890"), s, s, S("12345678901234567890"));
124     test(S("12345678901234567890"), s, s+1, S("12345678901234567890""A"));
125     test(S("12345678901234567890"), s, s+10, S("12345678901234567890""ABCDEFGHIJ"));
126     test(S("12345678901234567890"), s, s+52,
127          S("12345678901234567890""ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"));
128 
129     test(S(), input_iterator<const char*>(s), input_iterator<const char*>(s), S());
130     test(S(), input_iterator<const char*>(s), input_iterator<const char*>(s+1), S("A"));
131     test(S(), input_iterator<const char*>(s), input_iterator<const char*>(s+10),
132          S("ABCDEFGHIJ"));
133     test(S(), input_iterator<const char*>(s), input_iterator<const char*>(s+52),
134          S("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"));
135 
136     test(S("12345"), input_iterator<const char*>(s), input_iterator<const char*>(s),
137          S("12345"));
138     test(S("12345"), input_iterator<const char*>(s), input_iterator<const char*>(s+1),
139          S("12345A"));
140     test(S("12345"), input_iterator<const char*>(s), input_iterator<const char*>(s+10),
141          S("12345ABCDEFGHIJ"));
142     test(S("12345"), input_iterator<const char*>(s), input_iterator<const char*>(s+52),
143          S("12345ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"));
144 
145     test(S("1234567890"), input_iterator<const char*>(s), input_iterator<const char*>(s),
146          S("1234567890"));
147     test(S("1234567890"), input_iterator<const char*>(s), input_iterator<const char*>(s+1),
148          S("1234567890A"));
149     test(S("1234567890"), input_iterator<const char*>(s), input_iterator<const char*>(s+10),
150          S("1234567890ABCDEFGHIJ"));
151     test(S("1234567890"), input_iterator<const char*>(s), input_iterator<const char*>(s+52),
152          S("1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"));
153 
154     test(S("12345678901234567890"), input_iterator<const char*>(s), input_iterator<const char*>(s),
155          S("12345678901234567890"));
156     test(S("12345678901234567890"), input_iterator<const char*>(s), input_iterator<const char*>(s+1),
157          S("12345678901234567890""A"));
158     test(S("12345678901234567890"), input_iterator<const char*>(s), input_iterator<const char*>(s+10),
159          S("12345678901234567890""ABCDEFGHIJ"));
160     test(S("12345678901234567890"), input_iterator<const char*>(s), input_iterator<const char*>(s+52),
161          S("12345678901234567890""ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"));
162     }
163 #endif
164 #ifndef TEST_HAS_NO_EXCEPTIONS
165 	{ // test iterator operations that throw
166     typedef std::string S;
167     typedef ThrowingIterator<char> TIter;
168     typedef input_iterator<TIter> IIter;
169     const char* s = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
170     test_exceptions(S(), IIter(TIter(s, s+10, 4, TIter::TAIncrement)), IIter());
171     test_exceptions(S(), IIter(TIter(s, s+10, 5, TIter::TADereference)), IIter());
172     test_exceptions(S(), IIter(TIter(s, s+10, 6, TIter::TAComparison)), IIter());
173 
174     test_exceptions(S(), TIter(s, s+10, 4, TIter::TAIncrement), TIter());
175     test_exceptions(S(), TIter(s, s+10, 5, TIter::TADereference), TIter());
176     test_exceptions(S(), TIter(s, s+10, 6, TIter::TAComparison), TIter());
177 	}
178 #endif
179 }
180