text: import ImageTile from '../../../../../src/ol/ImageTile.js';
  import TileArcGISRest from '../../../../../src/ol/source/TileArcGISRest.js';
  import {get as getProjection} from '../../../../../src/ol/proj.js';
  
  describe('ol.source.TileArcGISRest', function () {
    let options;
    beforeEach(function () {
      options = {
        params: {},
        url: 'http://example.com/MapServer',
      };
    });
  
    describe('#getTile', function () {
      it('returns a tile with the expected URL', function () {
        const source = new TileArcGISRest(options);
        const tile = source.getTile(3, 2, 6, 1, getProjection('EPSG:3857'));
        expect(tile).to.be.an(ImageTile);
        const uri = new URL(tile.src_);
        expect(uri.protocol).to.be('http:');
        expect(uri.hostname).to.be('example.com');
        expect(uri.pathname).to.be('/MapServer/export');
        const queryData = uri.searchParams;
        const bbox = queryData.get('BBOX').split(',').map(parseFloat);
        expect(bbox[0]).roughlyEqual(-10018754.171394622, 1e-9);
        expect(bbox[1]).roughlyEqual(-15028131.257091936, 1e-9);
        expect(bbox[2]).roughlyEqual(-5009377.085697311, 1e-9);
        expect(bbox[3]).roughlyEqual(-10018754.171394624, 1e-9);
        expect(queryData.get('FORMAT')).to.be('PNG32');
        expect(queryData.get('SIZE')).to.be('256,256');
        expect(queryData.get('IMAGESR')).to.be('3857');
        expect(queryData.get('BBOXSR')).to.be('3857');
        expect(queryData.get('TRANSPARENT')).to.be('true');
      });
  
      it('returns a non floating point DPI value', function () {
        const source = new TileArcGISRest(options);
        const tile = source.getTile(3, 2, 6, 1.12, getProjection('EPSG:3857'));
        const uri = new URL(tile.src_);
        const queryData = uri.searchParams;
        expect(queryData.get('DPI')).to.be('101');
      });
  
      it('takes DPI from params if specified', function () {
        options.params.DPI = 96;
        const source = new TileArcGISRest(options);
        const tile = source.getTile(3, 2, 6, 1.12, getProjection('EPSG:3857'));
        const uri = new URL(tile.src_);
        const queryData = uri.searchParams;
        expect(queryData.get('DPI')).to.be('108');
        delete options.params.DPI;
      });
  
      it('returns a tile with the expected URL with url list', function () {
        options.urls = [
          'http://test1.com/MapServer',
          'http://test2.com/MapServer',
        ];
        const source = new TileArcGISRest(options);
  
        const tile = source.getTile(3, 2, 6, 1, getProjection('EPSG:3857'));
        expect(tile).to.be.an(ImageTile);
        const uri = new URL(tile.src_);
        expect(uri.protocol).to.be('http:');
        expect(uri.hostname).to.match(/test[12]\.com/);
        expect(uri.pathname).to.be('/MapServer/export');
        const queryData = uri.searchParams;
        const bbox = queryData.get('BBOX').split(',').map(parseFloat);
        expect(bbox[0]).roughlyEqual(-10018754.171394622, 1e-9);
        expect(bbox[1]).roughlyEqual(-15028131.257091936, 1e-9);
        expect(bbox[2]).roughlyEqual(-5009377.085697311, 1e-9);
        expect(bbox[3]).roughlyEqual(-10018754.171394624, 1e-9);
        expect(queryData.get('FORMAT')).to.be('PNG32');
        expect(queryData.get('SIZE')).to.be('256,256');
        expect(queryData.get('IMAGESR')).to.be('3857');
        expect(queryData.get('BBOXSR')).to.be('3857');
        expect(queryData.get('TRANSPARENT')).to.be('true');
      });
  
      it('returns a tile with the expected URL for ImageServer', function () {
        options.url = 'http://example.com/ImageServer';
        const source = new TileArcGISRest(options);
        const tile = source.getTile(3, 2, 6, 1, getProjection('EPSG:3857'));
        expect(tile).to.be.an(ImageTile);
        const uri = new URL(tile.src_);
        expect(uri.protocol).to.be('http:');
        expect(uri.hostname).to.be('example.com');
        expect(uri.pathname).to.be('/ImageServer/exportImage');
        const queryData = uri.searchParams;
        const bbox = queryData.get('BBOX').split(',').map(parseFloat);
        expect(bbox[0]).roughlyEqual(-10018754.171394622, 1e-9);
        expect(bbox[1]).roughlyEqual(-15028131.257091936, 1e-9);
        expect(bbox[2]).roughlyEqual(-5009377.085697311, 1e-9);
        expect(bbox[3]).roughlyEqual(-10018754.171394624, 1e-9);
        expect(queryData.get('FORMAT')).to.be('PNG32');
        expect(queryData.get('SIZE')).to.be('256,256');
        expect(queryData.get('IMAGESR')).to.be('3857');
        expect(queryData.get('BBOXSR')).to.be('3857');
        expect(queryData.get('TRANSPARENT')).to.be('true');
      });
  
      it('allows various parameters to be overridden', function () {
        options.params.FORMAT = 'png';
        options.params.TRANSPARENT = false;
        const source = new TileArcGISRest(options);
        const tile = source.getTile(3, 2, 2, 1, getProjection('EPSG:4326'));
        const uri = new URL(tile.src_);
        const queryData = uri.searchParams;
        expect(queryData.get('FORMAT')).to.be('png');
        expect(queryData.get('TRANSPARENT')).to.be('false');
      });
  
      it('allows adding rest option', function () {
        options.params.LAYERS = 'show:1,3,4';
        const source = new TileArcGISRest(options);
        const tile = source.getTile(3, 2, 2, 1, getProjection('EPSG:4326'));
        const uri = new URL(tile.src_);
        const queryData = uri.searchParams;
        expect(queryData.get('LAYERS')).to.be('show:1,3,4');
      });
    });
  
    describe('#updateParams', function () {
      it('add a new param', function () {
        const source = new TileArcGISRest(options);
        source.updateParams({'TEST': 'value'});
  
        const tile = source.getTile(3, 2, 6, 1, getProjection('EPSG:3857'));
        const uri = new URL(tile.src_);
        const queryData = uri.searchParams;
        expect(queryData.get('TEST')).to.be('value');
      });
  
      it('updates an existing param', function () {
        options.params.TEST = 'value';
  
        const source = new TileArcGISRest(options);
        source.updateParams({'TEST': 'newValue'});
  
        const tile = source.getTile(3, 2, 6, 1, getProjection('EPSG:3857'));
        const uri = new URL(tile.src_);
        const queryData = uri.searchParams;
        expect(queryData.get('TEST')).to.be('newValue');
      });
    });
  
    describe('#getParams', function () {
      it('verify getting a param', function () {
        options.params.TEST = 'value';
        const source = new TileArcGISRest(options);
  
        const setParams = source.getParams();
  
        expect(setParams).to.eql({TEST: 'value'});
      });
  
      it('verify on adding a param', function () {
        options.params.TEST = 'value';
  
        const source = new TileArcGISRest(options);
        source.updateParams({'TEST2': 'newValue'});
  
        const setParams = source.getParams();
  
        expect(setParams).to.eql({TEST: 'value', TEST2: 'newValue'});
      });
  
      it('verify on update a param', function () {
        options.params.TEST = 'value';
  
        const source = new TileArcGISRest(options);
        source.updateParams({'TEST': 'newValue'});
  
        const setParams = source.getParams();
  
        expect(setParams).to.eql({TEST: 'newValue'});
      });
    });
  
    describe('#getUrls', function () {
      it('verify getting array of urls', function () {
        options.urls = [
          'http://test.com/MapServer',
          'http://test2.com/MapServer',
        ];
  
        const source = new TileArcGISRest(options);
  
        const urls = source.getUrls();
  
        expect(urls).to.eql([
          'http://test.com/MapServer',
          'http://test2.com/MapServer',
        ]);
      });
    });
  
    describe('#setUrls', function () {
      it('verify setting urls when not set yet', function () {
        const source = new TileArcGISRest(options);
        source.setUrls([
          'http://test.com/MapServer',
          'http://test2.com/MapServer',
        ]);
  
        const urls = source.getUrls();
  
        expect(urls).to.eql([
          'http://test.com/MapServer',
          'http://test2.com/MapServer',
        ]);
      });
  
      it('verify setting urls with existing list', function () {
        options.urls = [
          'http://test.com/MapServer',
          'http://test2.com/MapServer',
        ];
  
        const source = new TileArcGISRest(options);
        source.setUrls([
          'http://test3.com/MapServer',
          'http://test4.com/MapServer',
        ]);
  
        const urls = source.getUrls();
  
        expect(urls).to.eql([
          'http://test3.com/MapServer',
          'http://test4.com/MapServer',
        ]);
      });
    });
  
    describe('#setUrl', function () {
      it('verify setting url with no urls', function () {
        const source = new TileArcGISRest(options);
        source.setUrl('http://test.com/MapServer');
  
        const urls = source.getUrls();
  
        expect(urls).to.eql(['http://test.com/MapServer']);
      });
  
      it('verify setting url with list of urls', function () {
        options.urls = [
          'http://test.com/MapServer',
          'http://test2.com/MapServer',
        ];
  
        const source = new TileArcGISRest(options);
        source.setUrl('http://test3.com/MapServer');
  
        const urls = source.getUrls();
  
        expect(urls).to.eql(['http://test3.com/MapServer']);
  
        const tileUrl = source.tileUrlFunction(
          [0, 0, 0],
          1,
          getProjection('EPSG:4326')
        );
        expect(tileUrl.indexOf(urls[0])).to.be(0);
      });
    });
  });
  