|
1 /* |
|
2 * Any copyright is dedicated to the Public Domain. |
|
3 * http://creativecommons.org/licenses/publicdomain/ |
|
4 * Contributor: |
|
5 * Jeff Walden <jwalden+code@mit.edu> |
|
6 */ |
|
7 |
|
8 var gTestfile = 'mutation-prevention-methods.js'; |
|
9 //----------------------------------------------------------------------------- |
|
10 var BUGNUMBER = 492849; |
|
11 var summary = 'Object.is{Sealed,Frozen}, Object.{seal,freeze}'; |
|
12 |
|
13 print(BUGNUMBER + ": " + summary); |
|
14 |
|
15 /************** |
|
16 * BEGIN TEST * |
|
17 **************/ |
|
18 |
|
19 // Empty object |
|
20 |
|
21 var o1 = {}; |
|
22 |
|
23 assertEq(Object.isExtensible(o1), true); |
|
24 assertEq(Object.isSealed(o1), false); |
|
25 assertEq(Object.isFrozen(o1), false); |
|
26 |
|
27 Object.preventExtensions(o1); |
|
28 |
|
29 // An non-extensible empty object has no properties, so it is vacuously sealed |
|
30 // and frozen. |
|
31 assertEq(Object.isExtensible(o1), false); |
|
32 assertEq(Object.isSealed(o1), true); |
|
33 assertEq(Object.isFrozen(o1), true); |
|
34 |
|
35 |
|
36 // Object with a data property |
|
37 |
|
38 var o2 = { 1: 2 }; |
|
39 |
|
40 assertEq(Object.isExtensible(o2), true); |
|
41 assertEq(Object.isSealed(o2), false); |
|
42 assertEq(Object.isFrozen(o2), false); |
|
43 |
|
44 Object.preventExtensions(o2); |
|
45 |
|
46 assertEq(Object.isExtensible(o2), false); |
|
47 assertEq(Object.isSealed(o2), false); |
|
48 assertEq(Object.isFrozen(o2), false); |
|
49 |
|
50 Object.seal(o2); |
|
51 |
|
52 assertEq(Object.isExtensible(o2), false); |
|
53 assertEq(Object.isSealed(o2), true); |
|
54 assertEq(Object.isFrozen(o2), false); |
|
55 |
|
56 assertEq(o2[1], 2); |
|
57 |
|
58 var desc; |
|
59 |
|
60 desc = Object.getOwnPropertyDescriptor(o2, "1"); |
|
61 assertEq(typeof desc, "object"); |
|
62 assertEq(desc.enumerable, true); |
|
63 assertEq(desc.configurable, false); |
|
64 assertEq(desc.value, 2); |
|
65 assertEq(desc.writable, true); |
|
66 |
|
67 o2[1] = 17; |
|
68 |
|
69 assertEq(o2[1], 17); |
|
70 |
|
71 desc = Object.getOwnPropertyDescriptor(o2, "1"); |
|
72 assertEq(typeof desc, "object"); |
|
73 assertEq(desc.enumerable, true); |
|
74 assertEq(desc.configurable, false); |
|
75 assertEq(desc.value, 17); |
|
76 assertEq(desc.writable, true); |
|
77 |
|
78 Object.freeze(o2); |
|
79 |
|
80 assertEq(o2[1], 17); |
|
81 |
|
82 desc = Object.getOwnPropertyDescriptor(o2, "1"); |
|
83 assertEq(typeof desc, "object"); |
|
84 assertEq(desc.enumerable, true); |
|
85 assertEq(desc.configurable, false); |
|
86 assertEq(desc.value, 17); |
|
87 assertEq(desc.writable, false); |
|
88 |
|
89 |
|
90 // Object with an accessor property |
|
91 |
|
92 var o3 = { get foo() { return 17; } }; |
|
93 |
|
94 assertEq(Object.isExtensible(o3), true); |
|
95 assertEq(Object.isSealed(o3), false); |
|
96 assertEq(Object.isFrozen(o3), false); |
|
97 |
|
98 Object.preventExtensions(o3); |
|
99 |
|
100 assertEq(Object.isExtensible(o3), false); |
|
101 assertEq(Object.isSealed(o3), false); |
|
102 assertEq(Object.isFrozen(o3), false); |
|
103 |
|
104 Object.seal(o3); |
|
105 |
|
106 // An accessor property in a sealed object is unchanged if that object is |
|
107 // frozen, so a sealed object containing only accessor properties is also |
|
108 // vacuously frozen. |
|
109 assertEq(Object.isExtensible(o3), false); |
|
110 assertEq(Object.isSealed(o3), true); |
|
111 assertEq(Object.isFrozen(o3), true); |
|
112 |
|
113 Object.freeze(o3); |
|
114 |
|
115 assertEq(Object.isExtensible(o3), false); |
|
116 assertEq(Object.isSealed(o3), true); |
|
117 assertEq(Object.isFrozen(o3), true); |
|
118 |
|
119 |
|
120 /******************************************************************************/ |
|
121 |
|
122 reportCompare(true, true); |
|
123 |
|
124 print("All tests passed!"); |