<html>
<head>
<script src="../http/tests/inspector/inspector-test.js"></script>
<script type="text/javascript">
var test = function()
{
    function createFakeTab(title, width)
    {
        function toString()
        {
            return title;
        }
        return { width: function() { return width; }, title: title, toString: toString };
    }

    var dropDownButtonMeasuredWidth = 10;
    function getTabsToShowAndDumpResults(tabsOrdered, tabsHistory, totalWidth)
    {
        var tabsToShowIndexes = WebInspector.TabbedPane.prototype._tabsToShowIndexes(tabsOrdered, tabsHistory, totalWidth, dropDownButtonMeasuredWidth);
        InspectorTest.addResult("    tabsToShowIndexes = [" + String(tabsToShowIndexes) + "]");
    }

    function testWidthsAndHistory(widths, history, totalWidth)
    {
        var tabsOrdered = [];
        var tabsHistory = [];
        for (var i = 0; i < widths.length; i++)
            tabsOrdered.push(createFakeTab("tab " + i, widths[i]));
        for (var i = 0; i < history.length; i++)
            tabsHistory.push(tabsOrdered[history[i]]);
        InspectorTest.addResult("Running tabs to show test:");
        InspectorTest.addResult("    widths = [" + String(widths) + "]");
        InspectorTest.addResult("    tabsHistory = [" + String(tabsHistory) + "]");
        InspectorTest.addResult("    totalWidth = " + totalWidth + ", dropDownButtonMeasuredWidth = " + dropDownButtonMeasuredWidth);
        getTabsToShowAndDumpResults(tabsOrdered, tabsHistory, totalWidth);
    }

    function testWithDifferentTotalWidths(widths, history)
    {
        testWidthsAndHistory(widths, history, 370);
        testWidthsAndHistory(widths, history, 360);
        testWidthsAndHistory(widths, history, 350);
        testWidthsAndHistory(widths, history, 300);
        testWidthsAndHistory(widths, history, 250);
        testWidthsAndHistory(widths, history, 200);
        testWidthsAndHistory(widths, history, 150);
        testWidthsAndHistory(widths, history, 100);
        testWidthsAndHistory(widths, history, 60);
        testWidthsAndHistory(widths, history, 50);
        InspectorTest.addResult("");
    }

    var widths = [50, 50, 60, 60, 70, 70];
    testWithDifferentTotalWidths(widths, [0, 1, 2, 3, 4, 5]);
    testWithDifferentTotalWidths(widths, [5, 4, 3, 2, 1, 0]);
    testWithDifferentTotalWidths(widths, [0, 2, 4, 1, 3, 5]);
    testWithDifferentTotalWidths(widths, [5, 3, 1, 4, 2, 0]);

    InspectorTest.completeTest();
}
</script>
</head>
<body onload="runTest()">
<p>Tests tabbed pane tabs to show calculation.</p>
<a href="https://bugs.webkit.org/show_bug.cgi?id=75085">Bug 75085</a>
</body>
</html>
