sort-data.js 3.29 KB
test( 'sort data', function() {

  'use strict';

  var iso = new Isotope( '#get-sort-data', {
    layoutMode: 'fitRows',
    getSortData: {
      ninjaTurtle: '[data-ninja-turtle]',
      fruit: 'span.fruit',
      b: 'b parseFloat',
      i: 'i parseInt',
      bbroke: 'b foobar'
    }
  });

  var item0 = iso.items[0];
  var item1 = iso.items[1];

  equal( item0.sortData.ninjaTurtle, 'leonardo', '[data-attr] shorthand' );
  equal( item0.sortData.fruit, 'watermelon', 'query selector shorthand' );
  equal( item0.sortData.b, 3.14, 'parseFloat parser' );
  equal( item0.sortData.i, 42, 'parseInt parser' );
  equal( item0.sortData.bbroke, '3.14', 'default nonparser' );

  // -----  ----- //

  var docElem = document.documentElement;
  var textSetter = docElem.textContent !== undefined ? 'textContent' : 'innerText';

  function setText( elem, value ) {
    elem[ textSetter ] = value;
  }

  var elem0 = iso.items[0].element;
  var elem1 = iso.items[1].element;

  elem0.setAttribute( 'data-ninja-turtle', 'donatello' );
  setText( elem0.querySelector('span.fruit'), 'mango' );
  setText( elem0.querySelector('b'), '7.24' );
  setText( elem0.querySelector('i'), 'foo' );

  iso.updateSortData( elem0 );

  var message = ', after updateSortData on single item'
  equal( item0.sortData.ninjaTurtle, 'donatello', '[data-attr] shorthand' + message );
  equal( item0.sortData.fruit, 'mango', 'query selector shorthand' + message );
  equal( item0.sortData.b, 7.24, 'parseFloat parser' + message );
  ok( isNaN( item0.sortData.i ), 'parseInt parser' + message );
  equal( item0.sortData.bbroke, '7.24', 'default nonparser' + message );

  // ----- update all items ----- //

  elem0.setAttribute( 'data-ninja-turtle', 'leonardo' );
  setText( elem0.querySelector('span.fruit'), 'passion fruit' );

  elem1.setAttribute( 'data-ninja-turtle', 'michelangelo' );
  setText( elem1.querySelector('span.fruit'), 'starfruit' );

  // update all
  iso.updateSortData();

  message = ', after updateSortData on all items'
  equal( item0.sortData.ninjaTurtle, 'leonardo', '[data-attr] shorthand' + message );
  equal( item0.sortData.fruit, 'passion fruit', 'query selector shorthand' + message );
  equal( item1.sortData.ninjaTurtle, 'michelangelo', '[data-attr] shorthand' + message );
  equal( item1.sortData.fruit, 'starfruit', 'query selector shorthand' + message );

  // ----- no items ----- //

  iso.options.itemSelector = 'none';
  iso.reloadItems();

  iso.updateSortData();
  ok( true, 'updateSortData on empty container is ok' );

  iso.updateSortData( document.createElement('div') );
  ok( true, 'updateSortData with non-item is ok, with no child items' );

  iso.updateSortData( false );
  ok( true, 'updateSortData with falsy is ok, with no child items' );

  iso.updateSortData( [] );
  ok( true, 'updateSortData with empty array is ok, with no child items' );

  iso.updateSortData( jQuery() );
  ok( true, 'updateSortData with empty jQuery object is ok, with no child items' );

  // ----- bad getSortData ----- //

  delete iso.options.itemSelector;
  iso.options.getSortData.badQuery = 'bad-query';
  iso.options.getSortData.badAttr = '[bad-attr]';
  iso._getSorters();
  iso.reloadItems();

  item0 = iso.items[0];

  equal( item0.sortData.badQuery, null, 'bad query returns null' );
  equal( item0.sortData.badAttr, null, 'bad attr returns null' );

});