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

function test()
{
    WebInspector.showPanel("scripts");

    var overridenInput = [];
    var overridenQuery = "";
    var delegate = {
        itemTitleAt: function(itemIndex) { },
        itemSuffixAt: function(itemIndex) { },
        itemSubtitleAt: function(itemIndex) { },
        itemKeyAt: function(itemIndex) { return overridenInput[itemIndex]; },
        itemsCount: function() { return overridenInput.length; },
        requestItems: function(callback) { callback(); },
        selectItem: function(itemIndex, promptValue) { },
        rewriteQuery: function(query) { return overridenQuery; },
    };

    function checkQuery(title, query, input)
    {
        overridenInput = input;
        overridenQuery = query;

        InspectorTest.addResult("\n" + title);
        InspectorTest.addResult("Query:" + JSON.stringify(query));
        InspectorTest.addResult("Input:" + JSON.stringify(input));

        var filteredSelectionDialog = new WebInspector.FilteredItemSelectionDialog(delegate);
        filteredSelectionDialog._updateAfterItemsLoaded();
        var items = filteredSelectionDialog._filteredItems;
        var output = [];
        for (var i = 0; i < items.length; ++i)
            output.push(delegate.itemKeyAt(items[i]));
        InspectorTest.addResult("Output:" + JSON.stringify(output));
    }

    checkQuery("Empty query matches everything", "", ["a", "bc"]);
    checkQuery("Case sensitive matching", "aB", ["abc", "acB"]);
    checkQuery("Case insensitive matching", "ab", ["abc", "bac", "a_B"]);
    checkQuery("Duplicate symbols in query", "aab", ["abab", "abaa", "caab", "baac", "fooaab"]);
    checkQuery("Dangerous input escaping", "^[]{}()\\.$*+?|", ["^[]{}()\\.$*+?|", "0123456789abcdef"]);
    checkQuery("Camel case matching", "fBaB", ["fooBarBaz", "FooBarBaz", "Foo_Bar_Baz", "foo_bar_baz", "foobarbaz", "foobarBaz", "afooBarBaz", "aFooBarBaz", "a fooBarBaz", "fooBorBaz", "fooBorCaz"]);
    checkQuery("Underscore matching", "fO_ba_b", ["foOBarBaz", "FoOBarBaz", "FoO_Bar_Baz", "foO_bar_baz", "foObarbaz", "foObarBaz", "afoOBarBaz", "aFoOBarBaz", "a foOBarBaz", "foOBorBaz", "foOBorCaz"]);
    checkQuery("Case insensitive matching", "fb", ["foo_bar", "FB", "foobar", "fBar"]);
    checkQuery("Case insensitive underscore matching", "f_b", ["foo_bar", "FOO_BAR", "Foo_Bar", "fOo_bAr"]);
    InspectorTest.completeTest();
}

</script>
</head>

<body onload="runTest()">
<p> 
Check to see that FilteredItemSelectionDialog uses proper regex to filter results.
</p>

</body>
</html>
