import Singleton from "discourse/mixins/singleton";

QUnit.module("mixin:singleton");

QUnit.test("current", assert => {
  var DummyModel = Ember.Object.extend({});
  DummyModel.reopenClass(Singleton);

  var current = DummyModel.current();
  assert.present(current, "current returns the current instance");
  assert.equal(
    current,
    DummyModel.current(),
    "calling it again returns the same instance"
  );
  assert.notEqual(
    current,
    DummyModel.create({}),
    "we can create other instances that are not the same as current"
  );
});

QUnit.test("currentProp reading", assert => {
  var DummyModel = Ember.Object.extend({});
  DummyModel.reopenClass(Singleton);
  var current = DummyModel.current();

  assert.blank(
    DummyModel.currentProp("evil"),
    "by default attributes are blank"
  );
  current.set("evil", "trout");
  assert.equal(
    DummyModel.currentProp("evil"),
    "trout",
    "after changing the instance, the value is set"
  );
});

QUnit.test("currentProp writing", assert => {
  var DummyModel = Ember.Object.extend({});
  DummyModel.reopenClass(Singleton);

  assert.blank(
    DummyModel.currentProp("adventure"),
    "by default attributes are blank"
  );
  var result = DummyModel.currentProp("adventure", "time");
  assert.equal(result, "time", "it returns the new value");
  assert.equal(
    DummyModel.currentProp("adventure"),
    "time",
    "after calling currentProp the value is set"
  );

  DummyModel.currentProp("count", 0);
  assert.equal(DummyModel.currentProp("count"), 0, "we can set the value to 0");

  DummyModel.currentProp("adventure", null);
  assert.equal(
    DummyModel.currentProp("adventure"),
    null,
    "we can set the value to null"
  );
});

QUnit.test("createCurrent", assert => {
  var Shoe = Ember.Object.extend({});
  Shoe.reopenClass(Singleton, {
    createCurrent: function() {
      return Shoe.create({ toes: 5 });
    }
  });

  assert.equal(
    Shoe.currentProp("toes"),
    5,
    "it created the class using `createCurrent`"
  );
});

QUnit.test("createCurrent that returns null", assert => {
  var Missing = Ember.Object.extend({});
  Missing.reopenClass(Singleton, {
    createCurrent: function() {
      return null;
    }
  });

  assert.blank(Missing.current(), "it doesn't return an instance");
  assert.blank(
    Missing.currentProp("madeup"),
    "it won't raise an error asking for a property. Will just return null."
  );
});