1// Copyright 2010 the V8 project authors. All rights reserved.
2// Redistribution and use in source and binary forms, with or without
3// modification, are permitted provided that the following conditions are
4// met:
5//
6//     * Redistributions of source code must retain the above copyright
7//       notice, this list of conditions and the following disclaimer.
8//     * Redistributions in binary form must reproduce the above
9//       copyright notice, this list of conditions and the following
10//       disclaimer in the documentation and/or other materials provided
11//       with the distribution.
12//     * Neither the name of Google Inc. nor the names of its
13//       contributors may be used to endorse or promote products derived
14//       from this software without specific prior written permission.
15//
16// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27
28// This file only tests very simple descriptors that always have
29// configurable, enumerable, and writable set to true.
30// A range of more elaborate tests are performed in
31// object-define-property.js
32
33function get() { return x; }
34function set(x) { this.x = x; }
35
36var obj = {x: 1};
37obj.__defineGetter__("accessor", get);
38obj.__defineSetter__("accessor", set);
39var a = new Array();
40a[1] = 42;
41obj[1] = 42;
42
43var descIsData = Object.getOwnPropertyDescriptor(obj, 'x');
44assertTrue(descIsData.enumerable);
45assertTrue(descIsData.writable);
46assertTrue(descIsData.configurable);
47
48var descIsAccessor = Object.getOwnPropertyDescriptor(obj, 'accessor');
49assertTrue(descIsAccessor.enumerable);
50assertTrue(descIsAccessor.configurable);
51assertTrue(descIsAccessor.get == get);
52assertTrue(descIsAccessor.set == set);
53
54var descIsNotData = Object.getOwnPropertyDescriptor(obj, 'not-x');
55assertTrue(descIsNotData == undefined);
56
57var descIsNotAccessor = Object.getOwnPropertyDescriptor(obj, 'not-accessor');
58assertTrue(descIsNotAccessor == undefined);
59
60var descArray = Object.getOwnPropertyDescriptor(a, '1');
61assertTrue(descArray.enumerable);
62assertTrue(descArray.configurable);
63assertTrue(descArray.writable);
64assertEquals(descArray.value, 42);
65
66var descObjectElement = Object.getOwnPropertyDescriptor(obj, '1');
67assertTrue(descObjectElement.enumerable);
68assertTrue(descObjectElement.configurable);
69assertTrue(descObjectElement.writable);
70assertEquals(descObjectElement.value, 42);
71
72// String objects.
73var a = new String('foobar');
74for (var i = 0; i < a.length; i++) {
75  var descStringObject = Object.getOwnPropertyDescriptor(a, i);
76  assertTrue(descStringObject.enumerable);
77  assertFalse(descStringObject.configurable);
78  assertFalse(descStringObject.writable);
79  assertEquals(descStringObject.value, a.substring(i, i+1));
80}
81
82// Support for additional attributes on string objects.
83a.x = 42;
84a[10] = 'foo';
85var descStringProperty = Object.getOwnPropertyDescriptor(a, 'x');
86assertTrue(descStringProperty.enumerable);
87assertTrue(descStringProperty.configurable);
88assertTrue(descStringProperty.writable);
89assertEquals(descStringProperty.value, 42);
90
91var descStringElement = Object.getOwnPropertyDescriptor(a, '10');
92assertTrue(descStringElement.enumerable);
93assertTrue(descStringElement.configurable);
94assertTrue(descStringElement.writable);
95assertEquals(descStringElement.value, 'foo');
96
97// Test that elements in the prototype chain is not returned.
98var proto = {};
99proto[10] = 42;
100
101var objWithProto = new Array();
102objWithProto.prototype = proto;
103objWithProto[0] = 'bar';
104var descWithProto = Object.getOwnPropertyDescriptor(objWithProto, '10');
105assertEquals(undefined, descWithProto);
106
107// Test elements on global proxy object.
108var global = (function() { return this; })();
109
110global[42] = 42;
111
112function el_getter() { return 239; };
113function el_setter() {};
114Object.defineProperty(global, '239', {get: el_getter, set: el_setter});
115
116var descRegularElement = Object.getOwnPropertyDescriptor(global, '42');
117assertEquals(42, descRegularElement.value);
118
119var descAccessorElement = Object.getOwnPropertyDescriptor(global, '239');
120assertEquals(el_getter, descAccessorElement.get);
121assertEquals(el_setter, descAccessorElement.set);
122