From a9e83bf8489851ee3a090f0aa0b7335979e65bfd Mon Sep 17 00:00:00 2001 From: Mikko Pulkki Date: Tue, 3 Dec 2019 12:16:02 +0200 Subject: [PATCH 1/3] Change tile id key type from number to string --- src/geo/transform.js | 4 +-- src/render/painter.js | 2 +- src/source/source_cache.js | 58 ++++++++++++++++++++------------------ src/source/tile_cache.js | 6 ++-- src/source/tile_id.js | 31 ++++++++++++++------ 5 files changed, 59 insertions(+), 42 deletions(-) diff --git a/src/geo/transform.js b/src/geo/transform.js index c92d68cf326..f80dc279277 100644 --- a/src/geo/transform.js +++ b/src/geo/transform.js @@ -50,8 +50,8 @@ class Transform { _maxPitch: number; _center: LngLat; _constraining: boolean; - _posMatrixCache: {[number]: Float32Array}; - _alignedPosMatrixCache: {[number]: Float32Array}; + _posMatrixCache: {[string]: Float32Array}; + _alignedPosMatrixCache: {[string]: Float32Array}; constructor(minZoom: ?number, maxZoom: ?number, minPitch: ?number, maxPitch: ?number, renderWorldCopies: boolean | void) { this.tileSize = 512; // constant diff --git a/src/render/painter.js b/src/render/painter.js index 30661433347..722c53fdc34 100644 --- a/src/render/painter.js +++ b/src/render/painter.js @@ -103,7 +103,7 @@ class Painter { viewportSegments: SegmentVector; quadTriangleIndexBuffer: IndexBuffer; tileBorderIndexBuffer: IndexBuffer; - _tileClippingMaskIDs: { [number]: number }; + _tileClippingMaskIDs: { [string]: number }; stencilClearMode: StencilMode; style: Style; options: PainterOptions; diff --git a/src/source/source_cache.js b/src/source/source_cache.js index 9eebec9d027..9e2474396ef 100644 --- a/src/source/source_cache.js +++ b/src/source/source_cache.js @@ -11,7 +11,7 @@ import EXTENT from '../data/extent'; import Context from '../gl/context'; import Point from '@mapbox/point-geometry'; import browser from '../util/browser'; -import {OverscaledTileID} from './tile_id'; +import {OverscaledTileID, tileIDKeyComparison} from './tile_id'; import assert from 'assert'; import SourceFeatureState from './source_state'; @@ -44,7 +44,7 @@ class SourceCache extends Evented { _source: Source; _sourceLoaded: boolean; _sourceErrored: boolean; - _tiles: {[any]: Tile}; + _tiles: {[string]: Tile}; _prevLng: number | void; _cache: TileCache; _timers: {[any]: TimeoutID}; @@ -52,9 +52,9 @@ class SourceCache extends Evented { _maxTileCacheSize: ?number; _paused: boolean; _shouldReloadOnResume: boolean; - _coveredTiles: {[any]: boolean}; + _coveredTiles: {[string]: boolean}; transform: Transform; - _isIdRenderable: (id: number, symbolLayer?: boolean) => boolean; + _isIdRenderable: (id: string, symbolLayer?: boolean) => boolean; used: boolean; _state: SourceFeatureState; @@ -179,25 +179,25 @@ class SourceCache extends Evented { /** * Return all tile ids ordered with z-order, and cast to numbers */ - getIds(): Array { - return Object.keys(this._tiles).map(Number).sort(compareKeyZoom); + getIds(): Array { + return (Object.values(this._tiles): any).map((tile: Tile) => tile.tileID).sort(compareIdZoom).map(id => id.key); } - getRenderableIds(symbolLayer?: boolean): Array { - const ids = []; + getRenderableIds(symbolLayer?: boolean): Array { + const renderables: Array = []; for (const id in this._tiles) { - if (this._isIdRenderable(+id, symbolLayer)) ids.push(+id); + if (this._isIdRenderable(id, symbolLayer)) renderables.push(this._tiles[id]); } if (symbolLayer) { - return ids.sort((a_, b_) => { - const a = this._tiles[a_].tileID; - const b = this._tiles[b_].tileID; + return renderables.sort((a_: Tile, b_: Tile) => { + const a = a_.tileID; + const b = b_.tileID; const rotatedA = (new Point(a.canonical.x, a.canonical.y))._rotate(this.transform.angle); const rotatedB = (new Point(b.canonical.x, b.canonical.y))._rotate(this.transform.angle); return a.overscaledZ - b.overscaledZ || rotatedB.y - rotatedA.y || rotatedB.x - rotatedA.x; - }); + }).map(tile => tile.tileID.key); } - return ids.sort(compareKeyZoom); + return renderables.map(tile => tile.tileID).sort(compareIdZoom).map(id => id.key); } hasRenderableParent(tileID: OverscaledTileID) { @@ -208,7 +208,7 @@ class SourceCache extends Evented { return false; } - _isIdRenderable(id: number, symbolLayer?: boolean) { + _isIdRenderable(id: string, symbolLayer?: boolean) { return this._tiles[id] && this._tiles[id].hasData() && !this._coveredTiles[id] && (symbolLayer || !this._tiles[id].holdingForFade()); } @@ -226,7 +226,7 @@ class SourceCache extends Evented { } } - _reloadTile(id: string | number, state: TileState) { + _reloadTile(id: string, state: TileState) { const tile = this._tiles[id]; // this potentially does not address all underlying @@ -245,7 +245,7 @@ class SourceCache extends Evented { this._loadTile(tile, this._tileLoaded.bind(this, tile, id, state)); } - _tileLoaded(tile: Tile, id: string | number, previousState: TileState, err: ?Error) { + _tileLoaded(tile: Tile, id: string, previousState: TileState, err: ?Error) { if (err) { tile.state = 'errored'; if ((err: any).status !== 404) this._source.fire(new ErrorEvent(err, {tile})); @@ -313,7 +313,7 @@ class SourceCache extends Evented { /** * Get a specific tile by id */ - getTileByID(id: string | number): Tile { + getTileByID(id: string): Tile { return this._tiles[id]; } @@ -424,7 +424,7 @@ class SourceCache extends Evented { this._prevLng = lng; if (wrapDelta) { - const tiles = {}; + const tiles: {[string]: Tile} = {}; for (const key in this._tiles) { const tile = this._tiles[key]; tile.tileID = tile.tileID.unwrapTo(tile.tileID.wrap + wrapDelta); @@ -490,12 +490,12 @@ class SourceCache extends Evented { const retain = this._updateRetainedTiles(idealTileIDs, zoom); if (isRasterType(this._source.type)) { - const parentsForFading = {}; + const parentsForFading: {[string]: OverscaledTileID} = {}; const fadingTiles = {}; const ids = Object.keys(retain); for (const id of ids) { const tileID = retain[id]; - assert(tileID.key === +id); + assert(tileID.key === id); const tile = this._tiles[id]; if (!tile || tile.fadeEndTime && tile.fadeEndTime <= browser.now()) continue; @@ -549,8 +549,8 @@ class SourceCache extends Evented { } _updateRetainedTiles(idealTileIDs: Array, zoom: number): { [string]: OverscaledTileID} { - const retain = {}; - const checked: {[number]: boolean } = {}; + const retain: {[string]: OverscaledTileID} = {}; + const checked: {[string]: boolean } = {}; const minCoveringZoom = Math.max(zoom - SourceCache.maxOverzooming, this._source.minzoom); const maxCoveringZoom = Math.max(zoom + SourceCache.maxUnderzooming, this._source.minzoom); @@ -667,7 +667,7 @@ class SourceCache extends Evented { return tile; } - _setTileReloadTimer(id: string | number, tile: Tile) { + _setTileReloadTimer(id: string, tile: Tile) { if (id in this._timers) { clearTimeout(this._timers[id]); delete this._timers[id]; @@ -686,7 +686,7 @@ class SourceCache extends Evented { * Remove a tile, given its id, from the pyramid * @private */ - _removeTile(id: string | number) { + _removeTile(id: string) { const tile = this._tiles[id]; if (!tile) return; @@ -847,7 +847,7 @@ class SourceCache extends Evented { * Sets the set of keys that the tile depends on. This allows tiles to * be reloaded when their dependencies change. */ - setDependencies(tileKey: string | number, namespace: string, dependencies: Array) { + setDependencies(tileKey: string, namespace: string, dependencies: Array) { const tile = this._tiles[tileKey]; if (tile) { tile.setDependencies(namespace, dependencies); @@ -871,8 +871,10 @@ class SourceCache extends Evented { SourceCache.maxOverzooming = 10; SourceCache.maxUnderzooming = 3; -function compareKeyZoom(a, b) { - return ((a % 32) - (b % 32)) || (b - a); +function compareIdZoom(a: OverscaledTileID, b: OverscaledTileID): number { + if (a.overscaledZ !== b.overscaledZ) + return a.overscaledZ - b.overscaledZ; + return tileIDKeyComparison(b.key, a.key); } function isRasterType(type) { diff --git a/src/source/tile_cache.js b/src/source/tile_cache.js index a78c002eb7c..5c423b14c1f 100644 --- a/src/source/tile_cache.js +++ b/src/source/tile_cache.js @@ -12,8 +12,8 @@ import type Tile from './tile'; */ class TileCache { max: number; - data: {[key: number | string]: Array<{ value: Tile, timeout: ?TimeoutID}>}; - order: Array; + data: {[key: string]: Array<{ value: Tile, timeout: ?TimeoutID}>}; + order: Array; onRemove: (element: Tile) => void; /** * @param {number} max number of permitted values @@ -110,7 +110,7 @@ class TileCache { /* * Get and remove the value with the specified key. */ - _getAndRemoveByKey(key: number): ?Tile { + _getAndRemoveByKey(key: string): ?Tile { const data = this.data[key].shift(); if (data.timeout) clearTimeout(data.timeout); diff --git a/src/source/tile_id.js b/src/source/tile_id.js index 9d39d3eae7b..6d5bc5454e7 100644 --- a/src/source/tile_id.js +++ b/src/source/tile_id.js @@ -12,7 +12,7 @@ export class CanonicalTileID { z: number; x: number; y: number; - key: number; + key: string; constructor(z: number, x: number, y: number) { assert(z >= 0 && z <= 25); @@ -21,7 +21,7 @@ export class CanonicalTileID { this.z = z; this.x = x; this.y = y; - this.key = calculateKey(0, z, x, y); + this.key = calculateKey(0, z, z, x, y); } equals(id: CanonicalTileID) { @@ -57,12 +57,12 @@ export class CanonicalTileID { export class UnwrappedTileID { wrap: number; canonical: CanonicalTileID; - key: number; + key: string; constructor(wrap: number, canonical: CanonicalTileID) { this.wrap = wrap; this.canonical = canonical; - this.key = calculateKey(wrap, canonical.z, canonical.x, canonical.y); + this.key = calculateKey(wrap, canonical.z, canonical.z, canonical.x, canonical.y); } } @@ -70,7 +70,7 @@ export class OverscaledTileID { overscaledZ: number; wrap: number; canonical: CanonicalTileID; - key: number; + key: string; posMatrix: Float32Array; constructor(overscaledZ: number, wrap: number, z: number, x: number, y: number) { @@ -78,7 +78,7 @@ export class OverscaledTileID { this.overscaledZ = overscaledZ; this.wrap = wrap; this.canonical = new CanonicalTileID(z, +x, +y); - this.key = calculateKey(wrap, overscaledZ, x, y); + this.key = calculateKey(wrap, overscaledZ, z, x, y); } equals(id: OverscaledTileID) { @@ -164,11 +164,26 @@ export class OverscaledTileID { } } -function calculateKey(wrap: number, z: number, x: number, y: number) { +function calculateKey(wrap: number, overscaledZ: number, z: number, x: number, y: number): string { wrap *= 2; if (wrap < 0) wrap = wrap * -1 - 1; const dim = 1 << z; - return ((dim * dim * wrap + dim * y + x) * 32) + z; + let id = `${dim * dim * wrap + dim * y + x}`; + // Always reserve two characters for both z values in order to + // keep the sorting behavior consistent + if (z < 10) + id += "0"; + id += z; + if (overscaledZ < 10) + id += "0"; + id += overscaledZ; + return id; +} + +export function tileIDKeyComparison(keyA: string, keyB: string): number { + if (keyA.length !== keyB.length) + return keyA.length - keyB.length; + return keyA.localeCompare(keyB); } function getQuadkey(z, x, y) { From 077550557516237ec761483fc4332d1c0dd4ff8c Mon Sep 17 00:00:00 2001 From: Mikko Pulkki Date: Tue, 3 Dec 2019 12:16:40 +0200 Subject: [PATCH 2/3] Add regression test --- test/unit/source/source_cache.test.js | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/test/unit/source/source_cache.test.js b/test/unit/source/source_cache.test.js index b8eb33b4cc6..4de1ba70499 100644 --- a/test/unit/source/source_cache.test.js +++ b/test/unit/source/source_cache.test.js @@ -229,6 +229,31 @@ test('SourceCache#addTile', (t) => { t.end(); }); + t.test('should load tiles with identical overscaled Z but different canonical Z', (t) => { + const sourceCache = createSourceCache(); + + const tileIDs = [ + new OverscaledTileID(1, 0, 0, 0, 0), + new OverscaledTileID(1, 0, 1, 0, 0), + new OverscaledTileID(1, 0, 1, 1, 0), + new OverscaledTileID(1, 0, 1, 0, 1), + new OverscaledTileID(1, 0, 1, 1, 1) + ]; + + for (let i = 0; i < tileIDs.length; i++) + sourceCache._addTile(tileIDs[i]); + + for (let i = 0; i < tileIDs.length; i++) { + const id = tileIDs[i]; + const key = id.key; + + t.ok(sourceCache._tiles[key]); + t.deepEqual(sourceCache._tiles[key].tileID, id); + } + + t.end(); + }); + t.end(); }); From e225bb9b4d86c01de4a17d2a271d12b505eaa64b Mon Sep 17 00:00:00 2001 From: Mikko Pulkki Date: Tue, 3 Dec 2019 12:16:58 +0200 Subject: [PATCH 3/3] Fix unit tests --- test/unit/source/source_cache.test.js | 75 ++++++++++++++------------- test/unit/source/tile_id.test.js | 18 +++---- test/unit/ui/map.test.js | 6 +-- 3 files changed, 50 insertions(+), 49 deletions(-) diff --git a/test/unit/source/source_cache.test.js b/test/unit/source/source_cache.test.js index 4de1ba70499..6b01a69da61 100644 --- a/test/unit/source/source_cache.test.js +++ b/test/unit/source/source_cache.test.js @@ -2,7 +2,7 @@ import {test} from '../../util/test'; import SourceCache from '../../../src/source/source_cache'; import {setType} from '../../../src/source/source'; import Tile from '../../../src/source/tile'; -import {OverscaledTileID} from '../../../src/source/tile_id'; +import {OverscaledTileID, tileIDKeyComparison} from '../../../src/source/tile_id'; import Transform from '../../../src/geo/transform'; import LngLat from '../../../src/geo/lng_lat'; import Point from '@mapbox/point-geometry'; @@ -779,20 +779,20 @@ test('SourceCache#update', (t) => { if (e.sourceDataType === 'metadata') { sourceCache.update(transform); t.deepEqual(sourceCache.getRenderableIds(), [ - new OverscaledTileID(16, 0, 16, 8192, 8192).key, - new OverscaledTileID(16, 0, 16, 8191, 8192).key, - new OverscaledTileID(16, 0, 16, 8192, 8191).key, - new OverscaledTileID(16, 0, 16, 8191, 8191).key + new OverscaledTileID(16, 0, 14, 8192, 8192).key, + new OverscaledTileID(16, 0, 14, 8191, 8192).key, + new OverscaledTileID(16, 0, 14, 8192, 8191).key, + new OverscaledTileID(16, 0, 14, 8191, 8191).key ]); transform.zoom = 15; sourceCache.update(transform); t.deepEqual(sourceCache.getRenderableIds(), [ - new OverscaledTileID(16, 0, 16, 8192, 8192).key, - new OverscaledTileID(16, 0, 16, 8191, 8192).key, - new OverscaledTileID(16, 0, 16, 8192, 8191).key, - new OverscaledTileID(16, 0, 16, 8191, 8191).key + new OverscaledTileID(16, 0, 14, 8192, 8192).key, + new OverscaledTileID(16, 0, 14, 8191, 8192).key, + new OverscaledTileID(16, 0, 14, 8192, 8191).key, + new OverscaledTileID(16, 0, 14, 8191, 8191).key ]); t.end(); } @@ -877,7 +877,7 @@ test('SourceCache#_updateRetainedTiles', (t) => { } const retained = sourceCache._updateRetainedTiles([idealTile], 3); - t.deepEqual(Object.keys(retained), [ + t.deepEqual(Object.keys(retained).sort(tileIDKeyComparison), [ // parents are requested because ideal ideal tile is not completely covered by // loaded child tiles new OverscaledTileID(0, 0, 0, 0, 0), @@ -912,12 +912,12 @@ test('SourceCache#_updateRetainedTiles', (t) => { // retained tiles include all ideal tiles and any parents that were loaded to cover // non-existant tiles t.deepEqual(retained, { - // parent - '0': new OverscaledTileID(0, 0, 0, 0, 0), - // 1/0/1 - '65': new OverscaledTileID(1, 0, 1, 0, 1), + // 1/0/1 + '20101': new OverscaledTileID(1, 0, 1, 0, 1), // 1/1/1 - '97': new OverscaledTileID(1, 0, 1, 1, 1) + '30101': new OverscaledTileID(1, 0, 1, 1, 1), + // parent + '00000': new OverscaledTileID(0, 0, 0, 0, 0) }); addTileSpy.restore(); getTileSpy.restore(); @@ -970,10 +970,11 @@ test('SourceCache#_updateRetainedTiles', (t) => { } }); const idealTile = new OverscaledTileID(1, 0, 1, 0, 1); + const parentTile = new OverscaledTileID(0, 0, 0, 0, 0); sourceCache._tiles[idealTile.key] = new Tile(idealTile); sourceCache._tiles[idealTile.key].state = 'loading'; - sourceCache._tiles['0'] = new Tile(new OverscaledTileID(0, 0, 0, 0, 0)); - sourceCache._tiles['0'].state = 'loaded'; + sourceCache._tiles[parentTile.key] = new Tile(parentTile); + sourceCache._tiles[parentTile.key].state = 'loaded'; const addTileSpy = t.spy(sourceCache, '_addTile'); const getTileSpy = t.spy(sourceCache, 'getTile'); @@ -987,9 +988,9 @@ test('SourceCache#_updateRetainedTiles', (t) => { t.deepEqual(retained, { // parent of ideal tile 0/0/0 - '0' : new OverscaledTileID(0, 0, 0, 0, 0), + '00000' : new OverscaledTileID(0, 0, 0, 0, 0), // ideal tile id 1/0/1 - '65' : new OverscaledTileID(1, 0, 1, 0, 1) + '20101' : new OverscaledTileID(1, 0, 1, 0, 1) }, 'retain ideal and parent tile when ideal tiles aren\'t loaded'); addTileSpy.resetHistory(); @@ -1002,7 +1003,7 @@ test('SourceCache#_updateRetainedTiles', (t) => { t.ok(getTileSpy.notCalled); t.deepEqual(retainedLoaded, { // only ideal tile retained - '65' : new OverscaledTileID(1, 0, 1, 0, 1) + '20101' : new OverscaledTileID(1, 0, 1, 0, 1) }, 'only retain ideal tiles when they\'re all loaded'); addTileSpy.restore(); @@ -1059,24 +1060,24 @@ test('SourceCache#_updateRetainedTiles', (t) => { t.deepEqual(retained, { // parent of ideal tile (0, 0, 0) (only partially covered by loaded child // tiles, so we still need to load the parent) - '0' : new OverscaledTileID(0, 0, 0, 0, 0), + '00000' : new OverscaledTileID(0, 0, 0, 0, 0), // ideal tile id (1, 0, 0) - '1' : new OverscaledTileID(1, 0, 1, 0, 0), + '00101' : new OverscaledTileID(1, 0, 1, 0, 0), // loaded child tile (2, 0, 0) - '2': new OverscaledTileID(2, 0, 2, 0, 0) + '00202': new OverscaledTileID(2, 0, 2, 0, 0) }, 'retains children and parent when ideal tile is partially covered by a loaded child tile'); getTileSpy.restore(); // remove child tile and check that it only uses parent tile - delete sourceCache._tiles['2']; + delete sourceCache._tiles['00202']; retained = sourceCache._updateRetainedTiles([idealTile], 1); t.deepEqual(retained, { // parent of ideal tile (0, 0, 0) (only partially covered by loaded child // tiles, so we still need to load the parent) - '0' : new OverscaledTileID(0, 0, 0, 0, 0), + '00000' : new OverscaledTileID(0, 0, 0, 0, 0), // ideal tile id (1, 0, 0) - '1' : new OverscaledTileID(1, 0, 1, 0, 0) + '00101' : new OverscaledTileID(1, 0, 1, 0, 0) }, 'only retains parent tile if no child tiles are loaded'); t.end(); @@ -1104,7 +1105,7 @@ test('SourceCache#_updateRetainedTiles', (t) => { t.deepEqual(retained, { // ideal tile id (2, 0, 0) - '2' : new OverscaledTileID(2, 0, 2, 0, 0) + '00202' : new OverscaledTileID(2, 0, 2, 0, 0) }, 'doesn\'t retain parent tiles below minzoom'); getTileSpy.restore(); @@ -1134,7 +1135,7 @@ test('SourceCache#_updateRetainedTiles', (t) => { t.deepEqual(retained, { // ideal tile id (2, 0, 0) - '2' : new OverscaledTileID(2, 0, 2, 0, 0) + '00202' : new OverscaledTileID(2, 0, 2, 0, 0) }, 'doesn\'t retain child tiles above maxzoom'); getTileSpy.restore(); @@ -1202,7 +1203,7 @@ test('SourceCache#_updateRetainedTiles', (t) => { const idealTiles = [new OverscaledTileID(8, 0, 7, 0, 0), new OverscaledTileID(8, 0, 7, 1, 0)]; const retained = sourceCache._updateRetainedTiles(idealTiles, 8); - t.deepEqual(Object.keys(retained), [ + t.deepEqual(Object.keys(retained).sort(tileIDKeyComparison), [ new OverscaledTileID(7, 0, 7, 0, 0).key, new OverscaledTileID(8, 0, 7, 0, 0).key, new OverscaledTileID(7, 0, 7, 1, 0).key, @@ -1302,12 +1303,12 @@ test('SourceCache#tilesIn', (t) => { tiles.sort((a, b) => { return a.tile.tileID.canonical.x - b.tile.tileID.canonical.x; }); tiles.forEach((result) => { delete result.tile.uid; }); - t.equal(tiles[0].tile.tileID.key, 1); + t.equal(tiles[0].tile.tileID.key, "00101"); t.equal(tiles[0].tile.tileSize, 512); t.equal(tiles[0].scale, 1); t.deepEqual(round(tiles[0].queryGeometry), [{x: 4096, y: 4050}, {x:12288, y: 8146}]); - t.equal(tiles[1].tile.tileID.key, 33); + t.equal(tiles[1].tile.tileID.key, "10101"); t.equal(tiles[1].tile.tileSize, 512); t.equal(tiles[1].scale, 1); t.deepEqual(round(tiles[1].queryGeometry), [{x: -4096, y: 4050}, {x: 4096, y: 8146}]); @@ -1340,10 +1341,10 @@ test('SourceCache#tilesIn', (t) => { sourceCache.update(transform); t.deepEqual(sourceCache.getIds(), [ - new OverscaledTileID(2, 0, 2, 1, 1).key, - new OverscaledTileID(2, 0, 2, 0, 1).key, - new OverscaledTileID(2, 0, 2, 1, 0).key, - new OverscaledTileID(2, 0, 2, 0, 0).key + new OverscaledTileID(2, 0, 1, 1, 1).key, + new OverscaledTileID(2, 0, 1, 0, 1).key, + new OverscaledTileID(2, 0, 1, 1, 0).key, + new OverscaledTileID(2, 0, 1, 0, 0).key ]); const tiles = sourceCache.tilesIn([ @@ -1354,12 +1355,12 @@ test('SourceCache#tilesIn', (t) => { tiles.sort((a, b) => { return a.tile.tileID.canonical.x - b.tile.tileID.canonical.x; }); tiles.forEach((result) => { delete result.tile.uid; }); - t.equal(tiles[0].tile.tileID.key, 2); + t.equal(tiles[0].tile.tileID.key, "00102"); t.equal(tiles[0].tile.tileSize, 1024); t.equal(tiles[0].scale, 1); t.deepEqual(round(tiles[0].queryGeometry), [{x: 4096, y: 4050}, {x:12288, y: 8146}]); - t.equal(tiles[1].tile.tileID.key, 34); + t.equal(tiles[1].tile.tileID.key, "10102"); t.equal(tiles[1].tile.tileSize, 1024); t.equal(tiles[1].scale, 1); t.deepEqual(round(tiles[1].queryGeometry), [{x: -4096, y: 4050}, {x: 4096, y: 8146}]); diff --git a/test/unit/source/tile_id.test.js b/test/unit/source/tile_id.test.js index 10e276964af..465e890eaa1 100644 --- a/test/unit/source/tile_id.test.js +++ b/test/unit/source/tile_id.test.js @@ -23,10 +23,10 @@ test('CanonicalTileID', (t) => { }); t.test('.key', (t) => { - t.deepEqual(new CanonicalTileID(0, 0, 0).key, 0); - t.deepEqual(new CanonicalTileID(1, 0, 0).key, 1); - t.deepEqual(new CanonicalTileID(1, 1, 0).key, 33); - t.deepEqual(new CanonicalTileID(1, 1, 1).key, 97); + t.deepEqual(new CanonicalTileID(0, 0, 0).key, "00000"); + t.deepEqual(new CanonicalTileID(1, 0, 0).key, "00101"); + t.deepEqual(new CanonicalTileID(1, 1, 0).key, "10101"); + t.deepEqual(new CanonicalTileID(1, 1, 1).key, "30101"); t.end(); }); @@ -77,11 +77,11 @@ test('OverscaledTileID', (t) => { }); t.test('.key', (t) => { - t.deepEqual(new OverscaledTileID(0, 0, 0, 0, 0).key, 0); - t.deepEqual(new OverscaledTileID(1, 0, 1, 0, 0).key, 1); - t.deepEqual(new OverscaledTileID(1, 0, 1, 1, 0).key, 33); - t.deepEqual(new OverscaledTileID(1, 0, 1, 1, 1).key, 97); - t.deepEqual(new OverscaledTileID(1, -1, 1, 1, 1).key, 225); + t.deepEqual(new OverscaledTileID(0, 0, 0, 0, 0).key, "00000"); + t.deepEqual(new OverscaledTileID(1, 0, 1, 0, 0).key, "00101"); + t.deepEqual(new OverscaledTileID(1, 0, 1, 1, 0).key, "10101"); + t.deepEqual(new OverscaledTileID(1, 0, 1, 1, 1).key, "30101"); + t.deepEqual(new OverscaledTileID(1, -1, 1, 1, 1).key, "70101"); t.end(); }); diff --git a/test/unit/ui/map.test.js b/test/unit/ui/map.test.js index 47da135e998..059291b980d 100755 --- a/test/unit/ui/map.test.js +++ b/test/unit/ui/map.test.js @@ -322,11 +322,11 @@ test('Map', (t) => { const map = createMap(t, {style}); t.equal(map.areTilesLoaded(), true, 'returns true if there are no sources on the map'); map.on('load', () => { - + const fakeTileId = new OverscaledTileID(0, 0, 0, 0, 0); map.addSource('geojson', createStyleSource()); - map.style.sourceCaches.geojson._tiles.fakeTile = new Tile(new OverscaledTileID(0, 0, 0, 0, 0)); + map.style.sourceCaches.geojson._tiles[fakeTileId.key] = new Tile(fakeTileId); t.equal(map.areTilesLoaded(), false, 'returns false if tiles are loading'); - map.style.sourceCaches.geojson._tiles.fakeTile.state = 'loaded'; + map.style.sourceCaches.geojson._tiles[fakeTileId.key].state = 'loaded'; t.equal(map.areTilesLoaded(), true, 'returns true if tiles are loaded'); t.end(); });