<html>
<head>
<script type="text/javascript">

function print(str) {
    document.writeln(str+"<br/>");
}

if (window.layoutTestController)
    layoutTestController.dumpAsText();
</script>
</head>
<body>
1.0 Single Argument Testing<br/>
The following tests forEach with one argument, the callback.  It should print the contents of the array [2, 5, 9] alongside each index.<br/><br/>
<script>
function printElt(element, index, array) {
    print("[" + index + "] is " + element);
}

[2, 5, 9].forEach(printElt);
</script>
<br/>

2.0 Two Argument Testing<br/>
The following tests forEach with two arguments, the callback and the applied "this" object.  It should print the contents of the array.<br/><br/>
<script>
    var writer = {
        sb:       [],
        write:    function (s) {
            this.sb.push(s);
        },
        writeln:  function (s) {
            this.write(s+"<br/>");
        },
        toString: function () {
            return this.sb.join("");
        }
    };
    
    [2, 5, 9].forEach(writer.writeln, writer);
    print(writer.toString());

</script>

3.0 Array Mutation Tests<br/>
These tests the affects of array mutation during execution of forEach.<br/><br/>
3.1 Array Element Removal<br/>
This test removes elements from the array, these elements should thus not appear since forEach doesn't iterate over non-existing properties.<br/><br/>

<script>
function printEltAndPop(element, index, array) {
    print("[" + index + "] is " + element);
    array.pop();
}

[2, 5, 9].forEach(printEltAndPop);
</script>
<br/>

3.2 Array Element Addition<br/>
This test adds elements to the array, these elements should not appear since forEach uses the original length to create the range it iterates over.  It should be identical to 1.0.<br/><br/>
<script>
function printEltAndPush(element, index, array) {
    print("[" + index + "] is " + element);
    array.push(1);
}

[2, 5, 9].forEach(printEltAndPush);
</script>
<br/>

3.3 Array Element Changing<br/>
This test changes elements in the array, these elements should appear in their mutated form when reached by forEach.<br/><br/>
<script>
function printEltAndChange(element, index, array) {
    print("[" + index + "] is " + element);
    array[array.length - 1 - index] = "changed";
}

[2, 5, 9].forEach(printEltAndChange);
</script>
<br/>
4.0 Exception Test<br/>
This test uses a function that throws an exception, and thus halts the execution of forEach.<br/><br/>
<script>
function printEltAndException(element, index, array) {
    print("[" + index + "] is " + element);
    if (index == 1)
        throw "Exception thrown, execution halted!";
}
try {
    [2, 5, 9].forEach(printEltAndException);
} catch (e) {
    print(e);
}
</script>

<br/>
5.0 Wrong Type for Callback Test
This test sends in incorrect types for the callback parameter of forEach.  An exception should be thrown in each case.  There should be 6 type errors (and no crashes!):<br/><br/>
<script>

try {
    [2, 5, 9].forEach(5);
} catch (e) {
    print(e);
}

try {
    [2, 5, 9].forEach("wrong");
} catch (e) {
    print(e);
}

try {
    [2, 5, 9].forEach(new Object());
} catch (e) {
    print(e);
}

try {
    [2, 5, 9].forEach(null);
} catch (e) {
    print(e);
}

try {
    [2, 5, 9].forEach(undefined);
} catch (e) {
    print(e)
}

try {
    [2, 5, 9].forEach();
} catch (e) {
    print(e);
}

</script>

<br/>
6.0 Behavior for Holes in Arrays<br/>
This test checks that holes in arrays (indexes which have been deleted or are not present) are not included in enumeration:<br/><br/>
<script>
function throwIfUndefined(element, index, array) {
    if (typeof element === "undefined")
        throw "undefined element enumerated!";
}

var arr;
try {
    arr = [5, 5, 5, 5];
    delete arr[1];
    arr.forEach(throwIfUndefined);
    print("Manually deleted index not enumerated");
} catch (e) {
    print(e);
}

try {
    arr = new Array(20);
    arr.forEach(throwIfUndefined);
    print("Array created using constructor has no properties, so no indexes enumerated");
} catch (e) {
    print(e);
}

</script>

<br/>
7.0 Return Value<br/>
This test checks that the return value of Array.prototype.forEach is undefined:<br/><br/>
<script>
var wasUndefined = typeof ([1, 2, 3].forEach(function(){})) === "undefined";

print("Return value is " + (wasUndefined ? "" : "NOT ") + "undefined!");
</script>

</body>
</html>
