JDK-8015355.js revision 343:b0dcc3727fc3
1/*
2 * Copyright (c) 2010, 2013, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.
8 *
9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 */
23
24/**
25 * JDK-8015355: Array.prototype functions don't honour non-writable length and / or index properties
26 *
27 * @test
28 * @run
29 */
30
31function fail(msg) {
32    print(msg);
33}
34
35function check(callback) {
36    try {
37        callback();
38        fail("TypeError expected for " + callback);
39    } catch (e) {
40        if (! (e instanceof TypeError)) {
41            fail("TypeError expected, got " + e);
42        }
43    }
44}
45
46var array = Object.defineProperty([],"length", { writable: false });
47
48check(function() {
49    array.push(0)
50});
51
52check(function() {
53    array.pop()
54});
55
56check(function() {
57    Object.defineProperty([,,],"0",{ writable: false }).reverse();
58});
59
60check(function() {
61    array.shift()
62});
63
64check(function() {
65    array.splice(0)
66});
67
68check(function() {
69    array.unshift()
70});
71
72// try the above via call
73
74check(function() {
75    Array.prototype.push.call(array, 0);
76});
77
78check(function() {
79    Array.prototype.pop.call(array);
80});
81
82check(function() {
83    Array.prototype.shift.call(array);
84});
85
86check(function() {
87    Array.prototype.unshift.call(array);
88});
89
90check(function() {
91    Array.prototype.splice.call(array, 0);
92});
93
94check(function() {
95    Array.prototype.reverse.call(Object.defineProperty([,,],"0",{ writable: false }));
96});
97
98// try the above via apply
99
100check(function() {
101    Array.prototype.push.apply(array, [ 0 ]);
102});
103
104check(function() {
105    Array.prototype.pop.apply(array);
106});
107
108check(function() {
109    Array.prototype.shift.apply(array);
110});
111
112check(function() {
113    Array.prototype.unshift.apply(array);
114});
115
116check(function() {
117    Array.prototype.splice.apply(array, [ 0 ]);
118});
119
120check(function() {
121    Array.prototype.reverse.apply(Object.defineProperty([,,],"0",{ writable: false }));
122});
123