michael@0: /* michael@0: * Any copyright is dedicated to the Public Domain. michael@0: * http://creativecommons.org/licenses/publicdomain/ michael@0: * Contributor: michael@0: * Jeff Walden michael@0: */ michael@0: michael@0: //----------------------------------------------------------------------------- michael@0: var BUGNUMBER = 858381; michael@0: var summary = michael@0: "Array length setting/truncating with non-dense, indexed elements"; michael@0: michael@0: print(BUGNUMBER + ": " + summary); michael@0: michael@0: /************** michael@0: * BEGIN TEST * michael@0: **************/ michael@0: michael@0: function testTruncateDenseAndSparse() michael@0: { michael@0: var arr; michael@0: michael@0: // initialized length 16, capacity same michael@0: arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]; michael@0: michael@0: // plus a sparse element michael@0: arr[987654321] = 987654321; michael@0: michael@0: // lop off the sparse element and half the dense elements, shrink capacity michael@0: arr.length = 8; michael@0: michael@0: assertEq(987654321 in arr, false); michael@0: assertEq(arr[987654321], undefined); michael@0: assertEq(arr.length, 8); michael@0: } michael@0: testTruncateDenseAndSparse(); michael@0: michael@0: function testTruncateSparse() michael@0: { michael@0: // initialized length 8, capacity same michael@0: var arr = [0, 1, 2, 3, 4, 5, 6, 7]; michael@0: michael@0: // plus a sparse element michael@0: arr[987654321] = 987654321; michael@0: michael@0: // lop off the sparse element, leave initialized length/capacity unchanged michael@0: arr.length = 8; michael@0: michael@0: assertEq(987654321 in arr, false); michael@0: assertEq(arr[987654321], undefined); michael@0: assertEq(arr.length, 8); michael@0: } michael@0: testTruncateSparse(); michael@0: michael@0: function testTruncateDenseAndSparseShrinkCapacity() michael@0: { michael@0: // initialized length 11, capacity...somewhat larger, likely 16 michael@0: var arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; michael@0: michael@0: // plus a sparse element michael@0: arr[987654321] = 987654321; michael@0: michael@0: // lop off the sparse element, reduce initialized length, reduce capacity michael@0: arr.length = 8; michael@0: michael@0: assertEq(987654321 in arr, false); michael@0: assertEq(arr[987654321], undefined); michael@0: assertEq(arr.length, 8); michael@0: } michael@0: testTruncateDenseAndSparseShrinkCapacity(); michael@0: michael@0: function testTruncateSparseShrinkCapacity() michael@0: { michael@0: // initialized length 8, capacity same michael@0: var arr = [0, 1, 2, 3, 4, 5, 6, 7]; michael@0: michael@0: // capacity expands to accommodate, initialized length remains same (not equal michael@0: // to capacity or length) michael@0: arr[15] = 15; michael@0: michael@0: // now no elements past initialized length michael@0: delete arr[15]; michael@0: michael@0: // ...except a sparse element michael@0: arr[987654321] = 987654321; michael@0: michael@0: // trims sparse element, doesn't change initialized length, shrinks capacity michael@0: arr.length = 8; michael@0: michael@0: assertEq(987654321 in arr, false); michael@0: assertEq(arr[987654321], undefined); michael@0: assertEq(arr.length, 8); michael@0: } michael@0: testTruncateSparseShrinkCapacity(); michael@0: michael@0: /******************************************************************************/ michael@0: michael@0: if (typeof reportCompare === "function") michael@0: reportCompare(true, true); michael@0: michael@0: print("Tests complete");