[html] Reload the page instead of navigating
[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 = get_argstr(this.arg);
100
101     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>';
102
103     this.signal.enabled = !this.xfail;
104     method(send_arg);
105   },
106
107   onemit: function (reply_arg)
108   {
109     var status = document.getElementById('status');
110     status.innerHTML += '<p>Got signal "' + this.method_name + '"';
111     this.signal.enabled = false;
112     this.method_reply(reply_arg);
113     
114     current_test = this.next;
115     setTimeout(run_next, 10);
116     show_results();
117   },
118   
119   method_reply: function (reply_arg)
120   {
121     var status = document.getElementById('status');
122
123     if (this.xfail)
124     {
125       status.innerHTML += '<p style="margin-top: -0.5em"><span style="color:red; padding-left: 1em;">This test should have failed, but did not!</span>';
126       bad++;
127       current_test = this.next;
128       setTimeout(run_next, 10);
129       show_results();
130       return;
131     }
132     
133     var color = 'green';
134     if (!is_equal(this.arg, reply_arg))
135       color = 'red';
136
137     var argstr = get_argstr(reply_arg);
138
139     if (color == 'red')
140     {
141       bad++;
142     } else {
143       good++;
144     }
145     
146     status.innerHTML += '<p style="margin-top: -0.5em">Result: <span style="color: ' + color + '; padding-left: 1em;">' + argstr + ', ' + typeof reply_arg + '</span>';
147
148     show_results();
149   },
150
151   error_reply: function (error_name, error_message)
152   {
153     var status = document.getElementById('status');
154
155     this.signal.enabled = false;
156
157     if (this.xfail)
158     {
159       status.innerHTML += '<p style="color: green;">Expected failure:';
160       good++;
161     } else {
162       status.innerHTML += '<p style="color: red;">' + error_name + ':';
163       bad++;
164     }
165     status.innerHTML += '<span style="color: red; padding-left: 1em;">' + error_message + '</span>';
166
167     current_test = this.next;
168     setTimeout(run_next, 10);
169     show_results();
170   },
171
172 };
173
174 function get_argstr(arg)
175 {
176   var argstr;
177
178   if (arg instanceof Array || arg instanceof Object)
179   {
180       var first = true;
181       argstr = '['
182       for (var propname in arg)
183       {
184         if (first) {
185             first = false;
186         } else {
187             argstr += ", ";
188         }
189         argstr += propname + ":" + get_argstr(arg[propname]);
190       }
191       argstr += ']';
192   } else {
193       if (typeof arg == 'boolean')
194       {
195         argstr = arg.toString();
196       } else if (arg) {
197         argstr = arg.toString();
198       } else {
199         argstr = '';
200       }
201   }
202
203   return argstr;
204 }
205
206 function is_equal(a, b)
207 {
208   if ((a instanceof Array && b instanceof Array)
209     || (a instanceof Object && b instanceof Object))
210   {
211     for (var i in a)
212     {
213       if (!is_equal(a[i], b[i]))
214       {
215         return false;
216       }
217     }
218
219   } else if (a != b) {
220     return false;
221   }
222   
223   return true;
224 }
225
226 function run_next()
227 {
228   if (current_test) {
229     current_test.run();
230     return;
231   }
232
233   var status = document.getElementById('status');
234   status.innerHTML += "<p>Ending test...";
235   var end = dbus.getMethod(dbus.SESSION, 'org.movial.Unit',
236                                 '/org/movial/Unit',
237                                 "end", 'org.movial.Unit');
238   end();
239   show_results();
240 }
241
242 function show_results()
243 {
244   var results = document.getElementById('results');
245   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';
246 }
247
248 var tests = new Array();
249
250 function do_unit()
251 {
252   var status = document.getElementById('status');
253   
254   if (!window.dbus)
255   {
256     status.innerHTML += "<p>Browser D-Bus Bridge not available, cannot run tests.";
257     return;
258   }
259
260   setTimeout(show_results, 1000);
261   
262   status.innerHTML += "<p>Starting test...";
263   var start = dbus.getMethod(dbus.SESSION, 'org.movial.Unit',
264                                 '/org/movial/Unit',
265                                 "start", 'org.movial.Unit');
266   start();
267
268   var i = 0;
269
270   tests[i++] = new Test('Boolean', true, null, false);
271   tests[i++] = new Test('Boolean', true, null, false, 'b');
272
273   tests[i++] = new Test('Int16', 32767, dbus.Int16, false);
274   tests[i++] = new Test('Int16', 32767, null, true);
275   tests[i++] = new Test('Int16', 32767, dbus.Int16, false, 'n');
276   tests[i++] = new Test('Int16', 32767, null, false, 'n');
277
278   tests[i++] = new Test('Int32', 2147483647, dbus.Int32, false);
279   tests[i++] = new Test('Int32', 2147483647, null, true);
280   tests[i++] = new Test('Int32', 2147483647, dbus.Int32, false, 'i');
281   tests[i++] = new Test('Int32', 2147483647, null, false, 'i');
282
283   // There's problems with the (u)int64 types since doubles can't hold
284   // large enough values accurately.
285   tests[i++] = new Test('Int64', 17179869176, dbus.Int64, false);
286   tests[i++] = new Test('Int64', 17179869176, null, true);
287   tests[i++] = new Test('Int64', 17179869176, dbus.Int64, false, 'x');
288   tests[i++] = new Test('Int64', 17179869176, null, false, 'x');
289
290   tests[i++] = new Test('UInt16', 32767, dbus.UInt16, false);
291   tests[i++] = new Test('UInt16', 32767, null, true);
292   tests[i++] = new Test('UInt16', 32767, dbus.UInt16, false, 'q');
293   tests[i++] = new Test('UInt16', 32767, null, false, 'q');
294
295   tests[i++] = new Test('UInt32', 2147483647, dbus.UInt32, false);
296   tests[i++] = new Test('UInt32', 2147483647, null, true);
297   tests[i++] = new Test('UInt32', 2147483647, dbus.UInt32, false, 'u');
298   tests[i++] = new Test('UInt32', 2147483647, null, false, 'u');
299
300   tests[i++] = new Test('UInt64', 17179869176, dbus.UInt64, false);
301   tests[i++] = new Test('UInt64', 17179869176, null, true);
302   tests[i++] = new Test('UInt64', 17179869176, dbus.UInt64, false, 't');
303   tests[i++] = new Test('UInt64', 17179869176, null, false, 't');
304
305   tests[i++] = new Test('Double', 1024.1024, null, false);
306   tests[i++] = new Test('Double', 1024.1024, null, false, 'd');
307
308   tests[i++] = new Test('Byte', 1, dbus.Byte, false);
309   tests[i++] = new Test('Byte', 1, null, true);
310   tests[i++] = new Test('Byte', 1, dbus.Byte, false, 'y');
311   tests[i++] = new Test('Byte', 1, null, false, 'y');
312
313   tests[i++] = new Test('String', "abc åäö", null, false);
314   tests[i++] = new Test('String', "abc åäö", null, false, 's');
315
316   tests[i++] = new Test('ObjectPath', "/org/movial/Unit", dbus.ObjectPath, false);
317   tests[i++] = new Test('ObjectPath', "/org/movial/Unit", null, true);
318   tests[i++] = new Test('ObjectPath', "/org/movial/Unit", dbus.ObjectPath, false, 'o');
319   tests[i++] = new Test('ObjectPath', "I'm invalid object path", dbus.ObjectPath, true);
320   tests[i++] = new Test('ObjectPath', "/not//valid/either", dbus.ObjectPath, true);
321
322   tests[i++] = new Test('Signature', "sib", dbus.Signature, false);
323   tests[i++] = new Test('Signature', "sib", null, true);
324   tests[i++] = new Test('Signature', "sib", dbus.Signature, false, 'g');
325   tests[i++] = new Test('Signature', "sib", null, false, 'g');
326
327   tests[i++] = new Test("Array", ["a", "b", "äöÄÖ"], null, false, null);
328   tests[i++] = new Test("Array", [1, 2, 3], null, false, null);
329   tests[i++] = new Test("Array", ["a", "b", "äöÄÖ"], null, false, 'as');
330   tests[i++] = new Test("Array", [1, 2, 3], null, false, 'ai');
331
332   var dict = new Object();
333   dict["abc åäö"] = "abc åäö";
334   tests[i++] = new Test("Dict", dict, null, false, 'a{ss}');
335
336   var dict = new Object();
337   dict["test"] = [100.0, 2.0, 3000.0];
338   tests[i++] = new Test("Dict", dict, null, false, 'a{sad}');
339
340   var dict = new Object();
341   dict["test"] = [100, 2, 3000];
342   tests[i++] = new Test("Dict", dict, null, false, 'a{sai}');
343
344   var dict = new Object();
345   var array = new Array("abc", "def", "åäö");
346   dict["abc åäö"] = array;
347   tests[i++] = new Test("Dict", dict, null, false, 'a{sas}');
348
349   var dict = new Object();
350   var dict2 = new Object();
351   dict2["abc"] = "åäö";
352   dict["åäö"] = dict2;
353   tests[i++] = new Test("Dict", dict, null, false, 'a{sa{ss}}');
354
355   var dict = new Object();
356   var dict2 = new Object();
357   dict2["åäö"] = ["abc", "def", "åäö"];
358   dict["abc"] = dict2;
359   tests[i++] = new Test("Dict", dict, null, false, 'a{sa{sas}}');
360
361   // Test for very deep container structure
362   var deep = new Object();
363   var deep_sig = "a{s";
364   function add_dict(o, d, depth)
365   {
366     o[0] = new Object();
367     deep_sig += "a{s";
368     if (d == depth)
369     {
370       o[0]["abc"] = "åäö";
371       deep_sig += "s}";
372       return;
373     }
374     add_array(o[0], d + 1, depth);
375     deep_sig += "}";
376   }
377   function add_array(o, d, depth)
378   {
379     o["abc"] = new Array();
380     deep_sig += "a";
381     if (d == depth)
382     {
383       o["abc"][0] = "åäö";
384       deep_sig += "s";
385       return;
386     }
387     add_dict(o["abc"], d + 1, depth);
388   }
389
390   add_array(deep, 0, 20);
391   deep_sig += "}";
392   tests[i++] = new Test("Dict", deep, null, false, deep_sig);
393
394   tests[i++] = new Test("Variant", "woot", null, false, 'v');
395   tests[i++] = new Test("Variant", ["woot", "bar"], null, false, 'v');
396
397   var dict = new Object();
398   dict["abc åäö"] = "abc åäö";
399   var dict2 = new Object();
400   dict2["def"] = "bleb";
401   tests[i++] = new Test("Variant", [dict, dict2], null, false, 'v');
402
403   var struct = new Array("abc åäö", 1004);
404   var struct2 = new Array("def", [42, 1004, 105]);
405   var dict = new Object();
406   dict["abc åäö"] = struct2;
407
408   tests[i++] = new Test("Struct", struct, null, false, '(si)');
409   tests[i++] = new Test("Array", [struct, struct2], null, false, 'a(sv)');
410   tests[i++] = new Test("Dict", dict, null, false, 'a{s(sv)}');
411
412   for (var j = 0; j < i-1; j++)
413   {
414     tests[j].next = tests[j+1]
415   }
416   current_test = tests[0];
417   run_next();
418
419 }
420
421 </script>
422 </head>
423 <body onload='do_unit();'>
424 <div><a href="javascript:window.location.reload();">Run again</a> <a href="http://google.fi">Leave the page</a></div>
425 <div id='results' style='border: solid blue 0.1em; padding: 1em; margin: 1em;'></div>
426 <div id='status' style='border: dashed black 0.1em; padding: 1em;'></div>
427
428 </body>
429 </html>
430