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