xref: /llvm-project/libcxx/test/std/strings/basic.string/string.modifiers/string_assign/iterator.pass.cpp (revision 76b4afc04051298081c2f46056138b4013c2f49d)
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& assign(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.assign(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.assign(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());
55     test(S("12345"), s, s+1, S("A"));
56     test(S("12345"), s, s+10, S("ABCDEFGHIJ"));
57     test(S("12345"), s, s+52, S("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"));
58 
59     test(S("1234567890"), s, s, S());
60     test(S("1234567890"), s, s+1, S("A"));
61     test(S("1234567890"), s, s+10, S("ABCDEFGHIJ"));
62     test(S("1234567890"), s, s+52, S("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"));
63 
64     test(S("12345678901234567890"), s, s, S());
65     test(S("12345678901234567890"), s, s+1, S("A"));
66     test(S("12345678901234567890"), s, s+10, S("ABCDEFGHIJ"));
67     test(S("12345678901234567890"), s, s+52,
68          S("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());
79     test(S("12345"), input_iterator<const char*>(s), input_iterator<const char*>(s+1),
80          S("A"));
81     test(S("12345"), input_iterator<const char*>(s), input_iterator<const char*>(s+10),
82          S("ABCDEFGHIJ"));
83     test(S("12345"), input_iterator<const char*>(s), input_iterator<const char*>(s+52),
84          S("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"));
85 
86     test(S("1234567890"), input_iterator<const char*>(s), input_iterator<const char*>(s),
87          S());
88     test(S("1234567890"), input_iterator<const char*>(s), input_iterator<const char*>(s+1),
89          S("A"));
90     test(S("1234567890"), input_iterator<const char*>(s), input_iterator<const char*>(s+10),
91          S("ABCDEFGHIJ"));
92     test(S("1234567890"), input_iterator<const char*>(s), input_iterator<const char*>(s+52),
93          S("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"));
94 
95     test(S("12345678901234567890"), input_iterator<const char*>(s), input_iterator<const char*>(s),
96          S());
97     test(S("12345678901234567890"), input_iterator<const char*>(s), input_iterator<const char*>(s+1),
98          S("A"));
99     test(S("12345678901234567890"), input_iterator<const char*>(s), input_iterator<const char*>(s+10),
100          S("ABCDEFGHIJ"));
101     test(S("12345678901234567890"), input_iterator<const char*>(s), input_iterator<const char*>(s+52),
102          S("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"));
103     }
104 #if __cplusplus >= 201103L
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());
114     test(S("12345"), s, s+1, S("A"));
115     test(S("12345"), s, s+10, S("ABCDEFGHIJ"));
116     test(S("12345"), s, s+52, S("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"));
117 
118     test(S("1234567890"), s, s, S());
119     test(S("1234567890"), s, s+1, S("A"));
120     test(S("1234567890"), s, s+10, S("ABCDEFGHIJ"));
121     test(S("1234567890"), s, s+52, S("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"));
122 
123     test(S("12345678901234567890"), s, s, S());
124     test(S("12345678901234567890"), s, s+1, S("A"));
125     test(S("12345678901234567890"), s, s+10, S("ABCDEFGHIJ"));
126     test(S("12345678901234567890"), s, s+52,
127          S("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());
138     test(S("12345"), input_iterator<const char*>(s), input_iterator<const char*>(s+1),
139          S("A"));
140     test(S("12345"), input_iterator<const char*>(s), input_iterator<const char*>(s+10),
141          S("ABCDEFGHIJ"));
142     test(S("12345"), input_iterator<const char*>(s), input_iterator<const char*>(s+52),
143          S("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"));
144 
145     test(S("1234567890"), input_iterator<const char*>(s), input_iterator<const char*>(s),
146          S());
147     test(S("1234567890"), input_iterator<const char*>(s), input_iterator<const char*>(s+1),
148          S("A"));
149     test(S("1234567890"), input_iterator<const char*>(s), input_iterator<const char*>(s+10),
150          S("ABCDEFGHIJ"));
151     test(S("1234567890"), input_iterator<const char*>(s), input_iterator<const char*>(s+52),
152          S("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"));
153 
154     test(S("12345678901234567890"), input_iterator<const char*>(s), input_iterator<const char*>(s),
155          S());
156     test(S("12345678901234567890"), input_iterator<const char*>(s), input_iterator<const char*>(s+1),
157          S("A"));
158     test(S("12345678901234567890"), input_iterator<const char*>(s), input_iterator<const char*>(s+10),
159          S("ABCDEFGHIJ"));
160     test(S("12345678901234567890"), input_iterator<const char*>(s), input_iterator<const char*>(s+52),
161          S("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"));
162     }
163 #endif
164 	{ // test iterator operations that throw
165     typedef std::string S;
166     typedef ThrowingIterator<char> TIter;
167     typedef input_iterator<TIter> IIter;
168     const char* s = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
169     test_exceptions(S(), IIter(TIter(s, s+10, 4, TIter::TAIncrement)), IIter());
170     test_exceptions(S(), IIter(TIter(s, s+10, 5, TIter::TADereference)), IIter());
171     test_exceptions(S(), IIter(TIter(s, s+10, 6, TIter::TAComparison)), IIter());
172 
173     test_exceptions(S(), TIter(s, s+10, 4, TIter::TAIncrement), TIter());
174     test_exceptions(S(), TIter(s, s+10, 5, TIter::TADereference), TIter());
175     test_exceptions(S(), TIter(s, s+10, 6, TIter::TAComparison), TIter());
176 	}
177 }
178