// ========================================================================== // Project: SproutCore - JavaScript Application Framework // Copyright: ©2006-2009 Sprout Systems, Inc. and contributors. // portions copyright @2009 Apple Inc. // License: Licened 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 }); }); module("SC.CollectionView.select", { setup: function() { view = SC.CollectionView.create({ content: content }); } }); // .......................................................... // BASIC OPERATIONS // test("return value", function() { equals(view.select(3), view, 'should return receiver') ; }); test("calling select(indexes=Number)", function() { view.select(3); var expected = SC.SelectionSet.create().add(content, 3), actual = view.get('selection'); ok(expected.isEqual(actual), 'selection should have index only (expected: %@ actual: %@)'.fmt(expected, actual)); }); test("calling select(indexes=Number, extend=YES)", function() { var base = SC.SelectionSet.create().add(content, 3,3), next = 1, expected = base.copy().add(content, next), actual; view.select(SC.IndexSet.create(3,3)); actual = view.get('selection'); ok(base.isEqual(actual), 'precond - should have base selection (expected: %@ actual: %@)'.fmt(expected, actual)); view.select(1, YES); actual = view.get('selection'); ok(expected.isEqual(actual), 'selection should add set to existing selection (expected: %@ actual: %@)'.fmt(expected, actual)); }); test("calling select(indexes=SC.IndexSet)", function() { var expected = SC.SelectionSet.create().add(content, 3,3), actual; view.select(SC.IndexSet.create(3,3)); actual = view.get('selection'); ok(expected.isEqual(actual), 'selection should have passed index set only (expected: %@ actual: %@)'.fmt(expected, actual)); }); test("calling select(indexes=SC.IndexSet, extend=YES)", function() { var base = SC.SelectionSet.create().add(content,3,3), next = SC.SelectionSet.create().add(content,0,2), expected = base.copy().add(content, 0,2), actual; view.select(SC.IndexSet.create(3,3)); actual = view.get('selection'); ok(base.isEqual(actual), 'precond - should have base selection (expected: %@ actual: %@)'.fmt(base, actual)); var indexes = SC.IndexSet.create(0,2); view.select(indexes, YES); actual = view.get('selection'); ok(expected.isEqual(actual), 'selection should add set to existing selection (expected: %@ actual: %@)'.fmt(expected, actual)); }); test("calling select(indexes=null)", function() { view.select(SC.IndexSet.create(4,2)); view.select(null); var expected = SC.SelectionSet.create(), actual = view.get('selection'); ok(expected.isEqual(actual), 'selection should be empty (expected: %@ actual: %@)'.fmt(expected, actual)); }); // .......................................................... // DELEGATE TESTS // var del; module("SC.CollectionView.select - delegate support", { setup: function() { del = SC.Object.create(SC.CollectionViewDelegate); view = SC.CollectionView.create({ delegate: del, content: content }); } }); test("should call delegate if set", function() { var callCount1 = 0, callCount2 = 0 ; del.collectionViewShouldSelectIndexes = function(v, indexes, extend) { callCount1++; return indexes; }; del.collectionViewSelectionForProposedSelection = function(v, indexes) { callCount2++; return indexes ; }; view.select(3); equals(callCount1, 1, 'should invoke collectionViewShouldSelectIndexes on delegate 1x'); equals(callCount2, 1, 'should invoke collectionViewSelectionForProposedSelection on delegate 1x if change is allowed'); }); test("calling collectionViewSelectionForProposedSelection if collectionViewShouldSelectIndexes returns null", function() { var callCount1 = 0, callCount2 = 0 ; del.collectionViewShouldSelectIndexes = function(v, indexes, extend) { callCount1++; return null; }; del.collectionViewSelectionForProposedSelection = function(v, indexes) { callCount2++; return indexes ; }; view.select(3); equals(callCount1, 1, 'should invoke collectionViewShouldSelectIndexes on delegate 1x'); equals(callCount2, 0, 'should NOT invoke collectionViewSelectionForProposedSelection on delegate since no change was allowed'); }); test("del.collectionViewShouldSelectIndexes - replacing selection", function() { del.collectionViewShouldSelectIndexes = function(v, indexes, extend) { return indexes.without(3); }; view.select(SC.IndexSet.create(0,4)); var expected = SC.SelectionSet.create().add(content, 0,4).remove(content,3), actual = view.get('selection'); ok(expected.isEqual(actual), 'selection should only include those allowed by delegate (i.e. not index 3) (expected: %@ actual: %@)'.fmt(expected, actual)); }); test("del.collectionViewShouldSelectIndexes - extending selection", function() { del.collectionViewShouldSelectIndexes = function(v, indexes, extend) { return indexes.without(3); }; view.select(SC.IndexSet.create(0,4)); view.select(SC.IndexSet.create(3,3), YES); var expected = SC.SelectionSet.create().add(content,0,6).remove(content,3), actual = view.get('selection'); ok(expected.isEqual(actual), 'selection should extend only those allowed by delegate (i.e. not index 3) (expected: %@ actual: %@)'.fmt(expected, actual)); }); test("del.collectionViewShouldSelectIndexes - returns empty index set", function() { del.collectionViewShouldSelectIndexes = function(v, indexes, extend) { return indexes.without(3); }; view.select(2); view.select(3); // should be ignored var expected = SC.SelectionSet.create().add(content,2), actual = view.get('selection'); ok(expected.isEqual(actual), 'selection should not change if delegate does not allow any proposed selected indexes (expected: %@ actual: %@)'.fmt(expected, actual)); }); test("del.collectionViewShouldSelectIndexes - delegate returns null", function() { view.select(2); del.collectionViewShouldSelectIndexes = function(v, indexes, extend) { return null; }; view.select(10); // should be ignored var expected = SC.SelectionSet.create().add(content,2), actual = view.get('selection'); ok(expected.isEqual(actual), 'selection should not change if delegate returns null (expected: %@ actual: %@)'.fmt(expected, actual)); }); test("del.collectionViewSelectionForProposedSelection - returns indexes", function() { del.collectionViewSelectionForProposedSelection = function(v, indexes) { var expected = SC.SelectionSet.create().add(content,10), actual = indexes; ok(expected.isEqual(actual), 'should pass proposed selection to delegate (expected: %@ actual: %@)'.fmt(expected, actual)); equals(v, view, 'should pass view to delegate'); return SC.SelectionSet.create().add(content,10,20); }; view.select(10); // should be ignored var expected = SC.SelectionSet.create().add(content,10,20), actual = view.get('selection'); ok(expected.isEqual(actual), 'should set selection to whatever is returned from delegate (expected: %@ actual: %@)'.fmt(expected, actual)); }); test("del.collectionViewSelectionForProposedSelection - returns null", function() { del.collectionViewSelectionForProposedSelection = function(v, indexes, extend) { return null; }; view.select(10); // should be ignored var expected = SC.SelectionSet.create(), actual = view.get('selection'); ok(expected.isEqual(actual), 'should set selection to empty set if returns null (expected: %@ actual: %@)'.fmt(expected, actual)); });