// ========================================================================== // Project: SproutCore - JavaScript Application Framework // Copyright: ©2006-2011 Strobe Inc. and contributors. // portions copyright @2009 Apple Inc. // License: Licensed under MIT license (see license.js) // ========================================================================== var view, content1, content2 ; module("SC.CollectionView.nowShowing", { setup: function() { content1 = "a b c".w(); // stub in collection view to verify that proper method are called view = SC.CollectionView.create({ // updateContentRangeObserver updateContentRangeObserver: CoreTest.stub('updateContentRangeObserver'), // reload() reloadCallCount: 0, reloadIndexes: "not called", reload: function(indexes) { this.reloadIndexes = indexes ? indexes.frozenCopy() : indexes; this.reloadCallCount++; }, expectReload: function(indexes, callCount) { if (indexes !== NO) { var pass = (indexes === null) ? (this.reloadIndexes === null) : indexes.isEqual(this.reloadIndexes); if (!pass) { indexes.isEqual(this.reloadIndexes); } ok(pass, 'should have called reload(%@), actual reload(%@)'.fmt(indexes, this.reloadIndexes)); } if (callCount !== NO) { equals(this.reloadCallCount, callCount, 'reload() should be called X times'); } }, // GENERAL SUPPORT observer: CoreTest.stub('nowShowing observer').observes('nowShowing'), reset: function() { this.updateContentRangeObserver.reset(); this.reloadCallCount = 0 ; this.reloadIndexes = 'not called'; this.observer.reset(); }, nextNowShowing: SC.IndexSet.create(0,3), // override to reeturn whatever index set is in nextNowShowing property just // for testing. computeNowShowing: function() { return this.nextNowShowing; }, content: content1 }); // some observers will fire on creation because of the content. just // ignore them view.reset(); } }); // .......................................................... // GENERAL TESTS // test("nowShowing should reflect content on create", function() { same(view.get('nowShowing'), view.nextNowShowing, 'should have now showing value'); }); test("if nowShowing changes but actual value stays the same, should do nothing", function() { // trigger any observers view.notifyPropertyChange('nowShowing'); view.observer.expect(1); view.expectReload(NO, 0); view.updateContentRangeObserver.expect(0); }); test("nowShowing changes to new index set with some overlap", function() { view.nextNowShowing = SC.IndexSet.create(2,5); view.notifyPropertyChange('nowShowing'); view.observer.expect(1); // expect inverse of intersection view.expectReload(SC.IndexSet.create(0,2).add(3,4), 1); view.updateContentRangeObserver.expect(1); }); test("nowShowing changes to new index set with no overlap", function() { view.nextNowShowing = SC.IndexSet.create(10,3); view.notifyPropertyChange('nowShowing'); view.observer.expect(1); // union of both ranges view.expectReload(SC.IndexSet.create(0,3).add(10,3), 1); view.updateContentRangeObserver.expect(1); }); // .......................................................... // SPECIAL CASES // // Add any specific cases you find that break here