// ========================================================================== // Project: SproutCore - JavaScript Application Framework // Copyright: ©2006-2011 Apple Inc. and contributors. // License: Licensed under MIT license (see license.js) // ==========================================================================

/*global module test equals context ok same notest */

var source, indexes, observer, obj ; // base array to work with module(“SC.RangeObserver#create”, {

setup: function() {

  // create array with 5 SC.Object's in them
  source = [1,2,3,4,5].map(function(x) {
    return SC.Object.create({ item: x, foo: "bar" }) ;
  }, this);

  indexes = SC.IndexSet.create(2,2); // select 2..3

  observer = SC.Object.create({

    callCount: 0,

    rangeDidChange: function() {
      this.callCount++;
    }

  });

  obj = SC.RangeObserver.create(source, indexes, observer, observer.rangeDidChange, "context", YES);

}

});

test(“returns new instance”, function() {

ok(obj && obj.isRangeObserver, 'returns range observer');

});

test(“sets up observing on properties for each object in range in index if isDeep”, function() {

var len = source.length, idx;
for(idx=0;idx<len;idx++) {
  source[idx].set('foo', 'baz');
}
equals(observer.callCount, 2, 'range observer should fire twice');

});

test(“does not observe object properties if isDeep is NO”, function() {

// remove unneeded observer
obj.destroy();

// use new observer
obj = SC.RangeObserver.create(source, indexes, observer, observer.rangeDidChange, "context", NO);

var len = source.length, idx;
for(idx=0;idx<len;idx++) {
  source[idx].set('foo', 'baz');
}
equals(observer.callCount, 0, 'range observer should not fire');

});

test(“SC.RangeObserver.create should accept methods specified as strings”, function() {

var myArray = [ SC.Object.create({ prop: 0 })],
    rangeObserverCount = 0,
    observer = SC.Object.create({
      rangeObserverDidFire: function(source, object, key, index) {
        ++rangeObserverCount;
      }
    }),
    rangeObserver = SC.RangeObserver.create( myArray, SC.IndexSet.create(0, 1),
                                             observer, 'rangeObserverDidFire',
                                             null, true /* isDeep */);

equals(rangeObserverCount, 0, "Range observer hasn't fired yet");
myArray[0].incrementProperty('prop');
equals(rangeObserverCount, 1, "Range observer should fire on property change");

});