1 #include <glib.h>
2 #include <lsmdom.h>
3
4 static void
_weak_ref_cb(void * data,GObject * object)5 _weak_ref_cb (void *data, GObject *object)
6 {
7 int *counter = data;
8
9 (*counter)++;
10 }
11
12 static void
create_document_test(void)13 create_document_test (void)
14 {
15 LsmDomDocument *document;
16
17 document = lsm_dom_implementation_create_document (NULL, "math");
18 g_assert (LSM_IS_DOM_DOCUMENT (document));
19 g_assert_cmpstr (lsm_dom_node_get_node_name (LSM_DOM_NODE (document)), ==, "#document");
20 g_assert (lsm_dom_node_get_node_value (LSM_DOM_NODE (document)) == NULL);
21
22 g_object_unref (document);
23
24 document = lsm_dom_implementation_create_document (NULL, "svg");
25 g_assert (LSM_IS_DOM_DOCUMENT (document));
26 g_assert_cmpstr (lsm_dom_node_get_node_name (LSM_DOM_NODE (document)), ==, "#document");
27 g_assert (lsm_dom_node_get_node_value (LSM_DOM_NODE (document)) == NULL);
28
29 g_object_unref (document);
30 }
31
32 static void
owner_document_test(void)33 owner_document_test (void)
34 {
35 LsmDomDocument *document;
36 LsmDomElement *element;
37 LsmDomElement *text_element;
38 LsmDomText *text;
39 int counter = 0;
40
41 document = lsm_dom_implementation_create_document (NULL, "svg");
42 g_assert (LSM_IS_DOM_DOCUMENT (document));
43 g_assert (lsm_dom_node_get_owner_document (LSM_DOM_NODE (document)) == NULL);
44
45 element = lsm_dom_document_create_element (document, "svg");
46 g_assert (LSM_IS_DOM_ELEMENT (element));
47 g_assert (lsm_dom_node_get_owner_document (LSM_DOM_NODE (element)) == document);
48
49 lsm_dom_node_append_child (LSM_DOM_NODE (document), LSM_DOM_NODE (element));
50 g_assert (lsm_dom_node_get_owner_document (LSM_DOM_NODE (element)) == document);
51
52 text_element = lsm_dom_document_create_element (document, "text");
53 g_assert (LSM_IS_DOM_ELEMENT (text_element));
54 g_assert (lsm_dom_node_get_owner_document (LSM_DOM_NODE (text_element)) == document);
55
56 lsm_dom_node_append_child (LSM_DOM_NODE (element), LSM_DOM_NODE (text_element));
57
58 text = lsm_dom_document_create_text_node (document, "");
59 g_assert (LSM_IS_DOM_TEXT (text));
60 g_assert (lsm_dom_node_get_owner_document (LSM_DOM_NODE (text)) == document);
61
62 lsm_dom_node_append_child (LSM_DOM_NODE (text_element), LSM_DOM_NODE (text));
63 g_assert (lsm_dom_node_get_owner_document (LSM_DOM_NODE (text)) == document);
64
65 g_object_weak_ref (G_OBJECT (document), _weak_ref_cb, &counter);
66 g_object_weak_ref (G_OBJECT (element), _weak_ref_cb, &counter);
67 g_object_weak_ref (G_OBJECT (text_element), _weak_ref_cb, &counter);
68 g_object_weak_ref (G_OBJECT (text), _weak_ref_cb, &counter);
69
70 g_object_unref (document);
71
72 g_assert_cmpint (counter, ==, 4);
73 }
74
75 static void
owner_mismatch_test(void)76 owner_mismatch_test (void)
77 {
78 LsmDomDocument *document_a;
79 LsmDomDocument *document_b;
80 LsmDomElement *element_a;
81 LsmDomElement *element_b;
82 LsmDomElement *element_c;
83 int counter = 0;
84
85 document_a = lsm_dom_implementation_create_document (NULL, "svg");
86 g_assert (LSM_IS_DOM_DOCUMENT (document_a));
87 g_assert (lsm_dom_node_get_owner_document (LSM_DOM_NODE (document_a)) == NULL);
88
89 element_a = lsm_dom_document_create_element (document_a, "svg");
90 element_b = lsm_dom_document_create_element (document_a, "text");
91
92 document_b = lsm_dom_implementation_create_document (NULL, "svg");
93 g_assert (LSM_IS_DOM_DOCUMENT (document_b));
94 g_assert (lsm_dom_node_get_owner_document (LSM_DOM_NODE (document_b)) == NULL);
95
96 element_c = lsm_dom_document_create_element (document_b, "text");
97
98 g_assert (lsm_dom_node_append_child (LSM_DOM_NODE (document_a), LSM_DOM_NODE (element_a)) == LSM_DOM_NODE (element_a));
99 g_assert (lsm_dom_node_append_child (LSM_DOM_NODE (element_a), LSM_DOM_NODE (element_b)) == LSM_DOM_NODE (element_b));
100
101 g_object_weak_ref (G_OBJECT (document_a), _weak_ref_cb, &counter);
102 g_object_weak_ref (G_OBJECT (document_b), _weak_ref_cb, &counter);
103 g_object_weak_ref (G_OBJECT (element_a), _weak_ref_cb, &counter);
104 g_object_weak_ref (G_OBJECT (element_c), _weak_ref_cb, &counter);
105 g_object_weak_ref (G_OBJECT (element_b), _weak_ref_cb, &counter);
106
107 g_assert (lsm_dom_node_append_child (LSM_DOM_NODE (element_a), LSM_DOM_NODE (element_c)) == NULL);
108
109 g_object_unref (document_a);
110 g_object_unref (document_b);
111
112 g_assert_cmpint (counter, ==, 5);
113 }
114
115 static void
create_element_test(void)116 create_element_test (void)
117 {
118 LsmDomDocument *document;
119 LsmDomElement *element;
120
121 document = lsm_dom_implementation_create_document (NULL, "svg");
122 g_assert (LSM_IS_DOM_DOCUMENT (document));
123 g_assert_cmpstr (lsm_dom_node_get_node_name (LSM_DOM_NODE (document)), ==, "#document");
124
125 element = lsm_dom_document_create_element (document, "unknown");
126 g_assert (element == NULL);
127
128 element = lsm_dom_document_create_element (document, "svg");
129 g_assert (LSM_IS_DOM_ELEMENT (element));
130
131 g_object_unref (element);
132 g_object_unref (document);
133 }
134
135 static void
add_remove_element_test(void)136 add_remove_element_test (void)
137 {
138 LsmDomDocument *document;
139 LsmDomElement *element;
140
141 document = lsm_dom_implementation_create_document (NULL, "svg");
142 g_assert (LSM_IS_DOM_DOCUMENT (document));
143
144 element = lsm_dom_document_create_element (document, "unknown");
145 g_assert (element == NULL);
146
147 element = lsm_dom_document_create_element (document, "svg");
148 g_assert (LSM_IS_DOM_ELEMENT (element));
149 g_assert_cmpstr (lsm_dom_element_get_tag_name (LSM_DOM_ELEMENT (element)), ==, "svg");
150 g_assert (lsm_dom_node_get_next_sibling (LSM_DOM_NODE (element)) == NULL);
151 g_assert (lsm_dom_node_get_previous_sibling (LSM_DOM_NODE (element)) == NULL);
152 g_assert (lsm_dom_node_get_parent_node (LSM_DOM_NODE (element)) == NULL);
153
154 g_assert (lsm_dom_node_append_child (LSM_DOM_NODE (document), LSM_DOM_NODE (element)) ==
155 LSM_DOM_NODE (element));
156 g_assert (lsm_dom_node_get_parent_node (LSM_DOM_NODE (element)) == LSM_DOM_NODE (document));
157 g_assert (lsm_dom_node_get_owner_document (LSM_DOM_NODE (element)) == document);
158 g_assert (lsm_dom_node_get_first_child (LSM_DOM_NODE (document)) == LSM_DOM_NODE (element));
159
160 g_object_ref (element);
161
162 lsm_dom_node_remove_child (LSM_DOM_NODE (document), LSM_DOM_NODE (element));
163 g_assert (lsm_dom_node_get_first_child (LSM_DOM_NODE (document)) == NULL);
164 g_assert (lsm_dom_node_get_parent_node (LSM_DOM_NODE (element)) == NULL);
165 g_assert (lsm_dom_node_get_owner_document (LSM_DOM_NODE (element)) != NULL);
166
167 g_object_unref (element);
168 g_object_unref (document);
169 }
170
171 static void
node_list_test(void)172 node_list_test (void)
173 {
174 LsmDomDocument *document;
175 LsmDomElement *element;
176 LsmDomNodeList *childs;
177 int counter = 0;
178
179 document = lsm_dom_implementation_create_document (NULL, "svg");
180 element = lsm_dom_document_create_element (document, "svg");
181 lsm_dom_node_append_child (LSM_DOM_NODE (document), LSM_DOM_NODE (element));
182
183 childs = lsm_dom_node_get_child_nodes (LSM_DOM_NODE (document));
184 g_assert (LSM_IS_DOM_NODE_LIST (childs));
185 g_assert (lsm_dom_node_list_get_length (childs) == 1);
186 g_assert (lsm_dom_node_list_get_item (childs, 0) == LSM_DOM_NODE (element));
187 g_assert (lsm_dom_node_list_get_item (childs, 1) == NULL);
188
189 g_object_weak_ref (G_OBJECT (document), _weak_ref_cb, &counter);
190 g_object_weak_ref (G_OBJECT (element), _weak_ref_cb, &counter);
191 g_object_weak_ref (G_OBJECT (childs), _weak_ref_cb, &counter);
192
193 g_object_ref (childs);
194 g_object_unref (document);
195
196 g_assert (lsm_dom_node_list_get_length (childs) == 0);
197
198 g_object_unref (childs);
199
200 g_assert_cmpint (counter, ==, 3);
201 }
202
203 static void
insert_before_test(void)204 insert_before_test (void)
205 {
206 LsmDomDocument *document;
207 LsmDomNode *node;
208 LsmDomNodeList *childs;
209 LsmDomElement *math;
210 LsmDomElement *mn1;
211 LsmDomElement *mn2;
212 LsmDomElement *mo1;
213 LsmDomElement *mo2;
214
215 document = lsm_dom_implementation_create_document (NULL, "math");
216 math = lsm_dom_document_create_element (document, "math");
217 lsm_dom_node_append_child (LSM_DOM_NODE (document), LSM_DOM_NODE (math));
218 mn1 = lsm_dom_document_create_element (document, "mn");
219 mn2 = lsm_dom_document_create_element (document, "mn");
220 mo1 = lsm_dom_document_create_element (document, "mo");
221
222 node = lsm_dom_node_append_child (LSM_DOM_NODE (math), LSM_DOM_NODE (mn2));
223 g_assert (node == LSM_DOM_NODE (mn2));
224 node = lsm_dom_node_insert_before (LSM_DOM_NODE (math), LSM_DOM_NODE (mn1), LSM_DOM_NODE (mn2));
225 g_assert (node == LSM_DOM_NODE (mn1));
226 node = lsm_dom_node_insert_before (LSM_DOM_NODE (math), LSM_DOM_NODE (mo1), LSM_DOM_NODE (mn2));
227 g_assert (node == LSM_DOM_NODE (mo1));
228
229 childs = lsm_dom_node_get_child_nodes (LSM_DOM_NODE (math));
230 g_assert (LSM_IS_DOM_NODE_LIST (childs));
231
232 g_assert (lsm_dom_node_list_get_item (childs, 0) == LSM_DOM_NODE (mn1));
233 g_assert (lsm_dom_node_list_get_item (childs, 1) == LSM_DOM_NODE (mo1));
234 g_assert (lsm_dom_node_list_get_item (childs, 2) == LSM_DOM_NODE (mn2));
235 g_assert (lsm_dom_node_list_get_length (childs) == 3);
236
237 mo2 = lsm_dom_document_create_element (document, "mo");
238 node = lsm_dom_node_replace_child (LSM_DOM_NODE (math), LSM_DOM_NODE (mo2), LSM_DOM_NODE (mo1));
239 g_assert (node == LSM_DOM_NODE (mo1));
240
241 g_assert (lsm_dom_node_list_get_item (childs, 1) == LSM_DOM_NODE (mo2));
242 g_assert (lsm_dom_node_list_get_length (childs) == 3);
243
244 g_object_unref (mo1);
245 g_object_unref (document);
246 }
247
248 int
main(int argc,char * argv[])249 main (int argc, char *argv[])
250 {
251 int result;
252
253 g_test_init (&argc, &argv, NULL);
254
255 g_test_add_func ("/dom/create-document", create_document_test);
256 g_test_add_func ("/dom/owner-document", owner_document_test);
257 g_test_add_func ("/dom/owner-mismatch", owner_mismatch_test);
258 g_test_add_func ("/dom/create-element", create_element_test);
259 g_test_add_func ("/dom/add-remove-element", add_remove_element_test);
260 g_test_add_func ("/dom/node-list", node_list_test);
261 g_test_add_func ("/dom/insert-before", insert_before_test);
262
263 #if !GLIB_CHECK_VERSION(2,36,0)
264 g_type_init ();
265 #endif
266
267 result = g_test_run();
268
269 lsm_shutdown ();
270
271 return result;
272 }
273