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