Files
openlayers/test/browser/spec/ol/renderer/webgl/TileLayer.test.js

104 lines
3.8 KiB
JavaScript

import TileQueue from '../../../../../../src/ol/TileQueue.js';
import TileState from '../../../../../../src/ol/TileState.js';
import WebGLTileLayer from '../../../../../../src/ol/layer/WebGLTile.js';
import {DataTile} from '../../../../../../src/ol/source.js';
import {VOID} from '../../../../../../src/ol/functions.js';
import {create} from '../../../../../../src/ol/transform.js';
import {createCanvasContext2D} from '../../../../../../src/ol/dom.js';
import {get} from '../../../../../../src/ol/proj.js';
describe('ol/renderer/webgl/TileLayer', function () {
/** @type {import("../../../../../../src/ol/renderer/webgl/TileLayer.js").default} */
let renderer;
/** @type {WebGLTileLayer} */
let tileLayer;
/** @type {import('../../../../../../src/ol/PluggableMap.js').FrameState} */
let frameState;
beforeEach(function () {
const size = 256;
const context = createCanvasContext2D(size, size);
tileLayer = new WebGLTileLayer({
source: new DataTile({
loader: function (z, x, y) {
context.clearRect(0, 0, size, size);
context.fillStyle = 'rgba(100, 100, 100, 0.5)';
context.fillRect(0, 0, size, size);
const data = context.getImageData(0, 0, size, size).data;
return Promise.resolve(data);
},
}),
});
renderer = tileLayer.createRenderer();
const proj = get('EPSG:3857');
frameState = {
layerStatesArray: [tileLayer.getLayerState()],
layerIndex: 0,
extent: proj.getExtent(),
pixelRatio: 1,
pixelToCoordinateTransform: create(),
postRenderFunctions: [],
time: Date.now(),
viewHints: [],
viewState: {
center: [0, 0],
resolution: 156543.03392804097,
projection: proj,
},
size: [256, 256],
usedTiles: {},
wantedTiles: {},
tileQueue: new TileQueue(VOID, VOID),
};
});
it('maintains a cache on the renderer instead of the source', function () {
expect(tileLayer.getSource().tileCache.highWaterMark).to.be(0.1);
expect(renderer.tileTextureCache_.highWaterMark).to.be(512);
});
it('#prepareFrame()', function () {
const source = tileLayer.getSource();
tileLayer.setSource(null);
expect(renderer.prepareFrame(frameState)).to.be(false);
tileLayer.setSource(source);
expect(renderer.prepareFrame(frameState)).to.be(true);
const tileGrid = source.getTileGrid();
tileLayer.setExtent(tileGrid.getTileCoordExtent([2, 0, 0]));
frameState.resolution = tileGrid.getResolution(2);
frameState.extent = tileGrid.getTileCoordExtent([2, 2, 2]);
frameState.layerStatesArray = [tileLayer.getLayerState()];
expect(renderer.prepareFrame(frameState)).to.be(false);
});
it('#renderFrame()', function () {
const ready = renderer.prepareFrame(frameState);
expect(ready).to.be(true);
const rendered = renderer.renderFrame(frameState);
expect(rendered).to.be.a(HTMLCanvasElement);
expect(frameState.tileQueue.getCount()).to.be(1);
expect(Object.keys(frameState.wantedTiles).length).to.be(1);
expect(frameState.postRenderFunctions.length).to.be(1); // clear source cache (use renderer cache)
expect(renderer.tileTextureCache_.count_).to.be(1);
});
it('#isDrawableTile_()', function (done) {
const tile = tileLayer.getSource().getTile(0, 0, 0);
expect(renderer.isDrawableTile_(tile)).to.be(false);
tileLayer.getSource().on('tileloadend', () => {
expect(renderer.isDrawableTile_(tile)).to.be(true);
done();
});
tile.load();
const errorTile = tileLayer.getSource().getTile(1, 0, 1);
errorTile.setState(TileState.ERROR);
tileLayer.setUseInterimTilesOnError(false);
expect(renderer.isDrawableTile_(errorTile)).to.be(true);
tileLayer.setUseInterimTilesOnError(true);
expect(renderer.isDrawableTile_(errorTile)).to.be(false);
});
});