<!doctype html>
<!--
@license
Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
The complete set of contributors may be found at http://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 http://polymer.github.io/PATENTS.txt
-->
<html>
  <head>
    <title>iron-image</title>

    <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="../../polymer/polymer.html">
    <link rel="import" href="../../test-fixture/test-fixture.html">
    <link rel="import" href="../iron-image.html">

    <style is="custom-style">
      .fixed-width-container {
        width: 500px;
      }

      .fixed-width-container iron-image {
        width: 100%;
        --iron-image-width: 100%;
      }

      .fixed-height-container {
        height: 500px;
      }

      .fixed-height-container iron-image {
        height: 100%;
        --iron-image-height: 100%;
      }
    </style>
  </head>
  <body>
    <test-fixture id="TrivialImage">
      <template>
        <iron-image></iron-image>
      </template>
    </test-fixture>

    <test-fixture id="FixedWidthContainer">
      <template>
        <div class="fixed-width-container">
          <iron-image></iron-image>
        </div>
      </template>
    </test-fixture>

    <test-fixture id="FixedHeightContainer">
      <template>
        <div class="fixed-height-container">
          <iron-image></iron-image>
        </div>
      </template>
    </test-fixture>

    <script>
      suite('<iron-image>', function() {
        function randomImageUrl () {
          return '../demo/polymer.svg?' + Math.random();
        }

        var image;

        suite('basic behavior', function() {
          setup(function() {
            image = fixture('TrivialImage');
          });

          test('loading, loaded, error are false before any src is set', function() {
            expect(image.loading).to.be.eql(false);
            expect(image.loaded).to.be.eql(false);
            expect(image.error).to.be.eql(false);
          });

          test('loading, loaded, error are false when src is set to empty string', function(done) {
            image.addEventListener('loaded-changed', function onLoadedChanged() {
              if (image.loaded) {
                image.removeEventListener('loaded-changed', onLoadedChanged);
                image.addEventListener('loaded-changed', function onLoadedChanged2() {
                  image.removeEventListener('loaded-changed', onLoadedChanged2);

                  expect(image.loading).to.be.eql(false);
                  expect(image.loaded).to.be.eql(false);
                  expect(image.error).to.be.eql(false);
                  done();
                });

                expect(image.loading).to.be.eql(false);
                expect(image.loaded).to.be.eql(true);
                expect(image.error).to.be.eql(false);
                image.src = '';
              }
            });
            image.src = randomImageUrl();
          });

          test('can load images given a src', function(done) {
            image.addEventListener('loaded-changed', function onLoadedChanged() {
              image.removeEventListener('loaded-changed', onLoadedChanged);

              try {
                expect(image.loaded).to.be.eql(true);
                done();
              } catch (e) {
                done(e);
              }
            });
            image.src = randomImageUrl();
          });

          test('will reload images when src changes', function(done) {
            var loadCount = 0;

            image.addEventListener('loaded-changed', function onLoadedChanged() {
              if (image.loaded === true) {
                loadCount++;

                if (loadCount === 2) {
                  image.removeEventListener('loaded-changed', onLoadedChanged);
                  done();
                } else {
                  image.src = randomImageUrl();
                }
              }
            });

            image.src = randomImageUrl();
          });

          test('error property is set when the image fails to load', function(done) {
            image.addEventListener('error-changed', function onErrorChanged() {
              assert(image.error, 'image has error property set');
              image.removeEventListener('error-changed', onErrorChanged);
              done();
            });

            image.src = '/this_image_should_not_exist.jpg';
          });

          // Test for PolymerElements/iron-image#16.
          test('placeholder is hidden after loading when src is changed from invalid to valid', function(done) {
            image.preload = true;

            image.addEventListener('error-changed', function onErrorChanged() {
              image.removeEventListener('error-changed', onErrorChanged);

              assert.equal(image.loading, false, 'errored image loading = false');
              assert.equal(image.loaded, false, 'errored image loaded = false');
              assert.equal(image.error, true, 'errored image error = true');

              image.addEventListener('loaded-changed', function onLoadedChanged() {
                if (!image.loaded) return;

                image.removeEventListener('loaded-changed', onLoadedChanged);

                assert.equal(image.loading, false, 'ok image loading = false');
                assert.equal(image.loaded, true, 'ok image loaded = true');
                assert.equal(image.error, false, 'ok image error = false');
                assert.equal(getComputedStyle(image.$.placeholder).display, 'none', 'placeholder has style.display = none');

                done();
              });

              image.src = randomImageUrl();
            });

            image.src = '/this_image_should_not_exist.jpg';
          });

          // Test for PolymerElements/iron-image#23.
          test('image is not shown below placeholder if previous image was loaded with' +
               ' sizing on and current image fails to load', function(done) {
            image.preload = true;
            image.sizing = 'cover';

            image.addEventListener('loaded-changed', function onLoadedChanged() {
              if (!image.loaded) return;
              image.removeEventListener('loaded-changed', onLoadedChanged);

              assert.notEqual(getComputedStyle(image.$.sizedImgDiv).backgroundImage, 'none', 'image visible after successful load');
              assert.equal(getComputedStyle(image.$.placeholder).display, 'none', 'placeholder hidden after successful load');

              image.addEventListener('error-changed', function onErrorChanged() {
                if (!image.error) return;
                image.removeEventListener('error-changed', onErrorChanged);

                assert.equal(getComputedStyle(image.$.sizedImgDiv).backgroundImage, 'none', 'image hidden after failed load');
                assert.notEqual(getComputedStyle(image.$.placeholder).display, 'none', 'placeholder visible after failed load');

                done();
              });

              image.src = '/this_image_should_not_exist.jpg';
            });

            image.src = randomImageUrl();
          });
        });

        suite('--iron-image-width, --iron-image-height', function() {
          var fixedWidthContainer;
          var fixedWidthIronImage;
          var fixedHeightContainer;
          var fixedHeightIronImage;

          setup(function() {
            fixedWidthContainer = fixture('FixedWidthContainer');
            fixedWidthIronImage = fixedWidthContainer.querySelector('iron-image');
            fixedHeightContainer = fixture('FixedHeightContainer');
            fixedHeightIronImage = fixedHeightContainer.querySelector('iron-image');
          });

          test('100% width image fills container', function(done) {
            fixedWidthIronImage.$.img.addEventListener('load', function onLoadedChanged(e) {
              fixedWidthIronImage.$.img.removeEventListener('load', onLoadedChanged);
              Polymer.updateStyles();

              var containerRect = fixedWidthContainer.getBoundingClientRect();
              var ironImageRect = fixedWidthIronImage.getBoundingClientRect();
              var wrappedImageRect = fixedWidthIronImage.$.img.getBoundingClientRect();

              expect(containerRect.width).to.be.closeTo(500, 0.5);
              expect(ironImageRect.width).to.be.closeTo(500, 0.5);
              expect(wrappedImageRect.width).to.be.closeTo(500, 0.5);

              done();
            });

            fixedWidthIronImage.src = randomImageUrl();
          });

          test('100% height image fills container', function(done) {
            fixedHeightIronImage.$.img.addEventListener('load', function onLoadedChanged(e) {
              fixedHeightIronImage.$.img.removeEventListener('load', onLoadedChanged);
              Polymer.updateStyles();

              var containerRect = fixedHeightContainer.getBoundingClientRect();
              var ironImageRect = fixedHeightIronImage.getBoundingClientRect();
              var wrappedImageRect = fixedHeightIronImage.$.img.getBoundingClientRect();

              expect(containerRect.height).to.be.closeTo(500, 0.5);
              expect(ironImageRect.height).to.be.closeTo(500, 0.5);
              expect(wrappedImageRect.height).to.be.closeTo(500, 0.5);

              done();
            });

            fixedHeightIronImage.src = randomImageUrl();
          });
        });

        suite('accessibility', function() {
          suite('sizing inactive', function() {
            var image;

            setup(function() {
              image = fixture('TrivialImage');
            });

            test('#sizedImgDiv is hidden', function() {
              var sizedImgDivStyle = window.getComputedStyle(image.$.sizedImgDiv);
              assert.strictEqual(sizedImgDivStyle.display, 'none');
            });

            test('img has no alt text by default', function() {
              assert.isFalse(image.$.img.hasAttribute('alt'));
            });

            test('img alt text is empty string when iron-image alt text is empty string', function() {
              image.alt = '';

              assert.isTrue(image.$.img.hasAttribute('alt'));
              assert.strictEqual(image.$.img.getAttribute('alt'), '');
            });

            test('img alt text matches iron-image alt text when defined', function() {
              image.alt = 'alt text value';

              assert.isTrue(image.$.img.hasAttribute('alt'));
              assert.strictEqual(image.$.img.getAttribute('alt'), 'alt text value');
            });
          });

          suite('sizing active', function() {
            var image;

            setup(function() {
              image = fixture('TrivialImage');
              image.sizing = 'cover';
            });

            test('inner img is hidden', function() {
              var imgStyle = window.getComputedStyle(image.$.img);
              assert.strictEqual(imgStyle.display, 'none');
            });

            test('#sizedImgDiv has empty aria-label text by default', function() {
              assert.isTrue(image.$.sizedImgDiv.hasAttribute('aria-label'));
              assert.strictEqual(image.$.sizedImgDiv.getAttribute('aria-label'), '');
            });

            test('#sizedImgDiv has aria-hidden when iron-image alt text is empty string', function() {
              image.alt = '';

              assert.isTrue(image.$.sizedImgDiv.hasAttribute('aria-hidden'));
              var hiddenValue = image.$.sizedImgDiv.getAttribute('aria-hidden');
              assert.isTrue(hiddenValue === '' || hiddenValue === 'true');
            });

            test('#sizedImgDiv aria-label matches iron-image alt text when defined', function() {
              image.alt = 'alt text value';

              assert.isTrue(image.$.sizedImgDiv.hasAttribute('aria-label'));
              assert.strictEqual(image.$.sizedImgDiv.getAttribute('aria-label'), 'alt text value');
            });

            test('#sizedImgDiv aria-label text is last path component of src when iron-image alt text is undefined', function() {
              image.src = '/some/path.components/file.jpg?a=b&c=d#anchor';

              assert.isTrue(image.$.sizedImgDiv.hasAttribute('aria-label'));
              assert.strictEqual(image.$.sizedImgDiv.getAttribute('aria-label'), 'file.jpg');
            });
          });
        });
      });
    </script>
  </body>
</html>
