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

// only finish() when correct number of tests are done
const expected = 4;
var count = 0;
var lastUniqueName = null;

function done()
{
  if (++count == expected) {
    finish();
  }
}

function test()
{
  waitForExplicitFinish();
  testOpen();
  testOpenWithState();
  testOpenInvalidState();
  testOpenTestFile();
}

function testUniqueName(name)
{
  ok(name, "Scratchpad has a uniqueName");

  if (lastUniqueName === null) {
    lastUniqueName = name;
    return;
  }

  ok(name !== lastUniqueName,
      "Unique name for this instance differs from the last one.");
}

function testOpen()
{
  openScratchpad(function (win) {
    is(win.Scratchpad.filename, undefined, "Default filename is undefined");
    isnot(win.Scratchpad.getText(), null, "Default text should not be null");
    is(win.Scratchpad.executionContext, win.SCRATCHPAD_CONTEXT_CONTENT,
      "Default execution context is content");
    testUniqueName(win.Scratchpad.uniqueName);

    win.close();
    done();
  }, {noFocus: true});
}

function testOpenWithState()
{
  let state = {
    filename: "testfile",
    executionContext: 2,
    text: "test text"
  };

  openScratchpad(function (win) {
    is(win.Scratchpad.filename, state.filename, "Filename loaded from state");
    is(win.Scratchpad.executionContext, state.executionContext, "Execution context loaded from state");
    is(win.Scratchpad.getText(), state.text, "Content loaded from state");
    testUniqueName(win.Scratchpad.uniqueName);

    win.close();
    done();
  }, {state: state, noFocus: true});
}

function testOpenInvalidState()
{
  let win = openScratchpad(null, {state: 7});
  ok(!win, "no scratchpad opened if state is not an object");
  done();
}

function testOpenTestFile()
{
  let win = openScratchpad(function (win) {
    ok(win, "scratchpad opened for file open");
    try {
      win.Scratchpad.importFromFile(
        "http://example.com/browser/devtools/client/scratchpad/test/NS_ERROR_ILLEGAL_INPUT.txt",
        "silent",
        function (aStatus, content) {
          let nb = win.document.querySelector("#scratchpad-notificationbox");
          is(nb.querySelectorAll("notification").length, 1, "There is just one notification");
          let cn = nb.currentNotification;
          is(cn.priority, nb.PRIORITY_WARNING_HIGH, "notification priority is correct");
          is(cn.value, "file-import-convert-failed", "notification value is corrent");
          is(cn.type, "warning", "notification type is correct");
          done();
        });
      ok(true, "importFromFile does not cause exception");
    } catch (exception) {
      ok(false, "importFromFile causes exception " + DevToolsUtils.safeErrorString(exception));
    }
  }, {noFocus: true});
}
