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.

410 lines
12 KiB
JavaScript

import { Credit } from "../../Source/Cesium.js";
import { defaultValue } from "../../Source/Cesium.js";
import { IonResource } from "../../Source/Cesium.js";
import { RequestScheduler } from "../../Source/Cesium.js";
import { Resource } from "../../Source/Cesium.js";
import { RuntimeError } from "../../Source/Cesium.js";
import { ArcGisMapServerImageryProvider } from "../../Source/Cesium.js";
import { BingMapsImageryProvider } from "../../Source/Cesium.js";
import { GoogleEarthEnterpriseMapsProvider } from "../../Source/Cesium.js";
import { ImageryProvider } from "../../Source/Cesium.js";
import { IonImageryProvider } from "../../Source/Cesium.js";
import { MapboxImageryProvider } from "../../Source/Cesium.js";
import { SingleTileImageryProvider } from "../../Source/Cesium.js";
import { UrlTemplateImageryProvider } from "../../Source/Cesium.js";
import { WebMapServiceImageryProvider } from "../../Source/Cesium.js";
import { WebMapTileServiceImageryProvider } from "../../Source/Cesium.js";
import { when } from "../../Source/Cesium.js";
describe("Scene/IonImageryProvider", function () {
function createTestProvider(endpointData) {
endpointData = defaultValue(endpointData, {
type: "IMAGERY",
url: "http://test.invalid/layer",
accessToken: "not_really_a_refresh_token",
attributions: [],
});
var assetId = 12335;
var options = { assetId: assetId };
var endpointResource = IonResource._createEndpointResource(
assetId,
options
);
spyOn(IonResource, "_createEndpointResource").and.returnValue(
endpointResource
);
spyOn(endpointResource, "fetchJson").and.returnValue(
when.resolve(endpointData)
);
var provider = new IonImageryProvider(options);
expect(IonResource._createEndpointResource).toHaveBeenCalledWith(
assetId,
options
);
return provider;
}
beforeEach(function () {
RequestScheduler.clearForSpecs();
IonImageryProvider._endpointCache = {};
});
it("conforms to ImageryProvider interface", function () {
expect(IonImageryProvider).toConformToInterface(ImageryProvider);
});
it("throws without asset ID", function () {
expect(function () {
return new IonImageryProvider({});
}).toThrowDeveloperError(ImageryProvider);
});
it("readyPromise rejects with non-imagery asset", function (done) {
var provider = createTestProvider({
type: "3DTILES",
url: "http://test.invalid/layer",
accessToken: "not_really_a_refresh_token",
attributions: [],
});
return provider.readyPromise
.then(function () {
fail("should not be called");
})
.otherwise(function (error) {
expect(error).toBeInstanceOf(RuntimeError);
expect(provider.ready).toBe(false);
});
});
it("readyPromise rejects with unknown external asset type", function (done) {
var provider = createTestProvider({
type: "IMAGERY",
externalType: "TUBELCANE",
options: { url: "http://test.invalid/layer" },
attributions: [],
});
return provider.readyPromise
.then(function () {
fail("should not be called");
})
.otherwise(function (error) {
expect(error).toBeInstanceOf(RuntimeError);
expect(provider.ready).toBe(false);
});
});
it("readyPromise resolves when ready", function () {
var provider = createTestProvider();
return provider.readyPromise.then(function () {
expect(provider.errorEvent).toBeDefined();
expect(provider.ready).toBe(true);
expect(provider._imageryProvider).toBeInstanceOf(
UrlTemplateImageryProvider
);
});
});
it("Uses previously fetched endpoint cache", function () {
var endpointData = {
type: "IMAGERY",
url: "http://test.invalid/layer",
accessToken: "not_really_a_refresh_token",
attributions: [],
};
var assetId = 12335;
var options = {
assetId: assetId,
accessToken: "token",
server: "http://test.invalid",
};
var endpointResource = IonResource._createEndpointResource(
assetId,
options
);
spyOn(IonResource, "_createEndpointResource").and.returnValue(
endpointResource
);
spyOn(endpointResource, "fetchJson").and.returnValue(
when.resolve(endpointData)
);
expect(endpointResource.fetchJson.calls.count()).toBe(0);
var provider = new IonImageryProvider(options);
var provider2;
return provider.readyPromise
.then(function () {
expect(provider.ready).toBe(true);
expect(endpointResource.fetchJson.calls.count()).toBe(1);
// Same as options but in a different order to verify cache is order independant.
var options2 = {
accessToken: "token",
server: "http://test.invalid",
assetId: assetId,
};
provider2 = new IonImageryProvider(options2);
return provider2.readyPromise;
})
.then(function () {
//Since the data is cached, fetchJson is not called again.
expect(endpointResource.fetchJson.calls.count()).toBe(1);
expect(provider2.ready).toBe(true);
});
});
it("propagates called to underlying imagery provider resolves when ready", function () {
var provider = createTestProvider();
var internalProvider;
return provider.readyPromise
.then(function () {
internalProvider = provider._imageryProvider;
expect(provider.rectangle).toBe(internalProvider.rectangle);
expect(provider.tileWidth).toBe(internalProvider.tileWidth);
expect(provider.tileHeight).toBe(internalProvider.tileHeight);
expect(provider.maximumLevel).toBe(internalProvider.maximumLevel);
expect(provider.minimumLevel).toBe(internalProvider.minimumLevel);
expect(provider.tilingScheme).toBe(internalProvider.tilingScheme);
expect(provider.tileDiscardPolicy).toBe(
internalProvider.tileDiscardPolicy
);
expect(provider.credit).toBe(internalProvider.credit);
expect(provider.hasAlphaChannel).toBe(internalProvider.hasAlphaChannel);
var image = new Image();
var request = {};
spyOn(internalProvider, "requestImage").and.returnValue(
when.resolve(image)
);
return provider.requestImage(1, 2, 3, request).then(function (result) {
expect(internalProvider.requestImage).toHaveBeenCalledWith(
1,
2,
3,
request
);
expect(result).toBe(image);
});
})
.then(function () {
var info = {};
spyOn(internalProvider, "pickFeatures").and.returnValue(
when.resolve(info)
);
return provider.pickFeatures(1, 2, 3, 4, 5).then(function (result) {
expect(internalProvider.pickFeatures).toHaveBeenCalledWith(
1,
2,
3,
4,
5
);
expect(result).toBe(info);
});
})
.then(function () {
var innerCredit = new Credit("Data provided");
spyOn(internalProvider, "getTileCredits").and.returnValue([
innerCredit,
]);
var credits = provider.getTileCredits(1, 2, 3);
expect(internalProvider.getTileCredits).toHaveBeenCalledWith(1, 2, 3);
expect(credits).toContain(innerCredit);
});
});
it("throws developer errors when not ready", function () {
var provider = createTestProvider();
provider._ready = false;
expect(function () {
return provider.rectangle;
}).toThrowDeveloperError();
expect(function () {
return provider.tileWidth;
}).toThrowDeveloperError();
expect(function () {
return provider.tileHeight;
}).toThrowDeveloperError();
expect(function () {
return provider.maximumLevel;
}).toThrowDeveloperError();
expect(function () {
return provider.minimumLevel;
}).toThrowDeveloperError();
expect(function () {
return provider.tilingScheme;
}).toThrowDeveloperError();
expect(function () {
return provider.tileDiscardPolicy;
}).toThrowDeveloperError();
expect(function () {
return provider.credit;
}).toThrowDeveloperError();
expect(function () {
return provider.hasAlphaChannel;
}).toThrowDeveloperError();
expect(function () {
return provider.requestImage(1, 2, 3, {});
}).toThrowDeveloperError();
expect(function () {
return provider.pickFeatures(1, 2, 3, 4, 5);
}).toThrowDeveloperError();
expect(function () {
return provider.getTileCredits(1, 2, 3);
}).toThrowDeveloperError();
});
it("handles server-sent credits", function () {
var serverCredit = {
html: '<a href="http://test.invalid/">Text</a>',
collapsible: false,
};
var provider = createTestProvider({
type: "IMAGERY",
url: "http://test.invalid/layer",
accessToken: "not_really_a_refresh_token",
attributions: [serverCredit],
});
return provider.readyPromise.then(function () {
var credits = provider.getTileCredits(0, 0, 0);
var credit = credits[0];
expect(credit).toBeInstanceOf(Credit);
expect(credit.html).toEqual(serverCredit.html);
expect(credit.showOnScreen).toEqual(!serverCredit.collapsible);
});
});
function testExternalImagery(type, options, ImageryClass) {
var provider = createTestProvider({
type: "IMAGERY",
externalType: type,
options: options,
attributions: [],
});
expect(provider._imageryProvider).toBeInstanceOf(ImageryClass);
}
it("createImageryProvider works with ARCGIS_MAPSERVER", function () {
spyOn(Resource._Implementations, "loadAndExecuteScript").and.callFake(
function (url, name, deffered) {
deffered.resolve({
resourceSets: [
{
resources: [{ imageUrl: "", imageUrlSubdomains: [], zoomMax: 0 }],
},
],
});
}
);
return testExternalImagery(
"ARCGIS_MAPSERVER",
{ url: "http://test.invalid" },
ArcGisMapServerImageryProvider
);
});
it("createImageryProvider works with BING", function () {
spyOn(Resource._Implementations, "loadAndExecuteScript").and.callFake(
function (url, name, deffered) {
deffered.resolve({
resourceSets: [
{
resources: [{ imageUrl: "", imageUrlSubdomains: [], zoomMax: 0 }],
},
],
});
}
);
return testExternalImagery(
"BING",
{ url: "http://test.invalid", key: "" },
BingMapsImageryProvider
);
});
it("createImageryProvider works with GOOGLE_EARTH", function () {
spyOn(Resource._Implementations, "loadWithXhr").and.callFake(function (
url,
responseType,
method,
data,
headers,
deferred,
overrideMimeType
) {
deferred.resolve(JSON.stringify({ layers: [{ id: 0, version: "" }] }));
});
return testExternalImagery(
"GOOGLE_EARTH",
{ url: "http://test.invalid", channel: 0 },
GoogleEarthEnterpriseMapsProvider
);
});
it("createImageryProvider works with MAPBOX", function () {
return testExternalImagery(
"MAPBOX",
{ accessToken: "test-token", url: "http://test.invalid", mapId: 1 },
MapboxImageryProvider
);
});
it("createImageryProvider works with SINGLE_TILE", function () {
spyOn(Resource._Implementations, "createImage").and.callFake(function (
request,
crossOrigin,
deferred
) {
deferred.resolve({});
});
return testExternalImagery(
"SINGLE_TILE",
{ url: "http://test.invalid" },
SingleTileImageryProvider
);
});
it("createImageryProvider works with TMS", function () {
return testExternalImagery(
"TMS",
{ url: "http://test.invalid" },
UrlTemplateImageryProvider
);
});
it("createImageryProvider works with URL_TEMPLATE", function () {
return testExternalImagery(
"URL_TEMPLATE",
{ url: "http://test.invalid" },
UrlTemplateImageryProvider
);
});
it("createImageryProvider works with WMS", function () {
return testExternalImagery(
"WMS",
{ url: "http://test.invalid", layers: [] },
WebMapServiceImageryProvider
);
});
it("createImageryProvider works with WMTS", function () {
return testExternalImagery(
"WMTS",
{ url: "http://test.invalid", layer: "", style: "", tileMatrixSetID: 1 },
WebMapTileServiceImageryProvider
);
});
});