<!doctype html>
<html>
<head>
<script src="../../http/tests/inspector/resources/inspector-test.js"></script>
<script>
function test()
{
    let suite = InspectorTest.createAsyncSuite("ResourceCollection");

    function createResource(url, type) {
        return new WI.Resource(url, null, type);
    }

    function logResourceNames(collection) {
        let items = Array.from(collection.items);
        InspectorTest.log(items.map((resource) => resource.displayName));
    }

    suite.addTestCase({
        name: "WI.ResourceCollection.verifierForType",
        test(resolve, reject) {
            let collection = new WI.ResourceCollection(WI.Resource.Type.Image);
            collection.add(createResource("one"));
            collection.add(createResource("two", WI.Resource.Type.Image));
            collection.add(3);

            logResourceNames(collection);

            resolve();
        }
    });

    suite.addTestCase({
        name: "WI.ResourceCollection.prototype.resourceCollectionForType",
        test(resolve, reject) {
            let collection = new WI.ResourceCollection;
            collection.add(createResource("one", WI.Resource.Type.Image));
            collection.add(createResource("two", WI.Resource.Type.Stylesheet));
            collection.add(createResource("three", WI.Resource.Type.Image));
            collection.add(createResource("four", WI.Resource.Type.Document));
            collection.add(createResource("five", WI.Resource.Type.Stylesheet));

            logResourceNames(collection.resourceCollectionForType(WI.Resource.Type.Image));

            let typedCollection = new WI.ResourceCollection(WI.Resource.Type.Image);
            typedCollection.add(createResource("one", WI.Resource.Type.Image));
            typedCollection.add(createResource("two", WI.Resource.Type.Stylesheet));
            typedCollection.add(createResource("three", WI.Resource.Type.Image));

            logResourceNames(typedCollection);
            InspectorTest.expectEqual(typedCollection.resourceCollectionForType(WI.Resource.Type.Image), typedCollection, "resourceCollectionForType will return `this` if a type is specified.")

            resolve();
        }
    });

    suite.addTestCase({
        name: "WI.ResourceCollection.prototype._resourceTypeDidChange",
        test(resolve, reject) {
            let imageResource = createResource("one");

            let collection = new WI.ResourceCollection;
            collection.add(imageResource);

            logResourceNames(collection);
            logResourceNames(collection.resourceCollectionForType(WI.Resource.Type.Image));
            logResourceNames(collection.resourceCollectionForType(WI.Resource.Type.Other));

            // Dispatch a type change.
            imageResource._type = WI.Resource.Type.Image;
            imageResource.dispatchEventToListeners(WI.Resource.Event.TypeDidChange, {oldType: WI.Resource.Type.Image});

            logResourceNames(collection);
            logResourceNames(collection.resourceCollectionForType(WI.Resource.Type.Image));
            logResourceNames(collection.resourceCollectionForType(WI.Resource.Type.Other));

            resolve();
        }
    });

    suite.runTestCasesAndFinish();
}
</script>
</head>
<body onload="runTest()">
    <p>Testing all methods of ResourceCollection.</p>
</body>
</html>
