<html>
<head>
<script src="../../http/tests/inspector/inspector-test.js"></script>
<script src="../../http/tests/inspector/console-test.js"></script>
<script>

function onload()
{
    var a = [];
    for (var i = 0; i < 42; ++i)
        a[i] = i;
    a[100] = 100;
    console.dir(a);

    var b = [];
    for (var i = 0; i < 10; ++i)
      b[i] = undefined;
    console.dir(b);

    var c = [];
    for (var i = 0; i < 10; ++i)
        c[i] = i;
    c[100] = 100;
    console.dir(c);

    var d = [];
    for (var i = 0; i < 405; ++i)
      d[i] = i;
    console.dir(d);

    var e = [];
    for (var i = 0; i < 10; ++i)
        e[i] = i;
    e[123] = 123;
    e[-123] = -123;
    e[3.14] = 3.14;
    e[4294967295] = 4294967295;
    e[4294967296] = 4294967296;
    e[Infinity] = Infinity;
    e[-Infinity] = -Infinity;
    e[NaN] = NaN;
    console.log("%O", e);

    var f = [];
    f[4294967294] = 4294967294;
    for (var i = 20; i >= 0; i -= 2)
        f[i] = i;
    for (var i = 2, n = 33; n--; i *= 2)
        f[i] = i;
    for (var i = 1; i < 20; i += 2)
        f[i] = i;
    console.log("%O", f)

    runTest();
}

function test()
{
    WebInspector.ArrayGroupingTreeElement._bucketThreshold = 20;

    var messages = WebInspector.console.messages;
    var sections = [];
    for (var i = 0; i < messages.length; ++i) {
        var element = messages[i].toMessageElement();
        var node = element.traverseNextNode(element);
        while (node) {
            if (node._section) {
                sections.push(node._section);
                messages[i].section = node._section;
                node._section.expanded = true;
            }
            node = node.traverseNextNode(element);
        }
    }

    InspectorTest.addSniffer(WebInspector.ArrayGroupingTreeElement.prototype, "onpopulate", populateCalled, true);
    var populated = false;
    function populateCalled()
    {
        populated = true;
    }

    InspectorTest.runAfterPendingDispatches(expandRecursively);

    function expandRecursively()
    {
        for (var i = 0; i < sections.length; ++i) {
            for (var j = 0; j < sections[i].propertiesTreeOutline.children.length; ++j) {
                for (var treeElement = sections[i].propertiesTreeOutline.children[j]; treeElement; treeElement = treeElement.traverseNextTreeElement(false, null, false)) {
                    if (treeElement.listItemElement.textContent.indexOf("__proto__") === -1)
                        treeElement.expand();
                }
            }
        }
        if (populated)
            InspectorTest.runAfterPendingDispatches(completeTest);
        else
            InspectorTest.runAfterPendingDispatches(expandRecursively);
    }

    function completeTest()
    {
        InspectorTest.addResult(InspectorTest.textContentWithLineBreaks(WebInspector.consoleView.messagesElement));
        InspectorTest.completeTest();
    }
}

</script>
</head>

<body onload="onload()">
<p>
Tests that console logging dumps large arrays properly.
</p>

</body>
</html>
