// ========================================================================== // Project: SproutCore - JavaScript Application Framework // Copyright: ©2006-2011 Strobe Inc. and contributors. // ©2008-2011 Apple Inc. All rights reserved. // License: Licensed under MIT license (see license.js) // ========================================================================== (function() {

var observerObject, array;

var willChangeStart, willChangeAdded, willChangeRemoved, willChangeSource, willChangeCallCount;
var didChangeStart, didChangeAdded, didChangeRemoved, didChangeSource, didChangeCallCount;

module("Enumerable Observers", {
  setup: function() {
    array = [1, 2, 3];

    observerObject = SC.Object.create({
      arrayContentWillChange: function(start, removedCount, addedCount, source) {
        willChangeStart = start;
        willChangeAdded = addedCount;
        willChangeRemoved = removedCount;
        willChangeSource = source;
        willChangeCallCount = willChangeCallCount ? willChangeCallCount++ : 1;
      },

      arrayContentDidChange: function(start, removedCount, addedCount, source) {
        didChangeStart = start;
        didChangeAdded = addedCount;
        didChangeRemoved = removedCount;
        didChangeSource = source;
        didChangeCallCount = didChangeCallCount ? didChangeCallCount++ : 1;
      }
    });

    array.addArrayObservers({
      target: observerObject,
      willChange: 'arrayContentWillChange',
      didChange: 'arrayContentDidChange'
    });
  }
});

test("should be called when an object is added to an enumerable", function() {
  array.pushObject(4);

  equals(willChangeCallCount, 1, "calls arrayContentWillChange once");
  equals(didChangeCallCount, 1, "calls arrayContentDidChange once");

  equals(didChangeSource.objectAt(willChangeStart), 4);
  equals(didChangeAdded, 1, "specifies one object added");
  equals(didChangeRemoved, 0, "specifies no objects removed");
});

test("should not be called when the observer is removed", function() {
  array.pushObject(4);
  equals(didChangeCallCount, 1, "precond - observer fires when added");
  didChangeCallCount = 0;

  array.removeArrayObservers({
    target: observerObject,
    willChange: 'arrayContentWillChange',
    didChange: 'arrayContentDidChange'
  });
  array.pushObject(5);
  equals(didChangeCallCount, 0, "observer does not fire after being removed");
});

test("should include both added and removed objects", function() {
  array.replace(1, 1, [6, 7, 8]);

  equals(willChangeStart, 1);
  equals(willChangeRemoved, 1);
  equals(willChangeAdded, 3);
  equals(willChangeSource, array);

  equals(didChangeStart, 1);
  equals(didChangeRemoved, 1);
  equals(didChangeAdded, 3);
  equals(didChangeSource, array);
});

})();