var oldHelpers;

module("Discourse.View", {
  setup: function() {
    oldHelpers = Ember.Handlebars.helpers;
  },

  teardown: function() {
    Ember.Handlebars.helpers = oldHelpers;
  }
});

test("mixes in Discourse.Presence", function() {
  ok(Discourse.Presence.detect(Discourse.View.create()));
});

test("registerHelper: enables embedding a child view in a parent view via dedicated, named helper instead of generic 'view' helper", function() {
  Discourse.View.registerHelper("childViewHelper", Ember.View.extend({
    template: Ember.Handlebars.compile('{{view.text}}')
  }));

  var parentView = Ember.View.extend({
    template: Ember.Handlebars.compile('{{childViewHelper id="child" text="foo"}}')
  }).create();

  Ember.run(function() {
    parentView.appendTo("#qunit-fixture");
  });

  equal(parentView.$("#child").length, 1, "child view registered as helper is appended to the parent view");
  equal(parentView.$("#child").text(), "foo", "child view registered as helper gets parameters provided during helper invocation in parent's template");
});

test("renderIfChanged: rerenders the whole view template when one of registered view fields changes", function() {
  var view, rerenderSpy;

  var viewRerendersOnceWhen = function(message, changeCallback) {
    rerenderSpy.reset();
    Ember.run(function() { changeCallback(); });
    ok(rerenderSpy.calledOnce, "view rerenders when " + message);
  };

  var viewDoesNotRerenderWhen = function(message, changeCallback) {
    rerenderSpy.reset();
    Ember.run(function() { changeCallback(); });
    ok(!rerenderSpy.called, "view does not rerender when " + message);
  };


  view = Ember.View.extend({
    shouldRerender: Discourse.View.renderIfChanged("simple", "complex.@each.nested")
  }).create({
    simple: "initial value",
    complex: [Ember.Object.create({nested: "initial value"})],
    unregistered: "initial value"
  });

  rerenderSpy = sinon.spy(view, "rerender");

  Ember.run(function() {
    view.appendTo("#qunit-fixture");
  });


  viewRerendersOnceWhen("a simple field (holding a string) changes", function() {
    view.set("simple", "updated value");
  });

  viewRerendersOnceWhen("a nested sub-field of a complex field (holding an array of objects) changes", function() {
    view.get("complex").objectAt(0).set("nested", "updated value");
  });

  viewDoesNotRerenderWhen("unregistered field changes", function() {
    view.set("unregistered", "updated value");
  });
});