<!doctype html>
<html>
<head>
<script src="../../http/tests/inspector/resources/inspector-test.js"></script>
<script>
function test()
{
    const KaboomEvent = "kaboom";
    var emitter = new WI.Object();
    var context = new WI.Object();
    var data = [1, 2, 3];

    function kaboomCallback(event) {
        InspectorTest.assert(this === context, "Callback invoked with wrong |this| binding.");
        InspectorTest.assert(event.target === emitter, "Callback invoked with wrong event emitter.");
        InspectorTest.assert(event.data === data, "Callback invoked with wrong event data.");

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

    // Test for multiple firings of the listener.

    var listener = new WI.EventListener(context);
    InspectorTest.assert(!emitter.hasEventListeners(KaboomEvent), "Emitter should not have any listeners.");
    emitter.dispatchEventToListeners(KaboomEvent, data); // Should not fire anything.

    InspectorTest.log("Connecting the listener.");
    listener.connect(emitter, KaboomEvent, kaboomCallback);
    InspectorTest.assert(emitter.hasEventListeners(KaboomEvent), "Emitter should have a listener.");
    emitter.dispatchEventToListeners(KaboomEvent, data); // Should fire.
    emitter.dispatchEventToListeners(KaboomEvent, data); // Should fire.
    InspectorTest.log("Disconnecting the listener.");
    listener.disconnect();

    emitter.dispatchEventToListeners(KaboomEvent, data); // Should not fire anything.
    InspectorTest.assert(!emitter.hasEventListeners(KaboomEvent), "Emitter should not have any listeners.");

    // Test reconnection.

    InspectorTest.log("Connecting the listener.");
    listener.connect(emitter, KaboomEvent, kaboomCallback);
    emitter.dispatchEventToListeners(KaboomEvent, data); // Should fire.
    InspectorTest.log("Disconnecting the listener.");
    listener.disconnect();

    // Test unused listener.

    InspectorTest.log("Connecting the listener.");
    listener.connect(emitter, KaboomEvent, kaboomCallback);
    InspectorTest.log("Disconnecting the listener.");
    listener.disconnect();

    // Test for single firing of the listener.

    var singleListener = new WI.EventListener(context, true);
    InspectorTest.assert(!emitter.hasEventListeners(KaboomEvent), "Emitter should not have any listeners.");
    emitter.dispatchEventToListeners(KaboomEvent, data); // Should not fire anything.

    InspectorTest.log("Connecting the single-fire listener.");
    singleListener.connect(emitter, KaboomEvent, kaboomCallback);
    InspectorTest.assert(emitter.hasEventListeners(KaboomEvent), "Emitter should have a listener.");
    emitter.dispatchEventToListeners(KaboomEvent, data); // Should fire.
    InspectorTest.assert(!emitter.hasEventListeners(KaboomEvent), "Emitter should not have any listeners.");
    emitter.dispatchEventToListeners(KaboomEvent, data); // Should not fire.
    InspectorTest.log("Disconnecting the single-fire listener.");
    singleListener.disconnect(); // Should cause an error.
    emitter.dispatchEventToListeners(KaboomEvent, data); // Should not fire.

    // Test for various error cases and abuse.

    var badListener = new WI.EventListener(context);
    badListener.connect(data, data, data); // Should complain about non-callable callback.
    badListener.connect(null, KaboomEvent, kaboomCallback); // Should complain about non-callable callback.
    badListener.connect(emitter, KaboomEvent, null); // Should complain about non-callable callback.
    badListener.connect(emitter, null, kaboomCallback); // Should complain about null event.

    var badListener2 = new WI.EventListener(context);
    badListener2.disconnect(); // Should complain about already disconnected.
    badListener2.connect(emitter, KaboomEvent, kaboomCallback);
    badListener2.connect(emitter, KaboomEvent, kaboomCallback); // Should complain about already connected.
    emitter.dispatchEventToListeners(KaboomEvent, data); // Should fire.
    badListener2.connect(emitter, KaboomEvent, kaboomCallback); // Should complain about already connected.
    badListener2.disconnect();
    badListener2.disconnect(); // Should complain about already disconnected.

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