// Copyright 2014 the V8 project authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// Flags: --allow-natives-syntax

function testAdd(mode) {
  var a = [];
  Object.defineProperty(a, "length", { writable : false});

  function check(f) {
    assertThrows(function() { f(a) }, TypeError);
    assertFalse(0 in a);
    assertEquals(0, a.length);
  }

  function push(a) {
    a.push(3);
  }

  if (mode == "fast properties") %ToFastProperties(a);

  check(push);
  check(push);
  check(push);
  %OptimizeFunctionOnNextCall(push);
  check(push);

  function unshift(a) {
    a.unshift(3);
  }

  check(unshift);
  check(unshift);
  check(unshift);
  %OptimizeFunctionOnNextCall(unshift);
  check(unshift);

  function splice(a) {
    a.splice(0, 0, 3);
  }

  check(splice);
  check(splice);
  check(splice);
  %OptimizeFunctionOnNextCall(splice);
  check(splice);
}

testAdd("fast properties");

testAdd("normalized");

function testRemove(a, mode) {
  Object.defineProperty(a, "length", { writable : false});

  function check(f) {
    assertThrows(function() { f(a) }, TypeError);
    assertEquals(3, a.length);
  }

  if (mode == "fast properties") %ToFastProperties(a);

  function pop(a) {
    a.pop();
  }

  check(pop);
  check(pop);
  check(pop);
  %OptimizeFunctionOnNextCall(pop);
  check(pop);

  function shift(a) {
    a.shift();
  }

  check(shift);
  check(shift);
  check(shift);
  %OptimizeFunctionOnNextCall(shift);
  check(shift);

  function splice(a) {
    a.splice(0, 1);
  }

  check(splice);
  check(splice);
  check(splice);
  %OptimizeFunctionOnNextCall(splice);
  check(splice);

  %ClearFunctionFeedback(pop);
  %ClearFunctionFeedback(shift);
  %ClearFunctionFeedback(splice);
}

for (var i = 0; i < 3; i++) {
  var a = [1, 2, 3];
  if (i == 1) {
    a = [1, 2, 3.5];
  } else if (i == 2) {
    a = [1, 2, "string"];
  }
  testRemove(a, "fast properties");
  testRemove(a, "normalized");
}

var b = [];
Object.defineProperty(b.__proto__, "0", {
  set : function(v) {
    b.x = v;
    Object.defineProperty(b, "length", { writable : false });
  },
  get: function() {
    return b.x;
  }
});

b = [];
try {
  b.push(3, 4, 5);
} catch(e) { }
assertFalse(1 in b);
assertFalse(2 in b);
assertEquals(0, b.length);

b = [];
try {
  b.unshift(3, 4, 5);
} catch(e) { }
assertFalse(1 in b);
assertFalse(2 in b);
assertEquals(0, b.length);

b = [1, 2];
try {
  b.unshift(3, 4, 5);
} catch(e) { }
assertEquals(3, b[0]);
assertEquals(4, b[1]);
assertEquals(5, b[2]);
assertEquals(1, b[3]);
assertEquals(2, b[4]);
assertEquals(5, b.length);

b = [1, 2];

Object.defineProperty(b.__proto__, "4", {
  set : function(v) {
    b.z = v;
    Object.defineProperty(b, "length", { writable : false });
  },
  get: function() {
    return b.z;
  }
});

try {
  b.unshift(3, 4, 5);
} catch(e) { }

assertFalse(2 in b);
assertFalse(3 in b);
assertEquals(2, b.length);
