// ==========================================================================
// 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)
// ==========================================================================

/*
  This test evaluates the creation of list item views with alternating rows
*/

module("SC.ListView - alternating rows");

// create a fake content array.  Generates a list with whatever length you
// want of objects with a title based on the index.  Cannot mutate.
var ContentArray = SC.Object.extend(SC.Array, {
  
  length: 0,
  
  objectAt: function(idx) {
    if (idx >= this.get('length')) return undefined;
    
    var content = this._content, ret ;
    if (!content) content = this._content = [];
    
    ret = content[idx];
    if (!ret) {
      ret = content[idx] = SC.Object.create({ 
        title: "ContentItem %@".fmt(idx)
      });
    }
    
    return ret ;
  }
});

var pane = SC.ControlTestPane.design()
  .add("basic-even", SC.ScrollView.design({
    layout: { left: 0, right: 0, top: 0, height: 180 },
    hasHorizontalScroller: NO,
    contentView: SC.ListView.design({
      content: ContentArray.create({ length: 10 }),
      showAlternatingRows: YES,
      rowHeight: 20
    })
  }))
  .add("basic-odd", SC.ScrollView.design({
    layout: { left: 0, right: 0, top: 0, height: 180 },
    hasHorizontalScroller: NO,
    contentView: SC.ListView.design({
      content: ContentArray.create({ length: 11 }),
      showAlternatingRows: YES,
      rowHeight: 20
    })
  }));
  
pane.show(); // add a test to show the test pane
window.pane = pane ;

function verifyClasses(views) {
  var evens = SC.IndexSet.create(0).addEach([2,4,6,8,10]);
  var odds = SC.IndexSet.create(1).addEach([3,5,7,9]);

  views.forEach(function(item) {
    var cq = item.$();
    var idx = item.get('contentIndex');

    if (evens.contains(idx)) {
      ok(!cq.hasClass('odd'), "item %@ doesn't have 'odd' CSS class".fmt(idx));
      ok(cq.hasClass('even'), "item %@ has 'even' CSS class".fmt(idx));
    }
    else if (odds.contains(idx)) {
      ok(cq.hasClass('odd'), "item %@ has 'odd' CSS class".fmt(idx));
      ok(!cq.hasClass('even'), "item %@ doesn't have 'even' CSS class".fmt(idx));
    }
  });
}

test("alternating class set on list view", function() {
  var listView = pane.view("basic-even").contentView;
  var cq = listView.$();
  
  ok(cq.hasClass('alternating'), "ListView instance should have 'alternating' CSS class");
});

test("even/odd classes on ListItemView children - even", function() {
  var items = pane.view("basic-even").contentView.childViews;
  verifyClasses(items);
});

test("even/odd classes on ListItemView children - odd", function() {
  items = pane.view("basic-odd").contentView.childViews;
  verifyClasses(items);
});

test("even/odd classes with incremental rendering - even", function() {
  var scrollView = pane.view("basic-even"),
      listView = scrollView.contentView,
      item = listView.childViews;
  
  SC.run(function() {
    scrollView.scrollTo(0,21);
  });
  
  verifyClasses(items);
  
  SC.run(function() {
    scrollView.scrollTo(0,0);
  });
  
  verifyClasses(items);
});

test("even/odd classes with incremental rendering - odd", function() {
  var scrollView = pane.view("basic-odd"),
      listView = scrollView.contentView,
      item = listView.childViews;
  
  SC.run(function() {
    scrollView.scrollTo(0,21);
  });
  
  verifyClasses(items);
  
  SC.run(function() {
    scrollView.scrollTo(0,0);
  });
  
  verifyClasses(items);
});