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

var view, sel, beforeLen, afterLen, content ;

module("SC.CollectionView.deleteSelection", {
  setup: function() {

    content = "1 2 3 4 5 6 7 8 9 10".w().map(function(x) {
      return SC.Object.create({ title: x });
    });

    sel  = SC.SelectionSet.create().add(content,4,2);

    view = SC.CollectionView.create({
      content: content,
      selection: sel,
      canDeleteContent: YES
    });
    
    beforeLen = content.get('length');
    afterLen  = beforeLen - sel.get('length');
  }
});

// ..........................................................
// BASIC OPERATIONS
// 

test("canDeleteContent", function() {
  
  view.set('canDeleteContent', NO);
  equals(view.deleteSelection(), NO, 'should return NO if not allowed');
  equals(content.get('length'), beforeLen, 'content.length should not change');
  equals(view.get('selection').get('length'), 2, 'should not change selection');
  
  view.set('canDeleteContent', YES);
  equals(view.deleteSelection(), YES, 'should return YES if allowed');
  equals(content.get('length'), afterLen, 'content.length should change');
  equals(view.get('selection').indexSetForSource(content).get('min'), 3, 'should select an adjacent item');
});

test("empty selection case", function() {
  view.select(null); // clear selection
  view.set('canDeleteContent', YES);
  equals(view.get('selection').get('length'), 0, 'precond - should have empty selection');

  equals(view.deleteSelection(), NO, 'should return NO if not allowed');
  equals(content.get('length'), beforeLen, 'content.length should not change');
});

test("delegate.collectionViewShouldDeleteIndexes", function() {
  view.set('canDeleteContent', YES);
  view.delegate = SC.Object.create(SC.CollectionViewDelegate, {
    
    v: null,
    
    collectionViewShouldDeleteIndexes: function() { return this.v; }
  });

  // delegate returns NO
  equals(view.deleteSelection(), NO, 'should return NO if not allowed');
  equals(content.get('length'), beforeLen, 'content.length should not change');
  equals(view.get('selection').get('length'), 2, 'should not change selection');
  
  // delegate returns partial
  view.delegate.v = SC.IndexSet.create(4,1);
  equals(view.get('selectionDelegate'), view.delegate, 'selection delegate should be delegate object');
  equals(view.deleteSelection(), YES, 'should return YES if allowed');
  equals(content.get('length'), afterLen+1, 'content.length should change');
  equals(view.get('selection').get('length'), 1, 'non-deleted parts should remain selected %@'.fmt(view.get('selection')));
});

// ..........................................................
// EDGE CASES
// 

// Add special edge cases here