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