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