/* Any copyright is dedicated to the Public Domain.
   http://creativecommons.org/publicdomain/zero/1.0/ */

/**
 * Tests if page navigation ("close", "navigate", etc.) triggers an appropriate
 * action in the network monitor.
 */

function test() {
  initNetMonitor(SIMPLE_URL).then(([aTab, aDebuggee, aMonitor]) => {
    info("Starting test... ");

    testNavigate(() => testNavigateBack(() => testClose(() => finish())));

    function testNavigate(aCallback) {
      info("Navigating forward...");

      aMonitor.panelWin.once(aMonitor.panelWin.EVENTS.TARGET_WILL_NAVIGATE, () => {
        is(aDebuggee.location, SIMPLE_URL,
          "Target started navigating to the correct location.");

        aMonitor.panelWin.once(aMonitor.panelWin.EVENTS.TARGET_DID_NAVIGATE, () => {
          is(aDebuggee.location, NAVIGATE_URL,
            "Target finished navigating to the correct location.");

          aCallback();
        });
      });

      aDebuggee.location = NAVIGATE_URL;
    }

    function testNavigateBack(aCallback) {
      info("Navigating backward...");

      aMonitor.panelWin.once(aMonitor.panelWin.EVENTS.TARGET_WILL_NAVIGATE, () => {
        is(aDebuggee.location, NAVIGATE_URL,
          "Target started navigating back to the previous location.");

        aMonitor.panelWin.once(aMonitor.panelWin.EVENTS.TARGET_DID_NAVIGATE, () => {
          is(aDebuggee.location, SIMPLE_URL,
            "Target finished navigating back to the previous location.");

          aCallback();
        });
      });

      aDebuggee.location = SIMPLE_URL;
    }

    function testClose(aCallback) {
      info("Closing...");

      aMonitor.once("destroyed", () => {
        ok(!aMonitor._controller.client,
          "There shouldn't be a client available after destruction.");
        ok(!aMonitor._controller.tabClient,
          "There shouldn't be a tabClient available after destruction.");
        ok(!aMonitor._controller.webConsoleClient,
          "There shouldn't be a webConsoleClient available after destruction.");

        aCallback();
      });

      removeTab(aTab);
    }
  });
}
