import {
  setting,
  propertyEqual,
  propertyNotEqual,
  fmt,
  i18n,
  url
} from "discourse/lib/computed";

QUnit.module("lib:computed", {
  beforeEach() {
    sandbox.stub(I18n, "t", function(scope) {
      return "%@ translated: " + scope;
    });
  },

  afterEach() {
    I18n.t.restore();
  }
});

QUnit.test("setting", assert => {
  var t = Em.Object.extend({
    vehicle: setting("vehicle"),
    missingProp: setting("madeUpThing")
  }).create();

  Discourse.SiteSettings.vehicle = "airplane";
  assert.equal(
    t.get("vehicle"),
    "airplane",
    "it has the value of the site setting"
  );
  assert.ok(
    !t.get("missingProp"),
    "it is falsy when the site setting is not defined"
  );
});

QUnit.test("propertyEqual", assert => {
  var t = Em.Object.extend({
    same: propertyEqual("cookies", "biscuits")
  }).create({
    cookies: 10,
    biscuits: 10
  });

  assert.ok(t.get("same"), "it is true when the properties are the same");
  t.set("biscuits", 9);
  assert.ok(!t.get("same"), "it isn't true when one property is different");
});

QUnit.test("propertyNotEqual", assert => {
  var t = Em.Object.extend({
    diff: propertyNotEqual("cookies", "biscuits")
  }).create({
    cookies: 10,
    biscuits: 10
  });

  assert.ok(!t.get("diff"), "it isn't true when the properties are the same");
  t.set("biscuits", 9);
  assert.ok(t.get("diff"), "it is true when one property is different");
});

QUnit.test("fmt", assert => {
  var t = Em.Object.extend({
    exclaimyUsername: fmt("username", "!!! %@ !!!"),
    multiple: fmt("username", "mood", "%@ is %@")
  }).create({
    username: "eviltrout",
    mood: "happy"
  });

  assert.equal(
    t.get("exclaimyUsername"),
    "!!! eviltrout !!!",
    "it inserts the string"
  );
  assert.equal(
    t.get("multiple"),
    "eviltrout is happy",
    "it inserts multiple strings"
  );

  t.set("username", "codinghorror");
  assert.equal(
    t.get("multiple"),
    "codinghorror is happy",
    "it supports changing properties"
  );
  t.set("mood", "ecstatic");
  assert.equal(
    t.get("multiple"),
    "codinghorror is ecstatic",
    "it supports changing another property"
  );
});

QUnit.test("i18n", assert => {
  var t = Em.Object.extend({
    exclaimyUsername: i18n("username", "!!! %@ !!!"),
    multiple: i18n("username", "mood", "%@ is %@")
  }).create({
    username: "eviltrout",
    mood: "happy"
  });

  assert.equal(
    t.get("exclaimyUsername"),
    "%@ translated: !!! eviltrout !!!",
    "it inserts the string and then translates"
  );
  assert.equal(
    t.get("multiple"),
    "%@ translated: eviltrout is happy",
    "it inserts multiple strings and then translates"
  );

  t.set("username", "codinghorror");
  assert.equal(
    t.get("multiple"),
    "%@ translated: codinghorror is happy",
    "it supports changing properties"
  );
  t.set("mood", "ecstatic");
  assert.equal(
    t.get("multiple"),
    "%@ translated: codinghorror is ecstatic",
    "it supports changing another property"
  );
});

QUnit.test("url", assert => {
  var t, testClass;

  testClass = Em.Object.extend({
    userUrl: url("username", "/u/%@")
  });

  t = testClass.create({ username: "eviltrout" });
  assert.equal(
    t.get("userUrl"),
    "/u/eviltrout",
    "it supports urls without a prefix"
  );

  Discourse.BaseUri = "/prefixed";
  t = testClass.create({ username: "eviltrout" });
  assert.equal(
    t.get("userUrl"),
    "/prefixed/u/eviltrout",
    "it supports urls with a prefix"
  );
});