You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Cesium-Prequel/Specs/Core/ArcGISTiledElevationTerrain...

496 lines
14 KiB
JavaScript

import { ArcGISTiledElevationTerrainProvider } from "../../Source/Cesium.js";
import { DefaultProxy } from "../../Source/Cesium.js";
import { GeographicTilingScheme } from "../../Source/Cesium.js";
import { HeightmapTerrainData } from "../../Source/Cesium.js";
import { Math as CesiumMath } from "../../Source/Cesium.js";
import { Request } from "../../Source/Cesium.js";
import { RequestScheduler } from "../../Source/Cesium.js";
import { Resource } from "../../Source/Cesium.js";
import { RuntimeError } from "../../Source/Cesium.js";
import { TerrainProvider } from "../../Source/Cesium.js";
import { WebMercatorTilingScheme } from "../../Source/Cesium.js";
import pollToPromise from "../pollToPromise.js";
describe("Core/ArcGISTiledElevationTerrainProvider", function () {
var lercTileUrl = "Data/Images/Red16x16.png";
var availability;
var metadata;
beforeEach(function () {
availability = {
data: [],
};
availability.data.length = 128 * 128;
availability.data.fill(1);
metadata = {
currentVersion: 10.3,
serviceDescription: "Test",
name: "Test",
description: "Test",
extent: {
xmin: -2.0037507842788246e7,
ymin: -2.0037508659999996e7,
xmax: 2.0037509157211754e7,
ymax: 2.0037508340000004e7,
spatialReference: {
wkid: 102100,
latestWkid: 3857,
},
},
bandCount: 1,
copyrightText:
"Source: USGS, NGA, NASA, CGIAR, GEBCO,N Robinson,NCEAS,NLS,OS,NMA,Geodatastyrelsen and the GIS User Community",
minValues: [-450],
maxValues: [8700],
capabilities: "Image,Tilemap,Mensuration",
tileInfo: {
rows: 256,
cols: 256,
format: "LERC",
lods: [
{
level: 0,
resolution: 156543.03392800014,
scale: 5.91657527591555e8,
},
{
level: 1,
resolution: 78271.51696399994,
scale: 2.95828763795777e8,
},
{
level: 2,
resolution: 39135.75848200009,
scale: 1.47914381897889e8,
},
{
level: 3,
resolution: 19567.87924099992,
scale: 7.3957190948944e7,
},
{
level: 4,
resolution: 9783.93962049996,
scale: 3.6978595474472e7,
},
{
level: 5,
resolution: 4891.96981024998,
scale: 1.8489297737236e7,
},
{
level: 6,
resolution: 2445.98490512499,
scale: 9244648.868618,
},
{
level: 7,
resolution: 1222.992452562495,
scale: 4622324.434309,
},
{
level: 8,
resolution: 611.4962262813797,
scale: 2311162.217155,
},
{
level: 9,
resolution: 305.74811314055756,
scale: 1155581.108577,
},
{
level: 10,
resolution: 152.87405657041106,
scale: 577790.554289,
},
{
level: 11,
resolution: 76.43702828507324,
scale: 288895.277144,
},
{
level: 12,
resolution: 38.21851414253662,
scale: 144447.638572,
},
{
level: 13,
resolution: 19.10925707126831,
scale: 72223.819286,
},
{
level: 14,
resolution: 9.554628535634155,
scale: 36111.909643,
},
{
level: 15,
resolution: 4.77731426794937,
scale: 18055.954822,
},
{
level: 16,
resolution: 2.388657133974685,
scale: 9027.977411,
},
],
},
spatialReference: {
wkid: 3857,
latestWkid: 3857,
},
};
RequestScheduler.clearForSpecs();
Resource._Implementations.loadWithXhr = function (
url,
responseType,
method,
data,
headers,
deferred,
overrideMimeType
) {
// Tile request
if (url.indexOf("/tile/") !== -1) {
Resource._DefaultImplementations.loadWithXhr(
lercTileUrl,
responseType,
method,
data,
headers,
deferred,
overrideMimeType
);
return;
}
// Availability request
if (url.indexOf("/tilemap/") !== -1) {
setTimeout(function () {
deferred.resolve(JSON.stringify(availability));
}, 1);
return;
}
// Metadata
setTimeout(function () {
deferred.resolve(JSON.stringify(metadata));
}, 1);
};
});
afterEach(function () {
Resource._Implementations.createImage =
Resource._DefaultImplementations.createImage;
Resource._Implementations.loadWithXhr =
Resource._DefaultImplementations.loadWithXhr;
});
function createRequest() {
return new Request({
throttleByServer: true,
});
}
it("conforms to TerrainProvider interface", function () {
expect(ArcGISTiledElevationTerrainProvider).toConformToInterface(
TerrainProvider
);
});
it("constructor throws if url is not provided", function () {
expect(function () {
return new ArcGISTiledElevationTerrainProvider();
}).toThrowDeveloperError();
expect(function () {
return new ArcGISTiledElevationTerrainProvider({});
}).toThrowDeveloperError();
});
it("resolves readyPromise", function () {
var provider = new ArcGISTiledElevationTerrainProvider({
url: "made/up/url",
});
return provider.readyPromise.then(function (result) {
expect(result).toBe(true);
expect(provider.ready).toBe(true);
});
});
it("resolves readyPromise with Resource", function () {
var resource = new Resource({
url: "made/up/url",
});
var provider = new ArcGISTiledElevationTerrainProvider({
url: resource,
});
return provider.readyPromise.then(function (result) {
expect(result).toBe(true);
expect(provider.ready).toBe(true);
});
});
it("has error event", function () {
var provider = new ArcGISTiledElevationTerrainProvider({
url: "made/up/url",
});
expect(provider.errorEvent).toBeDefined();
expect(provider.errorEvent).toBe(provider.errorEvent);
});
it("returns reasonable geometric error for various levels", function () {
var provider = new ArcGISTiledElevationTerrainProvider({
url: "made/up/url",
});
return pollToPromise(function () {
return provider.ready;
}).then(function () {
expect(provider.getLevelMaximumGeometricError(0)).toBeGreaterThan(0.0);
expect(provider.getLevelMaximumGeometricError(0)).toEqualEpsilon(
provider.getLevelMaximumGeometricError(1) * 2.0,
CesiumMath.EPSILON10
);
expect(provider.getLevelMaximumGeometricError(1)).toEqualEpsilon(
provider.getLevelMaximumGeometricError(2) * 2.0,
CesiumMath.EPSILON10
);
});
});
it("getLevelMaximumGeometricError must not be called before isReady returns true", function () {
var provider = new ArcGISTiledElevationTerrainProvider({
url: "made/up/url",
});
expect(function () {
provider.getLevelMaximumGeometricError(0);
}).toThrowDeveloperError();
});
it("getTilingScheme must not be called before isReady returns true", function () {
var provider = new ArcGISTiledElevationTerrainProvider({
url: "made/up/url",
});
expect(function () {
return provider.tilingScheme;
}).toThrowDeveloperError();
});
it("logo is undefined if credit is not provided", function () {
delete metadata.copyrightText;
var provider = new ArcGISTiledElevationTerrainProvider({
url: "made/up/url",
});
return pollToPromise(function () {
return provider.ready;
}).then(function () {
expect(provider.credit).toBeUndefined();
});
});
it("logo is defined if credit is provided", function () {
var provider = new ArcGISTiledElevationTerrainProvider({
url: "made/up/url",
credit: "thanks to our awesome made up contributors!",
});
return pollToPromise(function () {
return provider.ready;
}).then(function () {
expect(provider.credit).toBeDefined();
});
});
it("does not have a water mask", function () {
var provider = new ArcGISTiledElevationTerrainProvider({
url: "made/up/url",
});
expect(provider.hasWaterMask).toBe(false);
});
it("is not ready immediately", function () {
var provider = new ArcGISTiledElevationTerrainProvider({
url: "made/up/url",
});
expect(provider.ready).toBe(false);
});
it("detects WebMercator tiling scheme", function () {
var baseUrl = "made/up/url";
var terrainProvider = new ArcGISTiledElevationTerrainProvider({
url: baseUrl,
});
return pollToPromise(function () {
return terrainProvider.ready;
}).then(function () {
expect(terrainProvider.tilingScheme).toBeInstanceOf(
WebMercatorTilingScheme
);
});
});
it("detects Geographic tiling scheme", function () {
var baseUrl = "made/up/url";
metadata.spatialReference.latestWkid = 4326;
var terrainProvider = new ArcGISTiledElevationTerrainProvider({
url: baseUrl,
});
return pollToPromise(function () {
return terrainProvider.ready;
}).then(function () {
expect(terrainProvider.tilingScheme).toBeInstanceOf(
GeographicTilingScheme
);
});
});
it("raises an error if the SRS is not supported", function () {
var baseUrl = "made/up/url";
metadata.spatialReference.latestWkid = 1234;
var terrainProvider = new ArcGISTiledElevationTerrainProvider({
url: baseUrl,
});
return terrainProvider.readyPromise.then(fail).otherwise(function (error) {
expect(error).toBeInstanceOf(RuntimeError);
});
});
it("raises an error if tileInfo missing", function () {
var baseUrl = "made/up/url";
delete metadata.tileInfo;
var terrainProvider = new ArcGISTiledElevationTerrainProvider({
url: baseUrl,
});
return terrainProvider.readyPromise.then(fail).otherwise(function (error) {
expect(error).toBeInstanceOf(RuntimeError);
});
});
it("checks availability if TileMap capability exists", function () {
var baseUrl = "made/up/url";
var terrainProvider = new ArcGISTiledElevationTerrainProvider({
url: baseUrl,
});
return pollToPromise(function () {
return terrainProvider.ready;
}).then(function () {
expect(terrainProvider._hasAvailability).toBe(true);
expect(terrainProvider._tilesAvailable).toBeDefined();
expect(terrainProvider._tilesAvailablityLoaded).toBeDefined();
});
});
it("does not check availability if TileMap capability is missing", function () {
var baseUrl = "made/up/url";
metadata.capabilities = "Image,Mensuration";
var terrainProvider = new ArcGISTiledElevationTerrainProvider({
url: baseUrl,
});
return pollToPromise(function () {
return terrainProvider.ready;
}).then(function () {
expect(terrainProvider._hasAvailability).toBe(false);
expect(terrainProvider._tilesAvailable).toBeUndefined();
expect(terrainProvider._tilesAvailablityLoaded).toBeUndefined();
});
});
describe("requestTileGeometry", function () {
it("must not be called before isReady returns true", function () {
var terrainProvider = new ArcGISTiledElevationTerrainProvider({
url: "made/up/url",
proxy: new DefaultProxy("/proxy/"),
});
expect(function () {
terrainProvider.requestTileGeometry(0, 0, 0);
}).toThrowDeveloperError();
});
it("provides HeightmapTerrainData", function () {
var baseUrl = "made/up/url";
var terrainProvider = new ArcGISTiledElevationTerrainProvider({
url: baseUrl,
});
return pollToPromise(function () {
return terrainProvider.ready;
})
.then(function () {
var promise = terrainProvider.requestTileGeometry(0, 0, 0);
RequestScheduler.update();
return promise;
})
.then(function (loadedData) {
expect(loadedData).toBeInstanceOf(HeightmapTerrainData);
});
});
it("returns undefined if too many requests are already in progress", function () {
var baseUrl = "made/up/url";
var deferreds = [];
Resource._Implementations.createImage = function (
request,
crossOrigin,
deferred
) {
// Do nothing, so requests never complete
deferreds.push(deferred);
};
var terrainProvider = new ArcGISTiledElevationTerrainProvider({
url: baseUrl,
});
return pollToPromise(function () {
return terrainProvider.ready;
}).then(function () {
var promise;
var i;
for (i = 0; i < RequestScheduler.maximumRequestsPerServer; ++i) {
var request = new Request({
throttle: true,
throttleByServer: true,
});
promise = terrainProvider.requestTileGeometry(0, 0, 0, request);
}
RequestScheduler.update();
expect(promise).toBeDefined();
promise = terrainProvider.requestTileGeometry(0, 0, 0, createRequest());
expect(promise).toBeUndefined();
for (i = 0; i < deferreds.length; ++i) {
deferreds[i].resolve();
}
});
});
});
});