• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2016 The PDFium Authors
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include <limits>
6 
7 #include "build/build_config.h"
8 #include "core/fxcrt/fx_string.h"
9 #include "core/fxcrt/span.h"
10 #include "core/fxcrt/utf16.h"
11 #include "testing/gtest/include/gtest/gtest.h"
12 
TEST(fxstring,FXUTF8Encode)13 TEST(fxstring, FXUTF8Encode) {
14   EXPECT_EQ("", FX_UTF8Encode(WideStringView()));
15   EXPECT_EQ(
16       "x"
17       "\u0080"
18       "\u00ff"
19       "\ud7ff"
20       "\ue000"
21       "\uff2c"
22       "\uffff"
23       "y",
24       FX_UTF8Encode(L"x"
25                     L"\u0080"
26                     L"\u00ff"
27                     L"\ud7ff"
28                     L"\ue000"
29                     L"\uff2c"
30                     L"\uffff"
31                     L"y"));
32 }
33 
TEST(fxstring,FXUTF8EncodeSupplementary)34 TEST(fxstring, FXUTF8EncodeSupplementary) {
35   EXPECT_EQ(
36       "\U00010000"
37       "��"
38       "\U0010ffff",
39       FX_UTF8Encode(L"\U00010000"
40                     L"\U0001f3a8"
41                     L"\U0010ffff"));
42 }
43 
44 #if defined(WCHAR_T_IS_16_BIT)
TEST(fxstring,FXUTF8EncodeSurrogateErrorRecovery)45 TEST(fxstring, FXUTF8EncodeSurrogateErrorRecovery) {
46   EXPECT_EQ("(\xed\xa0\x80)", FX_UTF8Encode(L"(\xd800)")) << "High";
47   EXPECT_EQ("(\xed\xb0\x80)", FX_UTF8Encode(L"(\xdc00)")) << "Low";
48   EXPECT_EQ("(\xed\xa0\x80��)", FX_UTF8Encode(L"(\xd800\xd83c\xdfa8)"))
49       << "High-high";
50   EXPECT_EQ("(��\xed\xb0\x80)", FX_UTF8Encode(L"(\xd83c\xdfa8\xdc00)"))
51       << "Low-low";
52 }
53 #endif  // defined(WCHAR_T_IS_16_BIT)
54 
TEST(fxstring,ByteStringToFloat)55 TEST(fxstring, ByteStringToFloat) {
56   EXPECT_FLOAT_EQ(0.0f, StringToFloat(""));
57   EXPECT_FLOAT_EQ(0.0f, StringToFloat("0"));
58   EXPECT_FLOAT_EQ(0.0f, StringToFloat("0.0"));
59   EXPECT_FLOAT_EQ(0.0f, StringToFloat("-0.0"));
60 
61   EXPECT_FLOAT_EQ(0.25f, StringToFloat("0.25"));
62   EXPECT_FLOAT_EQ(-0.25f, StringToFloat("-0.25"));
63 
64   EXPECT_FLOAT_EQ(100.0f, StringToFloat("100"));
65   EXPECT_FLOAT_EQ(100.0f, StringToFloat("100.0"));
66   EXPECT_FLOAT_EQ(100.0f, StringToFloat("    100.0"));
67   EXPECT_FLOAT_EQ(-100.0f, StringToFloat("-100.0000"));
68 
69   EXPECT_FLOAT_EQ(3.402823e+38f,
70                   StringToFloat("340282300000000000000000000000000000000"));
71   EXPECT_FLOAT_EQ(-3.402823e+38f,
72                   StringToFloat("-340282300000000000000000000000000000000"));
73 
74   EXPECT_FLOAT_EQ(1.000000119f, StringToFloat("1.000000119"));
75   EXPECT_FLOAT_EQ(1.999999881f, StringToFloat("1.999999881"));
76 
77   EXPECT_FLOAT_EQ(0.25f, StringToFloat(L"+0.25"));
78 
79   EXPECT_FLOAT_EQ(1.2e34f, StringToFloat("1.2e34"));
80 
81   EXPECT_FLOAT_EQ(std::numeric_limits<float>::infinity(),
82                   StringToFloat("999999999999999999999999999999999999999"));
83   EXPECT_FLOAT_EQ(-std::numeric_limits<float>::infinity(),
84                   StringToFloat("-999999999999999999999999999999999999999"));
85 
86   EXPECT_FLOAT_EQ(0.0f, StringToFloat("invalid"));
87 
88   // Test the exact float value. Use EXPECT_EQ, which does an exact comparison,
89   // instead of EXPECT_FLOAT_EQ, which allows slight precision error.
90   EXPECT_EQ(38.89528656005859375f, StringToFloat("38.895285"));
91 }
92 
TEST(fxstring,WideStringToFloat)93 TEST(fxstring, WideStringToFloat) {
94   EXPECT_FLOAT_EQ(0.0f, StringToFloat(L""));
95   EXPECT_FLOAT_EQ(0.0f, StringToFloat(L"0"));
96   EXPECT_FLOAT_EQ(0.0f, StringToFloat(L"0.0"));
97   EXPECT_FLOAT_EQ(0.0f, StringToFloat(L"-0.0"));
98 
99   EXPECT_FLOAT_EQ(0.25f, StringToFloat(L"0.25"));
100   EXPECT_FLOAT_EQ(-0.25f, StringToFloat(L"-0.25"));
101 
102   EXPECT_FLOAT_EQ(100.0f, StringToFloat(L"100"));
103   EXPECT_FLOAT_EQ(100.0f, StringToFloat(L"100.0"));
104   EXPECT_FLOAT_EQ(100.0f, StringToFloat(L"    100.0"));
105   EXPECT_FLOAT_EQ(-100.0f, StringToFloat(L"-100.0000"));
106 
107   EXPECT_FLOAT_EQ(3.402823e+38f,
108                   StringToFloat(L"340282300000000000000000000000000000000"));
109   EXPECT_FLOAT_EQ(-3.402823e+38f,
110                   StringToFloat(L"-340282300000000000000000000000000000000"));
111 
112   EXPECT_FLOAT_EQ(1.000000119f, StringToFloat(L"1.000000119"));
113   EXPECT_FLOAT_EQ(1.999999881f, StringToFloat(L"1.999999881"));
114 
115   EXPECT_FLOAT_EQ(0.25f, StringToFloat(L"+0.25"));
116 
117   EXPECT_FLOAT_EQ(1.2e34f, StringToFloat(L"1.2e34"));
118 
119   EXPECT_FLOAT_EQ(std::numeric_limits<float>::infinity(),
120                   StringToFloat(L"999999999999999999999999999999999999999"));
121   EXPECT_FLOAT_EQ(-std::numeric_limits<float>::infinity(),
122                   StringToFloat(L"-999999999999999999999999999999999999999"));
123 
124   EXPECT_FLOAT_EQ(0.0f, StringToFloat(L"invalid"));
125 
126   // Test the exact float value. Use EXPECT_EQ, which does an exact comparison,
127   // instead of EXPECT_FLOAT_EQ, which allows slight precision error.
128   EXPECT_EQ(38.89528656005859375f, StringToFloat(L"38.895285"));
129 }
130 
TEST(fxstring,ByteStringToDouble)131 TEST(fxstring, ByteStringToDouble) {
132   EXPECT_DOUBLE_EQ(0.0, StringToDouble(""));
133   EXPECT_DOUBLE_EQ(0.0, StringToDouble("0"));
134   EXPECT_DOUBLE_EQ(0.0, StringToDouble("0.0"));
135   EXPECT_DOUBLE_EQ(0.0, StringToDouble("-0.0"));
136 
137   EXPECT_DOUBLE_EQ(0.25, StringToDouble("0.25"));
138   EXPECT_DOUBLE_EQ(-0.25, StringToDouble("-0.25"));
139 
140   EXPECT_DOUBLE_EQ(100.0, StringToDouble("100"));
141   EXPECT_DOUBLE_EQ(100.0, StringToDouble("100.0"));
142   EXPECT_DOUBLE_EQ(100.0, StringToDouble("    100.0"));
143   EXPECT_DOUBLE_EQ(-100.0, StringToDouble("-100.0000"));
144 
145   EXPECT_DOUBLE_EQ(3.402823e+38,
146                    StringToDouble("340282300000000000000000000000000000000"));
147   EXPECT_DOUBLE_EQ(-3.402823e+38,
148                    StringToDouble("-340282300000000000000000000000000000000"));
149 
150   EXPECT_DOUBLE_EQ(1.000000119, StringToDouble("1.000000119"));
151   EXPECT_DOUBLE_EQ(1.999999881, StringToDouble("1.999999881"));
152 
153   EXPECT_DOUBLE_EQ(0.25, StringToDouble("+0.25"));
154 
155   EXPECT_DOUBLE_EQ(1.2e34, StringToDouble("1.2e34"));
156 
157   EXPECT_DOUBLE_EQ(
158       std::numeric_limits<double>::infinity(),
159       StringToDouble(
160           "99999999999999999999999999999999999999999999999999999999999999999999"
161           "99999999999999999999999999999999999999999999999999999999999999999999"
162           "99999999999999999999999999999999999999999999999999999999999999999999"
163           "99999999999999999999999999999999999999999999999999999999999999999999"
164           "99999999999999999999999999999999999999"));
165   EXPECT_DOUBLE_EQ(
166       -std::numeric_limits<double>::infinity(),
167       StringToDouble(
168           "-9999999999999999999999999999999999999999999999999999999999999999999"
169           "99999999999999999999999999999999999999999999999999999999999999999999"
170           "99999999999999999999999999999999999999999999999999999999999999999999"
171           "99999999999999999999999999999999999999999999999999999999999999999999"
172           "99999999999999999999999999999999999999"));
173 
174   EXPECT_DOUBLE_EQ(0.0, StringToDouble("invalid"));
175 
176   // Test the exact double value. Use EXPECT_EQ, which does an exact comparison,
177   // instead of EXPECT_DOUBLE_EQ, which allows slight precision error.
178   EXPECT_EQ(1.9998779296892903, StringToDouble("1.99987792968929034"));
179 }
180 
TEST(fxstring,WideStringToDouble)181 TEST(fxstring, WideStringToDouble) {
182   EXPECT_DOUBLE_EQ(0.0, StringToDouble(L""));
183   EXPECT_DOUBLE_EQ(0.0, StringToDouble(L"0"));
184   EXPECT_DOUBLE_EQ(0.0, StringToDouble(L"0.0"));
185   EXPECT_DOUBLE_EQ(0.0, StringToDouble(L"-0.0"));
186 
187   EXPECT_DOUBLE_EQ(0.25, StringToDouble(L"0.25"));
188   EXPECT_DOUBLE_EQ(-0.25, StringToDouble(L"-0.25"));
189 
190   EXPECT_DOUBLE_EQ(100.0, StringToDouble(L"100"));
191   EXPECT_DOUBLE_EQ(100.0, StringToDouble(L"100.0"));
192   EXPECT_DOUBLE_EQ(100.0, StringToDouble(L"    100.0"));
193   EXPECT_DOUBLE_EQ(-100.0, StringToDouble(L"-100.0000"));
194 
195   EXPECT_DOUBLE_EQ(3.402823e+38,
196                    StringToDouble(L"340282300000000000000000000000000000000"));
197   EXPECT_DOUBLE_EQ(-3.402823e+38,
198                    StringToDouble(L"-340282300000000000000000000000000000000"));
199 
200   EXPECT_DOUBLE_EQ(1.000000119, StringToDouble(L"1.000000119"));
201   EXPECT_DOUBLE_EQ(1.999999881, StringToDouble(L"1.999999881"));
202 
203   EXPECT_DOUBLE_EQ(0.25, StringToDouble(L"+0.25"));
204 
205   EXPECT_DOUBLE_EQ(1.2e34, StringToDouble(L"1.2e34"));
206 
207   EXPECT_DOUBLE_EQ(
208       std::numeric_limits<double>::infinity(),
209       StringToDouble(
210           L"9999999999999999999999999999999999999999999999999999999999999999999"
211           L"9999999999999999999999999999999999999999999999999999999999999999999"
212           L"9999999999999999999999999999999999999999999999999999999999999999999"
213           L"9999999999999999999999999999999999999999999999999999999999999999999"
214           L"999999999999999999999999999999999999999999"));
215   EXPECT_DOUBLE_EQ(
216       -std::numeric_limits<double>::infinity(),
217       StringToDouble(
218           L"-999999999999999999999999999999999999999999999999999999999999999999"
219           L"9999999999999999999999999999999999999999999999999999999999999999999"
220           L"9999999999999999999999999999999999999999999999999999999999999999999"
221           L"9999999999999999999999999999999999999999999999999999999999999999999"
222           L"999999999999999999999999999999999999999999"));
223 
224   EXPECT_DOUBLE_EQ(0.0, StringToDouble(L"invalid"));
225 
226   // Test the exact double value. Use EXPECT_EQ, which does an exact comparison,
227   // instead of EXPECT_DOUBLE_EQ, which allows slight precision error.
228   EXPECT_EQ(1.9998779296892903, StringToDouble(L"1.99987792968929034"));
229 }
230 
TEST(fxstring,SplitByteString)231 TEST(fxstring, SplitByteString) {
232   std::vector<ByteString> result;
233   result = fxcrt::Split(ByteString(""), ',');
234   ASSERT_EQ(1u, result.size());
235   EXPECT_EQ("", result[0]);
236 
237   result = fxcrt::Split(ByteString("a"), ',');
238   ASSERT_EQ(1u, result.size());
239   EXPECT_EQ("a", result[0]);
240 
241   result = fxcrt::Split(ByteString(","), ',');
242   ASSERT_EQ(2u, result.size());
243   EXPECT_EQ("", result[0]);
244   EXPECT_EQ("", result[1]);
245 
246   result = fxcrt::Split(ByteString("a,"), ',');
247   ASSERT_EQ(2u, result.size());
248   EXPECT_EQ("a", result[0]);
249   EXPECT_EQ("", result[1]);
250 
251   result = fxcrt::Split(ByteString(",b"), ',');
252   ASSERT_EQ(2u, result.size());
253   EXPECT_EQ("", result[0]);
254   EXPECT_EQ("b", result[1]);
255 
256   result = fxcrt::Split(ByteString("a,b"), ',');
257   ASSERT_EQ(2u, result.size());
258   EXPECT_EQ("a", result[0]);
259   EXPECT_EQ("b", result[1]);
260 
261   result = fxcrt::Split(ByteString("a,b,"), ',');
262   ASSERT_EQ(3u, result.size());
263   EXPECT_EQ("a", result[0]);
264   EXPECT_EQ("b", result[1]);
265   EXPECT_EQ("", result[2]);
266 
267   result = fxcrt::Split(ByteString("a,,"), ',');
268   ASSERT_EQ(3u, result.size());
269   EXPECT_EQ("a", result[0]);
270   EXPECT_EQ("", result[1]);
271   EXPECT_EQ("", result[2]);
272 
273   result = fxcrt::Split(ByteString(",,a"), ',');
274   ASSERT_EQ(3u, result.size());
275   EXPECT_EQ("", result[0]);
276   EXPECT_EQ("", result[1]);
277   EXPECT_EQ("a", result[2]);
278 }
279 
TEST(fxstring,SplitByteStringView)280 TEST(fxstring, SplitByteStringView) {
281   std::vector<ByteStringView> result;
282   result = fxcrt::Split(ByteStringView(""), ',');
283   ASSERT_EQ(1u, result.size());
284   EXPECT_EQ("", result[0]);
285 
286   result = fxcrt::Split(ByteStringView("a"), ',');
287   ASSERT_EQ(1u, result.size());
288   EXPECT_EQ("a", result[0]);
289 
290   result = fxcrt::Split(ByteStringView(","), ',');
291   ASSERT_EQ(2u, result.size());
292   EXPECT_EQ("", result[0]);
293   EXPECT_EQ("", result[1]);
294 
295   result = fxcrt::Split(ByteStringView("a,"), ',');
296   ASSERT_EQ(2u, result.size());
297   EXPECT_EQ("a", result[0]);
298   EXPECT_EQ("", result[1]);
299 
300   result = fxcrt::Split(ByteStringView(",b"), ',');
301   ASSERT_EQ(2u, result.size());
302   EXPECT_EQ("", result[0]);
303   EXPECT_EQ("b", result[1]);
304 
305   result = fxcrt::Split(ByteStringView("a,b"), ',');
306   ASSERT_EQ(2u, result.size());
307   EXPECT_EQ("a", result[0]);
308   EXPECT_EQ("b", result[1]);
309 
310   result = fxcrt::Split(ByteStringView("a,b,"), ',');
311   ASSERT_EQ(3u, result.size());
312   EXPECT_EQ("a", result[0]);
313   EXPECT_EQ("b", result[1]);
314   EXPECT_EQ("", result[2]);
315 
316   result = fxcrt::Split(ByteStringView("a,,"), ',');
317   ASSERT_EQ(3u, result.size());
318   EXPECT_EQ("a", result[0]);
319   EXPECT_EQ("", result[1]);
320   EXPECT_EQ("", result[2]);
321 
322   result = fxcrt::Split(ByteStringView(",,a"), ',');
323   ASSERT_EQ(3u, result.size());
324   EXPECT_EQ("", result[0]);
325   EXPECT_EQ("", result[1]);
326   EXPECT_EQ("a", result[2]);
327 }
328 
TEST(fxstring,SplitWideString)329 TEST(fxstring, SplitWideString) {
330   std::vector<WideString> result;
331   result = fxcrt::Split(WideString(L""), L',');
332   ASSERT_EQ(1u, result.size());
333   EXPECT_EQ(L"", result[0]);
334 
335   result = fxcrt::Split(WideString(L"a"), L',');
336   ASSERT_EQ(1u, result.size());
337   EXPECT_EQ(L"a", result[0]);
338 
339   result = fxcrt::Split(WideString(L","), L',');
340   ASSERT_EQ(2u, result.size());
341   EXPECT_EQ(L"", result[0]);
342   EXPECT_EQ(L"", result[1]);
343 
344   result = fxcrt::Split(WideString(L"a,"), L',');
345   ASSERT_EQ(2u, result.size());
346   EXPECT_EQ(L"a", result[0]);
347   EXPECT_EQ(L"", result[1]);
348 
349   result = fxcrt::Split(WideString(L",b"), L',');
350   ASSERT_EQ(2u, result.size());
351   EXPECT_EQ(L"", result[0]);
352   EXPECT_EQ(L"b", result[1]);
353 
354   result = fxcrt::Split(WideString(L"a,b"), L',');
355   ASSERT_EQ(2u, result.size());
356   EXPECT_EQ(L"a", result[0]);
357   EXPECT_EQ(L"b", result[1]);
358 
359   result = fxcrt::Split(WideString(L"a,b,"), L',');
360   ASSERT_EQ(3u, result.size());
361   EXPECT_EQ(L"a", result[0]);
362   EXPECT_EQ(L"b", result[1]);
363   EXPECT_EQ(L"", result[2]);
364 
365   result = fxcrt::Split(WideString(L"a,,"), L',');
366   ASSERT_EQ(3u, result.size());
367   EXPECT_EQ(L"a", result[0]);
368   EXPECT_EQ(L"", result[1]);
369   EXPECT_EQ(L"", result[2]);
370 
371   result = fxcrt::Split(WideString(L",,a"), L',');
372   ASSERT_EQ(3u, result.size());
373   EXPECT_EQ(L"", result[0]);
374   EXPECT_EQ(L"", result[1]);
375   EXPECT_EQ(L"a", result[2]);
376 }
377 
TEST(fxstring,SplitWideStringView)378 TEST(fxstring, SplitWideStringView) {
379   std::vector<WideStringView> result;
380   result = fxcrt::Split(WideStringView(L""), L',');
381   ASSERT_EQ(1u, result.size());
382   EXPECT_EQ(L"", result[0]);
383 
384   result = fxcrt::Split(WideStringView(L"a"), L',');
385   ASSERT_EQ(1u, result.size());
386   EXPECT_EQ(L"a", result[0]);
387 
388   result = fxcrt::Split(WideStringView(L","), L',');
389   ASSERT_EQ(2u, result.size());
390   EXPECT_EQ(L"", result[0]);
391   EXPECT_EQ(L"", result[1]);
392 
393   result = fxcrt::Split(WideStringView(L"a,"), L',');
394   ASSERT_EQ(2u, result.size());
395   EXPECT_EQ(L"a", result[0]);
396   EXPECT_EQ(L"", result[1]);
397 
398   result = fxcrt::Split(WideStringView(L",b"), L',');
399   ASSERT_EQ(2u, result.size());
400   EXPECT_EQ(L"", result[0]);
401   EXPECT_EQ(L"b", result[1]);
402 
403   result = fxcrt::Split(WideStringView(L"a,b"), L',');
404   ASSERT_EQ(2u, result.size());
405   EXPECT_EQ(L"a", result[0]);
406   EXPECT_EQ(L"b", result[1]);
407 
408   result = fxcrt::Split(WideStringView(L"a,b,"), L',');
409   ASSERT_EQ(3u, result.size());
410   EXPECT_EQ(L"a", result[0]);
411   EXPECT_EQ(L"b", result[1]);
412   EXPECT_EQ(L"", result[2]);
413 
414   result = fxcrt::Split(WideStringView(L"a,,"), L',');
415   ASSERT_EQ(3u, result.size());
416   EXPECT_EQ(L"a", result[0]);
417   EXPECT_EQ(L"", result[1]);
418   EXPECT_EQ(L"", result[2]);
419 
420   result = fxcrt::Split(WideStringView(L",,a"), L',');
421   ASSERT_EQ(3u, result.size());
422   EXPECT_EQ(L"", result[0]);
423   EXPECT_EQ(L"", result[1]);
424   EXPECT_EQ(L"a", result[2]);
425 }
426 
TEST(fxstring,ByteStringSplitEfficiency)427 TEST(fxstring, ByteStringSplitEfficiency) {
428   std::vector<char> commas(50000, ',');
429   auto input = ByteString(ByteStringView(commas));
430   std::vector<ByteString> result;
431   result = fxcrt::Split(input, ',');
432   ASSERT_EQ(commas.size() + 1, result.size());
433   EXPECT_EQ("", result.front());
434   EXPECT_EQ("", result.back());
435 }
436 
TEST(fxstring,ByteStringViewSplitEfficiency)437 TEST(fxstring, ByteStringViewSplitEfficiency) {
438   std::vector<char> commas(50000, ',');
439   ByteStringView input(commas);
440   std::vector<ByteStringView> result;
441   result = fxcrt::Split(input, ',');
442   ASSERT_EQ(commas.size() + 1, result.size());
443   EXPECT_EQ("", result.front());
444   EXPECT_EQ("", result.back());
445 }
446 
TEST(fxstring,WideStringSplitEfficiency)447 TEST(fxstring, WideStringSplitEfficiency) {
448   std::vector<wchar_t> commas(50000, L',');
449   auto input = WideString(WideStringView(commas));
450   std::vector<WideString> result;
451   result = fxcrt::Split(input, ',');
452   ASSERT_EQ(commas.size() + 1, result.size());
453   EXPECT_EQ(L"", result.front());
454   EXPECT_EQ(L"", result.back());
455 }
456 
TEST(fxstring,WideStringViewSplitEfficiency)457 TEST(fxstring, WideStringViewSplitEfficiency) {
458   std::vector<wchar_t> commas(50000, L',');
459   WideStringView input(commas);
460   std::vector<WideStringView> result;
461   result = fxcrt::Split(input, ',');
462   ASSERT_EQ(commas.size() + 1, result.size());
463   EXPECT_EQ(L"", result.front());
464   EXPECT_EQ(L"", result.back());
465 }
466