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 
  31 function check(callback) {
  32     try {
  33         callback();
  34         fail("TypeError expected for " + callback);
  35     } catch (e) {
  36         if (! (e instanceof TypeError)) {
  37             fail("TypeError expected, got " + e);
  38         }
  39     }
  40 }
  41 
  42 var array = Object.defineProperty([],"length", { writable: false });
  43 
  44 check(function() {
  45     array.push(0)
  46 });
  47 
  48 check(function() {
  49     array.pop()
  50 });
  51 
  52 check(function() {
  53     Object.defineProperty([,,],"0",{ writable: false }).reverse();
  54 });
  55 
  56 check(function() {
  57     array.shift()
  58 });
  59 
  60 check(function() {
  61     array.splice(0)
  62 });
  63 
  64 check(function() {
  65     array.unshift()
  66 });
  67 
  68 // try the above via call
  69 
  70 check(function() {
  71     Array.prototype.push.call(array, 0);
  72 });
  73 
  74 check(function() {
  75     Array.prototype.pop.call(array);
  76 });
  77 
  78 check(function() {
  79     Array.prototype.shift.call(array);
  80 });
  81 
  82 check(function() {
  83     Array.prototype.unshift.call(array);
  84 });
  85 
  86 check(function() {
  87     Array.prototype.splice.call(array, 0);
  88 });
  89 
  90 check(function() {
  91     Array.prototype.reverse.call(Object.defineProperty([,,],"0",{ writable: false }));
  92 });
  93 
  94 // try the above via apply
  95 
  96 check(function() {
  97     Array.prototype.push.apply(array, [ 0 ]);
  98 });
  99 
 100 check(function() {
 101     Array.prototype.pop.apply(array);
 102 });
 103 
 104 check(function() {
 105     Array.prototype.shift.apply(array);
 106 });
 107 
 108 check(function() {
 109     Array.prototype.unshift.apply(array);
 110 });
 111 
 112 check(function() {
 113     Array.prototype.splice.apply(array, [ 0 ]);
 114 });
 115 
 116 check(function() {
 117     Array.prototype.reverse.apply(Object.defineProperty([,,],"0",{ writable: false }));
 118 });