<!doctype html> <!– @license Copyright © 2016 The Polymer Project Authors. All rights reserved. This code may only be used under the BSD style license found at polymer.github.io/LICENSE.txt The complete set of authors may be found at polymer.github.io/AUTHORS.txt The complete set of contributors may be found at polymer.github.io/CONTRIBUTORS.txt Code distributed by Google as part of the polymer project is also subject to an additional IP rights grant found at polymer.github.io/PATENTS.txt –>

<html> <head>

<title>iron-selector attr-for-selected</title>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0">

<script src="../../webcomponentsjs/webcomponents-lite.js"></script>
<script src="../../web-component-tester/browser.js"></script>
<script src="../../test-fixture/test-fixture-mocha.js"></script>

<link rel="import" href="../../test-fixture/test-fixture.html">
<link rel="import" href="../../iron-test-helpers/iron-test-helpers.html">

<link rel="import" href="../iron-selector.html">
<link rel="import" href="attr-for-selected-elements.html">

<style>
  .iron-selected {
    background: #ccc;
  }

  .my-selected {
    background: red;
  }
</style>

</head> <body>

<test-fixture id="inlineAttributes">
  <template>
    <iron-selector attr-for-selected="some-attr">
      <div some-attr="value0">Item 0</div>
      <div some-attr="value1">Item 1</div>
      <div some-attr="value2">Item 2</div>
    </iron-selector>
  </template>
</test-fixture>

<test-fixture id="reflectedProperties">
  <template>
    <iron-selector attr-for-selected="some-attr">
      <attr-reflector>Item 0</attr-reflector>
      <attr-reflector>Item 1</attr-reflector>
      <attr-reflector>Item 2</attr-reflector>
    </iron-selector>
  </template>
</test-fixture>

<test-fixture id="mixedPropertiesAndAttributes">
  <template>
    <iron-selector attr-for-selected="some-attr">
      <attr-reflector>Item 0</attr-reflector>
      <attr-reflector>Item 1</attr-reflector>
      <div some-attr="value2">Item 2</div>
      <div some-attr="value3">Item 3</div>
      <attr-reflector>Item 4</attr-reflector>
      <div some-attr="value5">Item 5</div>
    </iron-selector>
  </template>
</test-fixture>

<test-fixture id="defaultAttribute">
  <template>
    <iron-selector attr-for-selected="some-attr" fallback-selection="default">
      <div some-attr="value0">Item 0</div>
      <div some-attr="value1">Item 1</div>
      <div some-attr="default">Item 2</div>
    </iron-selector>
  </template>
</test-fixture>

<script>
  suite('inline attributes', function() {
    var selector;
    var items;

    setup(function () {
      selector = fixture('inlineAttributes');
      items = Array.prototype.slice.apply(selector.querySelectorAll('div[some-attr]'));
    });

    test('selecting value programatically selects correct item', function() {
      selector.select('value1');
      assert.equal(selector.selectedItem, items[1]);
    });

    test('selecting item sets the correct selected value', function(done) {
      MockInteractions.downAndUp(items[2], function() {
        assert.equal(selector.selected, 'value2');
        done();
      });
    });
  });

  suite('reflected properties as attributes', function() {
    var selector;
    var items;

    setup(function () {
      selector = fixture('reflectedProperties');
      items = Array.prototype.slice.apply(selector.querySelectorAll('attr-reflector'));
      for (var i = 0; i < items.length; i++) {
        items[i].someAttr = "value" + i;
      }
    });

    test('selecting value programatically selects correct item', function() {
      selector.select('value1');
      assert.equal(selector.selectedItem, items[1]);
    });

    test('selecting item sets the correct selected value', function(done) {
      MockInteractions.downAndUp(items[2], function() {
        assert.equal(selector.selected, 'value2');
        done();
      });
    });
  });

  suite('mixed properties and inline attributes', function() {
    var selector;
    var items;

    setup(function () {
      selector = fixture('mixedPropertiesAndAttributes');
      items = Array.prototype.slice.apply(selector.querySelectorAll('attr-reflector, div[some-attr]'));
      for (var i = 0; i < items.length; i++) {
        items[i].someAttr = "value" + i;
      }
    });

    test('selecting value programatically selects correct item', function() {
      for (var i = 0; i < items.length; i++) {
        selector.select('value' + i);
        assert.equal(selector.selectedItem, items[i]);
      }
    });

    test('selecting item sets the correct selected value', function(done) {
      var i = 0;

      function testSelectItem(i) {
        if (i >= items.length) {
          done();
          return;
        }

        MockInteractions.downAndUp(items[i], function() {
          assert.equal(selector.selected, 'value' + i);

          testSelectItem(i + 1);
        });
      }

      testSelectItem(i);
    });
  });

  suite('default attribute', function() {
    var selector;
    var items;

    setup(function () {
      selector = fixture('defaultAttribute');
      items = Array.prototype.slice.apply(selector.querySelectorAll('div[some-attr]'));
    });

    test('setting non-existing value sets default', function() {
      selector.select('non-existing-value');
      assert.equal(selector.selected, 'default');
      assert.equal(selector.selectedItem, items[2]);
    });

    test('setting non-existing value sets default', function() {
      selector.multi = true;
      selector.select(['non-existing-value']);
      assert.deepEqual(selector.selectedValues, ['default']);
      assert.deepEqual(selector.selectedItems, [items[2]]);
    });

    test('default not used when there was at least one match', function() {
      selector.multi = true;
      selector.selectedValues = ['non-existing-value', 'value0'];
      assert.deepEqual(selector.selectedValues, ['non-existing-value', 'value0']);
      assert.deepEqual(selector.selectedItems, [items[0]]);
    });

    test('default element not found does not result in infinite loop', function() {
      selector.fallbackSelection = 'non-existing-fallback';
      selector.select('non-existing-value');
      assert.equal(selector.selectedItem, undefined);
      selector.multi = true;
      selector.selectedValues = ['non-existing-value'];
      assert.deepEqual(selector.selectedItems, [undefined]);
      selector.fallbackSelection = 'default';
      assert.deepEqual(selector.selectedItems, [items[2]]);
    });

    test('selection is updated after fallback is set', function() {
      selector.fallbackSolution = undefined;
      selector.select('non-existing-value');
      selector.fallbackSelection = 'default';
      assert.equal(selector.selectedItem, items[2]);
    });

    test('multi-selection is updated after fallback is set', function() {
      selector.fallbackSolution = undefined;
      selector.selectedValues = ['non-existing-value'];
      selector.fallbackSolution = 'default';
      assert.equal(selector.selectedItem, items[2]);
    });
  });
</script>

</body> </html>