1 #include "common.hpp"
2 
3 #include "helpers.hpp"
4 
5 #include <limits.h>
6 
7 TEST_XML_FLAGS(dom_text_empty, "<node><a>foo</a><b><![CDATA[bar]]></b><c><?pi value?></c><d/></node>", parse_default | parse_pi)
8 {
9     xml_node node = doc.child(STR("node"));
10 
11     CHECK(node.child(STR("a")).text());
12     CHECK(node.child(STR("b")).text());
13     CHECK(!node.child(STR("c")).text());
14     CHECK(!node.child(STR("d")).text());
15     CHECK(!xml_node().text());
16     CHECK(!xml_text());
17 
18     generic_empty_test(node.child(STR("a")).text());
19 }
20 
21 TEST_XML(dom_text_bool_ops, "<node>foo</node>")
22 {
23     generic_bool_ops_test(doc.child(STR("node")).text());
24 }
25 
26 TEST_XML_FLAGS(dom_text_get, "<node><a>foo</a><b><node/><![CDATA[bar]]></b><c><?pi value?></c><d/></node>", parse_default | parse_pi)
27 {
28     xml_node node = doc.child(STR("node"));
29 
30     CHECK_STRING(node.child(STR("a")).text().get(), STR("foo"));
31     CHECK_STRING(node.child(STR("a")).first_child().text().get(), STR("foo"));
32 
33     CHECK_STRING(node.child(STR("b")).text().get(), STR("bar"));
34     CHECK_STRING(node.child(STR("b")).last_child().text().get(), STR("bar"));
35 
36     CHECK_STRING(node.child(STR("c")).text().get(), STR(""));
37     CHECK_STRING(node.child(STR("c")).first_child().text().get(), STR(""));
38 
39     CHECK_STRING(node.child(STR("d")).text().get(), STR(""));
40 
41     CHECK_STRING(xml_node().text().get(), STR(""));
42 }
43 
44 TEST_XML_FLAGS(dom_text_as_string, "<node><a>foo</a><b><node/><![CDATA[bar]]></b><c><?pi value?></c><d/></node>", parse_default | parse_pi)
45 {
46     xml_node node = doc.child(STR("node"));
47 
48     CHECK_STRING(node.child(STR("a")).text().as_string(), STR("foo"));
49     CHECK_STRING(node.child(STR("a")).first_child().text().as_string(), STR("foo"));
50 
51     CHECK_STRING(node.child(STR("b")).text().as_string(), STR("bar"));
52     CHECK_STRING(node.child(STR("b")).last_child().text().as_string(), STR("bar"));
53 
54     CHECK_STRING(node.child(STR("c")).text().as_string(), STR(""));
55     CHECK_STRING(node.child(STR("c")).first_child().text().as_string(), STR(""));
56 
57     CHECK_STRING(node.child(STR("d")).text().as_string(), STR(""));
58 
59     CHECK_STRING(xml_node().text().as_string(), STR(""));
60 }
61 
62 TEST_XML(dom_text_as_int, "<node><text1>1</text1><text2>-1</text2><text3>-2147483648</text3><text4>2147483647</text4><text5>0</text5></node>")
63 {
64 	xml_node node = doc.child(STR("node"));
65 
66 	CHECK(xml_text().as_int() == 0);
67 	CHECK(node.child(STR("text1")).text().as_int() == 1);
68 	CHECK(node.child(STR("text2")).text().as_int() == -1);
69 	CHECK(node.child(STR("text3")).text().as_int() == -2147483647 - 1);
70 	CHECK(node.child(STR("text4")).text().as_int() == 2147483647);
71     CHECK(node.child(STR("text5")).text().as_int() == 0);
72 }
73 
74 TEST_XML(dom_text_as_int_hex, "<node><text1>0777</text1><text2>0x5ab</text2><text3>0XFf</text3><text4>-0x20</text4><text5>-0x80000000</text5><text6>0x</text6></node>")
75 {
76     xml_node node = doc.child(STR("node"));
77 
78     CHECK(node.child(STR("text1")).text().as_int() == 777); // no octal support! intentional
79     CHECK(node.child(STR("text2")).text().as_int() == 1451);
80     CHECK(node.child(STR("text3")).text().as_int() == 255);
81     CHECK(node.child(STR("text4")).text().as_int() == -32);
82     CHECK(node.child(STR("text5")).text().as_int() == -2147483647 - 1);
83     CHECK(node.child(STR("text6")).text().as_int() == 0);
84 }
85 
86 TEST_XML(dom_text_as_uint, "<node><text1>0</text1><text2>1</text2><text3>2147483647</text3><text4>4294967295</text4><text5>0</text5></node>")
87 {
88 	xml_node node = doc.child(STR("node"));
89 
90 	CHECK(xml_text().as_uint() == 0);
91 	CHECK(node.child(STR("text1")).text().as_uint() == 0);
92 	CHECK(node.child(STR("text2")).text().as_uint() == 1);
93 	CHECK(node.child(STR("text3")).text().as_uint() == 2147483647);
94 	CHECK(node.child(STR("text4")).text().as_uint() == 4294967295u);
95     CHECK(node.child(STR("text5")).text().as_uint() == 0);
96 }
97 
98 TEST_XML(dom_text_as_uint_hex, "<node><text1>0777</text1><text2>0x5ab</text2><text3>0XFf</text3><text4>0x20</text4><text5>0xFFFFFFFF</text5><text6>0x</text6></node>")
99 {
100     xml_node node = doc.child(STR("node"));
101 
102     CHECK(node.child(STR("text1")).text().as_uint() == 777); // no octal support! intentional
103     CHECK(node.child(STR("text2")).text().as_uint() == 1451);
104     CHECK(node.child(STR("text3")).text().as_uint() == 255);
105     CHECK(node.child(STR("text4")).text().as_uint() == 32);
106     CHECK(node.child(STR("text5")).text().as_uint() == 4294967295u);
107     CHECK(node.child(STR("text6")).text().as_uint() == 0);
108 }
109 
110 TEST_XML(dom_text_as_integer_space, "<node><text1> \t\n1234</text1><text2>\n\t 0x123</text2><text3>- 16</text3><text4>- 0x10</text4></node>")
111 {
112     xml_node node = doc.child(STR("node"));
113 
114     CHECK(node.child(STR("text1")).text().as_int() == 1234);
115     CHECK(node.child(STR("text2")).text().as_int() == 291);
116     CHECK(node.child(STR("text3")).text().as_int() == 0);
117     CHECK(node.child(STR("text4")).text().as_int() == 0);
118 }
119 
120 TEST_XML(dom_text_as_float, "<node><text1>0</text1><text2>1</text2><text3>0.12</text3><text4>-5.1</text4><text5>3e-4</text5><text6>3.14159265358979323846</text6></node>")
121 {
122 	xml_node node = doc.child(STR("node"));
123 
124 	CHECK(xml_text().as_float() == 0);
125 	CHECK_DOUBLE(node.child(STR("text1")).text().as_float(), 0);
126 	CHECK_DOUBLE(node.child(STR("text2")).text().as_float(), 1);
127 	CHECK_DOUBLE(node.child(STR("text3")).text().as_float(), 0.12);
128 	CHECK_DOUBLE(node.child(STR("text4")).text().as_float(), -5.1);
129 	CHECK_DOUBLE(node.child(STR("text5")).text().as_float(), 3e-4);
130 	CHECK_DOUBLE(node.child(STR("text6")).text().as_float(), 3.14159265358979323846);
131 }
132 
133 TEST_XML(dom_text_as_double, "<node><text1>0</text1><text2>1</text2><text3>0.12</text3><text4>-5.1</text4><text5>3e-4</text5><text6>3.14159265358979323846</text6></node>")
134 {
135 	xml_node node = doc.child(STR("node"));
136 
137 	CHECK(xml_text().as_double() == 0);
138 	CHECK_DOUBLE(node.child(STR("text1")).text().as_double(), 0);
139 	CHECK_DOUBLE(node.child(STR("text2")).text().as_double(), 1);
140 	CHECK_DOUBLE(node.child(STR("text3")).text().as_double(), 0.12);
141 	CHECK_DOUBLE(node.child(STR("text4")).text().as_double(), -5.1);
142 	CHECK_DOUBLE(node.child(STR("text5")).text().as_double(), 3e-4);
143 	CHECK_DOUBLE(node.child(STR("text6")).text().as_double(), 3.14159265358979323846);
144 }
145 
146 TEST_XML(dom_text_as_bool, "<node><text1>0</text1><text2>1</text2><text3>true</text3><text4>True</text4><text5>Yes</text5><text6>yes</text6><text7>false</text7></node>")
147 {
148 	xml_node node = doc.child(STR("node"));
149 
150 	CHECK(!xml_text().as_bool());
151 	CHECK(!node.child(STR("text1")).text().as_bool());
152 	CHECK(node.child(STR("text2")).text().as_bool());
153 	CHECK(node.child(STR("text3")).text().as_bool());
154 	CHECK(node.child(STR("text4")).text().as_bool());
155 	CHECK(node.child(STR("text5")).text().as_bool());
156 	CHECK(node.child(STR("text6")).text().as_bool());
157 	CHECK(!node.child(STR("text7")).text().as_bool());
158 }
159 
160 #ifdef PUGIXML_HAS_LONG_LONG
161 TEST_XML(dom_text_as_llong, "<node><text1>1</text1><text2>-1</text2><text3>-9223372036854775808</text3><text4>9223372036854775807</text4><text5>0</text5></node>")
162 {
163 	xml_node node = doc.child(STR("node"));
164 
165 	CHECK(xml_text().as_llong() == 0);
166 	CHECK(node.child(STR("text1")).text().as_llong() == 1);
167 	CHECK(node.child(STR("text2")).text().as_llong() == -1);
168 	CHECK(node.child(STR("text3")).text().as_llong() == -9223372036854775807ll - 1);
169 	CHECK(node.child(STR("text4")).text().as_llong() == 9223372036854775807ll);
170 	CHECK(node.child(STR("text5")).text().as_llong() == 0);
171 }
172 
173 TEST_XML(dom_text_as_llong_hex, "<node><text1>0777</text1><text2>0x5ab</text2><text3>0XFf</text3><text4>-0x20</text4><text5>-0x8000000000000000</text5><text6>0x</text6></node>")
174 {
175 	xml_node node = doc.child(STR("node"));
176 
177 	CHECK(node.child(STR("text1")).text().as_llong() == 777); // no octal support! intentional
178 	CHECK(node.child(STR("text2")).text().as_llong() == 1451);
179 	CHECK(node.child(STR("text3")).text().as_llong() == 255);
180 	CHECK(node.child(STR("text4")).text().as_llong() == -32);
181 	CHECK(node.child(STR("text5")).text().as_llong() == -9223372036854775807ll - 1);
182 	CHECK(node.child(STR("text6")).text().as_llong() == 0);
183 }
184 
185 TEST_XML(dom_text_as_ullong, "<node><text1>0</text1><text2>1</text2><text3>9223372036854775807</text3><text4>18446744073709551615</text4><text5>0</text5></node>")
186 {
187 	xml_node node = doc.child(STR("node"));
188 
189 	CHECK(xml_text().as_ullong() == 0);
190 	CHECK(node.child(STR("text1")).text().as_ullong() == 0);
191 	CHECK(node.child(STR("text2")).text().as_ullong() == 1);
192 	CHECK(node.child(STR("text3")).text().as_ullong() == 9223372036854775807ll);
193 	CHECK(node.child(STR("text4")).text().as_ullong() == 18446744073709551615ull);
194 	CHECK(node.child(STR("text5")).text().as_ullong() == 0);
195 }
196 
197 TEST_XML(dom_text_as_ullong_hex, "<node><text1>0777</text1><text2>0x5ab</text2><text3>0XFf</text3><text4>0x20</text4><text5>0xFFFFFFFFFFFFFFFF</text5><text6>0x</text6></node>")
198 {
199 	xml_node node = doc.child(STR("node"));
200 
201 	CHECK(node.child(STR("text1")).text().as_ullong() == 777); // no octal support! intentional
202 	CHECK(node.child(STR("text2")).text().as_ullong() == 1451);
203 	CHECK(node.child(STR("text3")).text().as_ullong() == 255);
204 	CHECK(node.child(STR("text4")).text().as_ullong() == 32);
205 	CHECK(node.child(STR("text5")).text().as_ullong() == 18446744073709551615ull);
206 	CHECK(node.child(STR("text6")).text().as_ullong() == 0);
207 }
208 #endif
209 
210 TEST_XML(dom_text_get_no_state, "<node/>")
211 {
212     xml_node node = doc.child(STR("node"));
213     xml_text t = node.text();
214 
215     CHECK(!t);
216     CHECK(t.get() && *t.get() == 0);
217     CHECK(!node.first_child());
218 
219     node.append_child(node_pcdata);
220 
221     CHECK(t);
222     CHECK_STRING(t.get(), STR(""));
223 
224     node.first_child().set_value(STR("test"));
225 
226     CHECK(t);
227     CHECK_STRING(t.get(), STR("test"));
228 }
229 
230 TEST_XML(dom_text_set, "<node/>")
231 {
232     xml_node node = doc.child(STR("node"));
233     xml_text t = node.text();
234 
235     t.set(STR(""));
236     CHECK(node.first_child().type() == node_pcdata);
237     CHECK_NODE(node, STR("<node></node>"));
238 
239     t.set(STR("boo"));
240     CHECK(node.first_child().type() == node_pcdata);
241     CHECK(node.first_child() == node.last_child());
242     CHECK_NODE(node, STR("<node>boo</node>"));
243 
244     t.set(STR("foobarfoobar"));
245     CHECK(node.first_child().type() == node_pcdata);
246     CHECK(node.first_child() == node.last_child());
247     CHECK_NODE(node, STR("<node>foobarfoobar</node>"));
248 }
249 
250 TEST_XML(dom_text_assign, "<node/>")
251 {
252 	xml_node node = doc.child(STR("node"));
253 
254 	node.append_child(STR("text1")).text() = STR("v1");
255 	xml_text() = STR("v1");
256 
257 	node.append_child(STR("text2")).text() = -2147483647;
258 	node.append_child(STR("text3")).text() = -2147483647 - 1;
259 	xml_text() = -2147483647 - 1;
260 
261 	node.append_child(STR("text4")).text() = 4294967295u;
262 	node.append_child(STR("text5")).text() = 4294967294u;
263 	xml_text() = 4294967295u;
264 
265 	node.append_child(STR("text6")).text() = 0.5;
266 	xml_text() = 0.5;
267 
268 	node.append_child(STR("text7")).text() = 0.25f;
269 	xml_text() = 0.25f;
270 
271 	node.append_child(STR("text8")).text() = true;
272 	xml_text() = true;
273 
274 	CHECK_NODE(node, STR("<node><text1>v1</text1><text2>-2147483647</text2><text3>-2147483648</text3><text4>4294967295</text4><text5>4294967294</text5><text6>0.5</text6><text7>0.25</text7><text8>true</text8></node>"));
275 }
276 
277 TEST_XML(dom_text_set_value, "<node/>")
278 {
279 	xml_node node = doc.child(STR("node"));
280 
281 	CHECK(node.append_child(STR("text1")).text().set(STR("v1")));
282 	CHECK(!xml_text().set(STR("v1")));
283 
284 	CHECK(node.append_child(STR("text2")).text().set(-2147483647));
285 	CHECK(node.append_child(STR("text3")).text().set(-2147483647 - 1));
286 	CHECK(!xml_text().set(-2147483647 - 1));
287 
288 	CHECK(node.append_child(STR("text4")).text().set(4294967295u));
289 	CHECK(node.append_child(STR("text5")).text().set(4294967294u));
290 	CHECK(!xml_text().set(4294967295u));
291 
292 	CHECK(node.append_child(STR("text6")).text().set(0.5));
293 	CHECK(!xml_text().set(0.5));
294 
295 	CHECK(node.append_child(STR("text7")).text().set(0.25f));
296 	CHECK(!xml_text().set(0.25f));
297 
298 	CHECK(node.append_child(STR("text8")).text().set(true));
299 	CHECK(!xml_text().set(true));
300 
301 	CHECK_NODE(node, STR("<node><text1>v1</text1><text2>-2147483647</text2><text3>-2147483648</text3><text4>4294967295</text4><text5>4294967294</text5><text6>0.5</text6><text7>0.25</text7><text8>true</text8></node>"));
302 }
303 
304 #if LONG_MAX > 2147483647
305 TEST_XML(dom_text_assign_long, "<node/>")
306 {
307 	xml_node node = doc.child(STR("node"));
308 
309 	node.append_child(STR("text1")).text() = -9223372036854775807l;
310 	node.append_child(STR("text2")).text() = -9223372036854775807l - 1;
311 	xml_text() = -9223372036854775807l - 1;
312 
313 	node.append_child(STR("text3")).text() = 18446744073709551615ul;
314 	node.append_child(STR("text4")).text() = 18446744073709551614ul;
315 	xml_text() = 18446744073709551615ul;
316 
317 	CHECK_NODE(node, STR("<node><text1>-9223372036854775807</text1><text2>-9223372036854775808</text2><text3>18446744073709551615</text3><text4>18446744073709551614</text4></node>"));
318 }
319 
320 TEST_XML(dom_text_set_value_long, "<node/>")
321 {
322 	xml_node node = doc.child(STR("node"));
323 
324 	CHECK(node.append_child(STR("text1")).text().set(-9223372036854775807l));
325 	CHECK(node.append_child(STR("text2")).text().set(-9223372036854775807l - 1));
326 	CHECK(!xml_text().set(-9223372036854775807l - 1));
327 
328 	CHECK(node.append_child(STR("text3")).text().set(18446744073709551615ul));
329 	CHECK(node.append_child(STR("text4")).text().set(18446744073709551614ul));
330 	CHECK(!xml_text().set(18446744073709551615ul));
331 
332 	CHECK_NODE(node, STR("<node><text1>-9223372036854775807</text1><text2>-9223372036854775808</text2><text3>18446744073709551615</text3><text4>18446744073709551614</text4></node>"));
333 }
334 #else
335 TEST_XML(dom_text_assign_long, "<node/>")
336 {
337 	xml_node node = doc.child(STR("node"));
338 
339 	node.append_child(STR("text1")).text() = -2147483647l;
340 	node.append_child(STR("text2")).text() = -2147483647l - 1;
341 	xml_text() = -2147483647l - 1;
342 
343 	node.append_child(STR("text3")).text() = 4294967295ul;
344 	node.append_child(STR("text4")).text() = 4294967294ul;
345 	xml_text() = 4294967295ul;
346 
347 	CHECK_NODE(node, STR("<node><text1>-2147483647</text1><text2>-2147483648</text2><text3>4294967295</text3><text4>4294967294</text4></node>"));
348 }
349 
350 TEST_XML(dom_text_set_value_long, "<node/>")
351 {
352 	xml_node node = doc.child(STR("node"));
353 
354 	CHECK(node.append_child(STR("text1")).text().set(-2147483647l));
355 	CHECK(node.append_child(STR("text2")).text().set(-2147483647l - 1));
356 	CHECK(!xml_text().set(-2147483647l - 1));
357 
358 	CHECK(node.append_child(STR("text3")).text().set(4294967295ul));
359 	CHECK(node.append_child(STR("text4")).text().set(4294967294ul));
360 	CHECK(!xml_text().set(4294967295ul));
361 
362 	CHECK_NODE(node, STR("<node><text1>-2147483647</text1><text2>-2147483648</text2><text3>4294967295</text3><text4>4294967294</text4></node>"));
363 }
364 #endif
365 
366 #ifdef PUGIXML_HAS_LONG_LONG
367 TEST_XML(dom_text_assign_llong, "<node/>")
368 {
369 	xml_node node = doc.child(STR("node"));
370 
371 	node.append_child(STR("text1")).text() = -9223372036854775807ll;
372 	node.append_child(STR("text2")).text() = -9223372036854775807ll - 1;
373 	xml_text() = -9223372036854775807ll - 1;
374 
375 	node.append_child(STR("text3")).text() = 18446744073709551615ull;
376 	node.append_child(STR("text4")).text() = 18446744073709551614ull;
377 	xml_text() = 18446744073709551615ull;
378 
379 	CHECK_NODE(node, STR("<node><text1>-9223372036854775807</text1><text2>-9223372036854775808</text2><text3>18446744073709551615</text3><text4>18446744073709551614</text4></node>"));
380 }
381 
382 TEST_XML(dom_text_set_value_llong, "<node/>")
383 {
384 	xml_node node = doc.child(STR("node"));
385 
386 	CHECK(node.append_child(STR("text1")).text().set(-9223372036854775807ll));
387 	CHECK(node.append_child(STR("text2")).text().set(-9223372036854775807ll - 1));
388 	CHECK(!xml_text().set(-9223372036854775807ll - 1));
389 
390 	CHECK(node.append_child(STR("text3")).text().set(18446744073709551615ull));
391 	CHECK(node.append_child(STR("text4")).text().set(18446744073709551614ull));
392 	CHECK(!xml_text().set(18446744073709551615ull));
393 
394 	CHECK_NODE(node, STR("<node><text1>-9223372036854775807</text1><text2>-9223372036854775808</text2><text3>18446744073709551615</text3><text4>18446744073709551614</text4></node>"));
395 }
396 #endif
397 
398 TEST_XML(dom_text_middle, "<node><c1>notthisone</c1>text<c2/></node>")
399 {
400     xml_node node = doc.child(STR("node"));
401     xml_text t = node.text();
402 
403     CHECK_STRING(t.get(), STR("text"));
404     t.set(STR("notext"));
405 
406     CHECK_NODE(node, STR("<node><c1>notthisone</c1>notext<c2/></node>"));
407     CHECK(node.remove_child(t.data()));
408 
409     CHECK(!t);
410     CHECK_NODE(node, STR("<node><c1>notthisone</c1><c2/></node>"));
411 
412     t.set(STR("yestext"));
413 
414     CHECK(t);
415     CHECK_NODE(node, STR("<node><c1>notthisone</c1><c2/>yestext</node>"));
416     CHECK(t.data() == node.last_child());
417 }
418 
419 TEST_XML_FLAGS(dom_text_data, "<node><a>foo</a><b><![CDATA[bar]]></b><c><?pi value?></c><d/></node>", parse_default | parse_pi)
420 {
421     xml_node node = doc.child(STR("node"));
422 
423     CHECK(node.child(STR("a")).text().data() == node.child(STR("a")).first_child());
424     CHECK(node.child(STR("b")).text().data() == node.child(STR("b")).first_child());
425     CHECK(!node.child(STR("c")).text().data());
426     CHECK(!node.child(STR("d")).text().data());
427     CHECK(!xml_text().data());
428 }
429 
TEST(dom_text_defaults)430 TEST(dom_text_defaults)
431 {
432     xml_text text;
433 
434     CHECK_STRING(text.as_string(STR("foo")), STR("foo"));
435     CHECK(text.as_int(42) == 42);
436     CHECK(text.as_uint(42) == 42);
437     CHECK(text.as_double(42) == 42);
438     CHECK(text.as_float(42) == 42);
439     CHECK(text.as_bool(true) == true);
440 
441 #ifdef PUGIXML_HAS_LONG_LONG
442     CHECK(text.as_llong(42) == 42);
443     CHECK(text.as_ullong(42) == 42);
444 #endif
445 }
446