|
1 /* |
|
2 * Any copyright is dedicated to the Public Domain. |
|
3 * http://creativecommons.org/licenses/publicdomain/ |
|
4 */ |
|
5 |
|
6 //----------------------------------------------------------------------------- |
|
7 var BUGNUMBER = 430133; |
|
8 var summary = 'ES5 Object.defineProperties(O, Properties)'; |
|
9 |
|
10 print(BUGNUMBER + ": " + summary); |
|
11 |
|
12 /************** |
|
13 * BEGIN TEST * |
|
14 **************/ |
|
15 |
|
16 assertEq("defineProperties" in Object, true); |
|
17 assertEq(Object.defineProperties.length, 2); |
|
18 |
|
19 var o, props, desc, passed; |
|
20 |
|
21 o = {}; |
|
22 props = |
|
23 { |
|
24 a: { value: 17, enumerable: true, configurable: true, writable: true }, |
|
25 b: { value: 42, enumerable: false, configurable: false, writable: false } |
|
26 }; |
|
27 Object.defineProperties(o, props); |
|
28 assertEq("a" in o, true); |
|
29 assertEq("b" in o, true); |
|
30 desc = Object.getOwnPropertyDescriptor(o, "a"); |
|
31 assertEq(desc.value, 17); |
|
32 assertEq(desc.enumerable, true); |
|
33 assertEq(desc.configurable, true); |
|
34 assertEq(desc.writable, true); |
|
35 desc = Object.getOwnPropertyDescriptor(o, "b"); |
|
36 assertEq(desc.value, 42); |
|
37 assertEq(desc.enumerable, false); |
|
38 assertEq(desc.configurable, false); |
|
39 assertEq(desc.writable, false); |
|
40 |
|
41 props = |
|
42 { |
|
43 c: { value: NaN, enumerable: false, configurable: true, writable: true }, |
|
44 b: { value: 44 } |
|
45 }; |
|
46 var error = "before"; |
|
47 try |
|
48 { |
|
49 Object.defineProperties(o, props); |
|
50 error = "no exception thrown"; |
|
51 } |
|
52 catch (e) |
|
53 { |
|
54 if (e instanceof TypeError) |
|
55 error = "typeerror"; |
|
56 else |
|
57 error = "bad exception: " + e; |
|
58 } |
|
59 assertEq(error, "typeerror", "didn't throw or threw wrongly"); |
|
60 assertEq("c" in o, true, "new property added"); |
|
61 assertEq(o.b, 42, "old property value preserved"); |
|
62 |
|
63 function Properties() { } |
|
64 Properties.prototype = { b: { value: 42, enumerable: true } }; |
|
65 props = new Properties(); |
|
66 Object.defineProperty(props, "a", { enumerable: false }); |
|
67 o = {}; |
|
68 Object.defineProperties(o, props); |
|
69 assertEq("a" in o, false); |
|
70 assertEq(Object.getOwnPropertyDescriptor(o, "a"), undefined, |
|
71 "Object.defineProperties(O, Properties) should only use enumerable " + |
|
72 "properties on Properties"); |
|
73 assertEq("b" in o, false); |
|
74 assertEq(Object.getOwnPropertyDescriptor(o, "b"), undefined, |
|
75 "Object.defineProperties(O, Properties) should only use enumerable " + |
|
76 "properties directly on Properties"); |
|
77 |
|
78 Number.prototype.foo = { value: 17, enumerable: true }; |
|
79 Boolean.prototype.bar = { value: 8675309, enumerable: true }; |
|
80 String.prototype.quux = { value: "Are you HAPPY yet?", enumerable: true }; |
|
81 o = {}; |
|
82 Object.defineProperties(o, 5); // ToObject only throws for null/undefined |
|
83 assertEq("foo" in o, false, "foo is not an enumerable own property"); |
|
84 Object.defineProperties(o, false); |
|
85 assertEq("bar" in o, false, "bar is not an enumerable own property"); |
|
86 Object.defineProperties(o, ""); |
|
87 assertEq("quux" in o, false, "quux is not an enumerable own property"); |
|
88 |
|
89 error = "before"; |
|
90 try |
|
91 { |
|
92 Object.defineProperties(o, "1"); |
|
93 } |
|
94 catch (e) |
|
95 { |
|
96 if (e instanceof TypeError) |
|
97 error = "typeerror"; |
|
98 else |
|
99 error = "bad exception: " + e; |
|
100 } |
|
101 assertEq(error, "typeerror", |
|
102 "should throw on Properties == '1' due to '1'[0] not being a " + |
|
103 "property descriptor"); |
|
104 |
|
105 error = "before"; |
|
106 try |
|
107 { |
|
108 Object.defineProperties(o, null); |
|
109 } |
|
110 catch (e) |
|
111 { |
|
112 if (e instanceof TypeError) |
|
113 error = "typeerror"; |
|
114 else |
|
115 error = "bad exception: " + e; |
|
116 } |
|
117 assertEq(error, "typeerror", "should throw on Properties == null"); |
|
118 |
|
119 error = "before"; |
|
120 try |
|
121 { |
|
122 Object.defineProperties(o, undefined); |
|
123 } |
|
124 catch (e) |
|
125 { |
|
126 if (e instanceof TypeError) |
|
127 error = "typeerror"; |
|
128 else |
|
129 error = "bad exception: " + e; |
|
130 } |
|
131 assertEq(error, "typeerror", "should throw on Properties == undefined"); |
|
132 |
|
133 /******************************************************************************/ |
|
134 |
|
135 reportCompare(true, true); |
|
136 |
|
137 print("All tests passed!"); |