/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
/* Any copyright is dedicated to the Public Domain.
   http://creativecommons.org/publicdomain/zero/1.0/ */

"use strict";

const {getRuleText} = require("devtools/server/actors/styles");

const TEST_DATA = [
  {
    desc: "Empty input",
    input: "",
    line: 1,
    column: 1,
    throws: true
  },
  {
    desc: "Simplest test case",
    input: "#id{color:red;background:yellow;}",
    line: 1,
    column: 1,
    expected: {offset: 4, text: "color:red;background:yellow;"}
  },
  {
    desc: "Multiple rules test case",
    input: "#id{color:red;background:yellow;}.class-one .class-two { position:absolute; line-height: 45px}",
    line: 1,
    column: 34,
    expected: {offset: 56, text: " position:absolute; line-height: 45px"}
  },
  {
    desc: "Unclosed rule",
    input: "#id{color:red;background:yellow;",
    line: 1,
    column: 1,
    expected: {offset: 4, text: "color:red;background:yellow;"}
  },
  {
    desc: "Null input",
    input: null,
    line: 1,
    column: 1,
    throws: true
  },
  {
    desc: "Missing loc",
    input: "#id{color:red;background:yellow;}",
    throws: true
  },
  {
    desc: "Multi-lines CSS",
    input: [
      "/* this is a multi line css */",
      "body {",
      "  color: green;",
      "  background-repeat: no-repeat",
      "}",
      " /*something else here */",
      "* {",
      "  color: purple;",
      "}"
    ].join("\n"),
    line: 7,
    column: 1,
    expected: {offset: 116, text: "\n  color: purple;\n"}
  },
  {
    desc: "Multi-lines CSS and multi-line rule",
    input: [
      "/* ",
      "* some comments",
      "*/",
      "",
      "body {",
      "    margin: 0;",
      "    padding: 15px 15px 2px 15px;",
      "    color: red;",
      "}",
      "",
      "#header .btn, #header .txt {",
      "    font-size: 100%;",
      "}",
      "",
      "#header #information {",
      "    color: #dddddd;",
      "    font-size: small;",
      "}",
    ].join("\n"),
    line: 5,
    column: 1,
    expected: {
      offset: 30,
      text: "\n    margin: 0;\n    padding: 15px 15px 2px 15px;\n    color: red;\n"}
  },
  {
    desc: "Content string containing a } character",
    input: "   #id{border:1px solid red;content: '}';color:red;}",
    line: 1,
    column: 4,
    expected: {offset: 7, text: "border:1px solid red;content: '}';color:red;"}
  },
  {
    desc: "Rule contains no tokens",
    input: "div{}",
    line: 1,
    column: 1,
    expected: {offset: 4, text: ""}
  },
];

function run_test() {
  for (let test of TEST_DATA) {
    do_print("Starting test: " + test.desc);
    do_print("Input string " + test.input);
    let output;
    try {
      output = getRuleText(test.input, test.line, test.column);
      if (test.throws) {
        do_print("Test should have thrown");
        do_check_true(false);
      }
    } catch (e) {
      do_print("getRuleText threw an exception with the given input string");
      if (test.throws) {
        do_print("Exception expected");
        do_check_true(true);
      } else {
        do_print("Exception unexpected\n" + e);
        do_check_true(false);
      }
    }
    if (output) {
      deepEqual(output, test.expected);
    }
  }
}
