1 /* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 2; tab-width: 2 -*- */
2 /* test-mevents.c
3  *
4  * Copyright (C) 2001 Paolo Casarini <paolo@casarini.org>
5  *
6  * This library is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation; either
9  * version 2.1 of the License, or (at your option) any later version.
10  *
11  * This library is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with this library; if not, write to the Free Software
18  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
19  */
20 
21 #include <glib.h>
22 #include <stdio.h>
23 #include <string.h>
24 #include <gdome.h>
25 #include <gdome-events.h>
26 
27 char prop[128];
28 
29 void
signprop(const char * str)30 signprop (const char *str)
31 {
32   strcat (prop, str);
33 }
34 
35 void
resetprop()36 resetprop ()
37 {
38   prop[0] = '\0';
39 }
40 
41 
callback(GdomeEventListener * self,GdomeEvent * event,GdomeException * exc)42 void callback (GdomeEventListener *self,
43                GdomeEvent *event,
44                GdomeException *exc)
45 {
46 	GdomeNode *ct = gdome_mevnt_currentTarget ((GdomeMutationEvent *)event, exc);
47   GdomeDOMString *attrName, *id;
48 
49   if (ct != NULL && gdome_n_nodeType (ct, exc) == GDOME_ELEMENT_NODE) {
50     attrName = gdome_str_mkref ("ITEM");
51     id = gdome_el_getAttribute ((GdomeElement *)ct, attrName, exc);
52     gdome_str_unref (attrName);
53     signprop (id->str);
54     gdome_str_unref (id);
55   }
56   else
57     signprop (" ");
58   gdome_n_unref (ct, exc);
59 }
60 
61 void
dot()62 dot() {
63 	printf(".");
64 	fflush(stdout);
65 }
66 
67 gboolean
test_mevents(GdomeDocument * doc)68 test_mevents (GdomeDocument *doc)
69 {
70   GdomeException exc;
71   GdomeElement *els[6], *el1, *el2;
72   GdomeEventListener *evl;
73 	GdomeDOMString *id, *evntType, *str, *attrValue;
74   GdomeNode *result;
75   GdomeAttr *attr;
76   GdomeText *txt;
77 	gchar buff[2];
78   gboolean ret = TRUE;
79   int i;
80   buff[1] = '\0';
81 
82   evl = gdome_evntl_mkref (callback, NULL);
83 
84   /* Get els refs */
85   for (i=0; i<6 && ret; i++) {
86     buff[0]='0'+i;
87     id = gdome_str_mkref_dup (buff);
88     els[i] = gdome_doc_getElementById (doc, id, &exc);
89 		if (els[i] == NULL)
90 			fprintf (stderr, "\nDocument.getElementById(\"%s\"), NULL", buff), ret = FALSE;
91     gdome_str_unref (id);
92 	}
93   dot();
94 
95   /* Setting capture listeners */
96   evntType = gdome_str_mkref("DOMNodeInserted");
97   for (i=0; i<6; i++)
98     gdome_el_addEventListener (els[i], evntType, evl, TRUE, &exc);
99   gdome_str_unref (evntType);
100   evntType = gdome_str_mkref("DOMNodeInsertedIntoDocument");
101   for (i=0; i<6; i++)
102     gdome_el_addEventListener (els[i], evntType, evl, TRUE, &exc);
103   gdome_str_unref (evntType);
104   evntType = gdome_str_mkref("DOMNodeRemoved");
105   for (i=0; i<6; i++)
106     gdome_el_addEventListener (els[i], evntType, evl, TRUE, &exc);
107   gdome_str_unref (evntType);
108   evntType = gdome_str_mkref("DOMNodeRemovedFromDocument");
109   for (i=0; i<6; i++)
110     gdome_el_addEventListener (els[i], evntType, evl, TRUE, &exc);
111   gdome_str_unref (evntType);
112   evntType = gdome_str_mkref("DOMSubtreeModified");
113   for (i=0; i<6; i++)
114     gdome_el_addEventListener (els[i], evntType, evl, TRUE, &exc);
115   gdome_str_unref (evntType);
116   evntType = gdome_str_mkref("DOMAttrModified");
117   for (i=0; i<6; i++)
118     gdome_el_addEventListener (els[i], evntType, evl, TRUE, &exc);
119   gdome_str_unref (evntType);
120   evntType = gdome_str_mkref("DOMCharacterDataModified");
121   for (i=0; i<6; i++)
122     gdome_el_addEventListener (els[i], evntType, evl, TRUE, &exc);
123 	gdome_str_unref (evntType);
124   dot();
125 
126   /* DOMCharacterDataModified Test 1 */
127   txt = (GdomeText *)gdome_el_firstChild (els[3], &exc);
128   str = gdome_str_mkref ("Changed Test String");
129 	gdome_t_set_data (txt, str, &exc);
130 	gdome_str_unref (str);
131   gdome_t_unref (txt, &exc);
132 	if (strcmp (prop, "0123012"))
133     fprintf (stderr, "\n DOMCharacterDataModified Test 1 , failed"), ret = FALSE;
134 	resetprop();
135 	dot();
136 
137 	/* DOMNodeInserted Test 1 */
138   str = gdome_str_mkref ("WOW");
139 	txt = gdome_doc_createTextNode (doc, str, &exc);
140 	result = gdome_el_appendChild (els[2], (GdomeNode *)txt, &exc);
141   gdome_n_unref (result, &exc);
142   gdome_t_unref (txt, &exc);
143 	gdome_str_unref (str);
144 	if (strcmp (prop, "01201201"))
145 		fprintf (stderr, "\n DOMNodeInserted Test 1 , failed"), ret = FALSE;
146 	resetprop();
147 	dot();
148 
149 	/* DOMNodeInserted Test 2 */
150   str = gdome_str_mkref ("WOW");
151 	txt = gdome_doc_createTextNode (doc, str, &exc);
152 	gdome_str_unref (str);
153   str = gdome_str_mkref ("NEWEL");
154   el1 = gdome_doc_createElement (doc, str, &exc);
155 	gdome_str_unref (str);
156 	result = gdome_el_appendChild (el1, (GdomeNode *)txt, &exc);
157   gdome_n_unref (result, &exc);
158   gdome_t_unref (txt, &exc);
159 	result = gdome_el_appendChild (els[1], (GdomeNode *)el1, &exc);
160   gdome_n_unref (result, &exc);
161   gdome_el_unref (el1, &exc);
162 	if (strcmp (prop, "0101010"))
163 		fprintf (stderr, "\n DOMNodeInserted Test 2 , failed"), ret = FALSE;
164 	resetprop();
165 	dot();
166 
167 	/* DOMNodeInserted Test 3 */
168   str = gdome_str_mkref ("WOW");
169 	txt = gdome_doc_createTextNode (doc, str, &exc);
170 	gdome_str_unref (str);
171   str = gdome_str_mkref ("NEWEL");
172   el1 = gdome_doc_createElement (doc, str, &exc);
173   el2 = gdome_doc_createElement (doc, str, &exc);
174 	gdome_str_unref (str);
175 	result = gdome_el_appendChild (el2, (GdomeNode *)txt, &exc);
176   gdome_n_unref (result, &exc);
177   gdome_t_unref (txt, &exc);
178 	str = gdome_str_mkref ("ITEM");
179 	attrValue = gdome_str_mkref ("a");
180 	gdome_el_setAttribute (el1, str, attrValue, &exc);
181   gdome_str_unref (attrValue);
182 	attrValue = gdome_str_mkref ("b");
183 	gdome_el_setAttribute (el2, str, attrValue, &exc);
184 	gdome_str_unref (attrValue);
185 	gdome_str_unref (str);
186 	result = gdome_el_appendChild (el1, (GdomeNode *)el2, &exc);
187   gdome_n_unref (result, &exc);
188   evntType = gdome_str_mkref("DOMNodeInserted");
189 	gdome_el_addEventListener (el1, evntType, evl, TRUE, &exc);
190 	gdome_el_addEventListener (el2, evntType, evl, TRUE, &exc);
191   gdome_str_unref (evntType);
192   evntType = gdome_str_mkref("DOMNodeInsertedIntoDocument");
193 	gdome_el_addEventListener (el1, evntType, evl, TRUE, &exc);
194 	gdome_el_addEventListener (el2, evntType, evl, TRUE, &exc);
195 	gdome_str_unref (evntType);
196 	result = gdome_el_appendChild (els[3], (GdomeNode *)el1, &exc);
197 	gdome_n_unref (result, &exc);
198   evntType = gdome_str_mkref("DOMNodeInserted");
199 	gdome_el_removeEventListener (el1, evntType, evl, TRUE, &exc);
200 	gdome_el_removeEventListener (el2, evntType, evl, TRUE, &exc);
201   gdome_str_unref (evntType);
202   evntType = gdome_str_mkref("DOMNodeInsertedIntoDocument");
203 	gdome_el_removeEventListener (el1, evntType, evl, TRUE, &exc);
204 	gdome_el_removeEventListener (el2, evntType, evl, TRUE, &exc);
205 	gdome_str_unref (evntType);
206   gdome_el_unref (el2, &exc);
207 	gdome_el_unref (el1, &exc);
208 	if (strcmp (prop, "012301230123a0123ab012"))
209 		fprintf (stderr, "\n DOMNodeInserted Test 3 , failed"), ret = FALSE;
210 	resetprop();
211 	dot();
212 
213 	/* DOMNodeRemoved Test 1 */
214 	txt = (GdomeText *)gdome_el_lastChild (els[2], &exc);
215 	result = gdome_el_removeChild (els[2], (GdomeNode *)txt, &exc);
216   gdome_n_unref (result, &exc);
217   gdome_t_unref (txt, &exc);
218 	if (strcmp (prop, "01201201"))
219 		fprintf (stderr, "\n DOMNodeRemoved Test 1 , failed"), ret = FALSE;
220 	resetprop();
221 	dot();
222 
223 	/* DOMNodeRemoved Test 2 */
224   el1 = (GdomeElement *)gdome_el_lastChild (els[1], &exc);
225 	txt = (GdomeText *)gdome_el_lastChild (el1, &exc);
226 	result = gdome_el_removeChild (els[1], (GdomeNode *)el1, &exc);
227   gdome_n_unref (result, &exc);
228   gdome_t_unref (txt, &exc);
229   gdome_el_unref (el1, &exc);
230 	if (strcmp (prop, "0101010"))
231 		fprintf (stderr, "\n DOMNodeRemoved Test 2 , failed"), ret = FALSE;
232 	resetprop();
233 	dot();
234 
235 	/* DOMNodeRemoved Test 3 */
236 	el1 = (GdomeElement *)gdome_el_lastChild (els[3], &exc);
237   el2 = (GdomeElement *)gdome_el_lastChild (el1, &exc);
238   evntType = gdome_str_mkref("DOMNodeRemoved");
239 	gdome_el_addEventListener (el1, evntType, evl, TRUE, &exc);
240 	gdome_el_addEventListener (el2, evntType, evl, TRUE, &exc);
241   gdome_str_unref (evntType);
242   evntType = gdome_str_mkref("DOMNodeRemovedFromDocument");
243 	gdome_el_addEventListener (el1, evntType, evl, TRUE, &exc);
244 	gdome_el_addEventListener (el2, evntType, evl, TRUE, &exc);
245 	gdome_str_unref (evntType);
246 	result = gdome_el_removeChild (els[3], (GdomeNode *)el1, &exc);
247 	gdome_n_unref (result, &exc);
248 	evntType = gdome_str_mkref("DOMNodeRemoved");
249 	gdome_el_removeEventListener (el1, evntType, evl, TRUE, &exc);
250 	gdome_el_removeEventListener (el2, evntType, evl, TRUE, &exc);
251   gdome_str_unref (evntType);
252   evntType = gdome_str_mkref("DOMNodeRemovedFromDocument");
253 	gdome_el_removeEventListener (el1, evntType, evl, TRUE, &exc);
254 	gdome_el_removeEventListener (el2, evntType, evl, TRUE, &exc);
255 	gdome_str_unref (evntType);
256   gdome_el_unref (el2, &exc);
257 	gdome_el_unref (el1, &exc);
258 	if (strcmp (prop, "012301230123a0123ab012"))
259 		fprintf (stderr, "\n DOMNodeRemoved Test 3 , failed"), ret = FALSE;
260 	resetprop();
261   dot();
262 
263   /* DOMAttrModified ADDITION */
264   str = gdome_str_mkref ("ATTR");
265   attrValue = gdome_str_mkref ("attrValue");
266   attr = gdome_doc_createAttribute (doc, str, &exc);
267   gdome_a_set_value (attr, attrValue, &exc);
268   gdome_str_unref (attrValue);
269   gdome_str_unref (str);
270   gdome_el_setAttributeNode (els[3], attr, &exc);
271   if (strcmp (prop, "012012"))
272     fprintf (stderr, "\n DOMAttrModified ADDITION , failed"), ret = FALSE;
273   resetprop();
274   dot();
275 
276   /* DOMAttrModified MODIFICATION */
277   attrValue = gdome_str_mkref ("attrNewValue");
278   gdome_a_set_value (attr, attrValue, &exc);
279   gdome_str_unref (attrValue);
280   gdome_a_unref (attr, &exc);
281   if (strcmp (prop, "012012"))
282     fprintf (stderr, "\n DOMAttrModified MODIFICATION , failed"), ret = FALSE;
283   resetprop();
284   dot();
285 
286   /* DOMAttrModified REMOVAL */
287   str = gdome_str_mkref ("attr");
288   gdome_el_removeAttribute (els[3], str, &exc);
289   gdome_str_unref (str);
290   str = gdome_str_mkref ("ATTR");
291   gdome_el_removeAttribute (els[3], str, &exc);
292   gdome_str_unref (str);
293   if (strcmp (prop, "012012"))
294     fprintf (stderr, "\n DOMAttrModified REMOVAL , failed"), ret = FALSE;
295   resetprop();
296   dot();
297 
298   /* Remove capture listeners */
299   evntType = gdome_str_mkref("DOMNodeInserted");
300   for (i=0; i<6; i++)
301     gdome_el_removeEventListener (els[i], evntType, evl, TRUE, &exc);
302   gdome_str_unref (evntType);
303   evntType = gdome_str_mkref("DOMNodeInsertedIntoDocument");
304   for (i=0; i<6; i++)
305     gdome_el_removeEventListener (els[i], evntType, evl, TRUE, &exc);
306   gdome_str_unref (evntType);
307   evntType = gdome_str_mkref("DOMNodeRemoved");
308   for (i=0; i<6; i++)
309     gdome_el_removeEventListener (els[i], evntType, evl, TRUE, &exc);
310   gdome_str_unref (evntType);
311   evntType = gdome_str_mkref("DOMNodeRemovedFromDocument");
312   for (i=0; i<6; i++)
313     gdome_el_removeEventListener (els[i], evntType, evl, TRUE, &exc);
314   gdome_str_unref (evntType);
315   evntType = gdome_str_mkref("DOMSubtreeModified");
316   for (i=0; i<6; i++)
317     gdome_el_removeEventListener (els[i], evntType, evl, TRUE, &exc);
318   gdome_str_unref (evntType);
319   evntType = gdome_str_mkref("DOMAttrModified");
320   for (i=0; i<6; i++)
321     gdome_el_removeEventListener (els[i], evntType, evl, TRUE, &exc);
322   gdome_str_unref (evntType);
323   evntType = gdome_str_mkref("DOMCharacterDataModified");
324   for (i=0; i<6; i++)
325     gdome_el_removeEventListener (els[i], evntType, evl, TRUE, &exc);
326 	gdome_str_unref (evntType);
327   dot();
328 
329   for (i=0; i<6; i++)
330     gdome_el_unref (els[i], &exc);
331 
332   gdome_evntl_unref (evl, &exc);
333 
334   printf ("test_mevents\n");
335 	return ret;
336 }
337 
338 int
main(int argc,char ** argv)339 main (int argc, char **argv)
340 {
341 	GdomeDOMImplementation *domImpl = NULL;
342 	GdomeDocument *domdoc = NULL;
343 	GdomeException exc = 0;
344 	gboolean ret = FALSE;
345 
346 	domImpl = gdome_di_mkref();
347 	domdoc = gdome_di_createDocFromURI (domImpl, LOCALDIR"/test-mevents.xml", GDOME_LOAD_PARSING, &exc);
348   if (domdoc == NULL) {
349       fprintf (stderr, "DOImplementation.createDocFromURI: failed\n   test-mevents.xml not found\n");
350       return -1;
351   }
352 
353   ret = test_mevents(domdoc);
354   gdome_doc_unref(domdoc, &exc);
355 
356 	if(ret)
357 		return 0;
358 	else
359 		return -1;
360 }
361