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

"use strict";

// Test to make sure that the editor reacts to preference changes

const TAB_SIZE = "devtools.editor.tabsize";
const ENABLE_CODE_FOLDING = "devtools.editor.enableCodeFolding";
const EXPAND_TAB = "devtools.editor.expandtab";
const KEYMAP = "devtools.editor.keymap";
const AUTO_CLOSE = "devtools.editor.autoclosebrackets";
const AUTOCOMPLETE = "devtools.editor.autocomplete";
const DETECT_INDENT = "devtools.editor.detectindentation";

async function test() {
  waitForExplicitFinish();
  const { ed, win } = await setup();
  Assert.deepEqual(
    ed.getOption("gutters"),
    ["CodeMirror-linenumbers", "breakpoints", "CodeMirror-foldgutter"],
    "gutters is correct"
  );

  ed.setText("Checking preferences.");

  info("Turning prefs off");

  ed.setOption("autocomplete", true);

  Services.prefs.setIntPref(TAB_SIZE, 2);
  Services.prefs.setBoolPref(ENABLE_CODE_FOLDING, false);
  Services.prefs.setBoolPref(EXPAND_TAB, false);
  Services.prefs.setCharPref(KEYMAP, "default");
  Services.prefs.setBoolPref(AUTO_CLOSE, false);
  Services.prefs.setBoolPref(AUTOCOMPLETE, false);
  Services.prefs.setBoolPref(DETECT_INDENT, false);

  Assert.deepEqual(
    ed.getOption("gutters"),
    ["CodeMirror-linenumbers", "breakpoints"],
    "gutters is correct"
  );

  is(ed.getOption("tabSize"), 2, "tabSize is correct");
  is(ed.getOption("indentUnit"), 2, "indentUnit is correct");
  is(ed.getOption("foldGutter"), false, "foldGutter is correct");
  is(
    ed.getOption("enableCodeFolding"),
    undefined,
    "enableCodeFolding is correct"
  );
  is(ed.getOption("indentWithTabs"), true, "indentWithTabs is correct");
  is(ed.getOption("keyMap"), "default", "keyMap is correct");
  is(ed.getOption("autoCloseBrackets"), false, "autoCloseBrackets is correct");
  is(ed.getOption("autocomplete"), true, "autocomplete is correct");
  ok(!ed.isAutocompletionEnabled(), "Autocompletion is not enabled");

  info("Turning prefs on");

  Services.prefs.setIntPref(TAB_SIZE, 4);
  Services.prefs.setBoolPref(ENABLE_CODE_FOLDING, true);
  Services.prefs.setBoolPref(EXPAND_TAB, true);
  Services.prefs.setCharPref(KEYMAP, "sublime");
  Services.prefs.setBoolPref(AUTO_CLOSE, true);
  Services.prefs.setBoolPref(AUTOCOMPLETE, true);

  Assert.deepEqual(
    ed.getOption("gutters"),
    ["CodeMirror-linenumbers", "breakpoints", "CodeMirror-foldgutter"],
    "gutters is correct"
  );

  is(ed.getOption("tabSize"), 4, "tabSize is correct");
  is(ed.getOption("indentUnit"), 4, "indentUnit is correct");
  is(ed.getOption("foldGutter"), true, "foldGutter is correct");
  is(
    ed.getOption("enableCodeFolding"),
    undefined,
    "enableCodeFolding is correct"
  );
  is(ed.getOption("indentWithTabs"), false, "indentWithTabs is correct");
  is(
    ed.getOption("autoCloseBrackets"),
    "()[]{}''\"\"``",
    "autoCloseBrackets is correct"
  );
  is(ed.getOption("autocomplete"), true, "autocomplete is correct");
  ok(ed.isAutocompletionEnabled(), "Autocompletion is enabled");

  // Since the keyMap files are lazily loaded, this can take some time. We need to wait
  // until the option has the expected value.
  info("Wait for the keyMap option to be updated");
  await waitUntil(() => ed.getOption("keyMap") === "sublime");
  is(ed.getOption("keyMap"), "sublime", "keyMap is correct");

  info("Forcing foldGutter off using enableCodeFolding");
  ed.setOption("enableCodeFolding", false);

  is(ed.getOption("foldGutter"), false, "foldGutter is correct");
  is(ed.getOption("enableCodeFolding"), false, "enableCodeFolding is correct");
  Assert.deepEqual(
    ed.getOption("gutters"),
    ["CodeMirror-linenumbers", "breakpoints"],
    "gutters is correct"
  );

  info("Forcing foldGutter on using enableCodeFolding");
  ed.setOption("enableCodeFolding", true);

  is(ed.getOption("foldGutter"), true, "foldGutter is correct");
  is(ed.getOption("enableCodeFolding"), true, "enableCodeFolding is correct");
  Assert.deepEqual(
    ed.getOption("gutters"),
    ["CodeMirror-linenumbers", "breakpoints", "CodeMirror-foldgutter"],
    "gutters is correct"
  );

  info("Checking indentation detection");

  Services.prefs.setBoolPref(DETECT_INDENT, true);

  ed.setText("Detecting\n\tTabs");
  is(ed.getOption("indentWithTabs"), true, "indentWithTabs is correct");
  is(ed.getOption("indentUnit"), 4, "indentUnit is correct");

  ed.setText("body {\n  color:red;\n  a:b;\n}");
  is(ed.getOption("indentWithTabs"), false, "indentWithTabs is correct");
  is(ed.getOption("indentUnit"), 2, "indentUnit is correct");

  Services.prefs.clearUserPref(TAB_SIZE);
  Services.prefs.clearUserPref(EXPAND_TAB);
  Services.prefs.clearUserPref(KEYMAP);
  Services.prefs.clearUserPref(AUTO_CLOSE);
  Services.prefs.clearUserPref(AUTOCOMPLETE);
  Services.prefs.clearUserPref(DETECT_INDENT);

  teardown(ed, win);
}
