/*
 * Any copyright is dedicated to the Public Domain.
 * http://creativecommons.org/licenses/publicdomain/
 * Contributor:
 *   Jeff Walden <jwalden+code@mit.edu>
 */

//-----------------------------------------------------------------------------
var BUGNUMBER = 858381;
var summary =
  "Array length setting/truncating with non-dense, indexed elements";

print(BUGNUMBER + ": " + summary);

/**************
 * BEGIN TEST *
 **************/

function testTruncateDenseAndSparse()
{
  var arr;

  // initialized length 16, capacity same
  arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15];

  // plus a sparse element
  arr[987654321] = 987654321;

  // lop off the sparse element and half the dense elements, shrink capacity
  arr.length = 8;

  assertEq(987654321 in arr, false);
  assertEq(arr[987654321], undefined);
  assertEq(arr.length, 8);
}
testTruncateDenseAndSparse();

function testTruncateSparse()
{
  // initialized length 8, capacity same
  var arr = [0, 1, 2, 3, 4, 5, 6, 7];

  // plus a sparse element
  arr[987654321] = 987654321;

  // lop off the sparse element, leave initialized length/capacity unchanged
  arr.length = 8;

  assertEq(987654321 in arr, false);
  assertEq(arr[987654321], undefined);
  assertEq(arr.length, 8);
}
testTruncateSparse();

function testTruncateDenseAndSparseShrinkCapacity()
{
  // initialized length 11, capacity...somewhat larger, likely 16
  var arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10];

  // plus a sparse element
  arr[987654321] = 987654321;

  // lop off the sparse element, reduce initialized length, reduce capacity
  arr.length = 8;

  assertEq(987654321 in arr, false);
  assertEq(arr[987654321], undefined);
  assertEq(arr.length, 8);
}
testTruncateDenseAndSparseShrinkCapacity();

function testTruncateSparseShrinkCapacity()
{
  // initialized length 8, capacity same
  var arr = [0, 1, 2, 3, 4, 5, 6, 7];

  // capacity expands to accommodate, initialized length remains same (not equal
  // to capacity or length)
  arr[15] = 15;

  // now no elements past initialized length
  delete arr[15];

  // ...except a sparse element
  arr[987654321] = 987654321;

  // trims sparse element, doesn't change initialized length, shrinks capacity
  arr.length = 8;

  assertEq(987654321 in arr, false);
  assertEq(arr[987654321], undefined);
  assertEq(arr.length, 8);
}
testTruncateSparseShrinkCapacity();

/******************************************************************************/

if (typeof reportCompare === "function")
  reportCompare(true, true);

print("Tests complete");