goog.provide('ol.test.TileUrlFunction');

describe('ol.TileUrlFunction', function() {

  describe('expandUrl', function() {
    describe('with number range', function() {
      it('creates expected URLs', function() {
        var template = 'http://tile-{1-3}/{z}/{x}/{y}';
        var urls = ol.TileUrlFunction.expandUrl(template);
        expect(urls).to.eql([
          'http://tile-1/{z}/{x}/{y}',
          'http://tile-2/{z}/{x}/{y}',
          'http://tile-3/{z}/{x}/{y}'
        ]);
      });
    });
    describe('with character range', function() {
      it('creates expected URLs', function() {
        var template = 'http://tile-{c-e}/{z}/{x}/{y}';
        var urls = ol.TileUrlFunction.expandUrl(template);
        expect(urls).to.eql([
          'http://tile-c/{z}/{x}/{y}',
          'http://tile-d/{z}/{x}/{y}',
          'http://tile-e/{z}/{x}/{y}'
        ]);
      });
    });
  });

  describe('createFromTemplate', function() {
    it('creates expected URL', function() {
      var tileUrl = ol.TileUrlFunction.createFromTemplate('{z}/{x}/{y}');
      expect(tileUrl(new ol.TileCoord(3, 2, 1))).to.eql('3/2/1');
      expect(tileUrl(null)).to.be(undefined);
    });
  });

  describe('createFromTemplates', function() {
    it('creates expected URL', function() {
      var templates = [
        'http://tile-1/{z}/{x}/{y}',
        'http://tile-2/{z}/{x}/{y}',
        'http://tile-3/{z}/{x}/{y}'
      ];
      var tileUrlFunction = ol.TileUrlFunction.createFromTemplates(templates);
      var tileCoord = new ol.TileCoord(3, 2, 1);
      tileCoord.hash = function() { return 3; };
      expect(tileUrlFunction(tileCoord)).to.eql('http://tile-1/3/2/1');
      tileCoord.hash = function() { return 2; };
      expect(tileUrlFunction(tileCoord)).to.eql('http://tile-3/3/2/1');
      tileCoord.hash = function() { return 1; };
      expect(tileUrlFunction(tileCoord)).to.eql('http://tile-2/3/2/1');
    });
  });

  describe('withTileCoordTransform', function() {
    it('creates expected URL', function() {
      var tileUrl = ol.TileUrlFunction.withTileCoordTransform(
          function(tileCoord) {
            return new ol.TileCoord(tileCoord.z, tileCoord.x, -tileCoord.y);
          },
          ol.TileUrlFunction.createFromTemplate('{z}/{x}/{y}'));
      expect(tileUrl(new ol.TileCoord(3, 2, -1))).to.eql('3/2/1');
      expect(tileUrl(null)).to.be(undefined);
    });
  });

  describe('createFromTileUrlFunctions', function() {
    it('creates expected URL', function() {
      var tileUrl = ol.TileUrlFunction.createFromTileUrlFunctions([
        ol.TileUrlFunction.createFromTemplate('a'),
        ol.TileUrlFunction.createFromTemplate('b')
      ]);
      var tileUrl1 = tileUrl(new ol.TileCoord(1, 0, 0));
      var tileUrl2 = tileUrl(new ol.TileCoord(1, 0, 1));
      expect(tileUrl1).not.to.be(tileUrl2);
      expect(tileUrl(null)).to.be(undefined);
    });
  });

  describe('createFromParamsFunction', function() {
    var paramsFunction = function(url, params) { return arguments; };
    var projection = ol.proj.get('EPSG:3857');
    var fakeTileSource = {getTileGrid: function() {return null;}};
    var params = {foo: 'bar'};
    var tileUrlFunction = ol.TileUrlFunction.createFromParamsFunction(
        'url', params, paramsFunction);
    it('calls the passed function with the correct arguments', function() {
      var args = tileUrlFunction.call(fakeTileSource,
          new ol.TileCoord(0, 0, 0), projection);
      expect(args[0]).to.eql('url');
      expect(args[1]).to.be(params);
      expect(args[2]).to.eql(projection.getExtent());
      expect(args[3]).to.eql([256, 256]);
      expect(args[4]).to.eql(projection);
    });
  });

});

goog.require('ol.TileCoord');
goog.require('ol.TileUrlFunction');
goog.require('ol.proj');
