1 /*
2 * Copyright (c) 2023 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #ifndef TEST_XML_H
17 #define TEST_XML_H
18
19 #include "../js_xml.h"
20
21 namespace OHOS::xml {
22 class XmlTest {
23 public:
24 XmlTest() = default;
25 ~XmlTest() = default;
26 static XmlSerializer construct(napi_env env);
27 static void SetDeclaration(napi_env env);
28 static void SetNamespace(napi_env env);
29 static void StartElement(napi_env env);
30 static void WriteEscaped(napi_env env);
31 static void XmlSerializerError(napi_env env);
32 static void PushSrcLinkList();
33 static size_t GetNSCount(size_t iTemp);
34 static std::string XmlPullParserError();
35 static TagEnum DealExclamationGroup(std::string xml);
36 static TagEnum DealLtGroup();
37 static TagEnum ParseTagType();
38 static std::string SkipText(std::string strXml, std::string str);
39 static std::string ParseNameInner(size_t start);
40 static std::string ParseName();
41 static void ParseEntityFunc(std::string out, std::string sysInfo, bool flag, TextEnum textEnum);
42 static std::string ParseEntity();
43 static size_t ParseTagValueInner(size_t &start, std::string &result, size_t position, std::string xmlStr);
44 static std::string ParseTagValue(char delimiter, bool resolveEntities, TextEnum textEnum, size_t max);
45 static std::string GetNamespace(const std::string prefix, size_t depth);
46 static std::string ParseNspFunc();
47 static std::string ParseNspFunction(std::string pushStr);
48 static bool ParseNsp();
49 static bool ParseStartTagFuncDeal(std::string xml, bool relax);
50 static bool ParseDeclaration(std::string str);
51 static bool ReadInternalSubset();
52 int TestGetColumnNumber(napi_env env);
53 int TestGetLineNumber(napi_env env);
54 std::string TestGetText(napi_env env);
55 bool TestParseNsp(napi_env env);
56 void TestParseDeclaration(napi_env env);
57 std::string TestParseDelimiterInfo(napi_env env);
58 bool TestParseEndTag(napi_env env);
59 bool TestParseComment(napi_env env);
60 TagEnum TestParseOneTagFunc();
61 void TestParseEntityDecl();
62 };
63
construct(napi_env env)64 XmlSerializer XmlTest::construct(napi_env env)
65 {
66 napi_value arrayBuffer = nullptr;
67 void* pBuffer = nullptr;
68 size_t size = 1024; // 1024: buffer size
69 napi_create_arraybuffer(env, size, &pBuffer, &arrayBuffer);
70 OHOS::xml::XmlSerializer xmlSerializer(reinterpret_cast<char*>(pBuffer), size, "utf-8");
71 return xmlSerializer;
72 }
73
SetDeclaration(napi_env env)74 void XmlTest::SetDeclaration(napi_env env)
75 {
76 XmlSerializer xmlSerializer = construct(env);
77 xmlSerializer.isHasDecl = true;
78 xmlSerializer.SetDeclaration();
79 }
80
SetNamespace(napi_env env)81 void XmlTest::SetNamespace(napi_env env)
82 {
83 XmlSerializer xmlSerializer = construct(env);
84 xmlSerializer.type = "isStart";
85 xmlSerializer.iLength_ = 0;
86 xmlSerializer.depth_ = 1;
87 xmlSerializer.elementStack.push_back("");
88 xmlSerializer.elementStack.push_back("");
89 xmlSerializer.SetNamespace("xml", "convert");
90 }
91
StartElement(napi_env env)92 void XmlTest::StartElement(napi_env env)
93 {
94 XmlSerializer xmlSerializer = construct(env);
95 xmlSerializer.depth_ = 1;
96 xmlSerializer.elementStack[0] = "x";
97 xmlSerializer.elementStack.push_back("");
98 xmlSerializer.elementStack.push_back("");
99 xmlSerializer.elementStack.push_back("");
100 xmlSerializer.StartElement("val");
101 }
102
WriteEscaped(napi_env env)103 void XmlTest::WriteEscaped(napi_env env)
104 {
105 XmlSerializer xmlSerializer = construct(env);
106 xmlSerializer.WriteEscaped("'\"&><q");
107 }
108
XmlSerializerError(napi_env env)109 void XmlTest::XmlSerializerError(napi_env env)
110 {
111 XmlSerializer xmlSerializer = construct(env);
112 xmlSerializer.XmlSerializerError();
113 }
114
PushSrcLinkList()115 void XmlTest::PushSrcLinkList()
116 {
117 std::string strXml = "<?xml version=\"1.0\" encoding=\"utf-8\"?> <title>Happy</title> <todo>Work</todo>";
118 OHOS::xml::XmlPullParser xmlPullParser(strXml, "utf-8");
119 xmlPullParser.PushSrcLinkList("str");
120 }
121
GetNSCount(size_t iTemp)122 size_t XmlTest::GetNSCount(size_t iTemp)
123 {
124 std::string strXml = "<?xml version=\"1.0\" encoding=\"utf-8\"?><todo>Work</todo>";
125 OHOS::xml::XmlPullParser xmlPullParser(strXml, "utf-8");
126 xmlPullParser.nspCounts_.push_back(0);
127 xmlPullParser.nspCounts_.push_back(1);
128 return xmlPullParser.GetNSCount(iTemp);
129 }
130
XmlPullParserError()131 std::string XmlTest::XmlPullParserError()
132 {
133 std::string strXml = "<?xml version=\"1.0\" encoding=\"utf-8\"?><todo>Work</todo>";
134 OHOS::xml::XmlPullParser xmlPullParser("strXml", "utf-8");
135 xmlPullParser.xmlPullParserError_= "IndexOutOfBoundsException";
136 return xmlPullParser.XmlPullParserError();
137 }
138
DealExclamationGroup(std::string xml)139 TagEnum XmlTest::DealExclamationGroup(std::string xml)
140 {
141 std::string strXml = "<?xml version=\"1.0\" encoding=\"utf-8\"?><todo>Work</todo>";
142 OHOS::xml::XmlPullParser xmlPullParser("strXml", "utf-8");
143 xmlPullParser.strXml_ = xml;
144 return xmlPullParser.DealExclamationGroup();
145 }
146
DealLtGroup()147 TagEnum XmlTest::DealLtGroup()
148 {
149 std::string strXml = "<?xml version=\"1.0\" encoding=\"utf-8\"?><todo>Work</todo>";
150 OHOS::xml::XmlPullParser xmlPullParser(strXml, "utf-8");
151 xmlPullParser.strXml_ = "?/";
152 return xmlPullParser.DealLtGroup();
153 }
154
ParseTagType()155 TagEnum XmlTest::ParseTagType()
156 {
157 std::string strXml = "<?xml version=\"1.0\" encoding=\"utf-8\"?><todo>Work</todo>";
158 OHOS::xml::XmlPullParser xmlPullParser(strXml, "utf-8");
159 xmlPullParser.bStartDoc_ = false;
160 xmlPullParser.max_ = 0;
161 xmlPullParser.strXml_ = "%";
162 return xmlPullParser.ParseTagType(false);
163 }
164
SkipText(std::string strXml,std::string str)165 std::string XmlTest::SkipText(std::string strXml, std::string str)
166 {
167 OHOS::xml::XmlPullParser xmlPullParser(strXml, "utf-8");
168 xmlPullParser.SkipText(str);
169 return xmlPullParser.XmlPullParserError();
170 }
171
TestGetColumnNumber(napi_env env)172 int XmlTest::TestGetColumnNumber(napi_env env)
173 {
174 OHOS::xml::XmlPullParser xml("1\n1", "utf8");
175 xml.position_ = 3; // 3: index is three
176 int res = xml.GetColumnNumber();
177 return res;
178 }
179
TestGetLineNumber(napi_env env)180 int XmlTest::TestGetLineNumber(napi_env env)
181 {
182 OHOS::xml::XmlPullParser xml("\n", "utf8");
183 xml.position_ = 1;
184 int res = xml.GetLineNumber();
185 return res;
186 }
187
TestGetText(napi_env env)188 std::string XmlTest::TestGetText(napi_env env)
189 {
190 OHOS::xml::XmlPullParser xml("1\n1", "utf8");
191 xml.type = TagEnum::WHITESPACE;
192 return xml.GetText();
193 }
194
TestParseNsp(napi_env env)195 bool XmlTest::TestParseNsp(napi_env env)
196 {
197 OHOS::xml::XmlPullParser xml("", "utf8");
198 xml.attriCount_ = 1;
199 xml.attributes.push_back("");
200 xml.attributes.push_back("");
201 xml.attributes.push_back("xmlns");
202 xml.attributes.push_back("");
203 xml.nspCounts_.push_back(0);
204 xml.name_ = ":";
205 return xml.ParseNsp();
206 }
207
TestParseDeclaration(napi_env env)208 void XmlTest::TestParseDeclaration(napi_env env)
209 {
210 OHOS::xml::XmlPullParser xml("", "utf8");
211 xml.bufferStartLine_ = 1;
212 xml.attributes.push_back("");
213 xml.attributes.push_back("");
214 xml.attributes.push_back("");
215 xml.ParseDeclaration();
216 }
217
TestParseDelimiterInfo(napi_env env)218 std::string XmlTest::TestParseDelimiterInfo(napi_env env)
219 {
220 OHOS::xml::XmlPullParser xml("12", "utf8");
221 xml.text_ = "123";
222 std::string res = xml.ParseDelimiterInfo("456", true);
223 xml.strXml_ = "456";
224 xml.position_ = 0;
225 res = xml.ParseDelimiterInfo("456", false);
226 return res;
227 }
228
TestParseEndTag(napi_env env)229 bool XmlTest::TestParseEndTag(napi_env env)
230 {
231 OHOS::xml::XmlPullParser xml("123456789", "utf8");
232 xml.relaxed = false;
233 xml.depth = 1;
234 xml.elementStack_.resize(20); // 20 :vector size
235 xml.elementStack_[3] = "!"; // 3: index of three
236 xml.ParseEndTag();
237 xml.depth = 0;
238 xml.ParseEndTag();
239 return false;
240 }
241
TestParseComment(napi_env env)242 bool XmlTest::TestParseComment(napi_env env)
243 {
244 OHOS::xml::XmlPullParser xml("1", "utf8");
245 xml.relaxed = true;
246 xml.ParseComment(true);
247 return false;
248 }
249
TestParseOneTagFunc()250 TagEnum XmlTest::TestParseOneTagFunc()
251 {
252 OHOS::xml::XmlPullParser xml("1", "utf8");
253 xml.type = TagEnum::ERROR1;
254 TagEnum res = xml.ParseOneTagFunc();
255 return res;
256 }
257
TestParseEntityDecl()258 void XmlTest::TestParseEntityDecl()
259 {
260 OHOS::xml::XmlPullParser xml("%1234", "utf8");
261 xml.ParseEntityDecl();
262 }
263
ParseNameInner(size_t start)264 std::string XmlTest::ParseNameInner(size_t start)
265 {
266 std::string strXml = "<todo>Work</todo>";
267 OHOS::xml::XmlPullParser xmlPullParser(strXml, "utf-8");
268 xmlPullParser.position_ = 1;
269 xmlPullParser.max_ = 1;
270 xmlPullParser.strXml_ = "version";
271 return xmlPullParser.ParseNameInner(start);
272 }
273
ParseName()274 std::string XmlTest::ParseName()
275 {
276 std::string strXml = "><todo>Work</todo>";
277 OHOS::xml::XmlPullParser xmlPullParser(strXml, "utf-8");
278 xmlPullParser.strXml_ = "encoding";
279 size_t len = xmlPullParser.strXml_.length();
280 xmlPullParser.position_ = len;
281 xmlPullParser.max_ = len;
282 return xmlPullParser.ParseName();
283 }
284
ParseEntityFunc(std::string out,std::string sysInfo,bool flag,TextEnum textEnum)285 void XmlTest::ParseEntityFunc(std::string out, std::string sysInfo, bool flag, TextEnum textEnum)
286 {
287 std::string strXml = "<todo>Work</todo>";
288 OHOS::xml::XmlPullParser xmlPullParser(strXml, "utf-8");
289 std::string key = "Work";
290 xmlPullParser.documentEntities[key] = "value";
291 xmlPullParser.bDocDecl = flag;
292 xmlPullParser.sysInfo_ = sysInfo;
293 xmlPullParser.ParseEntityFunc(0, out, true, textEnum);
294 }
295
ParseEntity()296 std::string XmlTest::ParseEntity()
297 {
298 std::string strXml = "Wor";
299 std::string out = "W#13434";
300 OHOS::xml::XmlPullParser xmlPullParser(strXml, "utf-8");
301 xmlPullParser.position_= 0;
302 xmlPullParser.max_ = 1;
303 xmlPullParser.relaxed = true;
304 xmlPullParser.ParseEntity(out, true, true, TextEnum::ENTITY_DECL);
305 return xmlPullParser.XmlPullParserError();
306 }
307
ParseTagValueInner(size_t & start,std::string & result,size_t position,std::string xmlStr)308 size_t XmlTest::ParseTagValueInner(size_t &start, std::string &result, size_t position, std::string xmlStr)
309 {
310 std::string strXml = "<todo>Work</todo>";
311 OHOS::xml::XmlPullParser xmlPullParser(strXml, "utf-8");
312 xmlPullParser.position_ = position;
313 xmlPullParser.max_ = 1;
314 xmlPullParser.strXml_ = xmlStr;
315 return xmlPullParser.ParseTagValueInner(start, result, 'o', TextEnum::ENTITY_DECL, false);
316 }
317
ParseTagValue(char delimiter,bool resolveEntities,TextEnum textEnum,size_t max)318 std::string XmlTest::ParseTagValue(char delimiter, bool resolveEntities, TextEnum textEnum, size_t max)
319 {
320 std::string xml = "W";
321 OHOS::xml::XmlPullParser xmlPullParser(xml, "utf-8");
322 xmlPullParser.text_ = "xml";
323 xmlPullParser.position_ = 1;
324 xmlPullParser.max_ = max;
325 return xmlPullParser.ParseTagValue(delimiter, resolveEntities, false, textEnum);
326 }
327
GetNamespace(const std::string prefix,size_t depth)328 std::string XmlTest::GetNamespace(const std::string prefix, size_t depth)
329 {
330 std::string xml = "Work";
331 const std::string preStr = prefix;
332 OHOS::xml::XmlPullParser xmlPullParser(xml, "utf-8");
333 xmlPullParser.depth = depth;
334 xmlPullParser.nspCounts_.push_back(0);
335 xmlPullParser.nspCounts_.push_back(1);
336 xmlPullParser.nspCounts_.push_back(2); // values greater than pos_
337 xmlPullParser.nspStack_.push_back("Q");
338 xmlPullParser.nspStack_.push_back("E");
339 xmlPullParser.nspStack_.push_back("");
340 xmlPullParser.nspStack_.push_back("W");
341 return xmlPullParser.GetNamespace(preStr);
342 }
343
ParseNspFunc()344 std::string XmlTest::ParseNspFunc()
345 {
346 std::string xml = "Work";
347 size_t count = 0;
348 std::string attrName = "sub";
349 bool any = true;
350 OHOS::xml::XmlPullParser xmlPullParser(xml, "utf-8");
351 xmlPullParser.attributes.push_back("q");
352 xmlPullParser.attributes.push_back("e");
353 xmlPullParser.attributes.push_back("r");
354 xmlPullParser.attributes.push_back("");
355 xmlPullParser.nspCounts_.push_back(0);
356 xmlPullParser.nspStack_.push_back("t");
357 xmlPullParser.nspStack_.push_back("c");
358 xmlPullParser.nspStack_.push_back("y");
359 xmlPullParser.nspStack_.push_back("p");
360 xmlPullParser.bKeepNsAttri = true;
361 xmlPullParser.ParseNspFunc(count, attrName, any);
362 return xmlPullParser.XmlPullParserError();
363 }
364
ParseNspFunction(std::string pushStr)365 std::string XmlTest::ParseNspFunction(std::string pushStr)
366 {
367 std::string xml = "Work";
368 OHOS::xml::XmlPullParser xmlPullParser(xml, "utf-8");
369 xmlPullParser.attriCount_ = 1;
370 xmlPullParser.depth = 1;
371 xmlPullParser.nspCounts_.push_back(0);
372 xmlPullParser.nspCounts_.push_back(1);
373 xmlPullParser.nspCounts_.push_back(2); // values greater than pos_
374 xmlPullParser.nspStack_.push_back("Q");
375 xmlPullParser.nspStack_.push_back("E");
376 xmlPullParser.nspStack_.push_back("");
377 xmlPullParser.nspStack_.push_back("W");
378 xmlPullParser.attributes.push_back("r");
379 xmlPullParser.attributes.push_back("t");
380 xmlPullParser.attributes.push_back(pushStr);
381 xmlPullParser.ParseNspFunction();
382 return xmlPullParser.XmlPullParserError();
383 }
384
ParseNsp()385 bool XmlTest::ParseNsp()
386 {
387 std::string xml = "Work";
388 OHOS::xml::XmlPullParser xmlPullParser(xml, "utf-8");
389 xmlPullParser.attributes.push_back("");
390 xmlPullParser.attributes.push_back("");
391 xmlPullParser.attributes.push_back("xmlns");
392 xmlPullParser.nspCounts_.push_back(0);
393 xmlPullParser.name_ = ":xml";
394 return xmlPullParser.ParseNsp();
395 }
396
ParseStartTagFuncDeal(std::string xml,bool relax)397 bool XmlTest::ParseStartTagFuncDeal(std::string xml, bool relax)
398 {
399 OHOS::xml::XmlPullParser xmlPullParser(xml, "utf-8");
400 xmlPullParser.position_ = 0;
401 xmlPullParser.max_ = 1;
402 xmlPullParser.relaxed = relax;
403 return xmlPullParser.ParseStartTagFuncDeal(true);
404 }
405
ParseDeclaration(std::string str)406 bool XmlTest::ParseDeclaration(std::string str)
407 {
408 OHOS::xml::XmlPullParser xmlPullParser(str, "utf-8");
409 xmlPullParser.attriCount_ = 3; // values greater than pos_
410 xmlPullParser.ParseDeclaration();
411 return true;
412 }
413 }
414 #endif // TEST_XML_H