goog.provide('ol.test.source.UrlTile');


describe('ol.source.UrlTile', function() {

  describe('url option', function() {
    it('expands url template', function() {
      var tileSource = new ol.source.UrlTile({
        url: '{1-3}'
      });

      var urls = tileSource.getUrls();
      expect(urls).to.eql(['1', '2', '3']);
    });
  });

  describe('tileUrlFunction', function() {

    var tileSource, tileGrid;

    beforeEach(function() {
      tileSource = new ol.source.UrlTile({
        projection: 'EPSG:3857',
        tileGrid: ol.tilegrid.createXYZ({maxZoom: 6}),
        url: '{z}/{x}/{y}',
        wrapX: true
      });
      tileGrid = tileSource.getTileGrid();
    });

    it('returns the expected URL', function() {

      var coordinate = [829330.2064098881, 5933916.615134273];
      var tileUrl;

      tileUrl = tileSource.tileUrlFunction(
          tileGrid.getTileCoordForCoordAndZ(coordinate, 0));
      expect(tileUrl).to.eql('0/0/0');

      tileUrl = tileSource.tileUrlFunction(
          tileGrid.getTileCoordForCoordAndZ(coordinate, 1));
      expect(tileUrl).to.eql('1/1/0');

      tileUrl = tileSource.tileUrlFunction(
          tileGrid.getTileCoordForCoordAndZ(coordinate, 2));
      expect(tileUrl).to.eql('2/2/1');

      tileUrl = tileSource.tileUrlFunction(
          tileGrid.getTileCoordForCoordAndZ(coordinate, 3));
      expect(tileUrl).to.eql('3/4/2');

      tileUrl = tileSource.tileUrlFunction(
          tileGrid.getTileCoordForCoordAndZ(coordinate, 4));
      expect(tileUrl).to.eql('4/8/5');

      tileUrl = tileSource.tileUrlFunction(
          tileGrid.getTileCoordForCoordAndZ(coordinate, 5));
      expect(tileUrl).to.eql('5/16/11');

      tileUrl = tileSource.tileUrlFunction(
          tileGrid.getTileCoordForCoordAndZ(coordinate, 6));
      expect(tileUrl).to.eql('6/33/22');

    });

    describe('wrap x', function() {

      it('returns the expected URL', function() {
        var projection = tileSource.getProjection();
        var tileUrl = tileSource.tileUrlFunction(
            tileSource.getTileCoordForTileUrlFunction(
                [6, -31, -23], projection));
        expect(tileUrl).to.eql('6/33/22');

        tileUrl = tileSource.tileUrlFunction(
            tileSource.getTileCoordForTileUrlFunction(
                [6, 33, -23], projection));
        expect(tileUrl).to.eql('6/33/22');

        tileUrl = tileSource.tileUrlFunction(
            tileSource.getTileCoordForTileUrlFunction(
                [6, 97, -23], projection));
        expect(tileUrl).to.eql('6/33/22');
      });

    });

    describe('crop y', function() {

      it('returns the expected URL', function() {
        var projection = tileSource.getProjection();
        var tileUrl = tileSource.tileUrlFunction(
            tileSource.getTileCoordForTileUrlFunction(
                [6, 33, 0], projection));
        expect(tileUrl).to.be(undefined);

        tileUrl = tileSource.tileUrlFunction(
            tileSource.getTileCoordForTileUrlFunction(
                [6, 33, -23], projection));
        expect(tileUrl).to.eql('6/33/22');

        tileUrl = tileSource.tileUrlFunction(
            tileSource.getTileCoordForTileUrlFunction(
                [6, 33, -65], projection));
        expect(tileUrl).to.be(undefined);
      });

    });

  });

  describe('#getUrls', function() {

    var sourceOptions;
    var source;
    var url = 'http://geo.nls.uk/maps/towns/glasgow1857/{z}/{x}/{-y}.png';

    beforeEach(function() {
      sourceOptions = {
        tileGrid: ol.tilegrid.createXYZ({
          extent: ol.proj.get('EPSG:4326').getExtent()
        })
      };
    });

    describe('using a "url" option', function() {
      beforeEach(function() {
        sourceOptions.url = url;
        source = new ol.source.UrlTile(sourceOptions);
      });

      it('returns the XYZ URL', function() {
        var urls = source.getUrls();
        expect(urls).to.be.eql([url]);
      });

    });

    describe('using a "urls" option', function() {
      beforeEach(function() {
        sourceOptions.urls = ['some_xyz_url1', 'some_xyz_url2'];
        source = new ol.source.UrlTile(sourceOptions);
      });

      it('returns the XYZ URLs', function() {
        var urls = source.getUrls();
        expect(urls).to.be.eql(['some_xyz_url1', 'some_xyz_url2']);
      });

    });

    describe('using a "tileUrlFunction"', function() {
      beforeEach(function() {
        sourceOptions.tileUrlFunction = function() {
          return 'some_xyz_url';
        };
        source = new ol.source.UrlTile(sourceOptions);
      });

      it('returns null', function() {
        var urls = source.getUrls();
        expect(urls).to.be(null);
      });

    });

  });

});

goog.require('ol.TileCoord');
goog.require('ol.proj');
goog.require('ol.source.UrlTile');
