a116878a57
The addition of full extent tile ranges also allows us to simplify wrapX handling for tile layers. By limiting wrapX to true and false as possible values, we can remove a lot of guessing logic.
247 lines
6.8 KiB
JavaScript
247 lines
6.8 KiB
JavaScript
goog.provide('ol.test.source.TileSource');
|
|
|
|
describe('ol.source.Tile', function() {
|
|
|
|
describe('constructor', function() {
|
|
it('returns a tile source', function() {
|
|
var source = new ol.source.Tile({
|
|
projection: ol.proj.get('EPSG:4326')
|
|
});
|
|
expect(source).to.be.a(ol.source.Source);
|
|
expect(source).to.be.a(ol.source.Tile);
|
|
});
|
|
});
|
|
|
|
describe('#forEachLoadedTile()', function() {
|
|
|
|
var callback;
|
|
beforeEach(function() {
|
|
callback = sinon.spy();
|
|
});
|
|
|
|
it('does not call the callback if no tiles are loaded', function() {
|
|
var source = new ol.test.source.TileMock({});
|
|
var grid = source.getTileGrid();
|
|
var extent = [-180, -180, 180, 180];
|
|
var zoom = 3;
|
|
var range = grid.getTileRangeForExtentAndZ(extent, zoom);
|
|
|
|
source.forEachLoadedTile(zoom, range, callback);
|
|
expect(callback.callCount).to.be(0);
|
|
});
|
|
|
|
it('does not call getTile() if no tiles are loaded', function() {
|
|
var source = new ol.test.source.TileMock({});
|
|
sinon.spy(source, 'getTile');
|
|
var grid = source.getTileGrid();
|
|
var extent = [-180, -180, 180, 180];
|
|
var zoom = 3;
|
|
var range = grid.getTileRangeForExtentAndZ(extent, zoom);
|
|
|
|
source.forEachLoadedTile(zoom, range, callback);
|
|
expect(source.getTile.callCount).to.be(0);
|
|
source.getTile.restore();
|
|
});
|
|
|
|
|
|
it('calls callback for each loaded tile', function() {
|
|
var source = new ol.test.source.TileMock({
|
|
'1/0/0': ol.TileState.LOADED,
|
|
'1/0/1': ol.TileState.LOADED,
|
|
'1/1/0': ol.TileState.LOADING,
|
|
'1/1/1': ol.TileState.LOADED
|
|
});
|
|
|
|
var zoom = 1;
|
|
var range = new ol.TileRange(0, 1, 0, 1);
|
|
|
|
source.forEachLoadedTile(zoom, range, callback);
|
|
expect(callback.callCount).to.be(3);
|
|
});
|
|
|
|
it('returns true if range is fully loaded', function() {
|
|
// a source with no loaded tiles
|
|
var source = new ol.test.source.TileMock({
|
|
'1/0/0': ol.TileState.LOADED,
|
|
'1/0/1': ol.TileState.LOADED,
|
|
'1/1/0': ol.TileState.LOADED,
|
|
'1/1/1': ol.TileState.LOADED
|
|
});
|
|
|
|
var zoom = 1;
|
|
var range = new ol.TileRange(0, 1, 0, 1);
|
|
|
|
var covered = source.forEachLoadedTile(zoom, range, function() {
|
|
return true;
|
|
});
|
|
expect(covered).to.be(true);
|
|
});
|
|
|
|
it('returns false if range is not fully loaded', function() {
|
|
// a source with no loaded tiles
|
|
var source = new ol.test.source.TileMock({
|
|
'1/0/0': ol.TileState.LOADED,
|
|
'1/0/1': ol.TileState.LOADED,
|
|
'1/1/0': ol.TileState.LOADING,
|
|
'1/1/1': ol.TileState.LOADED
|
|
});
|
|
|
|
var zoom = 1;
|
|
var range = new ol.TileRange(0, 1, 0, 1);
|
|
|
|
var covered = source.forEachLoadedTile(zoom, range, function() {
|
|
return true;
|
|
});
|
|
expect(covered).to.be(false);
|
|
});
|
|
|
|
it('allows callback to override loaded check', function() {
|
|
// a source with no loaded tiles
|
|
var source = new ol.test.source.TileMock({
|
|
'1/0/0': ol.TileState.LOADED,
|
|
'1/0/1': ol.TileState.LOADED,
|
|
'1/1/0': ol.TileState.LOADED,
|
|
'1/1/1': ol.TileState.LOADED
|
|
});
|
|
|
|
var zoom = 1;
|
|
var range = new ol.TileRange(0, 1, 0, 1);
|
|
|
|
var covered = source.forEachLoadedTile(zoom, range, function() {
|
|
return false;
|
|
});
|
|
expect(covered).to.be(false);
|
|
});
|
|
|
|
});
|
|
|
|
describe('#getTileCoordForTileUrlFunction()', function() {
|
|
|
|
it('returns the expected tile coordinate - {wrapX: true}', function() {
|
|
var tileSource = new ol.source.Tile({
|
|
projection: 'EPSG:3857',
|
|
wrapX: true
|
|
});
|
|
|
|
var tileCoord = tileSource.getTileCoordForTileUrlFunction([6, -31, 22]);
|
|
expect(tileCoord).to.eql([6, 33, 22]);
|
|
|
|
tileCoord = tileSource.getTileCoordForTileUrlFunction([6, 33, 22]);
|
|
expect(tileCoord).to.eql([6, 33, 22]);
|
|
|
|
tileCoord = tileSource.getTileCoordForTileUrlFunction([6, 97, 22]);
|
|
expect(tileCoord).to.eql([6, 33, 22]);
|
|
});
|
|
|
|
it('returns the expected tile coordinate - {wrapX: false}', function() {
|
|
var tileSource = new ol.source.Tile({
|
|
projection: 'EPSG:3857',
|
|
wrapX: false
|
|
});
|
|
|
|
var tileCoord = tileSource.getTileCoordForTileUrlFunction([6, -31, 22]);
|
|
expect(tileCoord).to.eql(null);
|
|
|
|
tileCoord = tileSource.getTileCoordForTileUrlFunction([6, 33, 22]);
|
|
expect(tileCoord).to.eql([6, 33, 22]);
|
|
|
|
tileCoord = tileSource.getTileCoordForTileUrlFunction([6, 97, 22]);
|
|
expect(tileCoord).to.eql(null);
|
|
});
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
/**
|
|
* Tile source for tests that uses a EPSG:4326 based grid with 4 resolutions and
|
|
* 256x256 tiles.
|
|
*
|
|
* @constructor
|
|
* @extends {ol.source.Tile}
|
|
* @param {Object.<string, ol.TileState>} tileStates Lookup of tile key to
|
|
* tile state.
|
|
*/
|
|
ol.test.source.TileMock = function(tileStates) {
|
|
var tileGrid = new ol.tilegrid.TileGrid({
|
|
resolutions: [360 / 256, 180 / 256, 90 / 256, 45 / 256],
|
|
origin: [-180, -180],
|
|
tileSize: 256
|
|
});
|
|
|
|
goog.base(this, {
|
|
projection: ol.proj.get('EPSG:4326'),
|
|
tileGrid: tileGrid
|
|
});
|
|
|
|
for (var key in tileStates) {
|
|
this.tileCache.set(key, new ol.Tile(key.split('/'), tileStates[key]));
|
|
}
|
|
|
|
};
|
|
goog.inherits(ol.test.source.TileMock, ol.source.Tile);
|
|
|
|
|
|
/**
|
|
* @inheritDoc
|
|
*/
|
|
ol.test.source.TileMock.prototype.getTile = function(z, x, y) {
|
|
var key = this.getKeyZXY(z, x, y);
|
|
if (this.tileCache.containsKey(key)) {
|
|
return /** @type {!ol.Tile} */ (this.tileCache.get(key));
|
|
} else {
|
|
var tile = new ol.Tile(key, ol.TileState.IDLE);
|
|
this.tileCache.set(key, tile);
|
|
return tile;
|
|
}
|
|
};
|
|
|
|
|
|
describe('ol.test.source.TileMock', function() {
|
|
|
|
describe('constructor', function() {
|
|
it('creates a tile source', function() {
|
|
var source = new ol.test.source.TileMock({});
|
|
expect(source).to.be.a(ol.source.Tile);
|
|
expect(source).to.be.a(ol.test.source.TileMock);
|
|
});
|
|
});
|
|
|
|
describe('#getTile()', function() {
|
|
it('returns a tile with state based on constructor arg', function() {
|
|
var source = new ol.test.source.TileMock({
|
|
'0/0/0': ol.TileState.LOADED,
|
|
'1/0/0': ol.TileState.LOADED
|
|
});
|
|
var tile;
|
|
|
|
// check a loaded tile
|
|
tile = source.getTile(0, 0, 0);
|
|
expect(tile).to.be.a(ol.Tile);
|
|
expect(tile.state).to.be(ol.TileState.LOADED);
|
|
|
|
// check a tile that is not loaded
|
|
tile = source.getTile(1, 0, -1);
|
|
expect(tile).to.be.a(ol.Tile);
|
|
expect(tile.state).to.be(ol.TileState.IDLE);
|
|
|
|
// check another loaded tile
|
|
tile = source.getTile(1, 0, 0);
|
|
expect(tile).to.be.a(ol.Tile);
|
|
expect(tile.state).to.be(ol.TileState.LOADED);
|
|
|
|
});
|
|
});
|
|
|
|
});
|
|
|
|
goog.require('goog.object');
|
|
goog.require('ol.Tile');
|
|
goog.require('ol.TileRange');
|
|
goog.require('ol.TileState');
|
|
goog.require('ol.proj');
|
|
goog.require('ol.source.Source');
|
|
goog.require('ol.source.Tile');
|
|
goog.require('ol.tilegrid.TileGrid');
|