<!doctype html>
<html>
<head>
<script src="../../http/tests/inspector/resources/inspector-test.js"></script>
<script>
function test()
{
    const FooEvent = "foo";
    const BarEvent = "bar";
    const BazEvent = "baz";
    var emitter1 = new WI.Object();
    var emitter2 = new WI.Object();
    var context1 = new WI.Object();
    var context2 = new WI.Object();
    var data1 = [1, 2, 3];
    var data2 = [4, 6, 8];

    function fooCallback(event)
    {
        InspectorTest.assert(this === context1, "Callback invoked with wrong |this| binding.");
        InspectorTest.assert(event.target === emitter1, "Callback invoked with wrong event emitter.");
        InspectorTest.assert(event.data === data1, "Callback invoked with wrong event data.");

        InspectorTest.log("Invoked callback for foo event.");
    }

    function barCallback(event)
    {
        InspectorTest.assert(this === context1, "Callback invoked with wrong |this| binding.");
        InspectorTest.assert(event.target === emitter1, "Callback invoked with wrong event emitter.");
        InspectorTest.assert(event.data === data2, "Callback invoked with wrong event data.");

        InspectorTest.log("Invoked callback for bar event.");
    }

    function bazCallback(event)
    {
        InspectorTest.assert(this === context2, "Callback invoked with wrong |this| binding.");
        InspectorTest.assert(event.target === emitter2, "Callback invoked with wrong event emitter.");
        InspectorTest.assert(event.data === data2, "Callback invoked with wrong event data.");

        InspectorTest.log("Invoked callback for baz event.");
    }

    // Test for multiple firings of listeners in the set.

    var listenerSet = new WI.EventListenerSet(context1);
    InspectorTest.assert(!emitter1.hasEventListeners(FooEvent), "Emitter should not have any listeners.");
    emitter1.dispatchEventToListeners(FooEvent, data1); // Should not fire anything.

    InspectorTest.log("Registering listeners.");
    listenerSet.register(emitter1, FooEvent, fooCallback);
    listenerSet.register(emitter1, BarEvent, barCallback);
    listenerSet.register(emitter2, BazEvent, bazCallback, context2);
    InspectorTest.assert(!emitter1.hasEventListeners(FooEvent), "Emitter should not have a listener.");
    InspectorTest.assert(!emitter1.hasEventListeners(BarEvent), "Emitter should not have a listener.");
    InspectorTest.assert(!emitter2.hasEventListeners(BazEvent), "Emitter should not have a listener.");

    InspectorTest.log("Installing listeners.");
    listenerSet.install();
    InspectorTest.assert(emitter1.hasEventListeners(FooEvent), "Emitter should have a listener.");
    InspectorTest.assert(emitter1.hasEventListeners(BarEvent), "Emitter should have a listener.");
    InspectorTest.assert(emitter2.hasEventListeners(BazEvent), "Emitter should have a listener.");

    InspectorTest.log("Dispatching events.");
    emitter1.dispatchEventToListeners(FooEvent, data1); // Should fire.
    emitter1.dispatchEventToListeners(BarEvent, data2); // Should fire.
    emitter2.dispatchEventToListeners(BazEvent, data2); // Should fire.
    InspectorTest.log("Uninstalling and disconnecting listeners.");
    listenerSet.uninstall(true);

    InspectorTest.log("Registering listeners.");
    listenerSet.register(emitter1, FooEvent, fooCallback);
    listenerSet.register(emitter1, BarEvent, barCallback);
    listenerSet.register(emitter2, BazEvent, bazCallback, context2);

    listenerSet.install();
    InspectorTest.log("Dispatching events.");
    emitter1.dispatchEventToListeners(FooEvent, data1); // Should fire.
    emitter1.dispatchEventToListeners(BarEvent, data2); // Should fire.
    emitter2.dispatchEventToListeners(BazEvent, data2); // Should fire.
    InspectorTest.log("Uninstalling listeners.");
    listenerSet.uninstall();

    InspectorTest.log("Installing listeners.");
    listenerSet.install();
    InspectorTest.log("Dispatching events.");
    emitter1.dispatchEventToListeners(FooEvent, data1); // Should fire.
    emitter1.dispatchEventToListeners(BarEvent, data2); // Should fire.
    emitter2.dispatchEventToListeners(BazEvent, data2); // Should fire.

    InspectorTest.log("Unregistering everything.");
    listenerSet.unregister();
    InspectorTest.log("Dispatching events.");
    emitter1.dispatchEventToListeners(FooEvent, data1); // Should not fire.
    emitter1.dispatchEventToListeners(BarEvent, data2); // Should not fire.
    emitter2.dispatchEventToListeners(BazEvent, data2); // Should not fire.

    InspectorTest.log("Uninstalling and disconnecting listeners.");
    listenerSet.uninstall(true);
    InspectorTest.log("Dispatching events.");
    emitter1.dispatchEventToListeners(FooEvent, data1); // Should not fire.
    emitter1.dispatchEventToListeners(BarEvent, data2); // Should not fire.
    emitter2.dispatchEventToListeners(BazEvent, data2); // Should not fire.

    InspectorTest.assert(!emitter1.hasEventListeners(FooEvent), "Emitter should not have a listener.");
    InspectorTest.assert(!emitter1.hasEventListeners(BarEvent), "Emitter should not have a listener.");
    InspectorTest.assert(!emitter2.hasEventListeners(BazEvent), "Emitter should not have a listener.");

    InspectorTest.completeTest();
}
</script>
</head>
<body onload="runTest()">
    <p>Testing basic functionality of WI.EventListenerSet.</p>
</body>
</html>
