1 // Copyright 2021 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 "xfa/fxfa/parser/cxfa_document.h"
6
7 #include "core/fxcrt/fx_string.h"
8 #include "testing/gtest/include/gtest/gtest.h"
9
TEST(CXFA_DocumentTest,ParseXFAVersion)10 TEST(CXFA_DocumentTest, ParseXFAVersion) {
11 // Malformed
12 EXPECT_EQ(XFA_VERSION_UNKNOWN, CXFA_Document::ParseXFAVersion(L""));
13 EXPECT_EQ(XFA_VERSION_UNKNOWN,
14 CXFA_Document::ParseXFAVersion(
15 L"http://www.xfa.org/schema/xfa-template"));
16 EXPECT_EQ(XFA_VERSION_UNKNOWN,
17 CXFA_Document::ParseXFAVersion(
18 L"http://www.xfa.org/schema/xfa-templatX/"));
19 EXPECT_EQ(XFA_VERSION_UNKNOWN,
20 CXFA_Document::ParseXFAVersion(
21 L"http://www.xfa.org/schema/xfa-template/"));
22 EXPECT_EQ(XFA_VERSION_UNKNOWN,
23 CXFA_Document::ParseXFAVersion(
24 L"http://www.xfa.org/schema/xfa-template/2"));
25
26 // Out-of-range
27 EXPECT_EQ(XFA_VERSION_UNKNOWN,
28 CXFA_Document::ParseXFAVersion(
29 L"http://www.xfa.org/schema/xfa-template/-1.0"));
30 EXPECT_EQ(XFA_VERSION_UNKNOWN,
31 CXFA_Document::ParseXFAVersion(
32 L"http://www.xfa.org/schema/xfa-template/1.9"));
33 EXPECT_EQ(XFA_VERSION_UNKNOWN,
34 CXFA_Document::ParseXFAVersion(
35 L"http://www.xfa.org/schema/xfa-template/4.1"));
36
37 // Missing digits
38 EXPECT_EQ(XFA_VERSION_UNKNOWN,
39 CXFA_Document::ParseXFAVersion(
40 L"http://www.xfa.org/schema/xfa-template/."));
41 EXPECT_EQ(XFA_VERSION_UNKNOWN,
42 CXFA_Document::ParseXFAVersion(
43 L"http://www.xfa.org/schema/xfa-template/.3"));
44 EXPECT_EQ(XFA_VERSION_300, CXFA_Document::ParseXFAVersion(
45 L"http://www.xfa.org/schema/xfa-template/3."));
46 EXPECT_EQ(XFA_VERSION_UNKNOWN,
47 CXFA_Document::ParseXFAVersion(
48 L"http://www.xfa.org/schema/xfa-template/clams.6"));
49 EXPECT_EQ(XFA_VERSION_300,
50 CXFA_Document::ParseXFAVersion(
51 L"http://www.xfa.org/schema/xfa-template/3.clams"));
52
53 // Min / max values
54 EXPECT_EQ(XFA_VERSION_200,
55 CXFA_Document::ParseXFAVersion(
56 L"http://www.xfa.org/schema/xfa-template/2.0"));
57 EXPECT_EQ(400, CXFA_Document::ParseXFAVersion(
58 L"http://www.xfa.org/schema/xfa-template/4.0"));
59
60 // Number and decimal point parsing.
61 EXPECT_EQ(XFA_VERSION_306,
62 CXFA_Document::ParseXFAVersion(
63 L"http://www.xfa.org/schema/xfa-template/3.6"));
64
65 // TODO(tsepez): maybe fail on these dubious values?
66 EXPECT_EQ(XFA_VERSION_306,
67 CXFA_Document::ParseXFAVersion(
68 L"http://www.xfa.org/schema/xfa-template/0003.00006"));
69 EXPECT_EQ(XFA_VERSION_306,
70 CXFA_Document::ParseXFAVersion(
71 L"http://www.xfa.org/schema/xfa-template/0003.00006.0000"));
72 EXPECT_EQ(XFA_VERSION_206,
73 CXFA_Document::ParseXFAVersion(
74 L"http://www.xfa.org/schema/xfa-template/2.6clams"));
75 EXPECT_EQ(XFA_VERSION_206,
76 CXFA_Document::ParseXFAVersion(
77 L"http://www.xfa.org/schema/xfa-template/1.106"));
78 EXPECT_EQ(XFA_VERSION_306,
79 CXFA_Document::ParseXFAVersion(
80 L"http://www.xfa.org/schema/xfa-template/4.-94"));
81 EXPECT_EQ(317, CXFA_Document::ParseXFAVersion(
82 L"http://www.xfa.org/schema/xfa-template/3.17"));
83 }
84
TEST(CXFA_DocumentTest,ParseUseHref)85 TEST(CXFA_DocumentTest, ParseUseHref) {
86 {
87 WideString wsEmpty; // Must outlive views.
88 WideStringView wsURI;
89 WideStringView wsID;
90 WideStringView wsSOM;
91 CXFA_Document::ParseUseHref(wsEmpty, wsURI, wsID, wsSOM);
92 EXPECT_EQ(L"", wsURI);
93 EXPECT_EQ(L"", wsID);
94 EXPECT_EQ(L"", wsSOM);
95 }
96 {
97 WideString wsNoSharp(L"url-part-only"); // Must outlive views.
98 WideStringView wsURI;
99 WideStringView wsID;
100 WideStringView wsSOM;
101 CXFA_Document::ParseUseHref(wsNoSharp, wsURI, wsID, wsSOM);
102 EXPECT_EQ(L"url-part-only", wsURI);
103 EXPECT_EQ(L"", wsID);
104 EXPECT_EQ(L"", wsSOM);
105 }
106 {
107 WideString wsNoSom(L"url-part#frag"); // Must outlive views.
108 WideStringView wsURI;
109 WideStringView wsID;
110 WideStringView wsSOM;
111 CXFA_Document::ParseUseHref(wsNoSom, wsURI, wsID, wsSOM);
112 EXPECT_EQ(L"url-part", wsURI);
113 EXPECT_EQ(L"frag", wsID);
114 EXPECT_EQ(L"", wsSOM);
115 }
116 {
117 WideString wsIncompleteSom(L"url-part#som("); // Must outlive views.
118 WideStringView wsURI;
119 WideStringView wsID;
120 WideStringView wsSOM;
121 CXFA_Document::ParseUseHref(wsIncompleteSom, wsURI, wsID, wsSOM);
122 EXPECT_EQ(L"url-part", wsURI);
123 EXPECT_EQ(L"som(", wsID);
124 EXPECT_EQ(L"", wsSOM);
125 }
126 {
127 WideString wsEmptySom(L"url-part#som()"); // Must outlive views.
128 WideStringView wsURI;
129 WideStringView wsID;
130 WideStringView wsSOM;
131 CXFA_Document::ParseUseHref(wsEmptySom, wsURI, wsID, wsSOM);
132 EXPECT_EQ(L"url-part", wsURI);
133 EXPECT_EQ(L"", wsID);
134 EXPECT_EQ(L"", wsSOM);
135 }
136 {
137 WideString wsHasSom(
138 L"url-part#som(nested(foo.bar))"); // Must outlive views.
139 WideStringView wsURI;
140 WideStringView wsID;
141 WideStringView wsSOM;
142 CXFA_Document::ParseUseHref(wsHasSom, wsURI, wsID, wsSOM);
143 EXPECT_EQ(L"url-part", wsURI);
144 EXPECT_EQ(L"", wsID);
145 EXPECT_EQ(L"nested(foo.bar)", wsSOM);
146 }
147 }
148
TEST(CXFA_DocumentTest,ParseUse)149 TEST(CXFA_DocumentTest, ParseUse) {
150 {
151 WideString wsUseVal(L""); // Must outlive views.
152 WideStringView wsID;
153 WideStringView wsSOM;
154 CXFA_Document::ParseUse(wsUseVal, wsID, wsSOM);
155 EXPECT_EQ(L"", wsID);
156 EXPECT_EQ(L"", wsSOM);
157 }
158 {
159 WideString wsUseVal(L"clams"); // Must outlive views.
160 WideStringView wsID;
161 WideStringView wsSOM;
162 CXFA_Document::ParseUse(wsUseVal, wsID, wsSOM);
163 EXPECT_EQ(L"", wsID);
164 EXPECT_EQ(L"clams", wsSOM);
165 }
166 {
167 WideString wsUseVal(L"#clams"); // Must outlive views.
168 WideStringView wsID;
169 WideStringView wsSOM;
170 CXFA_Document::ParseUse(wsUseVal, wsID, wsSOM);
171 EXPECT_EQ(L"clams", wsID);
172 EXPECT_EQ(L"", wsSOM);
173 }
174 }
175