<!doctype html>
<html>
<head>
  <title>polymer-selector-multi</title>
  <script src="../../../platform/platform.js"></script>
  <script src="../../../tools/test/htmltest.js"></script>
  <script src="../../../tools/test/chai/chai.js"></script>
  <link rel="import" href="../../polymer-selector.html">
  <style>
    .polymer-selected {
      background: #ccc;
    }
  </style>
</head>
<body>

  <polymer-selector id="selector" multi>
    <div>Item 1</div>
    <div>Item 2</div>
    <div>Item 3</div>
    <div>Item 4</div>
    <div>Item 5</div>
  </polymer-selector>
  
  <script>
    var assert = chai.assert;
    
    function oneMutation(node, options, cb) {
      var o = new MutationObserver(function() {
        cb();
        o.disconnect();
      });
      o.observe(node, options);
    }
    
    document.addEventListener('polymer-ready', function() {
      //
      var s = document.querySelector('#selector');
      assert.equal(s.selected, null);
      assert.equal(s.selectedClass, 'polymer-selected');
      assert.isTrue(s.multi);
      assert.equal(s.valueattr, 'name');
      assert.equal(s.items.length, 5);
      // setup listener for polymer-select event
      var selectEventCounter = 0;
      s.addEventListener('polymer-select', function(e) {
        if (e.detail.isSelected) {
          selectEventCounter++;
        } else {
          selectEventCounter--;
        }
        // check selectedItem in polymer-select event
        assert.equal(this.selectedItem.length, selectEventCounter);
      });
      // set selected
      s.selected = [0, 2];
      Platform.flush();
      oneMutation(s, {attributes: true}, function() {
        // check polymer-select event
        assert.equal(selectEventCounter, 2);
        // check selected class
        assert.isTrue(s.children[0].classList.contains('polymer-selected'));
        assert.isTrue(s.children[2].classList.contains('polymer-selected'));
        // check selectedItem
        assert.equal(s.selectedItem.length, 2);
        assert.equal(s.selectedItem[0], s.children[0]);
        assert.equal(s.selectedItem[1], s.children[2]);
        // tap on already selected element should unselect it
        s.children[0].dispatchEvent(new CustomEvent('tap', {bubbles: true}));
        // check selected
        assert.equal(s.selected.length, 1);
        assert.isFalse(s.children[0].classList.contains('polymer-selected'));
        done();
      });
    });
  </script>
</body>
</html>
