/*
 *  Array enumeration order is not strictly specified.  This test case
 *  compares behavior against the currently desired semantics:
 *
 *    - If dense, enumerate array keys first, then other keys
 *
 *    - When converting to sparse, re-add keys so that array keys
 *      are first (i.e. preserve order when abandoning array part)
 *
 *    - If sparse, maintain key insertion order only
 */

/*---
{
    "custom": true
}
---*/

function enumArray(arr) {
    print('array keys');
    for (var i in arr) {
        print(i);
    }
}

/*===
array keys
0
1
2
foo
array keys
0
1
2
3
4
foo
array keys
0
1
2
3
4
foo
10000
array keys
0
1
2
3
4
foo
10000
10
===*/

var a;

// initially dense
a = [1,2,3];
a.foo = 'bar';
enumArray(a);

// new keys, array order maintained (NOT insertion order)
a[4] = 5;
a[3] = 4;
enumArray(a);

// force to sparse
a[10000] = 9999;
enumArray(a);

// array order no longer maintained; now insertion order
a[10] = 9;
enumArray(a);

