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

Components.utils.import("resource://gre/modules/Promise.jsm", this);

function test() {
  let cw;
  let win;
  let groupItemId;
  let prefix = 'start';

  let assertTabViewIsHidden = function () {
    ok(!win.TabView.isVisible(), prefix + ': tabview is hidden');
  }

  let assertNumberOfGroups = function (num) {
    is(cw.GroupItems.groupItems.length, num, prefix + ': there should be ' + num + ' groups');
  }

  let assertNumberOfTabs = function (num) {
    is(win.gBrowser.visibleTabs.length, num, prefix + ': there should be ' + num + ' tabs');
  }

  let assertNumberOfPinnedTabs = function (num) {
    is(win.gBrowser._numPinnedTabs, num, prefix + ': there should be ' + num + ' pinned tabs');
  }

  let assertGroupItemPreserved = function () {
    is(cw.GroupItems.groupItems[0].id, groupItemId, prefix + ': groupItem was preserved');
  }

  let assertValidPrerequisites = function () {
    assertNumberOfTabs(1);
    assertNumberOfGroups(1);
    assertNumberOfPinnedTabs(0);
    assertTabViewIsHidden();
  }

  let createTab = function (url) {
    return win.gBrowser.loadOneTab(url || 'http://mochi.test:8888/', {inBackground: true});
  }

  let createBlankTab = function () {
    return createTab('about:blank');
  }

  let finishTest = function () {
    prefix = 'finish';
    assertValidPrerequisites();
    promiseWindowClosed(win).then(finish);
  }

  let testUndoCloseWithSelectedBlankTab = function () {
    prefix = 'unpinned';
    let tab = createTab();
    assertNumberOfTabs(2);

    afterAllTabsLoaded(function () {
      BrowserTestUtils.removeTab(tab).then(() => {
        assertNumberOfTabs(1);
        assertNumberOfPinnedTabs(0);

        restoreTab(function () {
          prefix = 'unpinned-restored';
          assertValidPrerequisites();
          assertGroupItemPreserved();

          createBlankTab();
          afterAllTabsLoaded(testUndoCloseWithSelectedBlankPinnedTab, win);
        }, 0, win);
      });
    }, win);
  }

  let testUndoCloseWithSelectedBlankPinnedTab = function () {
    prefix = 'pinned';
    assertNumberOfTabs(2);

    afterAllTabsLoaded(function () {
      win.gBrowser.removeTab(win.gBrowser.tabs[0]);
      win.gBrowser.pinTab(win.gBrowser.tabs[0]);

      assertNumberOfTabs(1);
      assertNumberOfPinnedTabs(1);

      restoreTab(function () {
        prefix = 'pinned-restored';
        assertValidPrerequisites();
        assertGroupItemPreserved();

        createBlankTab();
        win.gBrowser.removeTab(win.gBrowser.tabs[0]);

        afterAllTabsLoaded(finishTest, win);
      }, 0, win);
    }, win);
  }

  waitForExplicitFinish();

  newWindowWithTabView(window => {
    win = window;

    hideTabView(function () {
      cw = win.TabView.getContentWindow();
      groupItemId = cw.GroupItems.groupItems[0].id;

      assertValidPrerequisites();
      testUndoCloseWithSelectedBlankTab();
    }, win);
  });
}
