summaryrefslogtreecommitdiff
path: root/tests/test_dom_text.cpp
blob: 2e38f29cee0e6af0e8776c894dbecfc0f1df2df7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
#include "common.hpp"

#include "helpers.hpp"

TEST_XML_FLAGS(dom_text_empty, "<node><a>foo</a><b><![CDATA[bar]]></b><c><?pi value?></c><d/></node>", parse_default | parse_pi)
{
    xml_node node = doc.child(STR("node"));

    CHECK(node.child(STR("a")).text());
    CHECK(node.child(STR("b")).text());
    CHECK(!node.child(STR("c")).text());
    CHECK(!node.child(STR("d")).text());
    CHECK(!xml_node().text());
    CHECK(!xml_text());

    generic_empty_test(node.child(STR("a")).text());
}

TEST_XML(dom_text_bool_ops, "<node>foo</node>")
{
    generic_bool_ops_test(doc.child(STR("node")).text());
}

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)
{
    xml_node node = doc.child(STR("node"));

    CHECK_STRING(node.child(STR("a")).text().get(), STR("foo"));
    CHECK_STRING(node.child(STR("a")).first_child().text().get(), STR("foo"));

    CHECK_STRING(node.child(STR("b")).text().get(), STR("bar"));
    CHECK_STRING(node.child(STR("b")).last_child().text().get(), STR("bar"));

    CHECK_STRING(node.child(STR("c")).text().get(), STR(""));
    CHECK_STRING(node.child(STR("c")).first_child().text().get(), STR(""));

    CHECK_STRING(node.child(STR("d")).text().get(), STR(""));

    CHECK_STRING(xml_node().text().get(), STR(""));
}

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)
{
    xml_node node = doc.child(STR("node"));

    CHECK_STRING(node.child(STR("a")).text().as_string(), STR("foo"));
    CHECK_STRING(node.child(STR("a")).first_child().text().as_string(), STR("foo"));

    CHECK_STRING(node.child(STR("b")).text().as_string(), STR("bar"));
    CHECK_STRING(node.child(STR("b")).last_child().text().as_string(), STR("bar"));

    CHECK_STRING(node.child(STR("c")).text().as_string(), STR(""));
    CHECK_STRING(node.child(STR("c")).first_child().text().as_string(), STR(""));

    CHECK_STRING(node.child(STR("d")).text().as_string(), STR(""));

    CHECK_STRING(xml_node().text().as_string(), STR(""));
}

TEST_XML(dom_text_as_int, "<node><text1>1</text1><text2>-1</text2><text3>-2147483648</text3><text4>2147483647</text4><text5>0</text5></node>")
{
	xml_node node = doc.child(STR("node"));

	CHECK(xml_text().as_int() == 0);
	CHECK(node.child(STR("text1")).text().as_int() == 1);
	CHECK(node.child(STR("text2")).text().as_int() == -1);
	CHECK(node.child(STR("text3")).text().as_int() == -2147483647 - 1);
	CHECK(node.child(STR("text4")).text().as_int() == 2147483647);
    CHECK(node.child(STR("text5")).text().as_int() == 0);
}

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>")
{
    xml_node node = doc.child(STR("node"));

    CHECK(node.child(STR("text1")).text().as_int() == 777); // no octal support! intentional
    CHECK(node.child(STR("text2")).text().as_int() == 1451);
    CHECK(node.child(STR("text3")).text().as_int() == 255);
    CHECK(node.child(STR("text4")).text().as_int() == -32);
    CHECK(node.child(STR("text5")).text().as_int() == -2147483647 - 1);
    CHECK(node.child(STR("text6")).text().as_int() == 0);
}

TEST_XML(dom_text_as_uint, "<node><text1>0</text1><text2>1</text2><text3>2147483647</text3><text4>4294967295</text4><text5>0</text5></node>")
{
	xml_node node = doc.child(STR("node"));

	CHECK(xml_text().as_uint() == 0);
	CHECK(node.child(STR("text1")).text().as_uint() == 0);
	CHECK(node.child(STR("text2")).text().as_uint() == 1);
	CHECK(node.child(STR("text3")).text().as_uint() == 2147483647);
	CHECK(node.child(STR("text4")).text().as_uint() == 4294967295u);
    CHECK(node.child(STR("text5")).text().as_uint() == 0);
}

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>")
{
    xml_node node = doc.child(STR("node"));

    CHECK(node.child(STR("text1")).text().as_uint() == 777); // no octal support! intentional
    CHECK(node.child(STR("text2")).text().as_uint() == 1451);
    CHECK(node.child(STR("text3")).text().as_uint() == 255);
    CHECK(node.child(STR("text4")).text().as_uint() == 32);
    CHECK(node.child(STR("text5")).text().as_uint() == 4294967295u);
    CHECK(node.child(STR("text6")).text().as_uint() == 0);
}

TEST_XML(dom_text_as_integer_space, "<node><text1> \t\n1234</text1><text2>\n\t 0x123</text2><text3>- 16</text3><text4>- 0x10</text4></node>")
{
    xml_node node = doc.child(STR("node"));

    CHECK(node.child(STR("text1")).text().as_int() == 1234);
    CHECK(node.child(STR("text2")).text().as_int() == 291);
    CHECK(node.child(STR("text3")).text().as_int() == 0);
    CHECK(node.child(STR("text4")).text().as_int() == 0);
}

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>")
{
	xml_node node = doc.child(STR("node"));

	CHECK(xml_text().as_float() == 0);
	CHECK_DOUBLE(node.child(STR("text1")).text().as_float(), 0);
	CHECK_DOUBLE(node.child(STR("text2")).text().as_float(), 1);
	CHECK_DOUBLE(node.child(STR("text3")).text().as_float(), 0.12);
	CHECK_DOUBLE(node.child(STR("text4")).text().as_float(), -5.1);
	CHECK_DOUBLE(node.child(STR("text5")).text().as_float(), 3e-4);
	CHECK_DOUBLE(node.child(STR("text6")).text().as_float(), 3.14159265358979323846);
}

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>")
{
	xml_node node = doc.child(STR("node"));

	CHECK(xml_text().as_double() == 0);
	CHECK_DOUBLE(node.child(STR("text1")).text().as_double(), 0);
	CHECK_DOUBLE(node.child(STR("text2")).text().as_double(), 1);
	CHECK_DOUBLE(node.child(STR("text3")).text().as_double(), 0.12);
	CHECK_DOUBLE(node.child(STR("text4")).text().as_double(), -5.1);
	CHECK_DOUBLE(node.child(STR("text5")).text().as_double(), 3e-4);
	CHECK_DOUBLE(node.child(STR("text6")).text().as_double(), 3.14159265358979323846);
}

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>")
{
	xml_node node = doc.child(STR("node"));

	CHECK(!xml_text().as_bool());
	CHECK(!node.child(STR("text1")).text().as_bool());
	CHECK(node.child(STR("text2")).text().as_bool());
	CHECK(node.child(STR("text3")).text().as_bool());
	CHECK(node.child(STR("text4")).text().as_bool());
	CHECK(node.child(STR("text5")).text().as_bool());
	CHECK(node.child(STR("text6")).text().as_bool());
	CHECK(!node.child(STR("text7")).text().as_bool());
}

TEST_XML(dom_text_get_no_state, "<node/>")
{
    xml_node node = doc.child(STR("node"));
    xml_text t = node.text();

    CHECK(!t);
    CHECK(t.get() && *t.get() == 0);
    CHECK(!node.first_child());

    node.append_child(node_pcdata);

    CHECK(t);
    CHECK_STRING(t.get(), STR(""));

    node.first_child().set_value(STR("test"));

    CHECK(t);
    CHECK_STRING(t.get(), STR("test"));
}

TEST_XML(dom_text_set, "<node/>")
{
    xml_node node = doc.child(STR("node"));
    xml_text t = node.text();

    t.set(STR(""));
    CHECK(node.first_child().type() == node_pcdata);
    CHECK_NODE(node, STR("<node></node>"));

    t.set(STR("boo"));
    CHECK(node.first_child().type() == node_pcdata);
    CHECK(node.first_child() == node.last_child());
    CHECK_NODE(node, STR("<node>boo</node>"));

    t.set(STR("foobarfoobar"));
    CHECK(node.first_child().type() == node_pcdata);
    CHECK(node.first_child() == node.last_child());
    CHECK_NODE(node, STR("<node>foobarfoobar</node>"));
}

TEST_XML(dom_text_assign, "<node/>")
{
	xml_node node = doc.child(STR("node"));

	node.append_child(STR("text1")).text() = STR("v1");
	xml_text() = STR("v1");

	node.append_child(STR("text2")).text() = -2147483647;
	node.append_child(STR("text3")).text() = -2147483647 - 1;
	xml_text() = -2147483647 - 1;

	node.append_child(STR("text4")).text() = 4294967295u;
	node.append_child(STR("text5")).text() = 4294967294u;
	xml_text() = 2147483647;

	node.append_child(STR("text6")).text() = 0.5;
	xml_text() = 0.5;

	node.append_child(STR("text7")).text() = true;
	xml_text() = true;

	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>true</text7></node>"));
}

TEST_XML(dom_text_set_value, "<node/>")
{
	xml_node node = doc.child(STR("node"));

	CHECK(node.append_child(STR("text1")).text().set(STR("v1")));
	CHECK(!xml_text().set(STR("v1")));

	CHECK(node.append_child(STR("text2")).text().set(-2147483647));
	CHECK(node.append_child(STR("text3")).text().set(-2147483647 - 1));
	CHECK(!xml_text().set(-2147483647 - 1));

	CHECK(node.append_child(STR("text4")).text().set(4294967295u));
	CHECK(node.append_child(STR("text5")).text().set(4294967294u));
	CHECK(!xml_text().set(2147483647));

	CHECK(node.append_child(STR("text6")).text().set(0.5));
	CHECK(!xml_text().set(0.5));

	CHECK(node.append_child(STR("text7")).text().set(true));
	CHECK(!xml_text().set(true));

	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>true</text7></node>"));
}

TEST_XML(dom_text_middle, "<node><c1>notthisone</c1>text<c2/></node>")
{
    xml_node node = doc.child(STR("node"));
    xml_text t = node.text();

    CHECK_STRING(t.get(), STR("text"));
    t.set(STR("notext"));

    CHECK_NODE(node, STR("<node><c1>notthisone</c1>notext<c2 /></node>"));
    CHECK(node.remove_child(t.data()));

    CHECK(!t);
    CHECK_NODE(node, STR("<node><c1>notthisone</c1><c2 /></node>"));

    t.set(STR("yestext"));

    CHECK(t);
    CHECK_NODE(node, STR("<node><c1>notthisone</c1><c2 />yestext</node>"));
    CHECK(t.data() == node.last_child());
}

TEST_XML_FLAGS(dom_text_data, "<node><a>foo</a><b><![CDATA[bar]]></b><c><?pi value?></c><d/></node>", parse_default | parse_pi)
{
    xml_node node = doc.child(STR("node"));

    CHECK(node.child(STR("a")).text().data() == node.child(STR("a")).first_child());
    CHECK(node.child(STR("b")).text().data() == node.child(STR("b")).first_child());
    CHECK(!node.child(STR("c")).text().data());
    CHECK(!node.child(STR("d")).text().data());
    CHECK(!xml_text().data());
}

TEST(dom_text_defaults)
{
    xml_text text;

    CHECK_STRING(text.as_string(STR("foo")), STR("foo"));
    CHECK(text.as_int(42) == 42);
    CHECK(text.as_uint(42) == 42);
    CHECK(text.as_double(42) == 42);
    CHECK(text.as_float(42) == 42);
    CHECK(text.as_bool(true) == true);
}