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(); } }); }); }); });