blossom
Version:
Modern, Cross-Platform Application Framework
142 lines (103 loc) • 4.48 kB
JavaScript
// ==========================================================================
// 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 ;
var content = "1 2 3 4 5 6 7 8 9 10".w().map(function(x) {
return SC.Object.create({ title: x });
});
suite("SC.CollectionView.selection", {
setup: function() {
view = SC.CollectionView.create({
isVisibleInWindow: true, // force render
content: content
});
}
});
/*
Helper method to validate that the item views in the view have the
proper selection state. Pass in the collection view and the selection.
@param {SC.CollectionView} view the view to test
@param {SC.IndexSet} sel the index set
@param {String} testName the name of the test
@returns {void}
*/
function verifySelection(view, sel, testName) {
var childViews = view.get('childViews'),
len = childViews.get('length'),
idx, itemView, expected, actual ;
if (!testName) testName = '';
equals(len, view.get('nowShowing').get('length'), '%@ precond - must have childViews for each nowShowing'.fmt(testName));
for(idx=0;idx<len;idx++) {
itemView = childViews[idx];
ok(!SC.none(itemView.contentIndex), '%@ precond - itemView[%@] must have contentIndex'.fmt(testName, idx));
expected = sel.contains(itemView.contentIndex);
actual = itemView.get('isSelected');
equals(actual, expected, '%@ itemView[%@].isSelected should match selection(%@)'.fmt(testName, idx, sel));
}
}
// ..........................................................
// SELECTION SYNCING WITH ITEM VIEWS
//
test("item views should have proper isSelected state on reload", function() {
var sel = SC.IndexSet.create(3,2).add(8),
set = SC.SelectionSet.create().add(view.get('content'), sel);
view.set('selection', set);
SC.run(function() { view.reload(); }); // make sure it loads
verifySelection(view, sel);
});
test("item views should update isSelected state when selection property changes", function() {
var sel1 = SC.IndexSet.create(3,2),
sel2 = SC.IndexSet.create(8);
view.set('selection',SC.SelectionSet.create().add(view.content, sel1));
SC.run(function() { view.reload(); });
verifySelection(view, sel1, 'before');
SC.run(function() {
view.set('selection',SC.SelectionSet.create().add(view.content, sel2));
});
verifySelection(view, sel2, 'after');
});
test("item views should not update isSelected state when old index set selection changes", function() {
var sel1 = SC.IndexSet.create(3,2),
sel2 = SC.IndexSet.create(8);
view.set('selection',SC.SelectionSet.create().add(view.content, sel1));
SC.run(function() { view.reload(); });
SC.run(function() {
view.set('selection', SC.SelectionSet.create().add(view.content, sel2));
});
verifySelection(view, sel2, 'before');
SC.run(function() { sel1.add(10).remove(8); });
verifySelection(view, sel2, 'after');
});
test("item views should update isSelected state when selection index set is modified", function() {
var sel = SC.IndexSet.create(3,2),
content = view.get('content'),
set = SC.SelectionSet.create().add(content, sel);
view.set('selection',set);
SC.run(function() { view.reload(); });
verifySelection(view, sel, 'before');
SC.run(function() { set.add(content, 8).remove(content, 4); });
verifySelection(view, SC.IndexSet.create(3).add(8), 'after');
});
// ..........................................................
// SPECIAL CASES
//
test("reloading some items should still update selection properly", function() {
var sel1 = SC.IndexSet.create(3,2),
sel2 = SC.IndexSet.create(4,2).add(8);
view.set('selection',SC.SelectionSet.create().add(view.content, sel1));
SC.run(function() { view.reload(); });
SC.run(function() {
view.reload(SC.IndexSet.create(4).add(8));
view.set('selection', SC.SelectionSet.create().add(view.content, sel2));
});
verifySelection(view, sel2, 'after');
});
test("select() should round trip", function() {
var sel = SC.IndexSet.create(3,2);
SC.run(function() { view.reload(); }); // make sure view is all ready
SC.run(function() { view.select(sel); });
verifySelection(view, sel);
});