|
1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ |
|
2 /* This Source Code Form is subject to the terms of the Mozilla Public |
|
3 * License, v. 2.0. If a copy of the MPL was not distributed with this |
|
4 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ |
|
5 |
|
6 //----------------------------------------------------------------------------- |
|
7 var BUGNUMBER = "346582"; |
|
8 var summary = "Basic support for iterable objects and for-each"; |
|
9 var actual, expect; |
|
10 |
|
11 printBugNumber(BUGNUMBER); |
|
12 printStatus(summary); |
|
13 |
|
14 /************** |
|
15 * BEGIN TEST * |
|
16 **************/ |
|
17 |
|
18 var failed = false; |
|
19 |
|
20 var iterable = { persistedProp: 17 }; |
|
21 |
|
22 function Array_equals(a, b) |
|
23 { |
|
24 if (!(a instanceof Array) || !(b instanceof Array)) |
|
25 throw new Error("Arguments not both of type Array"); |
|
26 if (a.length != b.length) |
|
27 return false; |
|
28 for (var i = 0, sz = a.length; i < sz; i++) |
|
29 if (a[i] !== b[i]) |
|
30 return false; |
|
31 return true; |
|
32 } |
|
33 |
|
34 try |
|
35 { |
|
36 // nothing unusual so far -- verify basic properties |
|
37 for (var i in iterable) |
|
38 { |
|
39 if (i != "persistedProp") |
|
40 throw "no persistedProp!"; |
|
41 if (iterable[i] != 17) |
|
42 throw "iterable[\"persistedProp\"] == 17"; |
|
43 } |
|
44 |
|
45 var keys = ["foo", "bar", "baz"]; |
|
46 var vals = [6, 5, 14]; |
|
47 |
|
48 iterable.__iterator__ = |
|
49 function(keysOnly) |
|
50 { |
|
51 var gen = |
|
52 function() |
|
53 { |
|
54 for (var i = 0; i < keys.length; i++) |
|
55 { |
|
56 if (keysOnly) |
|
57 yield keys[i]; |
|
58 else |
|
59 yield [keys[i], vals[i]]; |
|
60 } |
|
61 }; |
|
62 return gen(); |
|
63 }; |
|
64 |
|
65 // for each sets keysOnly==false |
|
66 var index = 0; |
|
67 for each (var v in iterable) |
|
68 { |
|
69 if (!Array_equals(v, [keys[index], vals[index]])) |
|
70 throw "for-each iteration failed on index=" + index + "!"; |
|
71 index++; |
|
72 } |
|
73 if (index != keys.length) |
|
74 throw "not everything iterated! index=" + index + |
|
75 ", keys.length=" + keys.length; |
|
76 |
|
77 if (iterable.persistedProp != 17) |
|
78 throw "iterable.persistedProp not persisted!"; |
|
79 } |
|
80 catch (e) |
|
81 { |
|
82 failed = e; |
|
83 } |
|
84 |
|
85 |
|
86 |
|
87 expect = false; |
|
88 actual = failed; |
|
89 |
|
90 reportCompare(expect, actual, summary); |