xref: /llvm-project/libcxx/test/std/strings/basic.string/string.nonmembers/string_op+/string_string.pass.cpp (revision a40bada91aeda276a772acfbcae6e8de26755a11)
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 // template<class charT, class traits, class Allocator>
12 //   basic_string<charT,traits,Allocator>
13 //   operator+(const basic_string<charT,traits,Allocator>& lhs,
14 //             const basic_string<charT,traits,Allocator>& rhs); // constexpr since C++20
15 
16 // template<class charT, class traits, class Allocator>
17 //   basic_string<charT,traits,Allocator>&&
18 //   operator+(const basic_string<charT,traits,Allocator>&& lhs,
19 //             const basic_string<charT,traits,Allocator>& rhs); // constexpr since C++20
20 
21 // template<class charT, class traits, class Allocator>
22 //   basic_string<charT,traits,Allocator>&&
23 //   operator+(const basic_string<charT,traits,Allocator>& lhs,
24 //             const basic_string<charT,traits,Allocator>&& rhs); // constexpr since C++20
25 
26 // template<class charT, class traits, class Allocator>
27 //   basic_string<charT,traits,Allocator>&&
28 //   operator+(const basic_string<charT,traits,Allocator>&& lhs,
29 //             const basic_string<charT,traits,Allocator>&& rhs); // constexpr since C++20
30 
31 #include <string>
32 #include <utility>
33 #include <cassert>
34 
35 #include "test_macros.h"
36 #include "min_allocator.h"
37 
38 template <class S>
39 TEST_CONSTEXPR_CXX20 void test0(const S& lhs, const S& rhs, const S& x) {
40   assert(lhs + rhs == x);
41 }
42 
43 #if TEST_STD_VER >= 11
44 template <class S>
45 TEST_CONSTEXPR_CXX20 void test1(S&& lhs, const S& rhs, const S& x) {
46   assert(std::move(lhs) + rhs == x);
47 }
48 
49 template <class S>
50 TEST_CONSTEXPR_CXX20 void test2(const S& lhs, S&& rhs, const S& x) {
51   assert(lhs + std::move(rhs) == x);
52 }
53 
54 template <class S>
55 TEST_CONSTEXPR_CXX20 void test3(S&& lhs, S&& rhs, const S& x) {
56   assert(std::move(lhs) + std::move(rhs) == x);
57 }
58 #endif
59 
60 TEST_CONSTEXPR_CXX20 bool test() {
61   {
62     typedef std::string S;
63     test0(S(""), S(""), S(""));
64     test0(S(""), S("12345"), S("12345"));
65     test0(S(""), S("1234567890"), S("1234567890"));
66     test0(S(""), S("12345678901234567890"), S("12345678901234567890"));
67     test0(S("abcde"), S(""), S("abcde"));
68     test0(S("abcde"), S("12345"), S("abcde12345"));
69     test0(S("abcde"), S("1234567890"), S("abcde1234567890"));
70     test0(S("abcde"), S("12345678901234567890"), S("abcde12345678901234567890"));
71     test0(S("abcdefghij"), S(""), S("abcdefghij"));
72     test0(S("abcdefghij"), S("12345"), S("abcdefghij12345"));
73     test0(S("abcdefghij"), S("1234567890"), S("abcdefghij1234567890"));
74     test0(S("abcdefghij"), S("12345678901234567890"), S("abcdefghij12345678901234567890"));
75     test0(S("abcdefghijklmnopqrst"), S(""), S("abcdefghijklmnopqrst"));
76     test0(S("abcdefghijklmnopqrst"), S("12345"), S("abcdefghijklmnopqrst12345"));
77     test0(S("abcdefghijklmnopqrst"), S("1234567890"), S("abcdefghijklmnopqrst1234567890"));
78     test0(S("abcdefghijklmnopqrst"), S("12345678901234567890"), S("abcdefghijklmnopqrst12345678901234567890"));
79   }
80 #if TEST_STD_VER >= 11
81   {
82     typedef std::string S;
83     test1(S(""), S(""), S(""));
84     test1(S(""), S("12345"), S("12345"));
85     test1(S(""), S("1234567890"), S("1234567890"));
86     test1(S(""), S("12345678901234567890"), S("12345678901234567890"));
87     test1(S("abcde"), S(""), S("abcde"));
88     test1(S("abcde"), S("12345"), S("abcde12345"));
89     test1(S("abcde"), S("1234567890"), S("abcde1234567890"));
90     test1(S("abcde"), S("12345678901234567890"), S("abcde12345678901234567890"));
91     test1(S("abcdefghij"), S(""), S("abcdefghij"));
92     test1(S("abcdefghij"), S("12345"), S("abcdefghij12345"));
93     test1(S("abcdefghij"), S("1234567890"), S("abcdefghij1234567890"));
94     test1(S("abcdefghij"), S("12345678901234567890"), S("abcdefghij12345678901234567890"));
95     test1(S("abcdefghijklmnopqrst"), S(""), S("abcdefghijklmnopqrst"));
96     test1(S("abcdefghijklmnopqrst"), S("12345"), S("abcdefghijklmnopqrst12345"));
97     test1(S("abcdefghijklmnopqrst"), S("1234567890"), S("abcdefghijklmnopqrst1234567890"));
98     test1(S("abcdefghijklmnopqrst"), S("12345678901234567890"), S("abcdefghijklmnopqrst12345678901234567890"));
99 
100     test2(S(""), S(""), S(""));
101     test2(S(""), S("12345"), S("12345"));
102     test2(S(""), S("1234567890"), S("1234567890"));
103     test2(S(""), S("12345678901234567890"), S("12345678901234567890"));
104     test2(S("abcde"), S(""), S("abcde"));
105     test2(S("abcde"), S("12345"), S("abcde12345"));
106     test2(S("abcde"), S("1234567890"), S("abcde1234567890"));
107     test2(S("abcde"), S("12345678901234567890"), S("abcde12345678901234567890"));
108     test2(S("abcdefghij"), S(""), S("abcdefghij"));
109     test2(S("abcdefghij"), S("12345"), S("abcdefghij12345"));
110     test2(S("abcdefghij"), S("1234567890"), S("abcdefghij1234567890"));
111     test2(S("abcdefghij"), S("12345678901234567890"), S("abcdefghij12345678901234567890"));
112     test2(S("abcdefghijklmnopqrst"), S(""), S("abcdefghijklmnopqrst"));
113     test2(S("abcdefghijklmnopqrst"), S("12345"), S("abcdefghijklmnopqrst12345"));
114     test2(S("abcdefghijklmnopqrst"), S("1234567890"), S("abcdefghijklmnopqrst1234567890"));
115     test2(S("abcdefghijklmnopqrst"), S("12345678901234567890"), S("abcdefghijklmnopqrst12345678901234567890"));
116 
117     test3(S(""), S(""), S(""));
118     test3(S(""), S("12345"), S("12345"));
119     test3(S(""), S("1234567890"), S("1234567890"));
120     test3(S(""), S("12345678901234567890"), S("12345678901234567890"));
121     test3(S("abcde"), S(""), S("abcde"));
122     test3(S("abcde"), S("12345"), S("abcde12345"));
123     test3(S("abcde"), S("1234567890"), S("abcde1234567890"));
124     test3(S("abcde"), S("12345678901234567890"), S("abcde12345678901234567890"));
125     test3(S("abcdefghij"), S(""), S("abcdefghij"));
126     test3(S("abcdefghij"), S("12345"), S("abcdefghij12345"));
127     test3(S("abcdefghij"), S("1234567890"), S("abcdefghij1234567890"));
128     test3(S("abcdefghij"), S("12345678901234567890"), S("abcdefghij12345678901234567890"));
129     test3(S("abcdefghijklmnopqrst"), S(""), S("abcdefghijklmnopqrst"));
130     test3(S("abcdefghijklmnopqrst"), S("12345"), S("abcdefghijklmnopqrst12345"));
131     test3(S("abcdefghijklmnopqrst"), S("1234567890"), S("abcdefghijklmnopqrst1234567890"));
132     test3(S("abcdefghijklmnopqrst"), S("12345678901234567890"), S("abcdefghijklmnopqrst12345678901234567890"));
133   }
134   {
135     typedef std::basic_string<char, std::char_traits<char>, min_allocator<char> > S;
136     test0(S(""), S(""), S(""));
137     test0(S(""), S("12345"), S("12345"));
138     test0(S(""), S("1234567890"), S("1234567890"));
139     test0(S(""), S("12345678901234567890"), S("12345678901234567890"));
140     test0(S("abcde"), S(""), S("abcde"));
141     test0(S("abcde"), S("12345"), S("abcde12345"));
142     test0(S("abcde"), S("1234567890"), S("abcde1234567890"));
143     test0(S("abcde"), S("12345678901234567890"), S("abcde12345678901234567890"));
144     test0(S("abcdefghij"), S(""), S("abcdefghij"));
145     test0(S("abcdefghij"), S("12345"), S("abcdefghij12345"));
146     test0(S("abcdefghij"), S("1234567890"), S("abcdefghij1234567890"));
147     test0(S("abcdefghij"), S("12345678901234567890"), S("abcdefghij12345678901234567890"));
148     test0(S("abcdefghijklmnopqrst"), S(""), S("abcdefghijklmnopqrst"));
149     test0(S("abcdefghijklmnopqrst"), S("12345"), S("abcdefghijklmnopqrst12345"));
150     test0(S("abcdefghijklmnopqrst"), S("1234567890"), S("abcdefghijklmnopqrst1234567890"));
151     test0(S("abcdefghijklmnopqrst"), S("12345678901234567890"), S("abcdefghijklmnopqrst12345678901234567890"));
152 
153     test1(S(""), S(""), S(""));
154     test1(S(""), S("12345"), S("12345"));
155     test1(S(""), S("1234567890"), S("1234567890"));
156     test1(S(""), S("12345678901234567890"), S("12345678901234567890"));
157     test1(S("abcde"), S(""), S("abcde"));
158     test1(S("abcde"), S("12345"), S("abcde12345"));
159     test1(S("abcde"), S("1234567890"), S("abcde1234567890"));
160     test1(S("abcde"), S("12345678901234567890"), S("abcde12345678901234567890"));
161     test1(S("abcdefghij"), S(""), S("abcdefghij"));
162     test1(S("abcdefghij"), S("12345"), S("abcdefghij12345"));
163     test1(S("abcdefghij"), S("1234567890"), S("abcdefghij1234567890"));
164     test1(S("abcdefghij"), S("12345678901234567890"), S("abcdefghij12345678901234567890"));
165     test1(S("abcdefghijklmnopqrst"), S(""), S("abcdefghijklmnopqrst"));
166     test1(S("abcdefghijklmnopqrst"), S("12345"), S("abcdefghijklmnopqrst12345"));
167     test1(S("abcdefghijklmnopqrst"), S("1234567890"), S("abcdefghijklmnopqrst1234567890"));
168     test1(S("abcdefghijklmnopqrst"), S("12345678901234567890"), S("abcdefghijklmnopqrst12345678901234567890"));
169 
170     test2(S(""), S(""), S(""));
171     test2(S(""), S("12345"), S("12345"));
172     test2(S(""), S("1234567890"), S("1234567890"));
173     test2(S(""), S("12345678901234567890"), S("12345678901234567890"));
174     test2(S("abcde"), S(""), S("abcde"));
175     test2(S("abcde"), S("12345"), S("abcde12345"));
176     test2(S("abcde"), S("1234567890"), S("abcde1234567890"));
177     test2(S("abcde"), S("12345678901234567890"), S("abcde12345678901234567890"));
178     test2(S("abcdefghij"), S(""), S("abcdefghij"));
179     test2(S("abcdefghij"), S("12345"), S("abcdefghij12345"));
180     test2(S("abcdefghij"), S("1234567890"), S("abcdefghij1234567890"));
181     test2(S("abcdefghij"), S("12345678901234567890"), S("abcdefghij12345678901234567890"));
182     test2(S("abcdefghijklmnopqrst"), S(""), S("abcdefghijklmnopqrst"));
183     test2(S("abcdefghijklmnopqrst"), S("12345"), S("abcdefghijklmnopqrst12345"));
184     test2(S("abcdefghijklmnopqrst"), S("1234567890"), S("abcdefghijklmnopqrst1234567890"));
185     test2(S("abcdefghijklmnopqrst"), S("12345678901234567890"), S("abcdefghijklmnopqrst12345678901234567890"));
186 
187     test3(S(""), S(""), S(""));
188     test3(S(""), S("12345"), S("12345"));
189     test3(S(""), S("1234567890"), S("1234567890"));
190     test3(S(""), S("12345678901234567890"), S("12345678901234567890"));
191     test3(S("abcde"), S(""), S("abcde"));
192     test3(S("abcde"), S("12345"), S("abcde12345"));
193     test3(S("abcde"), S("1234567890"), S("abcde1234567890"));
194     test3(S("abcde"), S("12345678901234567890"), S("abcde12345678901234567890"));
195     test3(S("abcdefghij"), S(""), S("abcdefghij"));
196     test3(S("abcdefghij"), S("12345"), S("abcdefghij12345"));
197     test3(S("abcdefghij"), S("1234567890"), S("abcdefghij1234567890"));
198     test3(S("abcdefghij"), S("12345678901234567890"), S("abcdefghij12345678901234567890"));
199     test3(S("abcdefghijklmnopqrst"), S(""), S("abcdefghijklmnopqrst"));
200     test3(S("abcdefghijklmnopqrst"), S("12345"), S("abcdefghijklmnopqrst12345"));
201     test3(S("abcdefghijklmnopqrst"), S("1234567890"), S("abcdefghijklmnopqrst1234567890"));
202     test3(S("abcdefghijklmnopqrst"), S("12345678901234567890"), S("abcdefghijklmnopqrst12345678901234567890"));
203   }
204 #endif // TEST_STD_VER >= 11
205 
206   return true;
207 }
208 
209 int main(int, char**) {
210   test();
211 #if TEST_STD_VER > 17
212   static_assert(test());
213 #endif
214 
215   return 0;
216 }
217