1f244194创建于 2024年12月9日历史提交
import {spy as sinonSpy} from 'sinon';
import ImageWrapper, {
  decode,
  decodeFallback,
  listenImage,
  load,
} from '../../../../src/ol/Image.js';
import ImageState from '../../../../src/ol/ImageState.js';

const dataUri =
  'data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==';

describe('ol/Image', function () {
  const extent = [0, 0, 1, 1];
  const resolution = 1;
  const pixelRatio = 1;
  describe('constructor', function () {
    it('creates a new instance with image state', function () {
      const instance = new ImageWrapper(
        extent,
        resolution,
        pixelRatio,
        ImageState.IDLE,
      );
      expect(instance).to.be.an(ImageWrapper);
      expect(instance.getState()).to.be(ImageState.IDLE);
    });
    it('creates a new instance with a loader', function (done) {
      let instance = undefined;
      const image = new Image();
      const loader = (extent, resolution, pixelRatio) => {
        expect(extent).to.eql([0, 0, 1, 1]);
        expect(resolution).to.be(1);
        expect(pixelRatio).to.be(1);
        image.src =
          'data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==';
        instance.setImage(image);
        return load(image);
      };
      instance = new ImageWrapper(extent, resolution, pixelRatio, loader);
      expect(instance).to.be.an(ImageWrapper);
      expect(instance.getState()).to.be(ImageState.IDLE);
      instance.addEventListener('change', function handleChange() {
        if (instance.getState() === ImageState.LOADED) {
          instance.removeEventListener('change', handleChange);
          expect(instance.getImage()).to.be(image);
          done();
        }
      });
      instance.load();
    });
  });
  describe('HTML Image loading', function () {
    let handleLoad, handleError, img;

    beforeEach(function () {
      handleLoad = sinonSpy();
      handleError = sinonSpy();
      img = new Image();
    });

    it('handles load event', function (done) {
      img.src = 'spec/ol/data/dot.png';
      listenImage(img, handleLoad, handleError);

      setTimeout(function () {
        expect(handleLoad.called).to.be(true);
        expect(handleError.called).to.be(false);
        done();
      }, 200);
    });

    it('handles load event when src is set later', function (done) {
      listenImage(img, handleLoad, handleError);
      img.src = 'spec/ol/data/dot.png';

      setTimeout(function () {
        expect(handleLoad.called).to.be(true);
        expect(handleError.called).to.be(false);
        done();
      }, 200);
    });

    it('handles error event', function (done) {
      img.src = 'invalid.jpeg';
      listenImage(img, handleLoad, handleError);

      setTimeout(function () {
        expect(handleLoad.called).to.be(false);
        expect(handleError.called).to.be(true);
        done();
      }, 500);
    });

    it('handles cancelation', function (done) {
      img.src = 'spec/ol/data/dot.png';
      listenImage(img, handleLoad, handleError)();

      setTimeout(function () {
        expect(handleLoad.called).to.be(false);
        expect(handleError.called).to.be(false);
        done();
      }, 200);
    });
  });

  describe('Promise based loading', function () {
    let image;
    this.beforeEach(function () {
      image = new Image();
    });
    it('load()', async () => {
      image.src = dataUri;
      const loadedImage = await load(image);
      expect(loadedImage).to.eql(image);
      expect(loadedImage.width).to.be(1);
    });
    it('load() with error', async () => {
      image.src = 'invalid.jpeg';
      try {
        await load(image);
        expect().fail();
      } catch (error) {
        expect(error).to.be.an(Error);
      }
    });
    it('decodeFallback()', async () => {
      image.src = dataUri;
      const loadedImage = await decodeFallback(image);
      expect(loadedImage).to.eql(image);
      expect(loadedImage.width).to.be(1);
    });
    it('decodeFallback() with error', async () => {
      image.src = 'invalid.jpeg';
      try {
        await decodeFallback(image);
        expect().fail();
      } catch (error) {
        expect(error).to.be.an(Error);
      }
    });
    it('decode()', async () => {
      image.src = dataUri;
      const loadedImage = await decode(image);
      expect(loadedImage).to.be.an(ImageBitmap);
      expect(loadedImage.width).to.be(1);
    });
    it('decode() with error', async () => {
      image.src = 'invalid.jpeg';
      try {
        await decode(image);
        expect().fail();
      } catch (error) {
        expect(error).to.be.an(Error);
      }
    });
    it('decode() with SVG', async () => {
      image.src =
        'data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" width="1" height="1" viewBox="0 0 1 1"/>';
      const loadedImage = await decode(image);
      expect(loadedImage).to.be.an(ImageBitmap);
      expect(loadedImage.width).to.be(1);
    });
    it('decode() with zero-dimension SVG', async () => {
      image.src =
        'data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg"/>';
      try {
        await decode(image);
        expect().fail();
      } catch (error) {
        expect(error).to.be.an(Error);
      }
    });
  });
});