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 { TerrainProvider } from "../../Source/Cesium.js";
import { VRTheWorldTerrainProvider } from "../../Source/Cesium.js";
import pollToPromise from "../pollToPromise.js";
import { when } from "../../Source/Cesium.js";
describe("Core/VRTheWorldTerrainProvider", function () {
var imageUrl = "Data/Images/Red16x16.png";
beforeEach(function () {
RequestScheduler.clearForSpecs();
Resource._Implementations.loadWithXhr = function (
url,
responseType,
method,
data,
headers,
deferred,
overrideMimeType
) {
if (url === imageUrl) {
Resource._DefaultImplementations.loadWithXhr(
url,
responseType,
method,
data,
headers,
deferred,
overrideMimeType
);
return;
}
setTimeout(function () {
var parser = new DOMParser();
var xmlString =
'' +
"" +
"Hawaii World elev" +
"layer to make cesium work right" +
"EPSG:4326" +
'' +
'' +
'' +
"" +
'' +
'' +
'' +
'' +
"" +
"" +
'' +
'' +
"" +
"";
var xml = parser.parseFromString(xmlString, "text/xml");
deferred.resolve(xml);
}, 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(VRTheWorldTerrainProvider).toConformToInterface(TerrainProvider);
});
it("constructor throws if url is not provided", function () {
expect(function () {
return new VRTheWorldTerrainProvider();
}).toThrowDeveloperError();
expect(function () {
return new VRTheWorldTerrainProvider({});
}).toThrowDeveloperError();
});
it("resolves readyPromise", function () {
var provider = new VRTheWorldTerrainProvider({
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 VRTheWorldTerrainProvider({
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 VRTheWorldTerrainProvider({
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 VRTheWorldTerrainProvider({
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 VRTheWorldTerrainProvider({
url: "made/up/url",
});
expect(function () {
provider.getLevelMaximumGeometricError(0);
}).toThrowDeveloperError();
});
it("getTilingScheme must not be called before isReady returns true", function () {
var provider = new VRTheWorldTerrainProvider({
url: "made/up/url",
});
expect(function () {
return provider.tilingScheme;
}).toThrowDeveloperError();
});
it("logo is undefined if credit is not provided", function () {
var provider = new VRTheWorldTerrainProvider({
url: "made/up/url",
});
expect(provider.credit).toBeUndefined();
});
it("logo is defined if credit is provided", function () {
var provider = new VRTheWorldTerrainProvider({
url: "made/up/url",
credit: "thanks to our awesome made up contributors!",
});
expect(provider.credit).toBeDefined();
});
it("does not have a water mask", function () {
var provider = new VRTheWorldTerrainProvider({
url: "made/up/url",
});
expect(provider.hasWaterMask).toBe(false);
});
it("is not ready immediately", function () {
var provider = new VRTheWorldTerrainProvider({
url: "made/up/url",
});
expect(provider.ready).toBe(false);
});
it("raises an error if the SRS is not supported", function () {
Resource._Implementations.loadWithXhr = function (
url,
responseType,
method,
data,
headers,
deferred,
overrideMimeType
) {
setTimeout(function () {
var parser = new DOMParser();
var xmlString =
'' +
"" +
"Hawaii World elev" +
"layer to make cesium work right" +
"EPSG:foo" +
'' +
'' +
'' +
"" +
'' +
'' +
'' +
'' +
"" +
"" +
'' +
'' +
"" +
"";
var xml = parser.parseFromString(xmlString, "text/xml");
deferred.resolve(xml);
}, 1);
};
var terrainProvider = new VRTheWorldTerrainProvider({
url: "made/up/url",
});
var deferred = when.defer();
terrainProvider.errorEvent.addEventListener(function () {
deferred.resolve();
});
return deferred.promise;
});
describe("requestTileGeometry", function () {
it("must not be called before isReady returns true", function () {
var terrainProvider = new VRTheWorldTerrainProvider({
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";
Resource._Implementations.createImage = function (
request,
crossOrigin,
deferred
) {
expect(
request.url.indexOf(".tif?cesium=true")
).toBeGreaterThanOrEqualTo(0);
// Just return any old image.
Resource._DefaultImplementations.createImage(
new Request({ url: imageUrl }),
crossOrigin,
deferred
);
};
var terrainProvider = new VRTheWorldTerrainProvider({
url: baseUrl,
});
return pollToPromise(function () {
return terrainProvider.ready;
})
.then(function () {
expect(terrainProvider.tilingScheme).toBeInstanceOf(
GeographicTilingScheme
);
return terrainProvider.requestTileGeometry(0, 0, 0);
})
.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 VRTheWorldTerrainProvider({
url: baseUrl,
});
return pollToPromise(function () {
return terrainProvider.ready;
}).then(function () {
var promise;
var i;
for (i = 0; i < RequestScheduler.maximumRequestsPerServer; ++i) {
promise = terrainProvider.requestTileGeometry(
0,
0,
0,
createRequest()
);
}
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();
}
});
});
});
});