/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 |