[unit] Add a debug print and some more Dict test cases
[browser-dbus-bridge.git] / html / unit.html
1 <!--
2  Copyright © 2008 Movial Creative Technologies Inc
3  Feel free to use the contents of this file in any way you want
4  If you can make money with it, please contact info@movial.com
5  and you have almost-guaranteed sales position waiting for you!
6  -->
7
8 <html>
9 <head>
10 <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
11 <title>test</title>
12 <script type='text/javascript' src='DBus.js'></script>
13 <script type='text/javascript'>
14
15 var n_tests = 0;
16 var good = 0;
17 var bad = 0;
18 var current_test = null;
19
20 function Test(method_name, arg, convert, xfail, signature, next_test)
21 {
22   this.method_name = method_name;
23   this.arg = arg;
24   this.convert = convert;
25   this.signature = signature;
26   this.xfail = xfail;
27   n_tests++;
28   if (!xfail)
29     n_tests++;
30
31   this.next = next_test;
32 }
33
34 Test.prototype =
35 {
36   method_name: null,
37   arg: null,
38   convert: null,
39   xfail: false,
40   signature: null,
41   signal: null,
42   next: null,
43
44   run: function ()
45   {
46     current_test = null;
47     if (!this.method_name)
48     {
49       alert("Test error: No method name specified!");
50       bad++;
51       return;
52     }
53     if (typeof this.arg != 'boolean' && !this.arg)
54     {
55       alert("Test error: No argument specified!");
56       bad++;
57       return;
58     }
59     var method = DBus.getMethod(DBus.SESSION, 'org.movial.Unit',
60                                 '/org/movial/Unit',
61                                 this.method_name, 'org.movial.Unit', this.signature,
62                                 this);
63     this.signal = DBus.getSignal(DBus.SESSION, 'org.movial.Unit', this.method_name,
64                                 null, null, this);
65     this.signal.onemit = this.onemit;
66
67     // We need to receive replies as we go to get a meaningful report
68     // but do test with async replies too!
69     method.async = false;
70
71     var status = document.getElementById('status');
72
73     var send_arg;
74     if (this.convert instanceof Function)
75     {
76       send_arg = this.convert(this.arg);
77       if (!send_arg)
78       {
79         var color = 'red';
80         if (this.xfail)
81         {
82           color = 'green';
83           good++;
84         } else {
85           bad++;
86         }
87         status.innerHTML += '<p>Result: <span style="color: ' + color + ';">Converting "' + this.arg + '" failed</span>';
88         current_test = this.next;
89         setTimeout(run_next, 10);
90         return;
91       }
92     } else {
93       send_arg = this.arg;
94     }
95
96     method.onreply = this.method_reply;
97     method.onerror = this.error_reply;
98
99     var argstr;
100     if (this.arg instanceof Array || this.arg instanceof Object)
101     {
102       var first = true;
103       argstr = '['
104       for (var propname in this.arg)
105       {
106         if (first) {
107           first = false;
108         } else {
109           argstr += ", ";
110         }
111         argstr += propname + ":" + this.arg[propname];
112       }
113       argstr += ']';
114     } else {
115       argstr = this.arg.toString();
116     }
117
118     status.innerHTML += '<p>Sending ' + this.method_name + ':<span style="color: blue; padding-left: 1em;">' + argstr + ' of type ' + typeof send_arg + ' with signature ' + this.signature + '</span>';
119     
120     this.signal.enabled = !this.xfail;
121     method(send_arg);
122   },
123
124   onemit: function (reply_arg)
125   {
126     var status = document.getElementById('status');
127     status.innerHTML += '<p>Got signal "' + this.method_name + '"';
128     this.signal.enabled = false;
129     this.method_reply(reply_arg);
130     
131     current_test = this.next;
132     setTimeout(run_next, 10);
133     show_results();
134   },
135   
136   method_reply: function (reply_arg)
137   {
138     var status = document.getElementById('status');
139
140     if (this.xfail)
141     {
142       status.innerHTML += '<p style="margin-top: -0.5em"><span style="color:red; padding-left: 1em;">This test should have failed, but did not!</span>';
143       bad++;
144       current_test = this.next;
145       setTimeout(run_next, 10);
146       show_results();
147       return;
148     }
149     
150     var color = 'green';
151     if (!is_equal(this.arg, reply_arg))
152       color = 'red';
153
154     var argstr;
155
156     if (reply_arg instanceof Array || reply_arg instanceof Object)
157     {
158       var first = true;
159       argstr = '['
160       for (var propname in reply_arg)
161       {
162         if (first) {
163           first = false;
164         } else {
165           argstr += ", ";
166         }
167         argstr += propname + ":" + reply_arg[propname];
168       }
169       argstr += ']';
170     } else {
171       if (typeof this.arg == 'boolean')
172       {
173         argstr = reply_arg.toString();
174       } else if (reply_arg) {
175         argstr = reply_arg.toString();
176       } else {
177         argstr = '';
178       }
179     }
180
181     if (color == 'red')
182     {
183       bad++;
184     } else {
185       good++;
186     }
187     
188     status.innerHTML += '<p style="margin-top: -0.5em">Result: <span style="color: ' + color + '; padding-left: 1em;">' + argstr + ', ' + typeof reply_arg + '</span>';
189
190     show_results();
191   },
192
193   error_reply: function (error_name, error_message)
194   {
195     var status = document.getElementById('status');
196
197     if (this.xfail)
198     {
199       status.innerHTML += '<p style="color: green;">Expected failure:';
200       good++;
201     } else {
202       status.innerHTML += '<p style="color: red;">' + error_name + ':';
203       bad++;
204     }
205     status.innerHTML += '<span style="color: red; padding-left: 1em;">' + error_message + '</span>';
206
207     current_test = this.next;
208     setTimeout(run_next, 10);
209     show_results();
210   },
211
212 };
213
214 function is_equal(a, b)
215 {
216   if ((a instanceof Array && b instanceof Array)
217     || (a instanceof Object && b instanceof Object))
218   {
219     for (var i in a)
220     {
221       if (!is_equal(a[i], b[i]))
222       {
223         return false;
224       }
225     }
226
227   } else if (a != b) {
228     return false;
229   }
230   
231   return true;
232 }
233
234 function run_next()
235 {
236   if (current_test) {
237     current_test.run();
238     return;
239   }
240
241   var status = document.getElementById('status');
242   status.innerHTML += "<p>Ending test...";
243   var end = DBus.getMethod(DBus.SESSION, 'org.movial.Unit',
244                                 '/org/movial/Unit',
245                                 "end", 'org.movial.Unit');
246   end();
247   show_results();
248 }
249
250 function show_results()
251 {
252   var results = document.getElementById('results');
253   results.innerHTML = '<p>Total of ' + n_tests + ' tests, <span style="color: green">passed ' + good + '</span>, <span style="color:red">failed ' + bad + '</span>, unknown ' + (n_tests - good - bad) + ", " + Math.round((good/n_tests)*100) + '% success rate';
254 }
255
256 var tests = new Array();
257
258 function do_unit()
259 {
260   var status = document.getElementById('status');
261   
262   setTimeout(show_results, 1000);
263   
264   status.innerHTML += "<p>Starting test...";
265   var start = DBus.getMethod(DBus.SESSION, 'org.movial.Unit',
266                                 '/org/movial/Unit',
267                                 "start", 'org.movial.Unit');
268   start();
269
270   var i = 0;
271
272   tests[i++] = new Test('Boolean', true, null, false);
273   tests[i++] = new Test('Boolean', true, null, false, 'b');
274
275   tests[i++] = new Test('Int16', 32767, DBus.Int16, false);
276   tests[i++] = new Test('Int16', 32767, null, true);
277   tests[i++] = new Test('Int16', 32767, DBus.Int16, false, 'n');
278   tests[i++] = new Test('Int16', 32767, null, false, 'n');
279
280   tests[i++] = new Test('Int32', 2147483647, DBus.Int32, false);
281   tests[i++] = new Test('Int32', 2147483647, null, true);
282   tests[i++] = new Test('Int32', 2147483647, DBus.Int32, false, 'i');
283   tests[i++] = new Test('Int32', 2147483647, null, false, 'i');
284
285   // There's problems with the (u)int64 types since doubles can't hold
286   // large enough values accurately.
287   tests[i++] = new Test('Int64', 17179869176, DBus.Int64, false);
288   tests[i++] = new Test('Int64', 17179869176, null, true);
289   tests[i++] = new Test('Int64', 17179869176, DBus.Int64, false, 'x');
290   tests[i++] = new Test('Int64', 17179869176, null, false, 'x');
291
292   tests[i++] = new Test('UInt16', 32767, DBus.UInt16, false);
293   tests[i++] = new Test('UInt16', 32767, null, true);
294   tests[i++] = new Test('UInt16', 32767, DBus.UInt16, false, 'q');
295   tests[i++] = new Test('UInt16', 32767, null, false, 'q');
296
297   tests[i++] = new Test('UInt32', 2147483647, DBus.UInt32, false);
298   tests[i++] = new Test('UInt32', 2147483647, null, true);
299   tests[i++] = new Test('UInt32', 2147483647, DBus.UInt32, false, 'u');
300   tests[i++] = new Test('UInt32', 2147483647, null, false, 'u');
301
302   tests[i++] = new Test('UInt64', 17179869176, DBus.UInt64, false);
303   tests[i++] = new Test('UInt64', 17179869176, null, true);
304   tests[i++] = new Test('UInt64', 17179869176, DBus.UInt64, false, 't');
305   tests[i++] = new Test('UInt64', 17179869176, null, false, 't');
306
307   tests[i++] = new Test('Double', 1024.1024, null, false);
308   tests[i++] = new Test('Double', 1024.1024, null, false, 'd');
309
310   tests[i++] = new Test('Byte', 1, DBus.Byte, false);
311   tests[i++] = new Test('Byte', 1, null, true);
312   tests[i++] = new Test('Byte', 1, DBus.Byte, false, 'y');
313   tests[i++] = new Test('Byte', 1, null, false, 'y');
314
315   tests[i++] = new Test('String', "Test string", null, false);
316   tests[i++] = new Test('String', "Test string", null, false, 's');
317
318   tests[i++] = new Test('ObjectPath', "/org/movial/Unit", DBus.ObjectPath, false);
319   tests[i++] = new Test('ObjectPath', "/org/movial/Unit", null, true);
320   tests[i++] = new Test('ObjectPath', "/org/movial/Unit", DBus.ObjectPath, false, 'o');
321   tests[i++] = new Test('ObjectPath', "I'm invalid object path", DBus.ObjectPath, true);
322   tests[i++] = new Test('ObjectPath', "/not//valid/either", DBus.ObjectPath, true);
323
324   tests[i++] = new Test('Signature', "sib", DBus.Signature, false);
325   tests[i++] = new Test('Signature', "sib", null, true);
326   tests[i++] = new Test('Signature', "sib", DBus.Signature, false, 'g');
327   tests[i++] = new Test('Signature', "sib", null, false, 'g');
328
329   tests[i++] = new Test("Array", ["woot", "bleep", "wap"], null, false, null);
330   tests[i++] = new Test("Array", [1, 2, 3], null, false, null);
331   tests[i++] = new Test("Array", ["woot", "bleep", "wap"], null, false, 'as');
332   tests[i++] = new Test("Array", [1, 2, 3], null, false, 'ai');
333
334   var dict = new Object();
335   dict["test"] = "me";
336   dict["test2"] = "you";
337
338   tests[i++] = new Test("Dict", dict, null, false, 'a{ss}');
339   tests[i++] = new Test("Dict", dict, null, false);
340
341   var dict = new Object();
342   dict["test"] = [100, 2, 3000];
343   tests[i++] = new Test("Dict", dict, null, false, 'a{sad}');
344
345   var dict = new Object();
346   dict["test"] = [100, 2, 3000];
347   tests[i++] = new Test("Dict", dict, null, false, 'a{sai}');
348
349   var dict = new Object();
350   var array = new Array("fää", "woo", "boo");
351   dict["test"] = array;
352   tests[i++] = new Test("Dict", dict, null, false, 'a{sas}');
353
354 /* TODO: We don't really yet know how exactly we want these to go...
355   tests[i++] = new Test("Variant", "woot", DBus.Variant, false);
356   tests[i++] = new Test("Variant", 1, DBus.Variant, false);
357   tests[i++] = new Test("Variant", "woot", DBus.Variant, false, 'v');
358   tests[i++] = new Test("Variant", ["woot", "bar"], DBus.Variant, false, 'v');
359
360   var struct = new Object();
361   struct.what = "that";
362   struct.how_many = 42;
363
364   tests[i++] = new Test("Struct", struct, DBus.Struct, false);
365   tests[i++] = new Test("Struct", struct, DBus.Struct, false, '(si)');
366 */
367
368   for (var j = 0; j < i-1; j++)
369   {
370     tests[j].next = tests[j+1]
371   }
372   current_test = tests[0];
373   run_next();
374
375 }
376
377 </script>
378 </head>
379 <body onload='do_unit();'>
380 <div><a href="unit.html">Run again</a> <a href="http://google.fi">Leave the page</a></div>
381 <div id='results' style='border: solid blue 0.1em; padding: 1em; margin: 1em;'></div>
382 <div id='status' style='border: dashed black 0.1em; padding: 1em;'></div>
383
384 </body>
385 </html>
386