9abcbb3a87d8c072d96d042dbff0aae4cd7c66f1
[WebKit-https.git] / Tools / TestWebKitAPI / Tests / WTF / StringOperators.cpp
1 /*
2  * Copyright (C) 2011 Apple Inc. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
14  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
15  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
17  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
18  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
19  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
20  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
21  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
22  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
23  * THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26 #include "config.h"
27
28 #define WTF_STRINGTYPEADAPTER_COPIED_WTF_STRING() (++wtfStringCopyCount)
29
30 static int wtfStringCopyCount;
31
32 #include <wtf/text/StringView.h>
33 #include <wtf/text/WTFString.h>
34
35 namespace TestWebKitAPI {
36
37 #define EXPECT_N_WTF_STRING_COPIES(count, expr) \
38     do { \
39         wtfStringCopyCount = 0; \
40         String __testString = expr; \
41         (void)__testString; \
42         EXPECT_EQ(count, wtfStringCopyCount) << #expr; \
43     } while (false)
44
45 TEST(WTF, StringOperators)
46 {
47     String string("String");
48     AtomicString atomicString("AtomicString");
49     ASCIILiteral literal { "ASCIILiteral"_s };
50
51     String stringViewBacking { "StringView" };
52     StringView stringView { stringViewBacking };
53
54     EXPECT_EQ(0, wtfStringCopyCount);
55
56     EXPECT_N_WTF_STRING_COPIES(2, string + string);
57     EXPECT_N_WTF_STRING_COPIES(2, string + atomicString);
58     EXPECT_N_WTF_STRING_COPIES(2, atomicString + string);
59     EXPECT_N_WTF_STRING_COPIES(2, atomicString + atomicString);
60     EXPECT_N_WTF_STRING_COPIES(1, stringView + string);
61     EXPECT_N_WTF_STRING_COPIES(1, string + stringView);
62     EXPECT_N_WTF_STRING_COPIES(1, stringView + atomicString);
63     EXPECT_N_WTF_STRING_COPIES(1, atomicString + stringView);
64
65     EXPECT_N_WTF_STRING_COPIES(1, "C string" + string);
66     EXPECT_N_WTF_STRING_COPIES(1, string + "C string");
67     EXPECT_N_WTF_STRING_COPIES(1, "C string" + atomicString);
68     EXPECT_N_WTF_STRING_COPIES(1, atomicString + "C string");
69     EXPECT_N_WTF_STRING_COPIES(0, "C string" + stringView);
70     EXPECT_N_WTF_STRING_COPIES(0, stringView + "C string");
71
72     EXPECT_N_WTF_STRING_COPIES(1, literal + string);
73     EXPECT_N_WTF_STRING_COPIES(1, string + literal);
74     EXPECT_N_WTF_STRING_COPIES(1, literal + atomicString);
75     EXPECT_N_WTF_STRING_COPIES(1, atomicString + literal);
76     EXPECT_N_WTF_STRING_COPIES(0, literal + stringView);
77     EXPECT_N_WTF_STRING_COPIES(0, stringView + literal);
78
79     EXPECT_N_WTF_STRING_COPIES(2, "C string" + string + "C string" + string);
80     EXPECT_N_WTF_STRING_COPIES(2, "C string" + (string + "C string" + string));
81     EXPECT_N_WTF_STRING_COPIES(2, ("C string" + string) + ("C string" + string));
82     EXPECT_N_WTF_STRING_COPIES(2, string + "C string" + string + "C string");
83     EXPECT_N_WTF_STRING_COPIES(2, string + ("C string" + string + "C string"));
84     EXPECT_N_WTF_STRING_COPIES(2, (string + "C string") + (string + "C string"));
85
86     EXPECT_N_WTF_STRING_COPIES(2, literal + string + literal + string);
87     EXPECT_N_WTF_STRING_COPIES(2, literal + (string + literal + string));
88     EXPECT_N_WTF_STRING_COPIES(2, (literal + string) + (literal + string));
89     EXPECT_N_WTF_STRING_COPIES(2, string + literal + string + literal);
90     EXPECT_N_WTF_STRING_COPIES(2, string + (literal + string + literal));
91     EXPECT_N_WTF_STRING_COPIES(2, (string + literal) + (string + literal));
92
93     EXPECT_N_WTF_STRING_COPIES(2, literal + string + "C string" + string);
94     EXPECT_N_WTF_STRING_COPIES(2, literal + (string + "C string" + string));
95     EXPECT_N_WTF_STRING_COPIES(2, (literal + string) + ("C string" + string));
96     EXPECT_N_WTF_STRING_COPIES(2, "C string" + string + literal + string);
97     EXPECT_N_WTF_STRING_COPIES(2, "C string" + (string + literal + string));
98     EXPECT_N_WTF_STRING_COPIES(2, ("C string" + string) + (literal + string));
99
100     EXPECT_N_WTF_STRING_COPIES(2, literal + atomicString + "C string" + atomicString);
101     EXPECT_N_WTF_STRING_COPIES(2, literal + (atomicString + "C string" + atomicString));
102     EXPECT_N_WTF_STRING_COPIES(2, (literal + atomicString) + ("C string" + atomicString));
103     EXPECT_N_WTF_STRING_COPIES(2, "C string" + atomicString + literal + atomicString);
104     EXPECT_N_WTF_STRING_COPIES(2, "C string" + (atomicString + literal + atomicString));
105     EXPECT_N_WTF_STRING_COPIES(2, ("C string" + atomicString) + (literal + atomicString));
106
107     EXPECT_N_WTF_STRING_COPIES(0, literal + stringView + "C string" + stringView);
108     EXPECT_N_WTF_STRING_COPIES(0, literal + (stringView + "C string" + stringView));
109     EXPECT_N_WTF_STRING_COPIES(0, (literal + stringView) + ("C string" + stringView));
110     EXPECT_N_WTF_STRING_COPIES(0, "C string" + stringView + literal + stringView);
111     EXPECT_N_WTF_STRING_COPIES(0, "C string" + (stringView + literal + stringView));
112     EXPECT_N_WTF_STRING_COPIES(0, ("C string" + stringView) + (literal + stringView));
113
114     EXPECT_N_WTF_STRING_COPIES(2, literal + atomicString + "C string" + string + literal + stringView);
115     EXPECT_N_WTF_STRING_COPIES(2, literal + (atomicString + "C string" + string + literal + stringView));
116     EXPECT_N_WTF_STRING_COPIES(2, (literal + atomicString) + ("C string" + string) + (literal + stringView));
117     EXPECT_N_WTF_STRING_COPIES(2, "C string" + atomicString + literal + string + literal + stringView);
118     EXPECT_N_WTF_STRING_COPIES(2, "C string" + (atomicString + literal + string + literal + stringView));
119     EXPECT_N_WTF_STRING_COPIES(2, ("C string" + atomicString) + (literal + string) + (literal + stringView));
120
121     EXPECT_N_WTF_STRING_COPIES(2, literal + atomicString + "C string" + stringView + literal + string);
122     EXPECT_N_WTF_STRING_COPIES(2, literal + (atomicString + "C string" + stringView + literal + string));
123     EXPECT_N_WTF_STRING_COPIES(2, (literal + atomicString) + ("C string" + stringView) + (literal + string));
124     EXPECT_N_WTF_STRING_COPIES(2, "C string" + atomicString + literal + stringView + literal + string);
125     EXPECT_N_WTF_STRING_COPIES(2, "C string" + (atomicString + literal + stringView + literal + string));
126     EXPECT_N_WTF_STRING_COPIES(2, ("C string" + atomicString) + (literal + stringView) + (literal + string));
127
128     EXPECT_N_WTF_STRING_COPIES(2, literal + string + "C string" + atomicString + literal + stringView);
129     EXPECT_N_WTF_STRING_COPIES(2, literal + (string + "C string" + atomicString + literal + stringView));
130     EXPECT_N_WTF_STRING_COPIES(2, (literal + string) + ("C string" + atomicString) + (literal + stringView));
131     EXPECT_N_WTF_STRING_COPIES(2, "C string" + string + literal + atomicString + literal + stringView);
132     EXPECT_N_WTF_STRING_COPIES(2, "C string" + (string + literal + atomicString + literal + stringView));
133     EXPECT_N_WTF_STRING_COPIES(2, ("C string" + string) + (literal + atomicString) + (literal + stringView));
134
135     EXPECT_N_WTF_STRING_COPIES(2, literal + string + "C string" + stringView + literal + atomicString);
136     EXPECT_N_WTF_STRING_COPIES(2, literal + (string + "C string" + stringView + literal + atomicString));
137     EXPECT_N_WTF_STRING_COPIES(2, (literal + string) + ("C string" + stringView) + (literal + atomicString));
138     EXPECT_N_WTF_STRING_COPIES(2, "C string" + string + literal + stringView + literal + atomicString);
139     EXPECT_N_WTF_STRING_COPIES(2, "C string" + (string + literal + stringView + literal + atomicString));
140     EXPECT_N_WTF_STRING_COPIES(2, ("C string" + string) + (literal + stringView) + (literal + atomicString));
141
142     EXPECT_N_WTF_STRING_COPIES(2, literal + stringView + "C string" + atomicString + literal + string);
143     EXPECT_N_WTF_STRING_COPIES(2, literal + (stringView + "C string" + atomicString + literal + string));
144     EXPECT_N_WTF_STRING_COPIES(2, (literal + stringView) + ("C string" + atomicString) + (literal + string));
145     EXPECT_N_WTF_STRING_COPIES(2, "C string" + stringView + literal + atomicString + literal + string);
146     EXPECT_N_WTF_STRING_COPIES(2, "C string" + (stringView + literal + atomicString + literal + string));
147     EXPECT_N_WTF_STRING_COPIES(2, ("C string" + stringView) + (literal + atomicString) + (literal + string));
148
149     EXPECT_N_WTF_STRING_COPIES(2, literal + stringView + "C string" + string + literal + atomicString);
150     EXPECT_N_WTF_STRING_COPIES(2, literal + (stringView + "C string" + string + literal + atomicString));
151     EXPECT_N_WTF_STRING_COPIES(2, (literal + stringView) + ("C string" + string) + (literal + atomicString));
152     EXPECT_N_WTF_STRING_COPIES(2, "C string" + stringView + literal + string + literal + atomicString);
153     EXPECT_N_WTF_STRING_COPIES(2, "C string" + (stringView + literal + string + literal + atomicString));
154     EXPECT_N_WTF_STRING_COPIES(2, ("C string" + stringView) + (literal + string) + (literal + atomicString));
155
156     EXPECT_N_WTF_STRING_COPIES(2, "C string" + atomicString + "C string" + atomicString);
157     EXPECT_N_WTF_STRING_COPIES(2, "C string" + (atomicString + "C string" + atomicString));
158     EXPECT_N_WTF_STRING_COPIES(2, ("C string" + atomicString) + ("C string" + atomicString));
159     EXPECT_N_WTF_STRING_COPIES(2, atomicString + "C string" + atomicString + "C string");
160     EXPECT_N_WTF_STRING_COPIES(2, atomicString + ("C string" + atomicString + "C string"));
161     EXPECT_N_WTF_STRING_COPIES(2, (atomicString + "C string") + (atomicString + "C string"));
162
163     EXPECT_N_WTF_STRING_COPIES(2, literal + atomicString + literal + atomicString);
164     EXPECT_N_WTF_STRING_COPIES(2, literal + (atomicString + literal + atomicString));
165     EXPECT_N_WTF_STRING_COPIES(2, (literal + atomicString) + (literal + atomicString));
166     EXPECT_N_WTF_STRING_COPIES(2, atomicString + literal + atomicString + literal);
167     EXPECT_N_WTF_STRING_COPIES(2, atomicString + (literal + atomicString + literal));
168     EXPECT_N_WTF_STRING_COPIES(2, (atomicString + literal) + (atomicString + literal));
169
170     EXPECT_N_WTF_STRING_COPIES(2, "C string" + string + "C string" + atomicString + "C string" + stringView);
171     EXPECT_N_WTF_STRING_COPIES(2, "C string" + (string + "C string" + atomicString + "C string" + stringView));
172     EXPECT_N_WTF_STRING_COPIES(2, ("C string" + string) + ("C string" + atomicString) + ("C string" + stringView));
173     EXPECT_N_WTF_STRING_COPIES(2, string + "C string" + atomicString + "C string" + stringView + "C string");
174     EXPECT_N_WTF_STRING_COPIES(2, string + ("C string" + atomicString + "C string" + stringView + "C string"));
175     EXPECT_N_WTF_STRING_COPIES(2, (string + "C string") + (atomicString + "C string") + (stringView + "C string"));
176
177     EXPECT_N_WTF_STRING_COPIES(2, literal + string + literal + atomicString + literal + stringView);
178     EXPECT_N_WTF_STRING_COPIES(2, literal + (string + literal + atomicString + literal + stringView));
179     EXPECT_N_WTF_STRING_COPIES(2, (literal + string) + (literal + atomicString) + (literal + stringView));
180     EXPECT_N_WTF_STRING_COPIES(2, string + literal + atomicString + literal + stringView + literal);
181     EXPECT_N_WTF_STRING_COPIES(2, string + (literal + atomicString + literal + stringView + literal));
182     EXPECT_N_WTF_STRING_COPIES(2, (string + literal) + (atomicString + literal) + (stringView + literal));
183
184     EXPECT_N_WTF_STRING_COPIES(2, "C string" + string + "C string" + stringView + "C string" + atomicString);
185     EXPECT_N_WTF_STRING_COPIES(2, "C string" + (string + "C string" + stringView + "C string" + atomicString));
186     EXPECT_N_WTF_STRING_COPIES(2, ("C string" + string) + ("C string" + stringView) + ("C string" + atomicString));
187     EXPECT_N_WTF_STRING_COPIES(2, string + "C string" + stringView + "C string" + atomicString + "C string");
188     EXPECT_N_WTF_STRING_COPIES(2, string + ("C string" + stringView + "C string" + atomicString + "C string"));
189     EXPECT_N_WTF_STRING_COPIES(2, (string + "C string") + (stringView + "C string") + (atomicString + "C string"));
190
191     EXPECT_N_WTF_STRING_COPIES(2, literal + string + literal + stringView + literal + atomicString);
192     EXPECT_N_WTF_STRING_COPIES(2, literal + (string + literal + stringView + literal + atomicString));
193     EXPECT_N_WTF_STRING_COPIES(2, (literal + string) + (literal + stringView) + (literal + atomicString));
194     EXPECT_N_WTF_STRING_COPIES(2, string + literal + stringView + literal + atomicString + literal);
195     EXPECT_N_WTF_STRING_COPIES(2, string + (literal + stringView + literal + atomicString + literal));
196     EXPECT_N_WTF_STRING_COPIES(2, (string + literal) + (stringView + literal) + (atomicString + literal));
197
198     EXPECT_N_WTF_STRING_COPIES(2, "C string" + atomicString + "C string" + string + "C string" + stringView);
199     EXPECT_N_WTF_STRING_COPIES(2, "C string" + (atomicString + "C string" + string + "C string" + stringView));
200     EXPECT_N_WTF_STRING_COPIES(2, ("C string" + atomicString) + ("C string" + string) + ("C string" + stringView));
201     EXPECT_N_WTF_STRING_COPIES(2, atomicString + "C string" + string + "C string" + stringView + "C string");
202     EXPECT_N_WTF_STRING_COPIES(2, atomicString + ("C string" + string + "C string" + stringView + "C string"));
203     EXPECT_N_WTF_STRING_COPIES(2, (atomicString + "C string") + (string + "C string") + (stringView + "C string"));
204
205     EXPECT_N_WTF_STRING_COPIES(2, literal + atomicString + literal + string + literal + stringView);
206     EXPECT_N_WTF_STRING_COPIES(2, literal + (atomicString + literal + string + literal + stringView));
207     EXPECT_N_WTF_STRING_COPIES(2, (literal + atomicString) + (literal + string) + (literal + stringView));
208     EXPECT_N_WTF_STRING_COPIES(2, atomicString + literal + string + literal + stringView + literal);
209     EXPECT_N_WTF_STRING_COPIES(2, atomicString + (literal + string + literal + stringView + literal));
210     EXPECT_N_WTF_STRING_COPIES(2, (atomicString + literal) + (string + literal) + (stringView + literal));
211
212     EXPECT_N_WTF_STRING_COPIES(2, "C string" + atomicString + "C string" + stringView + "C string" + string);
213     EXPECT_N_WTF_STRING_COPIES(2, "C string" + (atomicString + "C string" + stringView + "C string" + string));
214     EXPECT_N_WTF_STRING_COPIES(2, ("C string" + atomicString) + ("C string" + stringView) + ("C string" + string));
215     EXPECT_N_WTF_STRING_COPIES(2, atomicString + "C string" + stringView + "C string" + string + "C string");
216     EXPECT_N_WTF_STRING_COPIES(2, atomicString + ("C string" + stringView + "C string" + string + "C string"));
217     EXPECT_N_WTF_STRING_COPIES(2, (atomicString + "C string") + (stringView + "C string") + (string + "C string"));
218
219     EXPECT_N_WTF_STRING_COPIES(2, literal + atomicString + literal + stringView + literal + string);
220     EXPECT_N_WTF_STRING_COPIES(2, literal + (atomicString + literal + stringView + literal + string));
221     EXPECT_N_WTF_STRING_COPIES(2, (literal + atomicString) + (literal + stringView) + (literal + string));
222     EXPECT_N_WTF_STRING_COPIES(2, atomicString + literal + stringView + literal + string + literal);
223     EXPECT_N_WTF_STRING_COPIES(2, atomicString + (literal + stringView + literal + string + literal));
224     EXPECT_N_WTF_STRING_COPIES(2, (atomicString + literal) + (stringView + literal) + (string + literal));
225
226     EXPECT_N_WTF_STRING_COPIES(2, "C string" + stringView + "C string" + atomicString + "C string" + string);
227     EXPECT_N_WTF_STRING_COPIES(2, "C string" + (stringView + "C string" + atomicString + "C string" + string));
228     EXPECT_N_WTF_STRING_COPIES(2, ("C string" + stringView) + ("C string" + atomicString) + ("C string" + string));
229     EXPECT_N_WTF_STRING_COPIES(2, stringView + "C string" + atomicString + "C string" + string + "C string");
230     EXPECT_N_WTF_STRING_COPIES(2, stringView + ("C string" + atomicString + "C string" + string + "C string"));
231     EXPECT_N_WTF_STRING_COPIES(2, (stringView + "C string") + (atomicString + "C string") + (string + "C string"));
232
233     EXPECT_N_WTF_STRING_COPIES(2, literal + stringView + literal + atomicString + literal + string);
234     EXPECT_N_WTF_STRING_COPIES(2, literal + (stringView + literal + atomicString + literal + string));
235     EXPECT_N_WTF_STRING_COPIES(2, (literal + stringView) + (literal + atomicString) + (literal + string));
236     EXPECT_N_WTF_STRING_COPIES(2, stringView + literal + atomicString + literal + string + literal);
237     EXPECT_N_WTF_STRING_COPIES(2, stringView + (literal + atomicString + literal + string + literal));
238     EXPECT_N_WTF_STRING_COPIES(2, (stringView + literal) + (atomicString + literal) + (string + literal));
239
240     EXPECT_N_WTF_STRING_COPIES(2, "C string" + stringView + "C string" + string + "C string" + atomicString);
241     EXPECT_N_WTF_STRING_COPIES(2, "C string" + (stringView + "C string" + string + "C string" + atomicString));
242     EXPECT_N_WTF_STRING_COPIES(2, ("C string" + stringView) + ("C string" + string) + ("C string" + atomicString));
243     EXPECT_N_WTF_STRING_COPIES(2, stringView + "C string" + string + "C string" + atomicString + "C string");
244     EXPECT_N_WTF_STRING_COPIES(2, stringView + ("C string" + string + "C string" + atomicString + "C string"));
245     EXPECT_N_WTF_STRING_COPIES(2, (stringView + "C string") + (string + "C string") + (atomicString + "C string"));
246
247     EXPECT_N_WTF_STRING_COPIES(2, literal + stringView + literal + string + literal + atomicString);
248     EXPECT_N_WTF_STRING_COPIES(2, literal + (stringView + literal + string + literal + atomicString));
249     EXPECT_N_WTF_STRING_COPIES(2, (literal + stringView) + (literal + string) + (literal + atomicString));
250     EXPECT_N_WTF_STRING_COPIES(2, stringView + literal + string + literal + atomicString + literal);
251     EXPECT_N_WTF_STRING_COPIES(2, stringView + (literal + string + literal + atomicString + literal));
252     EXPECT_N_WTF_STRING_COPIES(2, (stringView + literal) + (string + literal) + (atomicString + literal));
253
254 #if COMPILER(MSVC)
255     EXPECT_N_WTF_STRING_COPIES(1, L"wide string" + string);
256     EXPECT_N_WTF_STRING_COPIES(1, string + L"wide string");
257     EXPECT_N_WTF_STRING_COPIES(1, L"wide string" + atomicString);
258     EXPECT_N_WTF_STRING_COPIES(1, atomicString + L"wide string");
259     EXPECT_N_WTF_STRING_COPIES(0, L"wide string" + stringView);
260     EXPECT_N_WTF_STRING_COPIES(0, stringView + L"wide string");
261
262     EXPECT_N_WTF_STRING_COPIES(2, L"wide string" + string + L"wide string" + string);
263     EXPECT_N_WTF_STRING_COPIES(2, L"wide string" + (string + L"wide string" + string));
264     EXPECT_N_WTF_STRING_COPIES(2, (L"wide string" + string) + (L"wide string" + string));
265     EXPECT_N_WTF_STRING_COPIES(2, string + L"wide string" + string + L"wide string");
266     EXPECT_N_WTF_STRING_COPIES(2, string + (L"wide string" + string + L"wide string"));
267     EXPECT_N_WTF_STRING_COPIES(2, (string + L"wide string") + (string + L"wide string"));
268
269     EXPECT_N_WTF_STRING_COPIES(2, L"wide string" + atomicString + L"wide string" + atomicString);
270     EXPECT_N_WTF_STRING_COPIES(2, L"wide string" + (atomicString + L"wide string" + atomicString));
271     EXPECT_N_WTF_STRING_COPIES(2, (L"wide string" + atomicString) + (L"wide string" + atomicString));
272     EXPECT_N_WTF_STRING_COPIES(2, atomicString + L"wide string" + atomicString + L"wide string");
273     EXPECT_N_WTF_STRING_COPIES(2, atomicString + (L"wide string" + atomicString + L"wide string"));
274     EXPECT_N_WTF_STRING_COPIES(2, (atomicString + L"wide string") + (atomicString + L"wide string"));
275
276     EXPECT_N_WTF_STRING_COPIES(0, L"wide string" + stringView + L"wide string" + stringView);
277     EXPECT_N_WTF_STRING_COPIES(0, L"wide string" + (stringView + L"wide string" + stringView));
278     EXPECT_N_WTF_STRING_COPIES(0, (L"wide string" + stringView) + (L"wide string" + stringView));
279     EXPECT_N_WTF_STRING_COPIES(0, stringView + L"wide string" + stringView + L"wide string");
280     EXPECT_N_WTF_STRING_COPIES(0, stringView + (L"wide string" + stringView + L"wide string"));
281     EXPECT_N_WTF_STRING_COPIES(0, (stringView + L"wide string") + (stringView + L"wide string"));
282
283     EXPECT_N_WTF_STRING_COPIES(2, L"wide string" + string + L"wide string" + atomicString + L"wide string" + stringView);
284     EXPECT_N_WTF_STRING_COPIES(2, L"wide string" + (string + L"wide string" + atomicString + L"wide string" + stringView));
285     EXPECT_N_WTF_STRING_COPIES(2, (L"wide string" + string) + (L"wide string" + atomicString) + (L"wide string" + stringView));
286     EXPECT_N_WTF_STRING_COPIES(2, string + L"wide string" + atomicString + L"wide string" + stringView + L"wide string");
287     EXPECT_N_WTF_STRING_COPIES(2, string + (L"wide string" + atomicString + L"wide string" + stringView + L"wide string"));
288     EXPECT_N_WTF_STRING_COPIES(2, (string + L"wide string") + (atomicString + L"wide string") + (stringView + L"wide string"));
289
290     EXPECT_N_WTF_STRING_COPIES(2, L"wide string" + string + L"wide string" + stringView + L"wide string" + atomicString);
291     EXPECT_N_WTF_STRING_COPIES(2, L"wide string" + (string + L"wide string" + stringView + L"wide string" + atomicString));
292     EXPECT_N_WTF_STRING_COPIES(2, (L"wide string" + string) + (L"wide string" + stringView) + (L"wide string" + atomicString));
293     EXPECT_N_WTF_STRING_COPIES(2, string + L"wide string" + stringView + L"wide string" + atomicString + L"wide string");
294     EXPECT_N_WTF_STRING_COPIES(2, string + (L"wide string" + stringView + L"wide string" + atomicString + L"wide string"));
295     EXPECT_N_WTF_STRING_COPIES(2, (string + L"wide string") + (stringView + L"wide string") + (atomicString + L"wide string"));
296
297     EXPECT_N_WTF_STRING_COPIES(2, L"wide string" + atomicString + L"wide string" + string + L"wide string" + stringView);
298     EXPECT_N_WTF_STRING_COPIES(2, L"wide string" + (atomicString + L"wide string" + string + L"wide string" + stringView));
299     EXPECT_N_WTF_STRING_COPIES(2, (L"wide string" + atomicString) + (L"wide string" + string) + (L"wide string" + stringView));
300     EXPECT_N_WTF_STRING_COPIES(2, atomicString + L"wide string" + string + L"wide string" + stringView + L"wide string");
301     EXPECT_N_WTF_STRING_COPIES(2, atomicString + (L"wide string" + string + L"wide string" + stringView + L"wide string"));
302     EXPECT_N_WTF_STRING_COPIES(2, (atomicString + L"wide string") + (string + L"wide string") + (stringView + L"wide string"));
303
304     EXPECT_N_WTF_STRING_COPIES(2, L"wide string" + atomicString + L"wide string" + stringView + L"wide string" + string);
305     EXPECT_N_WTF_STRING_COPIES(2, L"wide string" + (atomicString + L"wide string" + stringView + L"wide string" + string));
306     EXPECT_N_WTF_STRING_COPIES(2, (L"wide string" + atomicString) + (L"wide string" + stringView) + (L"wide string" + string));
307     EXPECT_N_WTF_STRING_COPIES(2, atomicString + L"wide string" + stringView + L"wide string" + string + L"wide string");
308     EXPECT_N_WTF_STRING_COPIES(2, atomicString + (L"wide string" + stringView + L"wide string" + string + L"wide string"));
309     EXPECT_N_WTF_STRING_COPIES(2, (atomicString + L"wide string") + (stringView + L"wide string") + (string + L"wide string"));
310
311     EXPECT_N_WTF_STRING_COPIES(2, L"wide string" + stringView + L"wide string" + atomicString + L"wide string" + string);
312     EXPECT_N_WTF_STRING_COPIES(2, L"wide string" + (stringView + L"wide string" + atomicString + L"wide string" + string));
313     EXPECT_N_WTF_STRING_COPIES(2, (L"wide string" + stringView) + (L"wide string" + atomicString) + (L"wide string" + string));
314     EXPECT_N_WTF_STRING_COPIES(2, stringView + L"wide string" + atomicString + L"wide string" + string + L"wide string");
315     EXPECT_N_WTF_STRING_COPIES(2, stringView + (L"wide string" + atomicString + L"wide string" + string + L"wide string"));
316     EXPECT_N_WTF_STRING_COPIES(2, (stringView + L"wide string") + (atomicString + L"wide string") + (string + L"wide string"));
317
318     EXPECT_N_WTF_STRING_COPIES(2, L"wide string" + stringView + L"wide string" + string + L"wide string" + atomicString);
319     EXPECT_N_WTF_STRING_COPIES(2, L"wide string" + (stringView + L"wide string" + string + L"wide string" + atomicString));
320     EXPECT_N_WTF_STRING_COPIES(2, (L"wide string" + stringView) + (L"wide string" + string) + (L"wide string" + atomicString));
321     EXPECT_N_WTF_STRING_COPIES(2, stringView + L"wide string" + string + L"wide string" + atomicString + L"wide string");
322     EXPECT_N_WTF_STRING_COPIES(2, stringView + (L"wide string" + string + L"wide string" + atomicString + L"wide string"));
323     EXPECT_N_WTF_STRING_COPIES(2, (stringView + L"wide string") + (string + L"wide string") + (atomicString + L"wide string"));
324 #endif
325 }
326
327 TEST(WTF, ConcatenateCharacterArrayAndEmptyString)
328 {
329     String emptyString;
330     EXPECT_EQ(static_cast<unsigned>(0), emptyString.length());
331
332     UChar ucharArray[] = { 't', 'e', 's', 't', '\0' };
333     String concatenation16 = ucharArray + emptyString;
334     ASSERT_EQ(static_cast<unsigned>(4), concatenation16.length());
335     ASSERT_TRUE(concatenation16 == String(ucharArray));
336
337     LChar lcharArray[] = { 't', 'e', 's', 't', '\0' };
338     String concatenation8 = lcharArray + emptyString;
339     ASSERT_EQ(static_cast<unsigned>(4), concatenation8.length());
340     ASSERT_TRUE(concatenation8 == String(lcharArray));
341 }
342
343 } // namespace TestWebKitAPI