Coverage Report

Created: 2018-09-25 14:53

/src/mozilla-central/xpcom/tests/gtest/TestStrings.cpp
Line
Count
Source (jump to first uncovered line)
1
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
3
/* This Source Code Form is subject to the terms of the Mozilla Public
4
 * License, v. 2.0. If a copy of the MPL was not distributed with this
5
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
6
7
#include <stdio.h>
8
#include <stdlib.h>
9
#include "nsASCIIMask.h"
10
#include "nsString.h"
11
#include "nsStringBuffer.h"
12
#include "nsReadableUtils.h"
13
#include "nsCRTGlue.h"
14
#include "mozilla/RefPtr.h"
15
#include "mozilla/Unused.h"
16
#include "nsTArray.h"
17
#include "gtest/gtest.h"
18
#include "gtest/MozGTestBench.h" // For MOZ_GTEST_BENCH
19
#include "gtest/BlackBox.h"
20
#include "nsBidiUtils.h"
21
22
#define CONVERSION_ITERATIONS 50000
23
24
#define CONVERSION_BENCH(name, func, src, dstType) \
25
MOZ_GTEST_BENCH_F(Strings, name, [this] { \
26
    for (int i = 0; i < CONVERSION_ITERATIONS; i++) { \
27
      dstType dst; \
28
      func(*BlackBox(&src), *BlackBox(&dst)); \
29
    } \
30
}); \
31
32
namespace TestStrings {
33
34
using mozilla::fallible;
35
using mozilla::BlackBox;
36
37
0
#define TestExample1 "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium,\n totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi\r architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur\n aut odit aut fugit, sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam est, qui\r\n\r dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora incidunt ut labore et dolore magnam aliquam quaerat voluptatem. Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur? Quis autem vel eum iure reprehenderit qui in ea voluptate velit esse quam nihil molestiae consequatur, vel illum qui dolorem eum fugiat quo voluptas nulla pariatur?"
38
39
0
#define TestExample2 "At vero eos et accusamus et iusto odio dignissimos ducimus\n\n qui blanditiis praesentium voluptatum deleniti atque corrupti quos dolores et quas molestias excepturi sint occaecati cupiditate non provident, similique sunt in culpa qui officia deserunt\r\r  \n mollitia animi, id est laborum et dolorum fuga. Et harum quidem rerum facilis est et expedita distinctio. Nam libero tempore, cum soluta nobis est eligendi optio cumque nihil impedit quo minus id quod maxime placeat facere possimus, omnis voluptas assumenda       est, omnis dolor repellendus. Temporibus autem quibusdam et aut officiis debitis aut rerum necessitatibus saepe eveniet ut et voluptates repudiandae sint et molestiae non recusandae. Itaque earum rerum hic tenetur a sapiente delectus, ut aut reiciendis voluptatibus maiores alias consequatur aut perferendis doloribus asperiores repellat."
40
41
0
#define TestExample3 " Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis ac tellus eget velit viverra viverra id sit amet neque. Sed id consectetur mi, vestibulum aliquet arcu. Curabitur sagittis accumsan convallis. Sed eu condimentum ipsum, a laoreet tortor. Orci varius natoque penatibus et magnis dis    \r\r\n\n parturient montes, nascetur ridiculus mus. Sed non tellus nec ante sodales placerat a nec risus. Cras vel bibendum sapien, nec ullamcorper felis. Pellentesque congue eget nisi sit amet vehicula. Morbi pulvinar turpis justo, in commodo dolor vulputate id. Curabitur in dui urna. Vestibulum placerat dui in sem congue, ut faucibus nibh rutrum. Duis mattis turpis facilisis ullamcorper tincidunt. Vestibulum pharetra tortor at enim sagittis, dapibus consectetur ex blandit. Curabitur ac fringilla quam. In ornare lectus ut ipsum mattis venenatis. Etiam in mollis lectus, sed luctus risus.\nCras dapibus\f\t  \n finibus justo sit amet dictum. Aliquam non elit diam. Fusce magna nulla, bibendum in massa a, commodo finibus lectus. Sed rutrum a augue id imperdiet. Aliquam sagittis sodales felis, a tristique ligula. Aliquam erat volutpat. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Duis volutpat interdum lorem et congue. Phasellus porttitor posuere justo eget euismod. Nam a condimentum turpis, sit amet gravida lacus. Vestibulum dolor diam, lobortis ac metus et, convallis dapibus tellus. Ut nec metus in velit malesuada tincidunt et eget justo. Curabitur ut libero bibendum, porttitor diam vitae, aliquet justo. "
42
43
0
#define TestExample4 " Donec feugiat volutpat massa. Cras ornare lacinia porta. Fusce in feugiat nunc. Praesent non felis varius diam feugiat ultrices ultricies a risus. Donec maximus nisi nisl, non consectetur nulla eleifend in. Nulla in massa interdum, eleifend orci a, vestibulum est. Mauris aliquet, massa et convallis mollis, felis augue vestibulum augue, in lobortis metus eros a quam. Nam              ac diam ornare, vestibulum elit sit amet, consectetur ante. Praesent massa mauris, pulvinar sit amet sapien vel, tempus gravida neque. Praesent id quam sit amet est maximus molestie eget at turpis. Nunc sit amet orci id arcu dapibus fermentum non eu erat.\f\tSuspendisse commodo nunc sem, eu congue eros condimentum vel. Nullam sit amet posuere arcu. Nulla facilisi. Mauris dapibus iaculis massa sed gravida. Nullam vitae urna at tortor feugiat auctor ut sit amet dolor. Proin rutrum at nunc et faucibus. Quisque suscipit id nibh a aliquet. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Aliquam a dapibus erat, id imperdiet mauris. Nulla blandit libero non magna dapibus tristique. Integer hendrerit imperdiet lorem, quis facilisis lacus semper ut. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae Nullam dignissim elit in congue ultricies. Quisque erat odio, maximus mollis laoreet id, iaculis at turpis. "
44
45
0
#define TestExample5 "Donec id risus urna. Nunc consequat lacinia urna id bibendum. Nulla faucibus faucibus enim. Cras ex risus, ultrices id semper vitae, luctus ut nulla. Sed vehicula tellus sed purus imperdiet efficitur. Suspendisse feugiat\n\n\n     imperdiet odio, sed porta lorem feugiat nec. Curabitur laoreet massa venenatis\r\n risus ornare\r\n, vitae feugiat tortor accumsan. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas id scelerisque mauris, eget facilisis erat. Ut nec pulvinar risus, sed iaculis ante. Mauris tincidunt, risus et pretium elementum, leo nisi consectetur ligula, tincidunt suscipit erat velit eget libero. Sed ac est tempus, consequat dolor mattis, mattis mi. "
46
47
// Originally ReadVPXFile in TestVPXDecoding.cpp
48
static void
49
ReadFile(const char* aPath, nsACString& aBuffer)
50
0
{
51
0
  FILE* f = fopen(aPath, "rb");
52
0
  ASSERT_NE(f, (FILE *) nullptr);
53
0
54
0
  int r = fseek(f, 0, SEEK_END);
55
0
  ASSERT_EQ(r, 0);
56
0
57
0
  long size = ftell(f);
58
0
  ASSERT_NE(size, -1);
59
0
  aBuffer.SetLength(size);
60
0
61
0
  r = fseek(f, 0, SEEK_SET);
62
0
  ASSERT_EQ(r, 0);
63
0
64
0
  size_t got = fread(aBuffer.BeginWriting(), 1, size, f);
65
0
  ASSERT_EQ(got, size_t(size));
66
0
67
0
  r = fclose(f);
68
0
  ASSERT_EQ(r, 0);
69
0
}
70
71
class Strings : public ::testing::Test {
72
protected:
73
0
  void SetUp() override {
74
0
    // Intentionally AssignASCII and not AssignLiteral
75
0
    // to simulate the usual heap case.
76
0
    mExample1Utf8.AssignASCII(TestExample1);
77
0
    mExample2Utf8.AssignASCII(TestExample2);
78
0
    mExample3Utf8.AssignASCII(TestExample3);
79
0
    mExample4Utf8.AssignASCII(TestExample4);
80
0
    mExample5Utf8.AssignASCII(TestExample5);
81
0
82
0
    // Use span to make the resulting string as ordinary as possible
83
0
    mAsciiOneUtf8.Append(MakeSpan(mExample3Utf8).To(1));
84
0
    mAsciiThreeUtf8.Append(MakeSpan(mExample3Utf8).To(3));
85
0
    mAsciiFifteenUtf8.Append(MakeSpan(mExample3Utf8).To(15));
86
0
    mAsciiHundredUtf8.Append(MakeSpan(mExample3Utf8).To(100));
87
0
    mAsciiThousandUtf8.Append(MakeSpan(mExample3Utf8).To(1000));
88
0
89
0
    ReadFile("ar.txt", mArUtf8);
90
0
    ReadFile("de.txt", mDeUtf8);
91
0
    ReadFile("de-edit.txt", mDeEditUtf8);
92
0
    ReadFile("ru.txt", mRuUtf8);
93
0
    ReadFile("th.txt", mThUtf8);
94
0
    ReadFile("ko.txt", mKoUtf8);
95
0
    ReadFile("ja.txt", mJaUtf8);
96
0
    ReadFile("tr.txt", mTrUtf8);
97
0
    ReadFile("vi.txt", mViUtf8);
98
0
99
0
    CopyASCIItoUTF16(mExample1Utf8, mExample1Utf16);
100
0
    CopyASCIItoUTF16(mExample2Utf8, mExample2Utf16);
101
0
    CopyASCIItoUTF16(mExample3Utf8, mExample3Utf16);
102
0
    CopyASCIItoUTF16(mExample4Utf8, mExample4Utf16);
103
0
    CopyASCIItoUTF16(mExample5Utf8, mExample5Utf16);
104
0
105
0
    CopyASCIItoUTF16(mAsciiOneUtf8, mAsciiOneUtf16);
106
0
    CopyASCIItoUTF16(mAsciiFifteenUtf8, mAsciiFifteenUtf16);
107
0
    CopyASCIItoUTF16(mAsciiHundredUtf8, mAsciiHundredUtf16);
108
0
    CopyASCIItoUTF16(mAsciiThousandUtf8, mAsciiThousandUtf16);
109
0
110
0
    CopyUTF8toUTF16(mArUtf8, mArUtf16);
111
0
    CopyUTF8toUTF16(mDeUtf8, mDeUtf16);
112
0
    CopyUTF8toUTF16(mDeEditUtf8, mDeEditUtf16);
113
0
    CopyUTF8toUTF16(mRuUtf8, mRuUtf16);
114
0
    CopyUTF8toUTF16(mThUtf8, mThUtf16);
115
0
    CopyUTF8toUTF16(mJaUtf8, mJaUtf16);
116
0
    CopyUTF8toUTF16(mKoUtf8, mKoUtf16);
117
0
    CopyUTF8toUTF16(mTrUtf8, mTrUtf16);
118
0
    CopyUTF8toUTF16(mViUtf8, mViUtf16);
119
0
120
0
    LossyCopyUTF16toASCII(mDeEditUtf16, mDeEditLatin1);
121
0
122
0
    // Use span to make the resulting string as ordinary as possible
123
0
    mArOneUtf16.Append(MakeSpan(mArUtf16).To(1));
124
0
    mDeOneUtf16.Append(MakeSpan(mDeUtf16).To(1));
125
0
    mDeEditOneUtf16.Append(MakeSpan(mDeEditUtf16).To(1));
126
0
    mRuOneUtf16.Append(MakeSpan(mRuUtf16).To(1));
127
0
    mThOneUtf16.Append(MakeSpan(mThUtf16).To(1));
128
0
    mJaOneUtf16.Append(MakeSpan(mJaUtf16).To(1));
129
0
    mKoOneUtf16.Append(MakeSpan(mKoUtf16).To(1));
130
0
    mTrOneUtf16.Append(MakeSpan(mTrUtf16).To(1));
131
0
    mViOneUtf16.Append(MakeSpan(mViUtf16).To(1));
132
0
133
0
    mDeEditOneLatin1.Append(MakeSpan(mDeEditLatin1).To(1));
134
0
135
0
    mArThreeUtf16.Append(MakeSpan(mArUtf16).To(3));
136
0
    mDeThreeUtf16.Append(MakeSpan(mDeUtf16).To(3));
137
0
    mDeEditThreeUtf16.Append(MakeSpan(mDeEditUtf16).To(3));
138
0
    mRuThreeUtf16.Append(MakeSpan(mRuUtf16).To(3));
139
0
    mThThreeUtf16.Append(MakeSpan(mThUtf16).To(3));
140
0
    mJaThreeUtf16.Append(MakeSpan(mJaUtf16).To(3));
141
0
    mKoThreeUtf16.Append(MakeSpan(mKoUtf16).To(3));
142
0
    mTrThreeUtf16.Append(MakeSpan(mTrUtf16).To(3));
143
0
    mViThreeUtf16.Append(MakeSpan(mViUtf16).To(3));
144
0
145
0
    mDeEditThreeLatin1.Append(MakeSpan(mDeEditLatin1).To(3));
146
0
147
0
    mArFifteenUtf16.Append(MakeSpan(mArUtf16).To(15));
148
0
    mDeFifteenUtf16.Append(MakeSpan(mDeUtf16).To(15));
149
0
    mDeEditFifteenUtf16.Append(MakeSpan(mDeEditUtf16).To(15));
150
0
    mRuFifteenUtf16.Append(MakeSpan(mRuUtf16).To(15));
151
0
    mThFifteenUtf16.Append(MakeSpan(mThUtf16).To(15));
152
0
    mJaFifteenUtf16.Append(MakeSpan(mJaUtf16).To(15));
153
0
    mKoFifteenUtf16.Append(MakeSpan(mKoUtf16).To(15));
154
0
    mTrFifteenUtf16.Append(MakeSpan(mTrUtf16).To(15));
155
0
    mViFifteenUtf16.Append(MakeSpan(mViUtf16).To(15));
156
0
157
0
    mDeEditFifteenLatin1.Append(MakeSpan(mDeEditLatin1).To(15));
158
0
159
0
    mArHundredUtf16.Append(MakeSpan(mArUtf16).To(100));
160
0
    mDeHundredUtf16.Append(MakeSpan(mDeUtf16).To(100));
161
0
    mDeEditHundredUtf16.Append(MakeSpan(mDeEditUtf16).To(100));
162
0
    mRuHundredUtf16.Append(MakeSpan(mRuUtf16).To(100));
163
0
    mThHundredUtf16.Append(MakeSpan(mThUtf16).To(100));
164
0
    mJaHundredUtf16.Append(MakeSpan(mJaUtf16).To(100));
165
0
    mKoHundredUtf16.Append(MakeSpan(mKoUtf16).To(100));
166
0
    mTrHundredUtf16.Append(MakeSpan(mTrUtf16).To(100));
167
0
    mViHundredUtf16.Append(MakeSpan(mViUtf16).To(100));
168
0
169
0
    mDeEditHundredLatin1.Append(MakeSpan(mDeEditLatin1).To(100));
170
0
171
0
    mArThousandUtf16.Append(MakeSpan(mArUtf16).To(1000));
172
0
    mDeThousandUtf16.Append(MakeSpan(mDeUtf16).To(1000));
173
0
    mDeEditThousandUtf16.Append(MakeSpan(mDeEditUtf16).To(1000));
174
0
    mRuThousandUtf16.Append(MakeSpan(mRuUtf16).To(1000));
175
0
    mThThousandUtf16.Append(MakeSpan(mThUtf16).To(1000));
176
0
    mJaThousandUtf16.Append(MakeSpan(mJaUtf16).To(1000));
177
0
    mKoThousandUtf16.Append(MakeSpan(mKoUtf16).To(1000));
178
0
    mTrThousandUtf16.Append(MakeSpan(mTrUtf16).To(1000));
179
0
    mViThousandUtf16.Append(MakeSpan(mViUtf16).To(1000));
180
0
181
0
    mDeEditThousandLatin1.Append(MakeSpan(mDeEditLatin1).To(1000));
182
0
183
0
    CopyUTF16toUTF8(mArOneUtf16, mArOneUtf8);
184
0
    CopyUTF16toUTF8(mDeOneUtf16, mDeOneUtf8);
185
0
    CopyUTF16toUTF8(mDeEditOneUtf16, mDeEditOneUtf8);
186
0
    CopyUTF16toUTF8(mRuOneUtf16, mRuOneUtf8);
187
0
    CopyUTF16toUTF8(mThOneUtf16, mThOneUtf8);
188
0
    CopyUTF16toUTF8(mJaOneUtf16, mJaOneUtf8);
189
0
    CopyUTF16toUTF8(mKoOneUtf16, mKoOneUtf8);
190
0
    CopyUTF16toUTF8(mTrOneUtf16, mTrOneUtf8);
191
0
    CopyUTF16toUTF8(mViOneUtf16, mViOneUtf8);
192
0
193
0
    CopyUTF16toUTF8(mArThreeUtf16, mArThreeUtf8);
194
0
    CopyUTF16toUTF8(mDeThreeUtf16, mDeThreeUtf8);
195
0
    CopyUTF16toUTF8(mDeEditThreeUtf16, mDeEditThreeUtf8);
196
0
    CopyUTF16toUTF8(mRuThreeUtf16, mRuThreeUtf8);
197
0
    CopyUTF16toUTF8(mThThreeUtf16, mThThreeUtf8);
198
0
    CopyUTF16toUTF8(mJaThreeUtf16, mJaThreeUtf8);
199
0
    CopyUTF16toUTF8(mKoThreeUtf16, mKoThreeUtf8);
200
0
    CopyUTF16toUTF8(mTrThreeUtf16, mTrThreeUtf8);
201
0
    CopyUTF16toUTF8(mViThreeUtf16, mViThreeUtf8);
202
0
203
0
    CopyUTF16toUTF8(mArFifteenUtf16, mArFifteenUtf8);
204
0
    CopyUTF16toUTF8(mDeFifteenUtf16, mDeFifteenUtf8);
205
0
    CopyUTF16toUTF8(mDeEditFifteenUtf16, mDeEditFifteenUtf8);
206
0
    CopyUTF16toUTF8(mRuFifteenUtf16, mRuFifteenUtf8);
207
0
    CopyUTF16toUTF8(mThFifteenUtf16, mThFifteenUtf8);
208
0
    CopyUTF16toUTF8(mJaFifteenUtf16, mJaFifteenUtf8);
209
0
    CopyUTF16toUTF8(mKoFifteenUtf16, mKoFifteenUtf8);
210
0
    CopyUTF16toUTF8(mTrFifteenUtf16, mTrFifteenUtf8);
211
0
    CopyUTF16toUTF8(mViFifteenUtf16, mViFifteenUtf8);
212
0
213
0
    CopyUTF16toUTF8(mArHundredUtf16, mArHundredUtf8);
214
0
    CopyUTF16toUTF8(mDeHundredUtf16, mDeHundredUtf8);
215
0
    CopyUTF16toUTF8(mDeEditHundredUtf16, mDeEditHundredUtf8);
216
0
    CopyUTF16toUTF8(mRuHundredUtf16, mRuHundredUtf8);
217
0
    CopyUTF16toUTF8(mThHundredUtf16, mThHundredUtf8);
218
0
    CopyUTF16toUTF8(mJaHundredUtf16, mJaHundredUtf8);
219
0
    CopyUTF16toUTF8(mKoHundredUtf16, mKoHundredUtf8);
220
0
    CopyUTF16toUTF8(mTrHundredUtf16, mTrHundredUtf8);
221
0
    CopyUTF16toUTF8(mViHundredUtf16, mViHundredUtf8);
222
0
223
0
    CopyUTF16toUTF8(mArThousandUtf16, mArThousandUtf8);
224
0
    CopyUTF16toUTF8(mDeThousandUtf16, mDeThousandUtf8);
225
0
    CopyUTF16toUTF8(mDeEditThousandUtf16, mDeEditThousandUtf8);
226
0
    CopyUTF16toUTF8(mRuThousandUtf16, mRuThousandUtf8);
227
0
    CopyUTF16toUTF8(mThThousandUtf16, mThThousandUtf8);
228
0
    CopyUTF16toUTF8(mJaThousandUtf16, mJaThousandUtf8);
229
0
    CopyUTF16toUTF8(mKoThousandUtf16, mKoThousandUtf8);
230
0
    CopyUTF16toUTF8(mTrThousandUtf16, mTrThousandUtf8);
231
0
    CopyUTF16toUTF8(mViThousandUtf16, mViThousandUtf8);
232
0
  }
233
public:
234
  nsCString mAsciiOneUtf8;
235
  nsCString mAsciiThreeUtf8;
236
  nsCString mAsciiFifteenUtf8;
237
  nsCString mAsciiHundredUtf8;
238
  nsCString mAsciiThousandUtf8;
239
  nsCString mExample1Utf8;
240
  nsCString mExample2Utf8;
241
  nsCString mExample3Utf8;
242
  nsCString mExample4Utf8;
243
  nsCString mExample5Utf8;
244
  nsCString mArUtf8;
245
  nsCString mDeUtf8;
246
  nsCString mDeEditUtf8;
247
  nsCString mRuUtf8;
248
  nsCString mThUtf8;
249
  nsCString mJaUtf8;
250
  nsCString mKoUtf8;
251
  nsCString mTrUtf8;
252
  nsCString mViUtf8;
253
254
  nsString mAsciiOneUtf16;
255
  nsString mAsciiThreeUtf16;
256
  nsString mAsciiFifteenUtf16;
257
  nsString mAsciiHundredUtf16;
258
  nsString mAsciiThousandUtf16;
259
  nsString mExample1Utf16;
260
  nsString mExample2Utf16;
261
  nsString mExample3Utf16;
262
  nsString mExample4Utf16;
263
  nsString mExample5Utf16;
264
  nsString mArUtf16;
265
  nsString mDeUtf16;
266
  nsString mDeEditUtf16;
267
  nsString mRuUtf16;
268
  nsString mThUtf16;
269
  nsString mJaUtf16;
270
  nsString mKoUtf16;
271
  nsString mTrUtf16;
272
  nsString mViUtf16;
273
274
  nsCString mDeEditLatin1;
275
276
  nsString mArOneUtf16;
277
  nsString mDeOneUtf16;
278
  nsString mDeEditOneUtf16;
279
  nsString mRuOneUtf16;
280
  nsString mThOneUtf16;
281
  nsString mJaOneUtf16;
282
  nsString mKoOneUtf16;
283
  nsString mTrOneUtf16;
284
  nsString mViOneUtf16;
285
286
  nsCString mDeEditOneLatin1;
287
288
  nsCString mArOneUtf8;
289
  nsCString mDeOneUtf8;
290
  nsCString mDeEditOneUtf8;
291
  nsCString mRuOneUtf8;
292
  nsCString mThOneUtf8;
293
  nsCString mJaOneUtf8;
294
  nsCString mKoOneUtf8;
295
  nsCString mTrOneUtf8;
296
  nsCString mViOneUtf8;
297
298
  nsString mArThreeUtf16;
299
  nsString mDeThreeUtf16;
300
  nsString mDeEditThreeUtf16;
301
  nsString mRuThreeUtf16;
302
  nsString mThThreeUtf16;
303
  nsString mJaThreeUtf16;
304
  nsString mKoThreeUtf16;
305
  nsString mTrThreeUtf16;
306
  nsString mViThreeUtf16;
307
308
  nsCString mDeEditThreeLatin1;
309
310
  nsCString mArThreeUtf8;
311
  nsCString mDeThreeUtf8;
312
  nsCString mDeEditThreeUtf8;
313
  nsCString mRuThreeUtf8;
314
  nsCString mThThreeUtf8;
315
  nsCString mJaThreeUtf8;
316
  nsCString mKoThreeUtf8;
317
  nsCString mTrThreeUtf8;
318
  nsCString mViThreeUtf8;
319
320
  nsString mArFifteenUtf16;
321
  nsString mDeFifteenUtf16;
322
  nsString mDeEditFifteenUtf16;
323
  nsString mRuFifteenUtf16;
324
  nsString mThFifteenUtf16;
325
  nsString mJaFifteenUtf16;
326
  nsString mKoFifteenUtf16;
327
  nsString mTrFifteenUtf16;
328
  nsString mViFifteenUtf16;
329
330
  nsCString mDeEditFifteenLatin1;
331
332
  nsCString mArFifteenUtf8;
333
  nsCString mDeFifteenUtf8;
334
  nsCString mDeEditFifteenUtf8;
335
  nsCString mRuFifteenUtf8;
336
  nsCString mThFifteenUtf8;
337
  nsCString mJaFifteenUtf8;
338
  nsCString mKoFifteenUtf8;
339
  nsCString mTrFifteenUtf8;
340
  nsCString mViFifteenUtf8;
341
342
  nsString mArHundredUtf16;
343
  nsString mDeHundredUtf16;
344
  nsString mDeEditHundredUtf16;
345
  nsString mRuHundredUtf16;
346
  nsString mThHundredUtf16;
347
  nsString mJaHundredUtf16;
348
  nsString mKoHundredUtf16;
349
  nsString mTrHundredUtf16;
350
  nsString mViHundredUtf16;
351
352
  nsCString mDeEditHundredLatin1;
353
354
  nsCString mArHundredUtf8;
355
  nsCString mDeHundredUtf8;
356
  nsCString mDeEditHundredUtf8;
357
  nsCString mRuHundredUtf8;
358
  nsCString mThHundredUtf8;
359
  nsCString mJaHundredUtf8;
360
  nsCString mKoHundredUtf8;
361
  nsCString mTrHundredUtf8;
362
  nsCString mViHundredUtf8;
363
364
  nsString mArThousandUtf16;
365
  nsString mDeThousandUtf16;
366
  nsString mDeEditThousandUtf16;
367
  nsString mRuThousandUtf16;
368
  nsString mThThousandUtf16;
369
  nsString mJaThousandUtf16;
370
  nsString mKoThousandUtf16;
371
  nsString mTrThousandUtf16;
372
  nsString mViThousandUtf16;
373
374
  nsCString mDeEditThousandLatin1;
375
376
  nsCString mArThousandUtf8;
377
  nsCString mDeThousandUtf8;
378
  nsCString mDeEditThousandUtf8;
379
  nsCString mRuThousandUtf8;
380
  nsCString mThThousandUtf8;
381
  nsCString mJaThousandUtf8;
382
  nsCString mKoThousandUtf8;
383
  nsCString mTrThousandUtf8;
384
  nsCString mViThousandUtf8;
385
386
};
387
388
void test_assign_helper(const nsACString& in, nsACString &_retval)
389
0
{
390
0
  _retval = in;
391
0
}
392
393
// Simple helper struct to test if conditionally enabled string functions are
394
// working.
395
template <typename T>
396
struct EnableTest
397
{
398
  template <typename Q = T, typename EnableIfChar16 = mozilla::Char16OnlyT<Q>>
399
0
  bool IsChar16() { return true; }
400
401
  template <typename Q = T, typename EnableIfChar = mozilla::CharOnlyT<Q>>
402
0
  bool IsChar16(int dummy = 42) { return false; }
403
404
  template <typename Q = T, typename EnableIfChar16 = mozilla::Char16OnlyT<Q>>
405
0
  bool IsChar() { return false; }
406
407
  template <typename Q = T, typename EnableIfChar = mozilla::CharOnlyT<Q>>
408
0
  bool IsChar(int dummy = 42) { return true; }
409
};
410
411
TEST_F(Strings, IsChar)
412
0
{
413
0
  EnableTest<char> charTest;
414
0
  EXPECT_TRUE(charTest.IsChar());
415
0
  EXPECT_FALSE(charTest.IsChar16());
416
0
417
0
  EnableTest<char16_t> char16Test;
418
0
  EXPECT_TRUE(char16Test.IsChar16());
419
0
  EXPECT_FALSE(char16Test.IsChar());
420
0
421
#ifdef COMPILATION_FAILURE_TEST
422
  nsAutoCString a_ctest;
423
  nsAutoString a_test;
424
425
  a_ctest.AssignLiteral("hello");
426
  // This should cause a compilation failure.
427
  a_ctest.AssignLiteral(u"hello");
428
  a_test.AssignLiteral(u"hello");
429
  a_test.AssignLiteral("hello");
430
#endif
431
}
432
433
TEST_F(Strings, DependentStrings)
434
0
{
435
0
  // A few tests that make sure copying nsTDependentStrings behaves properly.
436
0
  using DataFlags = mozilla::detail::StringDataFlags;
437
0
438
0
  {
439
0
    // Test copy ctor.
440
0
    nsDependentCString tmp("foo");
441
0
    auto data = tmp.Data();
442
0
    nsDependentCString foo(tmp);
443
0
    // Neither string should be using a shared buffer.
444
0
    EXPECT_FALSE(tmp.GetDataFlags() & DataFlags::REFCOUNTED);
445
0
    EXPECT_FALSE(foo.GetDataFlags() & DataFlags::REFCOUNTED);
446
0
    // Both strings should be pointing to the original buffer.
447
0
    EXPECT_EQ(data, tmp.Data());
448
0
    EXPECT_EQ(data, foo.Data());
449
0
  }
450
0
  {
451
0
    // Test move ctor.
452
0
    nsDependentCString tmp("foo");
453
0
    auto data = tmp.Data();
454
0
    nsDependentCString foo(std::move(tmp));
455
0
    // Neither string should be using a shared buffer.
456
0
    EXPECT_FALSE(tmp.GetDataFlags() & DataFlags::REFCOUNTED);
457
0
    EXPECT_FALSE(foo.GetDataFlags() & DataFlags::REFCOUNTED);
458
0
    // First string should be reset, the second should be pointing to the
459
0
    // original buffer.
460
0
    EXPECT_NE(data, tmp.Data());
461
0
    EXPECT_EQ(data, foo.Data());
462
0
    EXPECT_TRUE(tmp.IsEmpty());
463
0
  }
464
0
  {
465
0
    // Test copying to a nsCString.
466
0
    nsDependentCString tmp("foo");
467
0
    auto data = tmp.Data();
468
0
    nsCString foo(tmp);
469
0
    // Original string should not be shared, copy should be shared.
470
0
    EXPECT_FALSE(tmp.GetDataFlags() & DataFlags::REFCOUNTED);
471
0
    EXPECT_TRUE(foo.GetDataFlags() & DataFlags::REFCOUNTED);
472
0
    // First string should remain the same, the second should be pointing to
473
0
    // a new buffer.
474
0
    EXPECT_EQ(data, tmp.Data());
475
0
    EXPECT_NE(data, foo.Data());
476
0
  }
477
0
}
478
479
TEST_F(Strings, assign)
480
0
{
481
0
  nsCString result;
482
0
  test_assign_helper(NS_LITERAL_CSTRING("a") + NS_LITERAL_CSTRING("b"), result);
483
0
  EXPECT_STREQ(result.get(), "ab");
484
0
}
485
486
TEST_F(Strings, assign_c)
487
0
{
488
0
  nsCString c; c.Assign('c');
489
0
  EXPECT_STREQ(c.get(), "c");
490
0
}
491
492
TEST_F(Strings, test1)
493
0
{
494
0
  NS_NAMED_LITERAL_STRING(empty, "");
495
0
  const nsAString& aStr = empty;
496
0
497
0
  nsAutoString buf(aStr);
498
0
499
0
  int32_t n = buf.FindChar(',');
500
0
  EXPECT_EQ(n, kNotFound);
501
0
502
0
  n = buf.Length();
503
0
504
0
  buf.Cut(0, n + 1);
505
0
  n = buf.FindChar(',');
506
0
507
0
  EXPECT_EQ(n, kNotFound);
508
0
}
509
510
TEST_F(Strings, test2)
511
0
{
512
0
  nsCString data("hello world");
513
0
  const nsACString& aStr = data;
514
0
515
0
  nsCString temp(aStr);
516
0
  temp.Cut(0, 6);
517
0
518
0
  EXPECT_STREQ(temp.get(), "world");
519
0
}
520
521
TEST_F(Strings, find)
522
0
{
523
0
  nsCString src("<!DOCTYPE blah blah blah>");
524
0
525
0
  int32_t i = src.Find("DOCTYPE", true, 2, 1);
526
0
  EXPECT_EQ(i, 2);
527
0
}
528
529
TEST_F(Strings, rfind)
530
0
{
531
0
  const char text[] = "<!DOCTYPE blah blah blah>";
532
0
  const char term[] = "bLaH";
533
0
  nsCString src(text);
534
0
  int32_t i;
535
0
536
0
  i = src.RFind(term, true, 3, -1);
537
0
  EXPECT_EQ(i, kNotFound);
538
0
539
0
  i = src.RFind(term, true, -1, -1);
540
0
  EXPECT_EQ(i, 20);
541
0
542
0
  i = src.RFind(term, true, 13, -1);
543
0
  EXPECT_EQ(i, 10);
544
0
545
0
  i = src.RFind(term, true, 22, 3);
546
0
  EXPECT_EQ(i, 20);
547
0
}
548
549
TEST_F(Strings, rfind_2)
550
0
{
551
0
  const char text[] = "<!DOCTYPE blah blah blah>";
552
0
  nsCString src(text);
553
0
  int32_t i = src.RFind("TYPE", false, 5, -1);
554
0
  EXPECT_EQ(i, 5);
555
0
}
556
557
TEST_F(Strings, rfind_3)
558
0
{
559
0
  const char text[] = "urn:mozilla:locale:en-US:necko";
560
0
  nsAutoCString value(text);
561
0
  int32_t i = value.RFind(":");
562
0
  EXPECT_EQ(i, 24);
563
0
}
564
565
TEST_F(Strings, rfind_4)
566
0
{
567
0
  nsCString value("a.msf");
568
0
  int32_t i = value.RFind(".msf");
569
0
  EXPECT_EQ(i, 1);
570
0
}
571
572
TEST_F(Strings, findinreadable)
573
0
{
574
0
  const char text[] = "jar:jar:file:///c:/software/mozilla/mozilla_2006_02_21.jar!/browser/chrome/classic.jar!/";
575
0
  nsAutoCString value(text);
576
0
577
0
  nsACString::const_iterator begin, end;
578
0
  value.BeginReading(begin);
579
0
  value.EndReading(end);
580
0
  nsACString::const_iterator delim_begin (begin),
581
0
                             delim_end   (end);
582
0
583
0
  // Search for last !/ at the end of the string
584
0
  EXPECT_TRUE(FindInReadable(NS_LITERAL_CSTRING("!/"), delim_begin, delim_end));
585
0
  char *r = ToNewCString(Substring(delim_begin, delim_end));
586
0
  // Should match the first "!/" but not the last
587
0
  EXPECT_NE(delim_end, end);
588
0
  EXPECT_STREQ(r, "!/");
589
0
  free(r);
590
0
591
0
  delim_begin = begin;
592
0
  delim_end = end;
593
0
594
0
  // Search for first jar:
595
0
  EXPECT_TRUE(FindInReadable(NS_LITERAL_CSTRING("jar:"), delim_begin, delim_end));
596
0
597
0
  r = ToNewCString(Substring(delim_begin, delim_end));
598
0
  // Should not match the first jar:, but the second one
599
0
  EXPECT_EQ(delim_begin, begin);
600
0
  EXPECT_STREQ(r, "jar:");
601
0
  free(r);
602
0
603
0
  // Search for jar: in a Substring
604
0
  delim_begin = begin; delim_begin++;
605
0
  delim_end = end;
606
0
  EXPECT_TRUE(FindInReadable(NS_LITERAL_CSTRING("jar:"), delim_begin, delim_end));
607
0
608
0
  r = ToNewCString(Substring(delim_begin, delim_end));
609
0
  // Should not match the first jar:, but the second one
610
0
  EXPECT_NE(delim_begin, begin);
611
0
  EXPECT_STREQ(r, "jar:");
612
0
  free(r);
613
0
614
0
  // Should not find a match
615
0
  EXPECT_FALSE(FindInReadable(NS_LITERAL_CSTRING("gecko"), delim_begin, delim_end));
616
0
617
0
  // When no match is found, range should be empty
618
0
  EXPECT_EQ(delim_begin, delim_end);
619
0
620
0
  // Should not find a match (search not beyond Substring)
621
0
  delim_begin = begin; for (int i=0;i<6;i++) delim_begin++;
622
0
  delim_end = end;
623
0
  EXPECT_FALSE(FindInReadable(NS_LITERAL_CSTRING("jar:"), delim_begin, delim_end));
624
0
625
0
  // When no match is found, range should be empty
626
0
  EXPECT_EQ(delim_begin, delim_end);
627
0
628
0
  // Should not find a match (search not beyond Substring)
629
0
  delim_begin = begin;
630
0
  delim_end = end; for (int i=0;i<7;i++) delim_end--;
631
0
  EXPECT_FALSE(FindInReadable(NS_LITERAL_CSTRING("classic"), delim_begin, delim_end));
632
0
633
0
  // When no match is found, range should be empty
634
0
  EXPECT_EQ(delim_begin, delim_end);
635
0
}
636
637
TEST_F(Strings, rfindinreadable)
638
0
{
639
0
  const char text[] = "jar:jar:file:///c:/software/mozilla/mozilla_2006_02_21.jar!/browser/chrome/classic.jar!/";
640
0
  nsAutoCString value(text);
641
0
642
0
  nsACString::const_iterator begin, end;
643
0
  value.BeginReading(begin);
644
0
  value.EndReading(end);
645
0
  nsACString::const_iterator delim_begin (begin),
646
0
                             delim_end   (end);
647
0
648
0
  // Search for last !/ at the end of the string
649
0
  EXPECT_TRUE(RFindInReadable(NS_LITERAL_CSTRING("!/"), delim_begin, delim_end));
650
0
  char *r = ToNewCString(Substring(delim_begin, delim_end));
651
0
  // Should match the last "!/"
652
0
  EXPECT_EQ(delim_end, end);
653
0
  EXPECT_STREQ(r, "!/");
654
0
  free(r);
655
0
656
0
  delim_begin = begin;
657
0
  delim_end = end;
658
0
659
0
  // Search for last jar: but not the first one...
660
0
  EXPECT_TRUE(RFindInReadable(NS_LITERAL_CSTRING("jar:"), delim_begin, delim_end));
661
0
662
0
  r = ToNewCString(Substring(delim_begin, delim_end));
663
0
  // Should not match the first jar:, but the second one
664
0
  EXPECT_NE(delim_begin, begin);
665
0
  EXPECT_STREQ(r, "jar:");
666
0
  free(r);
667
0
668
0
  // Search for jar: in a Substring
669
0
  delim_begin = begin;
670
0
  delim_end = begin; for (int i=0;i<6;i++) delim_end++;
671
0
  EXPECT_TRUE(RFindInReadable(NS_LITERAL_CSTRING("jar:"), delim_begin, delim_end));
672
0
673
0
  r = ToNewCString(Substring(delim_begin, delim_end));
674
0
  // Should not match the first jar:, but the second one
675
0
  EXPECT_EQ(delim_begin, begin);
676
0
  EXPECT_STREQ(r, "jar:");
677
0
  free(r);
678
0
679
0
  // Should not find a match
680
0
  delim_begin = begin;
681
0
  delim_end = end;
682
0
  EXPECT_FALSE(RFindInReadable(NS_LITERAL_CSTRING("gecko"), delim_begin, delim_end));
683
0
684
0
  // When no match is found, range should be empty
685
0
  EXPECT_EQ(delim_begin, delim_end);
686
0
687
0
  // Should not find a match (search not before Substring)
688
0
  delim_begin = begin; for (int i=0;i<6;i++) delim_begin++;
689
0
  delim_end = end;
690
0
  EXPECT_FALSE(RFindInReadable(NS_LITERAL_CSTRING("jar:"), delim_begin, delim_end));
691
0
692
0
  // When no match is found, range should be empty
693
0
  EXPECT_EQ(delim_begin, delim_end);
694
0
695
0
  // Should not find a match (search not beyond Substring)
696
0
  delim_begin = begin;
697
0
  delim_end = end; for (int i=0;i<7;i++) delim_end--;
698
0
  EXPECT_FALSE(RFindInReadable(NS_LITERAL_CSTRING("classic"), delim_begin, delim_end));
699
0
700
0
  // When no match is found, range should be empty
701
0
  EXPECT_EQ(delim_begin, delim_end);
702
0
}
703
704
TEST_F(Strings, distance)
705
0
{
706
0
  const char text[] = "abc-xyz";
707
0
  nsCString s(text);
708
0
  nsCString::const_iterator begin, end;
709
0
  s.BeginReading(begin);
710
0
  s.EndReading(end);
711
0
  size_t d = Distance(begin, end);
712
0
  EXPECT_EQ(d, sizeof(text) - 1);
713
0
}
714
715
TEST_F(Strings, length)
716
0
{
717
0
  const char text[] = "abc-xyz";
718
0
  nsCString s(text);
719
0
  size_t d = s.Length();
720
0
  EXPECT_EQ(d, sizeof(text) - 1);
721
0
}
722
723
TEST_F(Strings, trim)
724
0
{
725
0
  const char text[] = " a\t    $   ";
726
0
  const char set[] = " \t$";
727
0
728
0
  nsCString s(text);
729
0
  s.Trim(set);
730
0
  EXPECT_STREQ(s.get(), "a");
731
0
732
0
  s.AssignLiteral("\t  \t\t  \t");
733
0
  s.Trim(set);
734
0
  EXPECT_STREQ(s.get(), "");
735
0
736
0
  s.AssignLiteral(" ");
737
0
  s.Trim(set);
738
0
  EXPECT_STREQ(s.get(), "");
739
0
740
0
  s.AssignLiteral(" ");
741
0
  s.Trim(set, false, true);
742
0
  EXPECT_STREQ(s.get(), "");
743
0
744
0
  s.AssignLiteral(" ");
745
0
  s.Trim(set, true, false);
746
0
  EXPECT_STREQ(s.get(), "");
747
0
}
748
749
TEST_F(Strings, replace_substr)
750
0
{
751
0
  const char text[] = "abc-ppp-qqq-ppp-xyz";
752
0
  nsCString s(text);
753
0
  s.ReplaceSubstring("ppp", "www");
754
0
  EXPECT_STREQ(s.get(), "abc-www-qqq-www-xyz");
755
0
756
0
  s.AssignLiteral("foobar");
757
0
  s.ReplaceSubstring("foo", "bar");
758
0
  s.ReplaceSubstring("bar", "");
759
0
  EXPECT_STREQ(s.get(), "");
760
0
761
0
  s.AssignLiteral("foofoofoo");
762
0
  s.ReplaceSubstring("foo", "foo");
763
0
  EXPECT_STREQ(s.get(), "foofoofoo");
764
0
765
0
  s.AssignLiteral("foofoofoo");
766
0
  s.ReplaceSubstring("of", "fo");
767
0
  EXPECT_STREQ(s.get(), "fofoofooo");
768
0
}
769
770
TEST_F(Strings, replace_substr_2)
771
0
{
772
0
  const char *newName = "user";
773
0
  nsString acctName; acctName.AssignLiteral("forums.foo.com");
774
0
  nsAutoString newAcctName, oldVal, newVal;
775
0
  CopyASCIItoUTF16(mozilla::MakeStringSpan(newName), newVal);
776
0
  newAcctName.Assign(acctName);
777
0
778
0
  // here, oldVal is empty.  we are testing that this function
779
0
  // does not hang.  see bug 235355.
780
0
  newAcctName.ReplaceSubstring(oldVal, newVal);
781
0
782
0
  // we expect that newAcctName will be unchanged.
783
0
  EXPECT_TRUE(newAcctName.Equals(acctName));
784
0
}
785
786
TEST_F(Strings, replace_substr_3)
787
0
{
788
0
  nsCString s;
789
0
  s.AssignLiteral("abcabcabc");
790
0
  s.ReplaceSubstring("ca", "X");
791
0
  EXPECT_STREQ(s.get(), "abXbXbc");
792
0
793
0
  s.AssignLiteral("abcabcabc");
794
0
  s.ReplaceSubstring("ca", "XYZ");
795
0
  EXPECT_STREQ(s.get(), "abXYZbXYZbc");
796
0
797
0
  s.AssignLiteral("abcabcabc");
798
0
  s.ReplaceSubstring("ca", "XY");
799
0
  EXPECT_STREQ(s.get(), "abXYbXYbc");
800
0
801
0
  s.AssignLiteral("abcabcabc");
802
0
  s.ReplaceSubstring("ca", "XYZ!");
803
0
  EXPECT_STREQ(s.get(), "abXYZ!bXYZ!bc");
804
0
805
0
  s.AssignLiteral("abcdabcdabcd");
806
0
  s.ReplaceSubstring("bcd", "X");
807
0
  EXPECT_STREQ(s.get(), "aXaXaX");
808
0
809
0
  s.AssignLiteral("abcdabcdabcd");
810
0
  s.ReplaceSubstring("bcd", "XYZ!");
811
0
  EXPECT_STREQ(s.get(), "aXYZ!aXYZ!aXYZ!");
812
0
813
0
  s.AssignLiteral("abcdabcdabcd");
814
0
  s.ReplaceSubstring("bcd", "XY");
815
0
  EXPECT_STREQ(s.get(), "aXYaXYaXY");
816
0
817
0
  s.AssignLiteral("abcdabcdabcd");
818
0
  s.ReplaceSubstring("bcd", "XYZABC");
819
0
  EXPECT_STREQ(s.get(), "aXYZABCaXYZABCaXYZABC");
820
0
821
0
  s.AssignLiteral("abcdabcdabcd");
822
0
  s.ReplaceSubstring("bcd", "XYZ");
823
0
  EXPECT_STREQ(s.get(), "aXYZaXYZaXYZ");
824
0
825
0
  s.AssignLiteral("abcdabcdabcd");
826
0
  s.ReplaceSubstring("bcd", "XYZ!");
827
0
  EXPECT_STREQ(s.get(), "aXYZ!aXYZ!aXYZ!");
828
0
829
0
  s.AssignLiteral("abcdabcdabcd");
830
0
  s.ReplaceSubstring("ab", "X");
831
0
  EXPECT_STREQ(s.get(), "XcdXcdXcd");
832
0
833
0
  s.AssignLiteral("abcdabcdabcd");
834
0
  s.ReplaceSubstring("ab", "XYZABC");
835
0
  EXPECT_STREQ(s.get(), "XYZABCcdXYZABCcdXYZABCcd");
836
0
837
0
  s.AssignLiteral("abcdabcdabcd");
838
0
  s.ReplaceSubstring("ab", "XY");
839
0
  EXPECT_STREQ(s.get(), "XYcdXYcdXYcd");
840
0
841
0
  s.AssignLiteral("abcdabcdabcd");
842
0
  s.ReplaceSubstring("ab", "XYZ!");
843
0
  EXPECT_STREQ(s.get(), "XYZ!cdXYZ!cdXYZ!cd");
844
0
845
0
  s.AssignLiteral("abcdabcdabcd");
846
0
  s.ReplaceSubstring("notfound", "X");
847
0
  EXPECT_STREQ(s.get(), "abcdabcdabcd");
848
0
849
0
  s.AssignLiteral("abcdabcdabcd");
850
0
  s.ReplaceSubstring("notfound", "longlongstring");
851
0
  EXPECT_STREQ(s.get(), "abcdabcdabcd");
852
0
}
853
854
TEST_F(Strings, strip_ws)
855
0
{
856
0
  const char* texts[] = {"",
857
0
                         " a    $   ",
858
0
                         "Some\fother\t thing\r\n",
859
0
                         "And   \f\t\r\n even\nmore\r \f"};
860
0
  const char* results[] = {"",
861
0
                           "a$",
862
0
                           "Someotherthing",
863
0
                           "Andevenmore"};
864
0
  for (size_t i=0; i<sizeof(texts)/sizeof(texts[0]); i++) {
865
0
    nsCString s(texts[i]);
866
0
    s.StripWhitespace();
867
0
    EXPECT_STREQ(s.get(), results[i]);
868
0
  }
869
0
}
870
871
TEST_F(Strings, equals_ic)
872
0
{
873
0
  nsCString s;
874
0
  EXPECT_FALSE(s.LowerCaseEqualsLiteral("view-source"));
875
0
}
876
877
TEST_F(Strings, concat)
878
0
{
879
0
  nsCString bar("bar");
880
0
  const nsACString& barRef = bar;
881
0
882
0
  const nsPromiseFlatCString& result =
883
0
      PromiseFlatCString(NS_LITERAL_CSTRING("foo") +
884
0
                         NS_LITERAL_CSTRING(",") +
885
0
                         barRef);
886
0
  EXPECT_STREQ(result.get(), "foo,bar");
887
0
}
888
889
TEST_F(Strings, concat_2)
890
0
{
891
0
  nsCString fieldTextStr("xyz");
892
0
  nsCString text("text");
893
0
  const nsACString& aText = text;
894
0
895
0
  nsAutoCString result( fieldTextStr + aText );
896
0
897
0
  EXPECT_STREQ(result.get(), "xyztext");
898
0
}
899
900
TEST_F(Strings, concat_3)
901
0
{
902
0
  nsCString result;
903
0
  nsCString ab("ab"), c("c");
904
0
905
0
  result = ab + result + c;
906
0
  EXPECT_STREQ(result.get(), "abc");
907
0
}
908
909
TEST_F(Strings, empty_assign)
910
0
{
911
0
  nsCString a;
912
0
  a.AssignLiteral("");
913
0
914
0
  a.AppendLiteral("");
915
0
916
0
  nsCString b;
917
0
  b.SetCapacity(0);
918
0
}
919
920
TEST_F(Strings, set_length)
921
0
{
922
0
  const char kText[] = "Default Plugin";
923
0
  nsCString buf;
924
0
  buf.SetCapacity(sizeof(kText)-1);
925
0
  buf.Assign(kText);
926
0
  buf.SetLength(sizeof(kText)-1);
927
0
  EXPECT_STREQ(buf.get(), kText);
928
0
}
929
930
TEST_F(Strings, substring)
931
0
{
932
0
  nsCString super("hello world"), sub("hello");
933
0
934
0
  // this tests that |super| starts with |sub|,
935
0
936
0
  EXPECT_TRUE(sub.Equals(StringHead(super, sub.Length())));
937
0
938
0
  // and verifies that |sub| does not start with |super|.
939
0
940
0
  EXPECT_FALSE(super.Equals(StringHead(sub, super.Length())));
941
0
}
942
943
#define test_append_expect(str, int, suffix, expect) \
944
0
  str.Truncate(); \
945
0
  str.AppendInt(suffix = int); \
946
0
  EXPECT_TRUE(str.EqualsLiteral(expect));
947
948
#define test_appends_expect(int, suffix, expect) \
949
0
  test_append_expect(str, int, suffix, expect) \
950
0
  test_append_expect(cstr, int, suffix, expect)
951
952
#define test_appendbase(str, prefix, int, suffix, base) \
953
0
  str.Truncate(); \
954
0
  str.AppendInt(suffix = prefix ## int ## suffix, base); \
955
0
  EXPECT_TRUE(str.EqualsLiteral(#int));
956
957
#define test_appendbases(prefix, int, suffix, base) \
958
0
  test_appendbase(str, prefix, int, suffix, base) \
959
0
  test_appendbase(cstr, prefix, int, suffix, base)
960
961
TEST_F(Strings, appendint)
962
0
{
963
0
  nsString str;
964
0
  nsCString cstr;
965
0
  int32_t L;
966
0
  uint32_t UL;
967
0
  int64_t LL;
968
0
  uint64_t ULL;
969
0
  test_appends_expect(INT32_MAX, L, "2147483647")
970
0
  test_appends_expect(INT32_MIN, L, "-2147483648")
971
0
  test_appends_expect(UINT32_MAX, UL, "4294967295")
972
0
  test_appends_expect(INT64_MAX, LL, "9223372036854775807")
973
0
  test_appends_expect(INT64_MIN, LL, "-9223372036854775808")
974
0
  test_appends_expect(UINT64_MAX, ULL, "18446744073709551615")
975
0
  test_appendbases(0, 17777777777, L, 8)
976
0
  test_appendbases(0, 20000000000, L, 8)
977
0
  test_appendbases(0, 37777777777, UL, 8)
978
0
  test_appendbases(0, 777777777777777777777, LL, 8)
979
0
  test_appendbases(0, 1000000000000000000000, LL, 8)
980
0
  test_appendbases(0, 1777777777777777777777, ULL, 8)
981
0
  test_appendbases(0x, 7fffffff, L, 16)
982
0
  test_appendbases(0x, 80000000, L, 16)
983
0
  test_appendbases(0x, ffffffff, UL, 16)
984
0
  test_appendbases(0x, 7fffffffffffffff, LL, 16)
985
0
  test_appendbases(0x, 8000000000000000, LL, 16)
986
0
  test_appendbases(0x, ffffffffffffffff, ULL, 16)
987
0
}
988
989
TEST_F(Strings, appendint64)
990
0
{
991
0
  nsCString str;
992
0
993
0
  int64_t max = INT64_MAX;
994
0
  static const char max_expected[] = "9223372036854775807";
995
0
  int64_t min = INT64_MIN;
996
0
  static const char min_expected[] = "-9223372036854775808";
997
0
  static const char min_expected_oct[] = "1000000000000000000000";
998
0
  int64_t maxint_plus1 = 1LL << 32;
999
0
  static const char maxint_plus1_expected[] = "4294967296";
1000
0
  static const char maxint_plus1_expected_x[] = "100000000";
1001
0
1002
0
  str.AppendInt(max);
1003
0
1004
0
  EXPECT_TRUE(str.Equals(max_expected));
1005
0
1006
0
  str.Truncate();
1007
0
  str.AppendInt(min);
1008
0
  EXPECT_TRUE(str.Equals(min_expected));
1009
0
  str.Truncate();
1010
0
  str.AppendInt(min, 8);
1011
0
  EXPECT_TRUE(str.Equals(min_expected_oct));
1012
0
1013
0
1014
0
  str.Truncate();
1015
0
  str.AppendInt(maxint_plus1);
1016
0
  EXPECT_TRUE(str.Equals(maxint_plus1_expected));
1017
0
  str.Truncate();
1018
0
  str.AppendInt(maxint_plus1, 16);
1019
0
  EXPECT_TRUE(str.Equals(maxint_plus1_expected_x));
1020
0
}
1021
1022
TEST_F(Strings, appendfloat)
1023
0
{
1024
0
  nsCString str;
1025
0
  double bigdouble = 11223344556.66;
1026
0
  static const char double_expected[] = "11223344556.66";
1027
0
  static const char float_expected[] = "0.01";
1028
0
1029
0
  // AppendFloat is used to append doubles, therefore the precision must be
1030
0
  // large enough (see bug 327719)
1031
0
  str.AppendFloat( bigdouble );
1032
0
  EXPECT_TRUE(str.Equals(double_expected));
1033
0
1034
0
  str.Truncate();
1035
0
  // AppendFloat is used to append floats (bug 327719 #27)
1036
0
  str.AppendFloat( 0.1f * 0.1f );
1037
0
  EXPECT_TRUE(str.Equals(float_expected));
1038
0
}
1039
1040
TEST_F(Strings, findcharinset)
1041
0
{
1042
0
  nsCString buf("hello, how are you?");
1043
0
1044
0
  int32_t index = buf.FindCharInSet(",?", 5);
1045
0
  EXPECT_EQ(index, 5);
1046
0
1047
0
  index = buf.FindCharInSet("helo", 0);
1048
0
  EXPECT_EQ(index, 0);
1049
0
1050
0
  index = buf.FindCharInSet("z?", 6);
1051
0
  EXPECT_EQ(index, (int32_t) buf.Length() - 1);
1052
0
}
1053
1054
TEST_F(Strings, rfindcharinset)
1055
0
{
1056
0
  nsCString buf("hello, how are you?");
1057
0
1058
0
  int32_t index = buf.RFindCharInSet(",?", 5);
1059
0
  EXPECT_EQ(index, 5);
1060
0
1061
0
  index = buf.RFindCharInSet("helo", 0);
1062
0
  EXPECT_EQ(index, 0);
1063
0
1064
0
  index = buf.RFindCharInSet("z?", 6);
1065
0
  EXPECT_EQ(index, kNotFound);
1066
0
1067
0
  index = buf.RFindCharInSet("l", 5);
1068
0
  EXPECT_EQ(index, 3);
1069
0
1070
0
  buf.AssignLiteral("abcdefghijkabc");
1071
0
1072
0
  index = buf.RFindCharInSet("ab");
1073
0
  EXPECT_EQ(index, 12);
1074
0
1075
0
  index = buf.RFindCharInSet("ab", 11);
1076
0
  EXPECT_EQ(index, 11);
1077
0
1078
0
  index = buf.RFindCharInSet("ab", 10);
1079
0
  EXPECT_EQ(index, 1);
1080
0
1081
0
  index = buf.RFindCharInSet("ab", 0);
1082
0
  EXPECT_EQ(index, 0);
1083
0
1084
0
  index = buf.RFindCharInSet("cd", 1);
1085
0
  EXPECT_EQ(index, kNotFound);
1086
0
1087
0
  index = buf.RFindCharInSet("h");
1088
0
  EXPECT_EQ(index, 7);
1089
0
}
1090
1091
TEST_F(Strings, stringbuffer)
1092
0
{
1093
0
  const char kData[] = "hello world";
1094
0
1095
0
  RefPtr<nsStringBuffer> buf;
1096
0
1097
0
  buf = nsStringBuffer::Alloc(sizeof(kData));
1098
0
  EXPECT_TRUE(!!buf);
1099
0
1100
0
  buf = nsStringBuffer::Alloc(sizeof(kData));
1101
0
  EXPECT_TRUE(!!buf);
1102
0
  char *data = (char *) buf->Data();
1103
0
  memcpy(data, kData, sizeof(kData));
1104
0
1105
0
  nsCString str;
1106
0
  buf->ToString(sizeof(kData)-1, str);
1107
0
1108
0
  nsStringBuffer *buf2;
1109
0
  buf2 = nsStringBuffer::FromString(str);
1110
0
1111
0
  EXPECT_EQ(buf, buf2);
1112
0
}
1113
1114
TEST_F(Strings, voided)
1115
0
{
1116
0
  const char kData[] = "hello world";
1117
0
1118
0
  nsCString str;
1119
0
  EXPECT_TRUE(!str.IsVoid());
1120
0
  EXPECT_TRUE(str.IsEmpty());
1121
0
  EXPECT_STREQ(str.get(), "");
1122
0
1123
0
  str.SetIsVoid(true);
1124
0
  EXPECT_TRUE(str.IsVoid());
1125
0
  EXPECT_TRUE(str.IsEmpty());
1126
0
  EXPECT_STREQ(str.get(), "");
1127
0
1128
0
  str.Assign(kData);
1129
0
  EXPECT_TRUE(!str.IsVoid());
1130
0
  EXPECT_TRUE(!str.IsEmpty());
1131
0
  EXPECT_STREQ(str.get(), kData);
1132
0
1133
0
  str.SetIsVoid(true);
1134
0
  EXPECT_TRUE(str.IsVoid());
1135
0
  EXPECT_TRUE(str.IsEmpty());
1136
0
  EXPECT_STREQ(str.get(), "");
1137
0
1138
0
  str.SetIsVoid(false);
1139
0
  EXPECT_TRUE(!str.IsVoid());
1140
0
  EXPECT_TRUE(str.IsEmpty());
1141
0
  EXPECT_STREQ(str.get(), "");
1142
0
1143
0
  str.Assign(kData);
1144
0
  EXPECT_TRUE(!str.IsVoid());
1145
0
  EXPECT_TRUE(!str.IsEmpty());
1146
0
  EXPECT_STREQ(str.get(), kData);
1147
0
1148
0
  str.Adopt(nullptr);
1149
0
  EXPECT_TRUE(str.IsVoid());
1150
0
  EXPECT_TRUE(str.IsEmpty());
1151
0
  EXPECT_STREQ(str.get(), "");
1152
0
}
1153
1154
TEST_F(Strings, voided_autostr)
1155
0
{
1156
0
  const char kData[] = "hello world";
1157
0
1158
0
  nsAutoCString str;
1159
0
  EXPECT_FALSE(str.IsVoid());
1160
0
  EXPECT_TRUE(str.IsEmpty());
1161
0
1162
0
  str.Assign(kData);
1163
0
  EXPECT_STREQ(str.get(), kData);
1164
0
1165
0
  str.SetIsVoid(true);
1166
0
  EXPECT_TRUE(str.IsVoid());
1167
0
  EXPECT_TRUE(str.IsEmpty());
1168
0
1169
0
  str.Assign(kData);
1170
0
  EXPECT_FALSE(str.IsVoid());
1171
0
  EXPECT_FALSE(str.IsEmpty());
1172
0
  EXPECT_STREQ(str.get(), kData);
1173
0
}
1174
1175
TEST_F(Strings, voided_assignment)
1176
0
{
1177
0
  nsCString a, b;
1178
0
  b.SetIsVoid(true);
1179
0
  a = b;
1180
0
  EXPECT_TRUE(a.IsVoid());
1181
0
  EXPECT_EQ(a.get(), b.get());
1182
0
}
1183
1184
TEST_F(Strings, empty_assignment)
1185
0
{
1186
0
  nsCString a, b;
1187
0
  a = b;
1188
0
  EXPECT_EQ(a.get(), b.get());
1189
0
}
1190
1191
struct ToIntegerTest
1192
{
1193
  const char *str;
1194
  uint32_t radix;
1195
  int32_t result;
1196
  nsresult rv;
1197
};
1198
1199
static const ToIntegerTest kToIntegerTests[] = {
1200
  { "123", 10, 123, NS_OK },
1201
  { "7b", 16, 123, NS_OK },
1202
  { "90194313659", 10, 0, NS_ERROR_ILLEGAL_VALUE },
1203
  { nullptr, 0, 0, NS_OK }
1204
};
1205
1206
TEST_F(Strings, string_tointeger)
1207
0
{
1208
0
  nsresult rv;
1209
0
  for (const ToIntegerTest* t = kToIntegerTests; t->str; ++t) {
1210
0
    int32_t result = nsAutoCString(t->str).ToInteger(&rv, t->radix);
1211
0
    EXPECT_EQ(rv, t->rv);
1212
0
    EXPECT_EQ(result, t->result);
1213
0
    result = nsAutoCString(t->str).ToInteger(&rv, t->radix);
1214
0
    EXPECT_EQ(rv, t->rv);
1215
0
    EXPECT_EQ(result, t->result);
1216
0
  }
1217
0
}
1218
1219
static void test_parse_string_helper(const char* str, char separator, int len,
1220
                                       const char* s1, const char* s2)
1221
0
{
1222
0
  nsCString data(str);
1223
0
  nsTArray<nsCString> results;
1224
0
  EXPECT_TRUE(ParseString(data, separator, results));
1225
0
  EXPECT_EQ(int(results.Length()), len);
1226
0
  const char* strings[] = { s1, s2 };
1227
0
  for (int i = 0; i < len; ++i) {
1228
0
    EXPECT_TRUE(results[i].Equals(strings[i]));
1229
0
  }
1230
0
}
1231
1232
static void test_parse_string_helper0(const char* str, char separator)
1233
0
{
1234
0
  test_parse_string_helper(str, separator, 0, nullptr, nullptr);
1235
0
}
1236
1237
static void test_parse_string_helper1(const char* str, char separator, const char* s1)
1238
0
{
1239
0
  test_parse_string_helper(str, separator, 1, s1, nullptr);
1240
0
}
1241
1242
static void test_parse_string_helper2(const char* str, char separator, const char* s1, const char* s2)
1243
0
{
1244
0
  test_parse_string_helper(str, separator, 2, s1, s2);
1245
0
}
1246
1247
TEST(String, parse_string)
1248
0
{
1249
0
  test_parse_string_helper1("foo, bar", '_', "foo, bar");
1250
0
  test_parse_string_helper2("foo, bar", ',', "foo", " bar");
1251
0
  test_parse_string_helper2("foo, bar ", ' ', "foo,", "bar");
1252
0
  test_parse_string_helper2("foo,bar", 'o', "f", ",bar");
1253
0
  test_parse_string_helper0("", '_');
1254
0
  test_parse_string_helper0("  ", ' ');
1255
0
  test_parse_string_helper1(" foo", ' ', "foo");
1256
0
  test_parse_string_helper1("  foo", ' ', "foo");
1257
0
}
1258
1259
static void test_strip_chars_helper(const char16_t* str, const char16_t* strip, const nsAString& result)
1260
0
{
1261
0
  nsAutoString data(str);
1262
0
  data.StripChars(strip);
1263
0
  EXPECT_TRUE(data.Equals(result));
1264
0
}
1265
1266
TEST(String, strip_chars)
1267
0
{
1268
0
  test_strip_chars_helper(u"foo \r \nbar",
1269
0
                          u" \n\r",
1270
0
                          NS_LITERAL_STRING("foobar"));
1271
0
  test_strip_chars_helper(u"\r\nfoo\r\n",
1272
0
                          u" \n\r",
1273
0
                          NS_LITERAL_STRING("foo"));
1274
0
  test_strip_chars_helper(u"foo",
1275
0
                          u" \n\r",
1276
0
                          NS_LITERAL_STRING("foo"));
1277
0
  test_strip_chars_helper(u"foo",
1278
0
                          u"fo",
1279
0
                          NS_LITERAL_STRING(""));
1280
0
  test_strip_chars_helper(u"foo",
1281
0
                          u"foo",
1282
0
                          NS_LITERAL_STRING(""));
1283
0
  test_strip_chars_helper(u" foo",
1284
0
                          u" ",
1285
0
                          NS_LITERAL_STRING("foo"));
1286
0
}
1287
1288
TEST_F(Strings, append_with_capacity)
1289
0
{
1290
0
  nsAutoString s;
1291
0
  const char16_t* origPtr = s.BeginReading();
1292
0
  s.SetCapacity(8000);
1293
0
  const char16_t* ptr = s.BeginReading();
1294
0
  EXPECT_NE(origPtr, ptr);
1295
0
  for (int i = 0; i < 100; i++) {
1296
0
    s.Append(u'a');
1297
0
    EXPECT_EQ(s.BeginReading(), ptr);
1298
0
    EXPECT_EQ(s.Length(), uint32_t(i + 1));
1299
0
  }
1300
0
}
1301
1302
TEST_F(Strings, append_string_with_capacity)
1303
0
{
1304
0
  nsAutoString aa;
1305
0
  aa.Append(u'a');
1306
0
  aa.Append(u'a');
1307
0
  nsAutoString s;
1308
0
  const char16_t* origPtr = s.BeginReading();
1309
0
  s.SetCapacity(8000);
1310
0
  const char16_t* ptr = s.BeginReading();
1311
0
  EXPECT_NE(origPtr, ptr);
1312
0
  nsAutoString empty;
1313
0
  s.Append(empty);
1314
0
  EXPECT_EQ(s.BeginReading(), ptr);
1315
0
  for (int i = 0; i < 100; i++) {
1316
0
    s.Append(aa);
1317
0
    EXPECT_EQ(s.BeginReading(), ptr);
1318
0
    EXPECT_EQ(s.Length(), uint32_t(2 * (i + 1)));
1319
0
  }
1320
0
}
1321
1322
TEST_F(Strings, append_literal_with_capacity)
1323
0
{
1324
0
  nsAutoString s;
1325
0
  const char16_t* origPtr = s.BeginReading();
1326
0
  s.SetCapacity(8000);
1327
0
  const char16_t* ptr = s.BeginReading();
1328
0
  EXPECT_NE(origPtr, ptr);
1329
0
  s.AppendLiteral(u"");
1330
0
  EXPECT_EQ(s.BeginReading(), ptr);
1331
0
  for (int i = 0; i < 100; i++) {
1332
0
    s.AppendLiteral(u"aa");
1333
0
    EXPECT_EQ(s.BeginReading(), ptr);
1334
0
    EXPECT_EQ(s.Length(), uint32_t(2 * (i + 1)));
1335
0
  }
1336
0
}
1337
1338
// The following test is intentionally not memory
1339
// checking-clean.
1340
#if !(defined(MOZ_HAVE_MEM_CHECKS) || defined(MOZ_MSAN))
1341
TEST_F(Strings, legacy_set_length_semantics)
1342
0
{
1343
0
  const char* foobar = "foobar";
1344
0
  nsCString s;
1345
0
  s.SetCapacity(2048);
1346
0
  memcpy(s.BeginWriting(), foobar, strlen(foobar));
1347
0
  s.SetLength(strlen(foobar));
1348
0
  EXPECT_FALSE(s.EqualsASCII(foobar));
1349
0
}
1350
#endif
1351
1352
TEST_F(Strings, bulk_write)
1353
0
{
1354
0
  nsresult rv;
1355
0
  nsCString s;
1356
0
  const char* ptrTwoThousand;
1357
0
  {
1358
0
    auto handle = s.BulkWrite(500, 0, true, rv);
1359
0
    EXPECT_EQ(rv, NS_OK);
1360
0
    auto span = handle.AsSpan();
1361
0
    for (auto&& c: span) {
1362
0
      c = 'a';
1363
0
    }
1364
0
    mozilla::Unused << handle.RestartBulkWrite(2000, 500, false);
1365
0
    span = handle.AsSpan().From(500);
1366
0
    for (auto&& c: span) {
1367
0
      c = 'b';
1368
0
    }
1369
0
    ptrTwoThousand = handle.Elements();
1370
0
    handle.Finish(1000, true);
1371
0
  }
1372
0
  EXPECT_EQ(s.Length(), 1000U);
1373
0
  EXPECT_NE(s.BeginReading(), ptrTwoThousand);
1374
0
  EXPECT_EQ(s.BeginReading()[1000], '\0');
1375
0
  for (uint32_t i = 0; i < 500; i++) {
1376
0
    EXPECT_EQ(s[i], 'a');
1377
0
  }
1378
0
  for (uint32_t i = 500; i < 1000; i++) {
1379
0
    EXPECT_EQ(s[i], 'b');
1380
0
  }
1381
0
}
1382
1383
TEST_F(Strings, bulk_write_fail)
1384
0
{
1385
0
  nsresult rv;
1386
0
  nsCString s;
1387
0
  {
1388
0
    auto handle = s.BulkWrite(500, 0, true, rv);
1389
0
    EXPECT_EQ(rv, NS_OK);
1390
0
  }
1391
0
  EXPECT_EQ(s.Length(), 3U);
1392
0
  EXPECT_TRUE(s.Equals(u8"\uFFFD"));
1393
0
}
1394
1395
TEST_F(Strings, huge_capacity)
1396
0
{
1397
0
  nsString a, b, c, d, e, f, g, h, i, j, k, l, m, n;
1398
0
  nsCString n1;
1399
0
1400
0
  // Ignore the result if the address space is less than 64-bit because
1401
0
  // some of the allocations above will exhaust the address space.
1402
0
  if (sizeof(void*) >= 8) {
1403
0
    EXPECT_TRUE(a.SetCapacity(1, fallible));
1404
0
    EXPECT_FALSE(a.SetCapacity(nsString::size_type(-1)/2, fallible));
1405
0
    EXPECT_TRUE(a.SetCapacity(0, fallible));  // free the allocated memory
1406
0
1407
0
    EXPECT_TRUE(b.SetCapacity(1, fallible));
1408
0
    EXPECT_FALSE(b.SetCapacity(nsString::size_type(-1)/2 - 1, fallible));
1409
0
    EXPECT_TRUE(b.SetCapacity(0, fallible));
1410
0
1411
0
    EXPECT_TRUE(c.SetCapacity(1, fallible));
1412
0
    EXPECT_FALSE(c.SetCapacity(nsString::size_type(-1)/2, fallible));
1413
0
    EXPECT_TRUE(c.SetCapacity(0, fallible));
1414
0
1415
0
    EXPECT_FALSE(d.SetCapacity(nsString::size_type(-1)/2 - 1, fallible));
1416
0
    EXPECT_FALSE(d.SetCapacity(nsString::size_type(-1)/2, fallible));
1417
0
    EXPECT_TRUE(d.SetCapacity(0, fallible));
1418
0
1419
0
    EXPECT_FALSE(e.SetCapacity(nsString::size_type(-1)/4, fallible));
1420
0
    EXPECT_FALSE(e.SetCapacity(nsString::size_type(-1)/4 + 1, fallible));
1421
0
    EXPECT_TRUE(e.SetCapacity(0, fallible));
1422
0
1423
0
    EXPECT_FALSE(f.SetCapacity(nsString::size_type(-1)/2, fallible));
1424
0
    EXPECT_TRUE(f.SetCapacity(0, fallible));
1425
0
1426
0
    EXPECT_FALSE(g.SetCapacity(nsString::size_type(-1)/4 + 1000, fallible));
1427
0
    EXPECT_FALSE(g.SetCapacity(nsString::size_type(-1)/4 + 1001, fallible));
1428
0
    EXPECT_TRUE(g.SetCapacity(0, fallible));
1429
0
1430
0
    EXPECT_FALSE(h.SetCapacity(nsString::size_type(-1)/4+1, fallible));
1431
0
    EXPECT_FALSE(h.SetCapacity(nsString::size_type(-1)/2, fallible));
1432
0
    EXPECT_TRUE(h.SetCapacity(0, fallible));
1433
0
1434
0
    EXPECT_TRUE(i.SetCapacity(1, fallible));
1435
0
    EXPECT_TRUE(i.SetCapacity(nsString::size_type(-1)/4 - 1000, fallible));
1436
0
    EXPECT_FALSE(i.SetCapacity(nsString::size_type(-1)/4 + 1, fallible));
1437
0
    EXPECT_TRUE(i.SetCapacity(0, fallible));
1438
0
1439
0
    EXPECT_TRUE(j.SetCapacity(nsString::size_type(-1)/4 - 1000, fallible));
1440
0
    EXPECT_FALSE(j.SetCapacity(nsString::size_type(-1)/4 + 1, fallible));
1441
0
    EXPECT_TRUE(j.SetCapacity(0, fallible));
1442
0
1443
0
    EXPECT_TRUE(k.SetCapacity(nsString::size_type(-1)/8 - 1000, fallible));
1444
0
    EXPECT_TRUE(k.SetCapacity(nsString::size_type(-1)/4 - 1001, fallible));
1445
0
    EXPECT_TRUE(k.SetCapacity(nsString::size_type(-1)/4 - 998, fallible));
1446
0
    EXPECT_FALSE(k.SetCapacity(nsString::size_type(-1)/4 + 1, fallible));
1447
0
    EXPECT_TRUE(k.SetCapacity(0, fallible));
1448
0
1449
0
    EXPECT_TRUE(l.SetCapacity(nsString::size_type(-1)/8, fallible));
1450
0
    EXPECT_TRUE(l.SetCapacity(nsString::size_type(-1)/8 + 1, fallible));
1451
0
    EXPECT_TRUE(l.SetCapacity(nsString::size_type(-1)/8 + 2, fallible));
1452
0
    EXPECT_TRUE(l.SetCapacity(0, fallible));
1453
0
1454
0
    EXPECT_TRUE(m.SetCapacity(nsString::size_type(-1)/8 + 1000, fallible));
1455
0
    EXPECT_TRUE(m.SetCapacity(nsString::size_type(-1)/8 + 1001, fallible));
1456
0
    EXPECT_TRUE(m.SetCapacity(0, fallible));
1457
0
1458
0
    EXPECT_TRUE(n.SetCapacity(nsString::size_type(-1)/8+1, fallible));
1459
0
    EXPECT_FALSE(n.SetCapacity(nsString::size_type(-1)/4, fallible));
1460
0
    EXPECT_TRUE(n.SetCapacity(0, fallible));
1461
0
1462
0
    EXPECT_TRUE(n.SetCapacity(0, fallible));
1463
0
    EXPECT_TRUE(n.SetCapacity((nsString::size_type(-1)/2 - sizeof(nsStringBuffer)) / 2 - 2, fallible));
1464
0
    EXPECT_TRUE(n.SetCapacity(0, fallible));
1465
0
    EXPECT_FALSE(n.SetCapacity((nsString::size_type(-1)/2 - sizeof(nsStringBuffer)) / 2 - 1, fallible));
1466
0
    EXPECT_TRUE(n.SetCapacity(0, fallible));
1467
0
    EXPECT_TRUE(n1.SetCapacity(0, fallible));
1468
0
    EXPECT_TRUE(n1.SetCapacity((nsCString::size_type(-1)/2 - sizeof(nsStringBuffer)) / 1 - 2, fallible));
1469
0
    EXPECT_TRUE(n1.SetCapacity(0, fallible));
1470
0
    EXPECT_FALSE(n1.SetCapacity((nsCString::size_type(-1)/2 - sizeof(nsStringBuffer)) / 1 - 1, fallible));
1471
0
    EXPECT_TRUE(n1.SetCapacity(0, fallible));
1472
0
  }
1473
0
}
1474
1475
static void test_tofloat_helper(const nsString& aStr, float aExpected, bool aSuccess)
1476
0
{
1477
0
  nsresult result;
1478
0
  EXPECT_EQ(aStr.ToFloat(&result), aExpected);
1479
0
  if (aSuccess) {
1480
0
    EXPECT_EQ(result, NS_OK);
1481
0
  } else {
1482
0
    EXPECT_NE(result, NS_OK);
1483
0
  }
1484
0
}
1485
1486
TEST_F(Strings, tofloat)
1487
0
{
1488
0
  test_tofloat_helper(NS_LITERAL_STRING("42"), 42.f, true);
1489
0
  test_tofloat_helper(NS_LITERAL_STRING("42.0"), 42.f, true);
1490
0
  test_tofloat_helper(NS_LITERAL_STRING("-42"), -42.f, true);
1491
0
  test_tofloat_helper(NS_LITERAL_STRING("+42"), 42, true);
1492
0
  test_tofloat_helper(NS_LITERAL_STRING("13.37"), 13.37f, true);
1493
0
  test_tofloat_helper(NS_LITERAL_STRING("1.23456789"), 1.23456789f, true);
1494
0
  test_tofloat_helper(NS_LITERAL_STRING("1.98765432123456"), 1.98765432123456f, true);
1495
0
  test_tofloat_helper(NS_LITERAL_STRING("0"), 0.f, true);
1496
0
  test_tofloat_helper(NS_LITERAL_STRING("1.e5"), 100000, true);
1497
0
  test_tofloat_helper(NS_LITERAL_STRING(""), 0.f, false);
1498
0
  test_tofloat_helper(NS_LITERAL_STRING("42foo"), 42.f, false);
1499
0
  test_tofloat_helper(NS_LITERAL_STRING("foo"), 0.f, false);
1500
0
}
1501
1502
static void test_todouble_helper(const nsString& aStr, double aExpected, bool aSuccess)
1503
0
{
1504
0
  nsresult result;
1505
0
  EXPECT_EQ(aStr.ToDouble(&result), aExpected);
1506
0
  if (aSuccess) {
1507
0
    EXPECT_EQ(result, NS_OK);
1508
0
  } else {
1509
0
    EXPECT_NE(result, NS_OK);
1510
0
  }
1511
0
}
1512
1513
TEST_F(Strings, todouble)
1514
0
{
1515
0
  test_todouble_helper(NS_LITERAL_STRING("42"), 42, true);
1516
0
  test_todouble_helper(NS_LITERAL_STRING("42.0"), 42, true);
1517
0
  test_todouble_helper(NS_LITERAL_STRING("-42"), -42, true);
1518
0
  test_todouble_helper(NS_LITERAL_STRING("+42"), 42, true);
1519
0
  test_todouble_helper(NS_LITERAL_STRING("13.37"), 13.37, true);
1520
0
  test_todouble_helper(NS_LITERAL_STRING("1.23456789"), 1.23456789, true);
1521
0
  test_todouble_helper(NS_LITERAL_STRING("1.98765432123456"), 1.98765432123456, true);
1522
0
  test_todouble_helper(NS_LITERAL_STRING("123456789.98765432123456"), 123456789.98765432123456, true);
1523
0
  test_todouble_helper(NS_LITERAL_STRING("0"), 0, true);
1524
0
  test_todouble_helper(NS_LITERAL_STRING("1.e5"), 100000, true);
1525
0
  test_todouble_helper(NS_LITERAL_STRING(""), 0, false);
1526
0
  test_todouble_helper(NS_LITERAL_STRING("42foo"), 42, false);
1527
0
  test_todouble_helper(NS_LITERAL_STRING("foo"), 0, false);
1528
0
}
1529
1530
TEST_F(Strings, Split)
1531
0
{
1532
0
   nsCString one("one"),
1533
0
             two("one;two"),
1534
0
             three("one--three"),
1535
0
             empty(""),
1536
0
             delimStart("-two"),
1537
0
             delimEnd("one-");
1538
0
1539
0
  nsString wide(u"hello world");
1540
0
1541
0
  size_t counter = 0;
1542
0
  for (const nsACString& token : one.Split(',')) {
1543
0
    EXPECT_TRUE(token.EqualsLiteral("one"));
1544
0
    counter++;
1545
0
  }
1546
0
  EXPECT_EQ(counter, (size_t)1);
1547
0
1548
0
  counter = 0;
1549
0
  for (const nsACString& token : two.Split(';')) {
1550
0
    if (counter == 0) {
1551
0
      EXPECT_TRUE(token.EqualsLiteral("one"));
1552
0
    } else if (counter == 1) {
1553
0
      EXPECT_TRUE(token.EqualsLiteral("two"));
1554
0
    }
1555
0
    counter++;
1556
0
  }
1557
0
  EXPECT_EQ(counter, (size_t)2);
1558
0
1559
0
  counter = 0;
1560
0
  for (const nsACString& token : three.Split('-')) {
1561
0
    if (counter == 0) {
1562
0
      EXPECT_TRUE(token.EqualsLiteral("one"));
1563
0
    } else if (counter == 1) {
1564
0
      EXPECT_TRUE(token.EqualsLiteral(""));
1565
0
    } else if (counter == 2) {
1566
0
      EXPECT_TRUE(token.EqualsLiteral("three"));
1567
0
    }
1568
0
    counter++;
1569
0
  }
1570
0
  EXPECT_EQ(counter, (size_t)3);
1571
0
1572
0
  counter = 0;
1573
0
  for (const nsACString& token : empty.Split(',')) {
1574
0
    mozilla::Unused << token;
1575
0
    counter++;
1576
0
  }
1577
0
  EXPECT_EQ(counter, (size_t)0);
1578
0
1579
0
  counter = 0;
1580
0
  for (const nsACString& token : delimStart.Split('-')) {
1581
0
    if (counter == 0) {
1582
0
      EXPECT_TRUE(token.EqualsLiteral(""));
1583
0
    } else if (counter == 1) {
1584
0
      EXPECT_TRUE(token.EqualsLiteral("two"));
1585
0
    }
1586
0
    counter++;
1587
0
  }
1588
0
  EXPECT_EQ(counter, (size_t)2);
1589
0
1590
0
  counter = 0;
1591
0
  for (const nsACString& token : delimEnd.Split('-')) {
1592
0
    if (counter == 0) {
1593
0
      EXPECT_TRUE(token.EqualsLiteral("one"));
1594
0
    } else if (counter == 1) {
1595
0
      EXPECT_TRUE(token.EqualsLiteral(""));
1596
0
    }
1597
0
    counter++;
1598
0
  }
1599
0
  EXPECT_EQ(counter, (size_t)2);
1600
0
1601
0
  counter = 0;
1602
0
  for (const nsAString& token : wide.Split(' ')) {
1603
0
    if (counter == 0) {
1604
0
      EXPECT_TRUE(token.Equals(NS_LITERAL_STRING("hello")));
1605
0
    } else if (counter == 1) {
1606
0
      EXPECT_TRUE(token.Equals(NS_LITERAL_STRING("world")));
1607
0
    }
1608
0
    counter++;
1609
0
  }
1610
0
  EXPECT_EQ(counter, (size_t)2);
1611
0
}
1612
1613
constexpr bool TestSomeChars(char c)
1614
0
{
1615
0
  return c == 'a' || c == 'c' || c == 'e' || c == '7' ||
1616
0
         c == 'G' || c == 'Z' || c == '\b' || c == '?';
1617
0
}
1618
TEST_F(Strings,ASCIIMask)
1619
0
{
1620
0
  const ASCIIMaskArray& maskCRLF = mozilla::ASCIIMask::MaskCRLF();
1621
0
  EXPECT_TRUE(maskCRLF['\n'] && mozilla::ASCIIMask::IsMasked(maskCRLF, '\n'));
1622
0
  EXPECT_TRUE(maskCRLF['\r'] && mozilla::ASCIIMask::IsMasked(maskCRLF, '\r'));
1623
0
  EXPECT_FALSE(maskCRLF['g'] || mozilla::ASCIIMask::IsMasked(maskCRLF, 'g'));
1624
0
  EXPECT_FALSE(maskCRLF[' '] || mozilla::ASCIIMask::IsMasked(maskCRLF, ' '));
1625
0
  EXPECT_FALSE(maskCRLF['\0'] || mozilla::ASCIIMask::IsMasked(maskCRLF, '\0'));
1626
0
  EXPECT_FALSE(mozilla::ASCIIMask::IsMasked(maskCRLF, 14324));
1627
0
1628
0
  const ASCIIMaskArray& mask0to9 = mozilla::ASCIIMask::Mask0to9();
1629
0
  EXPECT_TRUE(mask0to9['9'] && mozilla::ASCIIMask::IsMasked(mask0to9, '9'));
1630
0
  EXPECT_TRUE(mask0to9['0'] && mozilla::ASCIIMask::IsMasked(mask0to9, '0'));
1631
0
  EXPECT_TRUE(mask0to9['4'] && mozilla::ASCIIMask::IsMasked(mask0to9, '4'));
1632
0
  EXPECT_FALSE(mask0to9['g'] || mozilla::ASCIIMask::IsMasked(mask0to9, 'g'));
1633
0
  EXPECT_FALSE(mask0to9[' '] || mozilla::ASCIIMask::IsMasked(mask0to9, ' '));
1634
0
  EXPECT_FALSE(mask0to9['\n'] || mozilla::ASCIIMask::IsMasked(mask0to9, '\n'));
1635
0
  EXPECT_FALSE(mask0to9['\0'] || mozilla::ASCIIMask::IsMasked(mask0to9, '\0'));
1636
0
  EXPECT_FALSE(mozilla::ASCIIMask::IsMasked(maskCRLF, 14324));
1637
0
1638
0
  const ASCIIMaskArray& maskWS = mozilla::ASCIIMask::MaskWhitespace();
1639
0
  EXPECT_TRUE(maskWS[' '] && mozilla::ASCIIMask::IsMasked(maskWS, ' '));
1640
0
  EXPECT_TRUE(maskWS['\t'] && mozilla::ASCIIMask::IsMasked(maskWS, '\t'));
1641
0
  EXPECT_FALSE(maskWS['8'] || mozilla::ASCIIMask::IsMasked(maskWS, '8'));
1642
0
  EXPECT_FALSE(maskWS['\0'] || mozilla::ASCIIMask::IsMasked(maskWS, '\0'));
1643
0
  EXPECT_FALSE(mozilla::ASCIIMask::IsMasked(maskCRLF, 14324));
1644
0
1645
0
  constexpr ASCIIMaskArray maskSome = mozilla::CreateASCIIMask(TestSomeChars);
1646
0
  EXPECT_TRUE(maskSome['a'] && mozilla::ASCIIMask::IsMasked(maskSome, 'a'));
1647
0
  EXPECT_TRUE(maskSome['c'] && mozilla::ASCIIMask::IsMasked(maskSome, 'c'));
1648
0
  EXPECT_TRUE(maskSome['e'] && mozilla::ASCIIMask::IsMasked(maskSome, 'e'));
1649
0
  EXPECT_TRUE(maskSome['7'] && mozilla::ASCIIMask::IsMasked(maskSome, '7'));
1650
0
  EXPECT_TRUE(maskSome['G'] && mozilla::ASCIIMask::IsMasked(maskSome, 'G'));
1651
0
  EXPECT_TRUE(maskSome['Z'] && mozilla::ASCIIMask::IsMasked(maskSome, 'Z'));
1652
0
  EXPECT_TRUE(maskSome['\b'] && mozilla::ASCIIMask::IsMasked(maskSome, '\b'));
1653
0
  EXPECT_TRUE(maskSome['?'] && mozilla::ASCIIMask::IsMasked(maskSome, '?'));
1654
0
  EXPECT_FALSE(maskSome['8'] || mozilla::ASCIIMask::IsMasked(maskSome, '8'));
1655
0
  EXPECT_FALSE(maskSome['\0'] || mozilla::ASCIIMask::IsMasked(maskSome, '\0'));
1656
0
  EXPECT_FALSE(mozilla::ASCIIMask::IsMasked(maskCRLF, 14324));
1657
0
}
1658
1659
template <typename T> void
1660
CompressWhitespaceHelper()
1661
0
{
1662
0
  T s;
1663
0
  s.AssignLiteral("abcabcabc");
1664
0
  s.CompressWhitespace(true, true);
1665
0
  EXPECT_TRUE(s.EqualsLiteral("abcabcabc"));
1666
0
1667
0
  s.AssignLiteral("   \n\rabcabcabc\r\n");
1668
0
  s.CompressWhitespace(true, true);
1669
0
  EXPECT_TRUE(s.EqualsLiteral("abcabcabc"));
1670
0
1671
0
  s.AssignLiteral("   \n\rabc   abc   abc\r\n");
1672
0
  s.CompressWhitespace(true, true);
1673
0
  EXPECT_TRUE(s.EqualsLiteral("abc abc abc"));
1674
0
1675
0
  s.AssignLiteral("   \n\rabc\r   abc\n   abc\r\n");
1676
0
  s.CompressWhitespace(true, true);
1677
0
  EXPECT_TRUE(s.EqualsLiteral("abc abc abc"));
1678
0
1679
0
  s.AssignLiteral("   \n\rabc\r  \nabc\n   \rabc\r\n");
1680
0
  s.CompressWhitespace(true, true);
1681
0
  EXPECT_TRUE(s.EqualsLiteral("abc abc abc"));
1682
0
1683
0
  s.AssignLiteral("   \n\rabc\r   abc\n   abc\r\n");
1684
0
  s.CompressWhitespace(false, true);
1685
0
  EXPECT_TRUE(s.EqualsLiteral(" abc abc abc"));
1686
0
1687
0
  s.AssignLiteral("   \n\rabc\r   abc\n   abc\r\n");
1688
0
  s.CompressWhitespace(true, false);
1689
0
  EXPECT_TRUE(s.EqualsLiteral("abc abc abc "));
1690
0
1691
0
  s.AssignLiteral("   \n\rabc\r   abc\n   abc\r\n");
1692
0
  s.CompressWhitespace(false, false);
1693
0
  EXPECT_TRUE(s.EqualsLiteral(" abc abc abc "));
1694
0
1695
0
  s.AssignLiteral("  \r\n  ");
1696
0
  s.CompressWhitespace(true, true);
1697
0
  EXPECT_TRUE(s.EqualsLiteral(""));
1698
0
1699
0
  s.AssignLiteral("  \r\n  \t");
1700
0
  s.CompressWhitespace(true, true);
1701
0
  EXPECT_TRUE(s.EqualsLiteral(""));
1702
0
1703
0
  s.AssignLiteral("\n  \r\n  \t");
1704
0
  s.CompressWhitespace(false, false);
1705
0
  EXPECT_TRUE(s.EqualsLiteral(" "));
1706
0
1707
0
  s.AssignLiteral("\n  \r\n  \t");
1708
0
  s.CompressWhitespace(false, true);
1709
0
  EXPECT_TRUE(s.EqualsLiteral(""));
1710
0
1711
0
  s.AssignLiteral("\n  \r\n  \t");
1712
0
  s.CompressWhitespace(true, false);
1713
0
  EXPECT_TRUE(s.EqualsLiteral(""));
1714
0
1715
0
  s.AssignLiteral("");
1716
0
  s.CompressWhitespace(false, false);
1717
0
  EXPECT_TRUE(s.EqualsLiteral(""));
1718
0
1719
0
  s.AssignLiteral("");
1720
0
  s.CompressWhitespace(false, true);
1721
0
  EXPECT_TRUE(s.EqualsLiteral(""));
1722
0
1723
0
  s.AssignLiteral("");
1724
0
  s.CompressWhitespace(true, false);
1725
0
  EXPECT_TRUE(s.EqualsLiteral(""));
1726
0
1727
0
  s.AssignLiteral("");
1728
0
  s.CompressWhitespace(true, true);
1729
0
  EXPECT_TRUE(s.EqualsLiteral(""));
1730
0
}
Unexecuted instantiation: void TestStrings::CompressWhitespaceHelper<nsTString<char> >()
Unexecuted instantiation: void TestStrings::CompressWhitespaceHelper<nsTString<char16_t> >()
1731
1732
TEST_F(Strings, CompressWhitespace)
1733
0
{
1734
0
  CompressWhitespaceHelper<nsCString>();
1735
0
}
1736
1737
TEST_F(Strings, CompressWhitespaceW)
1738
0
{
1739
0
  CompressWhitespaceHelper<nsString>();
1740
0
1741
0
  nsString str, result;
1742
0
  str.AssignLiteral(u"\u263A    is\r\n   ;-)");
1743
0
  result.AssignLiteral(u"\u263A is ;-)");
1744
0
  str.CompressWhitespace(true, true);
1745
0
  EXPECT_TRUE(str == result);
1746
0
}
1747
1748
template <typename T> void
1749
StripCRLFHelper()
1750
0
{
1751
0
  T s;
1752
0
  s.AssignLiteral("abcabcabc");
1753
0
  s.StripCRLF();
1754
0
  EXPECT_TRUE(s.EqualsLiteral("abcabcabc"));
1755
0
1756
0
  s.AssignLiteral("   \n\rabcabcabc\r\n");
1757
0
  s.StripCRLF();
1758
0
  EXPECT_TRUE(s.EqualsLiteral("   abcabcabc"));
1759
0
1760
0
  s.AssignLiteral("   \n\rabc   abc   abc\r\n");
1761
0
  s.StripCRLF();
1762
0
  EXPECT_TRUE(s.EqualsLiteral("   abc   abc   abc"));
1763
0
1764
0
  s.AssignLiteral("   \n\rabc\r   abc\n   abc\r\n");
1765
0
  s.StripCRLF();
1766
0
  EXPECT_TRUE(s.EqualsLiteral("   abc   abc   abc"));
1767
0
1768
0
  s.AssignLiteral("   \n\rabc\r  \nabc\n   \rabc\r\n");
1769
0
  s.StripCRLF();
1770
0
  EXPECT_TRUE(s.EqualsLiteral("   abc  abc   abc"));
1771
0
1772
0
  s.AssignLiteral("   \n\rabc\r   abc\n   abc\r\n");
1773
0
  s.StripCRLF();
1774
0
  EXPECT_TRUE(s.EqualsLiteral("   abc   abc   abc"));
1775
0
1776
0
  s.AssignLiteral("  \r\n  ");
1777
0
  s.StripCRLF();
1778
0
  EXPECT_TRUE(s.EqualsLiteral("    "));
1779
0
1780
0
  s.AssignLiteral("  \r\n  \t");
1781
0
  s.StripCRLF();
1782
0
  EXPECT_TRUE(s.EqualsLiteral("    \t"));
1783
0
1784
0
  s.AssignLiteral("\n  \r\n  \t");
1785
0
  s.StripCRLF();
1786
0
  EXPECT_TRUE(s.EqualsLiteral("    \t"));
1787
0
1788
0
  s.AssignLiteral("");
1789
0
  s.StripCRLF();
1790
0
  EXPECT_TRUE(s.EqualsLiteral(""));
1791
0
}
Unexecuted instantiation: void TestStrings::StripCRLFHelper<nsTString<char> >()
Unexecuted instantiation: void TestStrings::StripCRLFHelper<nsTString<char16_t> >()
1792
1793
TEST_F(Strings, StripCRLF)
1794
0
{
1795
0
  StripCRLFHelper<nsCString>();
1796
0
}
1797
1798
TEST_F(Strings, StripCRLFW)
1799
0
{
1800
0
  StripCRLFHelper<nsString>();
1801
0
1802
0
  nsString str, result;
1803
0
  str.AssignLiteral(u"\u263A    is\r\n   ;-)");
1804
0
  result.AssignLiteral(u"\u263A    is   ;-)");
1805
0
  str.StripCRLF();
1806
0
  EXPECT_TRUE(str == result);
1807
0
}
1808
1809
// Note the five calls in the loop, so divide by 100k
1810
MOZ_GTEST_BENCH_F(Strings, PerfStripWhitespace, [this] {
1811
    nsCString test1(mExample1Utf8);
1812
    nsCString test2(mExample2Utf8);
1813
    nsCString test3(mExample3Utf8);
1814
    nsCString test4(mExample4Utf8);
1815
    nsCString test5(mExample5Utf8);
1816
    for (int i = 0; i < 20000; i++) {
1817
      test1.StripWhitespace();
1818
      test2.StripWhitespace();
1819
      test3.StripWhitespace();
1820
      test4.StripWhitespace();
1821
      test5.StripWhitespace();
1822
    }
1823
});
1824
1825
MOZ_GTEST_BENCH_F(Strings, PerfStripCharsWhitespace, [this] {
1826
    // This is the unoptimized (original) version of
1827
    // StripWhitespace using StripChars.
1828
    nsCString test1(mExample1Utf8);
1829
    nsCString test2(mExample2Utf8);
1830
    nsCString test3(mExample3Utf8);
1831
    nsCString test4(mExample4Utf8);
1832
    nsCString test5(mExample5Utf8);
1833
    for (int i = 0; i < 20000; i++) {
1834
      test1.StripChars("\f\t\r\n ");
1835
      test2.StripChars("\f\t\r\n ");
1836
      test3.StripChars("\f\t\r\n ");
1837
      test4.StripChars("\f\t\r\n ");
1838
      test5.StripChars("\f\t\r\n ");
1839
    }
1840
});
1841
1842
MOZ_GTEST_BENCH_F(Strings, PerfCompressWhitespace, [this] {
1843
    nsCString test1(mExample1Utf8);
1844
    nsCString test2(mExample2Utf8);
1845
    nsCString test3(mExample3Utf8);
1846
    nsCString test4(mExample4Utf8);
1847
    nsCString test5(mExample5Utf8);
1848
    for (int i = 0; i < 20000; i++) {
1849
      test1.CompressWhitespace();
1850
      test2.CompressWhitespace();
1851
      test3.CompressWhitespace();
1852
      test4.CompressWhitespace();
1853
      test5.CompressWhitespace();
1854
    }
1855
});
1856
1857
MOZ_GTEST_BENCH_F(Strings, PerfStripCRLF, [this] {
1858
    nsCString test1(mExample1Utf8);
1859
    nsCString test2(mExample2Utf8);
1860
    nsCString test3(mExample3Utf8);
1861
    nsCString test4(mExample4Utf8);
1862
    nsCString test5(mExample5Utf8);
1863
    for (int i = 0; i < 20000; i++) {
1864
      test1.StripCRLF();
1865
      test2.StripCRLF();
1866
      test3.StripCRLF();
1867
      test4.StripCRLF();
1868
      test5.StripCRLF();
1869
    }
1870
});
1871
1872
MOZ_GTEST_BENCH_F(Strings, PerfStripCharsCRLF, [this] {
1873
    // This is the unoptimized (original) version of
1874
    // stripping \r\n using StripChars.
1875
    nsCString test1(mExample1Utf8);
1876
    nsCString test2(mExample2Utf8);
1877
    nsCString test3(mExample3Utf8);
1878
    nsCString test4(mExample4Utf8);
1879
    nsCString test5(mExample5Utf8);
1880
    for (int i = 0; i < 20000; i++) {
1881
      test1.StripChars("\r\n");
1882
      test2.StripChars("\r\n");
1883
      test3.StripChars("\r\n");
1884
      test4.StripChars("\r\n");
1885
      test5.StripChars("\r\n");
1886
    }
1887
});
1888
1889
MOZ_GTEST_BENCH_F(Strings, PerfIsUTF8One, [this] {
1890
    for (int i = 0; i < 200000; i++) {
1891
      bool b = IsUTF8(*BlackBox(&mAsciiOneUtf8));
1892
      BlackBox(&b);
1893
    }
1894
});
1895
1896
MOZ_GTEST_BENCH_F(Strings, PerfIsUTF8Fifteen, [this] {
1897
    for (int i = 0; i < 200000; i++) {
1898
      bool b = IsUTF8(*BlackBox(&mAsciiFifteenUtf8));
1899
      BlackBox(&b);
1900
    }
1901
});
1902
1903
MOZ_GTEST_BENCH_F(Strings, PerfIsUTF8Hundred, [this] {
1904
    for (int i = 0; i < 200000; i++) {
1905
      bool b = IsUTF8(*BlackBox(&mAsciiHundredUtf8));
1906
      BlackBox(&b);
1907
    }
1908
});
1909
1910
MOZ_GTEST_BENCH_F(Strings, PerfIsUTF8Example3, [this] {
1911
    for (int i = 0; i < 100000; i++) {
1912
      bool b = IsUTF8(*BlackBox(&mExample3Utf8));
1913
      BlackBox(&b);
1914
    }
1915
});
1916
1917
MOZ_GTEST_BENCH_F(Strings, PerfIsASCII8One, [this] {
1918
    for (int i = 0; i < 200000; i++) {
1919
      bool b = IsASCII(*BlackBox(&mAsciiOneUtf8));
1920
      BlackBox(&b);
1921
    }
1922
});
1923
1924
MOZ_GTEST_BENCH_F(Strings, PerfIsASCIIFifteen, [this] {
1925
    for (int i = 0; i < 200000; i++) {
1926
      bool b = IsASCII(*BlackBox(&mAsciiFifteenUtf8));
1927
      BlackBox(&b);
1928
    }
1929
});
1930
1931
MOZ_GTEST_BENCH_F(Strings, PerfIsASCIIHundred, [this] {
1932
    for (int i = 0; i < 200000; i++) {
1933
      bool b = IsASCII(*BlackBox(&mAsciiHundredUtf8));
1934
      BlackBox(&b);
1935
    }
1936
});
1937
1938
MOZ_GTEST_BENCH_F(Strings, PerfIsASCIIExample3, [this] {
1939
    for (int i = 0; i < 100000; i++) {
1940
      bool b = IsASCII(*BlackBox(&mExample3Utf8));
1941
      BlackBox(&b);
1942
    }
1943
});
1944
1945
MOZ_GTEST_BENCH_F(Strings, PerfHasRTLCharsExample3, [this] {
1946
    for (int i = 0; i < 5000; i++) {
1947
      bool b = HasRTLChars(*BlackBox(&mExample3Utf16));
1948
      BlackBox(&b);
1949
    }
1950
});
1951
1952
MOZ_GTEST_BENCH_F(Strings, PerfHasRTLCharsDE, [this] {
1953
    for (int i = 0; i < 5000; i++) {
1954
      bool b = HasRTLChars(*BlackBox(&mDeUtf16));
1955
      BlackBox(&b);
1956
    }
1957
});
1958
1959
MOZ_GTEST_BENCH_F(Strings, PerfHasRTLCharsRU, [this] {
1960
    for (int i = 0; i < 5000; i++) {
1961
      bool b = HasRTLChars(*BlackBox(&mRuUtf16));
1962
      BlackBox(&b);
1963
    }
1964
});
1965
1966
MOZ_GTEST_BENCH_F(Strings, PerfHasRTLCharsTH, [this] {
1967
    for (int i = 0; i < 5000; i++) {
1968
      bool b = HasRTLChars(*BlackBox(&mThUtf16));
1969
      BlackBox(&b);
1970
    }
1971
});
1972
1973
MOZ_GTEST_BENCH_F(Strings, PerfHasRTLCharsJA, [this] {
1974
    for (int i = 0; i < 5000; i++) {
1975
      bool b = HasRTLChars(*BlackBox(&mJaUtf16));
1976
      BlackBox(&b);
1977
    }
1978
});
1979
1980
CONVERSION_BENCH(PerfUTF16toLatin1ASCIIOne, LossyCopyUTF16toASCII, mAsciiOneUtf16, nsAutoCString);
1981
1982
CONVERSION_BENCH(PerfUTF16toLatin1ASCIIThree, LossyCopyUTF16toASCII, mAsciiThreeUtf16, nsAutoCString);
1983
1984
CONVERSION_BENCH(PerfUTF16toLatin1ASCIIFifteen, LossyCopyUTF16toASCII, mAsciiFifteenUtf16, nsAutoCString);
1985
1986
CONVERSION_BENCH(PerfUTF16toLatin1ASCIIHundred, LossyCopyUTF16toASCII, mAsciiHundredUtf16, nsAutoCString);
1987
1988
CONVERSION_BENCH(PerfUTF16toLatin1ASCIIThousand, LossyCopyUTF16toASCII, mAsciiThousandUtf16, nsAutoCString);
1989
1990
CONVERSION_BENCH(PerfUTF16toLatin1DEOne, LossyCopyUTF16toASCII, mDeEditOneUtf16, nsAutoCString);
1991
1992
CONVERSION_BENCH(PerfUTF16toLatin1DEThree, LossyCopyUTF16toASCII, mDeEditThreeUtf16, nsAutoCString);
1993
1994
CONVERSION_BENCH(PerfUTF16toLatin1DEFifteen, LossyCopyUTF16toASCII, mDeEditFifteenUtf16, nsAutoCString);
1995
1996
CONVERSION_BENCH(PerfUTF16toLatin1DEHundred, LossyCopyUTF16toASCII, mDeEditHundredUtf16, nsAutoCString);
1997
1998
CONVERSION_BENCH(PerfUTF16toLatin1DEThousand, LossyCopyUTF16toASCII, mDeEditThousandUtf16, nsAutoCString);
1999
2000
CONVERSION_BENCH(PerfLatin1toUTF16AsciiOne, CopyASCIItoUTF16, mAsciiOneUtf8, nsAutoString);
2001
2002
CONVERSION_BENCH(PerfLatin1toUTF16AsciiThree, CopyASCIItoUTF16, mAsciiThreeUtf8, nsAutoString);
2003
2004
CONVERSION_BENCH(PerfLatin1toUTF16AsciiFifteen, CopyASCIItoUTF16, mAsciiFifteenUtf8, nsAutoString);
2005
2006
CONVERSION_BENCH(PerfLatin1toUTF16AsciiHundred, CopyASCIItoUTF16, mAsciiHundredUtf8, nsAutoString);
2007
2008
CONVERSION_BENCH(PerfLatin1toUTF16AsciiThousand, CopyASCIItoUTF16, mAsciiThousandUtf8, nsAutoString);
2009
2010
CONVERSION_BENCH(PerfLatin1toUTF16DEOne, CopyASCIItoUTF16, mDeEditOneLatin1, nsAutoString);
2011
2012
CONVERSION_BENCH(PerfLatin1toUTF16DEThree, CopyASCIItoUTF16, mDeEditThreeLatin1, nsAutoString);
2013
2014
CONVERSION_BENCH(PerfLatin1toUTF16DEFifteen, CopyASCIItoUTF16, mDeEditFifteenLatin1, nsAutoString);
2015
2016
CONVERSION_BENCH(PerfLatin1toUTF16DEHundred, CopyASCIItoUTF16, mDeEditHundredLatin1, nsAutoString);
2017
2018
CONVERSION_BENCH(PerfLatin1toUTF16DEThousand, CopyASCIItoUTF16, mDeEditThousandLatin1, nsAutoString);
2019
2020
CONVERSION_BENCH(PerfUTF16toUTF8AsciiOne, CopyUTF16toUTF8, mAsciiOneUtf16, nsAutoCString);
2021
2022
CONVERSION_BENCH(PerfUTF16toUTF8AsciiThree, CopyUTF16toUTF8, mAsciiThreeUtf16, nsAutoCString);
2023
2024
CONVERSION_BENCH(PerfUTF16toUTF8AsciiFifteen, CopyUTF16toUTF8, mAsciiFifteenUtf16, nsAutoCString);
2025
2026
CONVERSION_BENCH(PerfUTF16toUTF8AsciiHundred, CopyUTF16toUTF8, mAsciiHundredUtf16, nsAutoCString);
2027
2028
CONVERSION_BENCH(PerfUTF16toUTF8AsciiThousand, CopyUTF16toUTF8, mAsciiThousandUtf16, nsAutoCString);
2029
2030
CONVERSION_BENCH(PerfUTF8toUTF16AsciiOne, CopyUTF8toUTF16, mAsciiOneUtf8, nsAutoString);
2031
2032
CONVERSION_BENCH(PerfUTF8toUTF16AsciiThree, CopyUTF8toUTF16, mAsciiThreeUtf8, nsAutoString);
2033
2034
CONVERSION_BENCH(PerfUTF8toUTF16AsciiFifteen, CopyUTF8toUTF16, mAsciiFifteenUtf8, nsAutoString);
2035
2036
CONVERSION_BENCH(PerfUTF8toUTF16AsciiHundred, CopyUTF8toUTF16, mAsciiHundredUtf8, nsAutoString);
2037
2038
CONVERSION_BENCH(PerfUTF8toUTF16AsciiThousand, CopyUTF8toUTF16, mAsciiThousandUtf8, nsAutoString);
2039
2040
CONVERSION_BENCH(PerfUTF16toUTF8AROne, CopyUTF16toUTF8, mArOneUtf16, nsAutoCString);
2041
2042
CONVERSION_BENCH(PerfUTF16toUTF8ARThree, CopyUTF16toUTF8, mArThreeUtf16, nsAutoCString);
2043
2044
CONVERSION_BENCH(PerfUTF16toUTF8ARFifteen, CopyUTF16toUTF8, mArFifteenUtf16, nsAutoCString);
2045
2046
CONVERSION_BENCH(PerfUTF16toUTF8ARHundred, CopyUTF16toUTF8, mArHundredUtf16, nsAutoCString);
2047
2048
CONVERSION_BENCH(PerfUTF16toUTF8ARThousand, CopyUTF16toUTF8, mArThousandUtf16, nsAutoCString);
2049
2050
CONVERSION_BENCH(PerfUTF8toUTF16AROne, CopyUTF8toUTF16, mArOneUtf8, nsAutoString);
2051
2052
CONVERSION_BENCH(PerfUTF8toUTF16ARThree, CopyUTF8toUTF16, mArThreeUtf8, nsAutoString);
2053
2054
CONVERSION_BENCH(PerfUTF8toUTF16ARFifteen, CopyUTF8toUTF16, mArFifteenUtf8, nsAutoString);
2055
2056
CONVERSION_BENCH(PerfUTF8toUTF16ARHundred, CopyUTF8toUTF16, mArHundredUtf8, nsAutoString);
2057
2058
CONVERSION_BENCH(PerfUTF8toUTF16ARThousand, CopyUTF8toUTF16, mArThousandUtf8, nsAutoString);
2059
2060
CONVERSION_BENCH(PerfUTF16toUTF8DEOne, CopyUTF16toUTF8, mDeOneUtf16, nsAutoCString);
2061
2062
CONVERSION_BENCH(PerfUTF16toUTF8DEThree, CopyUTF16toUTF8, mDeThreeUtf16, nsAutoCString);
2063
2064
CONVERSION_BENCH(PerfUTF16toUTF8DEFifteen, CopyUTF16toUTF8, mDeFifteenUtf16, nsAutoCString);
2065
2066
CONVERSION_BENCH(PerfUTF16toUTF8DEHundred, CopyUTF16toUTF8, mDeHundredUtf16, nsAutoCString);
2067
2068
CONVERSION_BENCH(PerfUTF16toUTF8DEThousand, CopyUTF16toUTF8, mDeThousandUtf16, nsAutoCString);
2069
2070
CONVERSION_BENCH(PerfUTF8toUTF16DEOne, CopyUTF8toUTF16, mDeOneUtf8, nsAutoString);
2071
2072
CONVERSION_BENCH(PerfUTF8toUTF16DEThree, CopyUTF8toUTF16, mDeThreeUtf8, nsAutoString);
2073
2074
CONVERSION_BENCH(PerfUTF8toUTF16DEFifteen, CopyUTF8toUTF16, mDeFifteenUtf8, nsAutoString);
2075
2076
CONVERSION_BENCH(PerfUTF8toUTF16DEHundred, CopyUTF8toUTF16, mDeHundredUtf8, nsAutoString);
2077
2078
CONVERSION_BENCH(PerfUTF8toUTF16DEThousand, CopyUTF8toUTF16, mDeThousandUtf8, nsAutoString);
2079
2080
CONVERSION_BENCH(PerfUTF16toUTF8RUOne, CopyUTF16toUTF8, mRuOneUtf16, nsAutoCString);
2081
2082
CONVERSION_BENCH(PerfUTF16toUTF8RUThree, CopyUTF16toUTF8, mRuThreeUtf16, nsAutoCString);
2083
2084
CONVERSION_BENCH(PerfUTF16toUTF8RUFifteen, CopyUTF16toUTF8, mRuFifteenUtf16, nsAutoCString);
2085
2086
CONVERSION_BENCH(PerfUTF16toUTF8RUHundred, CopyUTF16toUTF8, mRuHundredUtf16, nsAutoCString);
2087
2088
CONVERSION_BENCH(PerfUTF16toUTF8RUThousand, CopyUTF16toUTF8, mRuThousandUtf16, nsAutoCString);
2089
2090
CONVERSION_BENCH(PerfUTF8toUTF16RUOne, CopyUTF8toUTF16, mRuOneUtf8, nsAutoString);
2091
2092
CONVERSION_BENCH(PerfUTF8toUTF16RUThree, CopyUTF8toUTF16, mRuThreeUtf8, nsAutoString);
2093
2094
CONVERSION_BENCH(PerfUTF8toUTF16RUFifteen, CopyUTF8toUTF16, mRuFifteenUtf8, nsAutoString);
2095
2096
CONVERSION_BENCH(PerfUTF8toUTF16RUHundred, CopyUTF8toUTF16, mRuHundredUtf8, nsAutoString);
2097
2098
CONVERSION_BENCH(PerfUTF8toUTF16RUThousand, CopyUTF8toUTF16, mRuThousandUtf8, nsAutoString);
2099
2100
CONVERSION_BENCH(PerfUTF16toUTF8THOne, CopyUTF16toUTF8, mThOneUtf16, nsAutoCString);
2101
2102
CONVERSION_BENCH(PerfUTF16toUTF8THThree, CopyUTF16toUTF8, mThThreeUtf16, nsAutoCString);
2103
2104
CONVERSION_BENCH(PerfUTF16toUTF8THFifteen, CopyUTF16toUTF8, mThFifteenUtf16, nsAutoCString);
2105
2106
CONVERSION_BENCH(PerfUTF16toUTF8THHundred, CopyUTF16toUTF8, mThHundredUtf16, nsAutoCString);
2107
2108
CONVERSION_BENCH(PerfUTF16toUTF8THThousand, CopyUTF16toUTF8, mThThousandUtf16, nsAutoCString);
2109
2110
CONVERSION_BENCH(PerfUTF8toUTF16THOne, CopyUTF8toUTF16, mThOneUtf8, nsAutoString);
2111
2112
CONVERSION_BENCH(PerfUTF8toUTF16THThree, CopyUTF8toUTF16, mThThreeUtf8, nsAutoString);
2113
2114
CONVERSION_BENCH(PerfUTF8toUTF16THFifteen, CopyUTF8toUTF16, mThFifteenUtf8, nsAutoString);
2115
2116
CONVERSION_BENCH(PerfUTF8toUTF16THHundred, CopyUTF8toUTF16, mThHundredUtf8, nsAutoString);
2117
2118
CONVERSION_BENCH(PerfUTF8toUTF16THThousand, CopyUTF8toUTF16, mThThousandUtf8, nsAutoString);
2119
2120
CONVERSION_BENCH(PerfUTF16toUTF8JAOne, CopyUTF16toUTF8, mJaOneUtf16, nsAutoCString);
2121
2122
CONVERSION_BENCH(PerfUTF16toUTF8JAThree, CopyUTF16toUTF8, mJaThreeUtf16, nsAutoCString);
2123
2124
CONVERSION_BENCH(PerfUTF16toUTF8JAFifteen, CopyUTF16toUTF8, mJaFifteenUtf16, nsAutoCString);
2125
2126
CONVERSION_BENCH(PerfUTF16toUTF8JAHundred, CopyUTF16toUTF8, mJaHundredUtf16, nsAutoCString);
2127
2128
CONVERSION_BENCH(PerfUTF16toUTF8JAThousand, CopyUTF16toUTF8, mJaThousandUtf16, nsAutoCString);
2129
2130
CONVERSION_BENCH(PerfUTF8toUTF16JAOne, CopyUTF8toUTF16, mJaOneUtf8, nsAutoString);
2131
2132
CONVERSION_BENCH(PerfUTF8toUTF16JAThree, CopyUTF8toUTF16, mJaThreeUtf8, nsAutoString);
2133
2134
CONVERSION_BENCH(PerfUTF8toUTF16JAFifteen, CopyUTF8toUTF16, mJaFifteenUtf8, nsAutoString);
2135
2136
CONVERSION_BENCH(PerfUTF8toUTF16JAHundred, CopyUTF8toUTF16, mJaHundredUtf8, nsAutoString);
2137
2138
CONVERSION_BENCH(PerfUTF8toUTF16JAThousand, CopyUTF8toUTF16, mJaThousandUtf8, nsAutoString);
2139
2140
CONVERSION_BENCH(PerfUTF16toUTF8KOOne, CopyUTF16toUTF8, mKoOneUtf16, nsAutoCString);
2141
2142
CONVERSION_BENCH(PerfUTF16toUTF8KOThree, CopyUTF16toUTF8, mKoThreeUtf16, nsAutoCString);
2143
2144
CONVERSION_BENCH(PerfUTF16toUTF8KOFifteen, CopyUTF16toUTF8, mKoFifteenUtf16, nsAutoCString);
2145
2146
CONVERSION_BENCH(PerfUTF16toUTF8KOHundred, CopyUTF16toUTF8, mKoHundredUtf16, nsAutoCString);
2147
2148
CONVERSION_BENCH(PerfUTF16toUTF8KOThousand, CopyUTF16toUTF8, mKoThousandUtf16, nsAutoCString);
2149
2150
CONVERSION_BENCH(PerfUTF8toUTF16KOOne, CopyUTF8toUTF16, mKoOneUtf8, nsAutoString);
2151
2152
CONVERSION_BENCH(PerfUTF8toUTF16KOThree, CopyUTF8toUTF16, mKoThreeUtf8, nsAutoString);
2153
2154
CONVERSION_BENCH(PerfUTF8toUTF16KOFifteen, CopyUTF8toUTF16, mKoFifteenUtf8, nsAutoString);
2155
2156
CONVERSION_BENCH(PerfUTF8toUTF16KOHundred, CopyUTF8toUTF16, mKoHundredUtf8, nsAutoString);
2157
2158
CONVERSION_BENCH(PerfUTF8toUTF16KOThousand, CopyUTF8toUTF16, mKoThousandUtf8, nsAutoString);
2159
2160
CONVERSION_BENCH(PerfUTF16toUTF8TROne, CopyUTF16toUTF8, mTrOneUtf16, nsAutoCString);
2161
2162
CONVERSION_BENCH(PerfUTF16toUTF8TRThree, CopyUTF16toUTF8, mTrThreeUtf16, nsAutoCString);
2163
2164
CONVERSION_BENCH(PerfUTF16toUTF8TRFifteen, CopyUTF16toUTF8, mTrFifteenUtf16, nsAutoCString);
2165
2166
CONVERSION_BENCH(PerfUTF16toUTF8TRHundred, CopyUTF16toUTF8, mTrHundredUtf16, nsAutoCString);
2167
2168
CONVERSION_BENCH(PerfUTF16toUTF8TRThousand, CopyUTF16toUTF8, mTrThousandUtf16, nsAutoCString);
2169
2170
CONVERSION_BENCH(PerfUTF8toUTF16TROne, CopyUTF8toUTF16, mTrOneUtf8, nsAutoString);
2171
2172
CONVERSION_BENCH(PerfUTF8toUTF16TRThree, CopyUTF8toUTF16, mTrThreeUtf8, nsAutoString);
2173
2174
CONVERSION_BENCH(PerfUTF8toUTF16TRFifteen, CopyUTF8toUTF16, mTrFifteenUtf8, nsAutoString);
2175
2176
CONVERSION_BENCH(PerfUTF8toUTF16TRHundred, CopyUTF8toUTF16, mTrHundredUtf8, nsAutoString);
2177
2178
CONVERSION_BENCH(PerfUTF8toUTF16TRThousand, CopyUTF8toUTF16, mTrThousandUtf8, nsAutoString);
2179
2180
CONVERSION_BENCH(PerfUTF16toUTF8VIOne, CopyUTF16toUTF8, mViOneUtf16, nsAutoCString);
2181
2182
CONVERSION_BENCH(PerfUTF16toUTF8VIThree, CopyUTF16toUTF8, mViThreeUtf16, nsAutoCString);
2183
2184
CONVERSION_BENCH(PerfUTF16toUTF8VIFifteen, CopyUTF16toUTF8, mViFifteenUtf16, nsAutoCString);
2185
2186
CONVERSION_BENCH(PerfUTF16toUTF8VIHundred, CopyUTF16toUTF8, mViHundredUtf16, nsAutoCString);
2187
2188
CONVERSION_BENCH(PerfUTF16toUTF8VIThousand, CopyUTF16toUTF8, mViThousandUtf16, nsAutoCString);
2189
2190
CONVERSION_BENCH(PerfUTF8toUTF16VIOne, CopyUTF8toUTF16, mViOneUtf8, nsAutoString);
2191
2192
CONVERSION_BENCH(PerfUTF8toUTF16VIThree, CopyUTF8toUTF16, mViThreeUtf8, nsAutoString);
2193
2194
CONVERSION_BENCH(PerfUTF8toUTF16VIFifteen, CopyUTF8toUTF16, mViFifteenUtf8, nsAutoString);
2195
2196
CONVERSION_BENCH(PerfUTF8toUTF16VIHundred, CopyUTF8toUTF16, mViHundredUtf8, nsAutoString);
2197
2198
CONVERSION_BENCH(PerfUTF8toUTF16VIThousand, CopyUTF8toUTF16, mViThousandUtf8, nsAutoString);
2199
2200
} // namespace TestStrings