• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2017 PDFium Authors. All rights reserved.
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 "fxjs/cjs_util.h"
6 
7 #include "testing/gtest/include/gtest/gtest.h"
8 #include "testing/test_support.h"
9 
TEST(CJS_Util,ParseDataType)10 TEST(CJS_Util, ParseDataType) {
11   struct ParseDataTypeCase {
12     const wchar_t* const input_string;
13     const int expected;
14   };
15 
16   // Commented out tests follow the spec but are not passing.
17   const ParseDataTypeCase cases[] = {
18       // Not conversions
19       {L"", -1},
20       {L"d", -1},
21 
22       // Simple cases
23       {L"%d", UTIL_INT},
24       {L"%x", UTIL_INT},
25       {L"%f", UTIL_DOUBLE},
26       {L"%s", UTIL_STRING},
27 
28       // nDecSep Not implemented
29       // {L"%,0d", UTIL_INT},
30       // {L"%,1d", UTIL_INT},
31       // {L"%,2d", UTIL_INT},
32       // {L"%,3d", UTIL_INT},
33       // {L"%,4d", -1},
34       // {L"%,d", -1},
35 
36       // cFlags("+ 0#"") are only valid for numeric conversions.
37       {L"%+d", UTIL_INT},
38       {L"%+x", UTIL_INT},
39       {L"%+f", UTIL_DOUBLE},
40       // {L"%+s", -1},
41       {L"% d", UTIL_INT},
42       {L"% x", UTIL_INT},
43       {L"% f", UTIL_DOUBLE},
44       // {L"% s", -1},
45       {L"%0d", UTIL_INT},
46       {L"%0x", UTIL_INT},
47       {L"%0f", UTIL_DOUBLE},
48       // {L"%0s", -1},
49       {L"%#d", UTIL_INT},
50       {L"%#x", UTIL_INT},
51       {L"%#f", UTIL_DOUBLE},
52       // {L"%#s", -1},
53 
54       // nWidth should work. for all conversions, can be combined with cFlags=0
55       // for numbers.
56       {L"%5d", UTIL_INT},
57       {L"%05d", UTIL_INT},
58       {L"%5x", UTIL_INT},
59       {L"%05x", UTIL_INT},
60       {L"%5f", UTIL_DOUBLE},
61       {L"%05f", UTIL_DOUBLE},
62       {L"%5s", UTIL_STRING},
63       // {L"%05s", -1},
64 
65       // nPrecision should only work for float
66       // {L"%.5d", -1},
67       // {L"%.5x", -1},
68       {L"%.5f", UTIL_DOUBLE},
69       // {L"%.5s", -1},
70       // {L"%.14d", -1},
71       // {L"%.14x", -1},
72       {L"%.14f", UTIL_DOUBLE},
73       // {L"%.14s", -1},
74       // {L"%.f", -1},
75 
76       // See https://crbug.com/740166
77       // nPrecision too large (> 260) causes crashes in Windows.
78       // Avoid this by limiting to two digits
79       {L"%.1d", UTIL_INT},
80       {L"%.10d", UTIL_INT},
81       {L"%.100d", -1},
82 
83       // Unexpected characters
84       {L"%ad", -1},
85       {L"%bx", -1},
86       // {L"%cf", -1},
87       // {L"%es", -1},
88       // {L"%gd", -1},
89       {L"%hx", -1},
90       // {L"%if", -1},
91       {L"%js", -1},
92       {L"%@d", -1},
93       {L"%~x", -1},
94       {L"%[f", -1},
95       {L"%\0s", -1},
96       {L"%\nd", -1},
97       {L"%\rx", -1},
98       // {L"%%f", -1},
99       // {L"%  s", -1},
100 
101       // Combine multiple valid components
102       {L"%+6d", UTIL_INT},
103       {L"% 7x", UTIL_INT},
104       {L"%#9.3f", UTIL_DOUBLE},
105       {L"%10s", UTIL_STRING},
106   };
107 
108   for (size_t i = 0; i < FX_ArraySize(cases); i++) {
109     std::wstring input(cases[i].input_string);
110     EXPECT_EQ(cases[i].expected, util::ParseDataType(&input))
111         << cases[i].input_string;
112   }
113 }
114