/* vim: set ts=2 et sw=2 tw=80: */
/* Any copyright is dedicated to the Public Domain.
 http://creativecommons.org/publicdomain/zero/1.0/ */

"use strict";

// Test that options can be changed without resetting the whole
// editor.
add_task(function*() {

  let TEMP_PATH = buildTempDirectoryStructure();
  let projecteditor = yield addProjectEditorTab();

  let resourceBeenAdded = promise.defer();
  projecteditor.project.once("resource-added", () => {
    info ("A resource has been added");
    resourceBeenAdded.resolve();
  });

  info ("About to set project to: " + TEMP_PATH);
  yield projecteditor.setProjectToAppPath(TEMP_PATH, {
    name: "Test",
    iconUrl: "chrome://devtools/skin/images/tool-options.svg",
    projectOverviewURL: SAMPLE_WEBAPP_URL
  });

  info ("Making sure a resource has been added before continuing");
  yield resourceBeenAdded.promise;

  info ("From now on, if a resource is added it should fail");
  projecteditor.project.on("resource-added", failIfResourceAdded);

  info ("Getting ahold and validating the project header DOM");
  let header = projecteditor.document.querySelector(".entry-group-title");
  let image = header.querySelector(".project-image");
  let nameLabel = header.querySelector(".project-name-label");
  let statusElement = header.querySelector(".project-status");
  is (statusElement.getAttribute("status"), "unknown", "The status starts out as unknown.");
  is (nameLabel.textContent, "Test", "The name label has been set correctly");
  is (image.getAttribute("src"), "chrome://devtools/skin/images/tool-options.svg", "The icon has been set correctly");

  info ("About to set project with new options.");
  yield projecteditor.setProjectToAppPath(TEMP_PATH, {
    name: "Test2",
    iconUrl: "chrome://devtools/skin/images/tool-inspector.svg",
    projectOverviewURL: SAMPLE_WEBAPP_URL,
    validationStatus: "error"
  });

  info ("Getting ahold of and validating the project header DOM");
  is (statusElement.getAttribute("status"), "error", "The status has been set correctly.");
  is (nameLabel.textContent, "Test2", "The name label has been set correctly");
  is (image.getAttribute("src"), "chrome://devtools/skin/images/tool-inspector.svg", "The icon has been set correctly");

  info ("About to set project with new options.");
  yield projecteditor.setProjectToAppPath(TEMP_PATH, {
    name: "Test3",
    iconUrl: "chrome://devtools/skin/images/tool-webconsole.svg",
    projectOverviewURL: SAMPLE_WEBAPP_URL,
    validationStatus: "warning"
  });

  info ("Getting ahold of and validating the project header DOM");
  is (statusElement.getAttribute("status"), "warning", "The status has been set correctly.");
  is (nameLabel.textContent, "Test3", "The name label has been set correctly");
  is (image.getAttribute("src"), "chrome://devtools/skin/images/tool-webconsole.svg", "The icon has been set correctly");

  info ("About to set project with new options.");
  yield projecteditor.setProjectToAppPath(TEMP_PATH, {
    name: "Test4",
    iconUrl: "chrome://devtools/skin/images/tool-debugger.svg",
    projectOverviewURL: SAMPLE_WEBAPP_URL,
    validationStatus: "valid"
  });

  info ("Getting ahold of and validating the project header DOM");
  is (statusElement.getAttribute("status"), "valid", "The status has been set correctly.");
  is (nameLabel.textContent, "Test4", "The name label has been set correctly");
  is (image.getAttribute("src"), "chrome://devtools/skin/images/tool-debugger.svg", "The icon has been set correctly");

  info ("Test finished, cleaning up");
  projecteditor.project.off("resource-added", failIfResourceAdded);
});

function failIfResourceAdded() {
  ok (false, "A resource has been added, but it shouldn't have been");
}
