DSDSWeb/static/js/Cesium-1.53/Specs/Core/CesiumTerrainProviderSpec.js

814 lines
31 KiB
JavaScript
Raw Normal View History

2024-07-11 18:02:47 +08:00
defineSuite([
'Core/CesiumTerrainProvider',
'Core/DefaultProxy',
'Core/Ellipsoid',
'Core/GeographicTilingScheme',
'Core/getAbsoluteUri',
'Core/HeightmapTerrainData',
'Core/IonResource',
'Core/Math',
'Core/QuantizedMeshTerrainData',
'Core/Request',
'Core/RequestScheduler',
'Core/Resource',
'Core/TerrainProvider',
'Specs/pollToPromise',
'ThirdParty/when'
], function(
CesiumTerrainProvider,
DefaultProxy,
Ellipsoid,
GeographicTilingScheme,
getAbsoluteUri,
HeightmapTerrainData,
IonResource,
CesiumMath,
QuantizedMeshTerrainData,
Request,
RequestScheduler,
Resource,
TerrainProvider,
pollToPromise,
when) {
'use strict';
beforeEach(function() {
RequestScheduler.clearForSpecs();
});
afterEach(function() {
Resource._Implementations.loadWithXhr = Resource._DefaultImplementations.loadWithXhr;
});
function returnTileJson(path) {
var oldLoad = Resource._Implementations.loadWithXhr;
Resource._Implementations.loadWithXhr = function(url, responseType, method, data, headers, deferred, overrideMimeType) {
if (url.indexOf('layer.json') >= 0) {
Resource._DefaultImplementations.loadWithXhr(path, responseType, method, data, headers, deferred);
} else {
return oldLoad(url, responseType, method, data, headers, deferred, overrideMimeType);
}
};
}
function returnHeightmapTileJson() {
return returnTileJson('Data/CesiumTerrainTileJson/StandardHeightmap.tile.json');
}
function returnQuantizedMeshTileJson() {
return returnTileJson('Data/CesiumTerrainTileJson/QuantizedMesh.tile.json');
}
function returnVertexNormalTileJson() {
return returnTileJson('Data/CesiumTerrainTileJson/VertexNormals.tile.json');
}
function returnOctVertexNormalTileJson() {
return returnTileJson('Data/CesiumTerrainTileJson/OctVertexNormals.tile.json');
}
function returnWaterMaskTileJson() {
return returnTileJson('Data/CesiumTerrainTileJson/WaterMask.tile.json');
}
function returnPartialAvailabilityTileJson() {
return returnTileJson('Data/CesiumTerrainTileJson/PartialAvailability.tile.json');
}
function returnParentUrlTileJson() {
var paths = ['Data/CesiumTerrainTileJson/ParentUrl.tile.json',
'Data/CesiumTerrainTileJson/Parent.tile.json'];
var i = 0;
var oldLoad = Resource._Implementations.loadWithXhr;
Resource._Implementations.loadWithXhr = function(url, responseType, method, data, headers, deferred, overrideMimeType) {
if (url.indexOf('layer.json') >= 0) {
Resource._DefaultImplementations.loadWithXhr(paths[i++], responseType, method, data, headers, deferred);
} else {
return oldLoad(url, responseType, method, data, headers, deferred, overrideMimeType);
}
};
}
function returnMetadataAvailabilityTileJson() {
return returnTileJson('Data/CesiumTerrainTileJson/MetadataAvailability.tile.json');
}
function waitForTile(level, x, y, requestNormals, requestWaterMask, f) {
var terrainProvider = new CesiumTerrainProvider({
url : 'made/up/url',
requestVertexNormals : requestNormals,
requestWaterMask: requestWaterMask
});
return pollToPromise(function() {
return terrainProvider.ready;
}).then(function() {
var promise = terrainProvider.requestTileGeometry(level, x, y);
return when(promise, f, function(error) {
expect('requestTileGeometry').toBe('returning a tile.'); // test failure
});
});
}
function createRequest() {
return new Request({
throttleByServer : true
});
}
it('conforms to TerrainProvider interface', function() {
expect(CesiumTerrainProvider).toConformToInterface(TerrainProvider);
});
it('constructor throws if url is not provided', function() {
expect(function() {
return new CesiumTerrainProvider();
}).toThrowDeveloperError();
expect(function() {
return new CesiumTerrainProvider({
});
}).toThrowDeveloperError();
});
it('resolves readyPromise', function() {
var provider = new CesiumTerrainProvider({
url : 'made/up/url'
});
return provider.readyPromise.then(function (result) {
expect(result).toBe(true);
expect(provider.ready).toBe(true);
});
});
it('resolves readyPromise when url promise is used', function() {
var provider = new CesiumTerrainProvider({
url : when.resolve('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 CesiumTerrainProvider({
url : resource
});
return provider.readyPromise.then(function (result) {
expect(result).toBe(true);
expect(provider.ready).toBe(true);
});
});
it('rejects readyPromise when url rejects', function() {
var error = new Error();
var provider = new CesiumTerrainProvider({
url: when.reject(error)
});
return provider.readyPromise
.then(function() {
fail('should not resolve');
})
.otherwise(function(result) {
expect(result).toBe(error);
expect(provider.ready).toBe(false);
});
});
it('uses geographic tiling scheme by default', function() {
returnHeightmapTileJson();
var provider = new CesiumTerrainProvider({
url : 'made/up/url'
});
return pollToPromise(function() {
return provider.ready;
}).then(function() {
var tilingScheme = provider.tilingScheme;
expect(tilingScheme instanceof GeographicTilingScheme).toBe(true);
});
});
it('can use a custom ellipsoid', function() {
returnHeightmapTileJson();
var ellipsoid = new Ellipsoid(1, 2, 3);
var provider = new CesiumTerrainProvider({
url : 'made/up/url',
ellipsoid : ellipsoid
});
return pollToPromise(function() {
return provider.ready;
}).then(function() {
expect(provider.tilingScheme.ellipsoid).toEqual(ellipsoid);
});
});
it('has error event', function() {
var provider = new CesiumTerrainProvider({
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 CesiumTerrainProvider({
url : 'made/up/url'
});
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('logo is undefined if credit is not provided', function() {
returnHeightmapTileJson();
var provider = new CesiumTerrainProvider({
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() {
returnHeightmapTileJson();
var provider = new CesiumTerrainProvider({
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('has a water mask', function() {
returnHeightmapTileJson();
var provider = new CesiumTerrainProvider({
url : 'made/up/url'
});
return pollToPromise(function() {
return provider.ready;
}).then(function() {
expect(provider.hasWaterMask).toBe(true);
});
});
it('has vertex normals', function() {
returnOctVertexNormalTileJson();
var provider = new CesiumTerrainProvider({
url : 'made/up/url',
requestVertexNormals : true
});
return pollToPromise(function() {
return provider.ready;
}).then(function() {
expect(provider.requestVertexNormals).toBe(true);
expect(provider.hasVertexNormals).toBe(true);
});
});
it('does not request vertex normals', function() {
returnOctVertexNormalTileJson();
var provider = new CesiumTerrainProvider({
url : 'made/up/url',
requestVertexNormals : false
});
return pollToPromise(function() {
return provider.ready;
}).then(function() {
expect(provider.requestVertexNormals).toBe(false);
expect(provider.hasVertexNormals).toBe(false);
});
});
it('requests parent layer.json', function() {
returnParentUrlTileJson();
var provider = new CesiumTerrainProvider({
url : 'made/up/url',
requestVertexNormals : true,
requestWaterMask : true
});
return pollToPromise(function() {
return provider.ready;
}).then(function() {
expect(provider._tileCredits[0].html).toBe('This is a child tileset! This amazing data is courtesy The Amazing Data Source!');
expect(provider.requestVertexNormals).toBe(true);
expect(provider.requestWaterMask).toBe(true);
expect(provider.hasVertexNormals).toBe(false); // Neither tileset has them
expect(provider.hasWaterMask).toBe(true); // The child tileset has them
expect(provider.availability.isTileAvailable(1, 2, 1)).toBe(true); // Both have this
expect(provider.availability.isTileAvailable(1, 3, 1)).toBe(true); // Parent has this, but child doesn't
expect(provider.availability.isTileAvailable(2, 0, 0)).toBe(false); // Neither has this
var layers = provider._layers;
expect(layers.length).toBe(2);
expect(layers[0].hasVertexNormals).toBe(false);
expect(layers[0].hasWaterMask).toBe(true);
expect(layers[0].availability.isTileAvailable(1, 2, 1)).toBe(true);
expect(layers[0].availability.isTileAvailable(1, 3, 1)).toBe(false);
expect(layers[0].availability.isTileAvailable(2, 0, 0)).toBe(false);
expect(layers[1].hasVertexNormals).toBe(false);
expect(layers[1].hasWaterMask).toBe(false);
expect(layers[1].availability.isTileAvailable(1, 2, 1)).toBe(true);
expect(layers[1].availability.isTileAvailable(1, 3, 1)).toBe(true);
expect(layers[1].availability.isTileAvailable(2, 0, 0)).toBe(false);
});
});
it('raises an error if layer.json does not specify a format', function() {
returnTileJson('Data/CesiumTerrainTileJson/NoFormat.tile.json');
var provider = new CesiumTerrainProvider({
url : 'made/up/url'
});
var deferred = when.defer();
provider.errorEvent.addEventListener(function(e) {
deferred.resolve(e);
});
return deferred.promise.then(function(error) {
expect(error.message).toContain('format is not specified');
});
});
it('raises an error if layer.json specifies an unknown format', function() {
returnTileJson('Data/CesiumTerrainTileJson/InvalidFormat.tile.json');
var provider = new CesiumTerrainProvider({
url : 'made/up/url'
});
var deferred = when.defer();
provider.errorEvent.addEventListener(function(e) {
deferred.resolve(e);
});
return deferred.promise.then(function(error) {
expect(error.message).toContain('invalid or not supported');
});
});
it('raises an error if layer.json does not specify quantized-mesh 1.x format', function() {
returnTileJson('Data/CesiumTerrainTileJson/QuantizedMesh2.0.tile.json');
var provider = new CesiumTerrainProvider({
url : 'made/up/url'
});
var deferred = when.defer();
provider.errorEvent.addEventListener(function(e) {
deferred.resolve(e);
});
return deferred.promise.then(function(error) {
expect(error.message).toContain('invalid or not supported');
});
});
it('supports quantized-mesh1.x minor versions', function() {
returnTileJson('Data/CesiumTerrainTileJson/QuantizedMesh1.1.tile.json');
var provider = new CesiumTerrainProvider({
url : 'made/up/url'
});
var errorListener = jasmine.createSpy('error');
provider.errorEvent.addEventListener(errorListener);
return pollToPromise(function() {
return provider.ready;
}).then(function() {
expect(errorListener).not.toHaveBeenCalled();
});
});
it('raises an error if layer.json does not specify a tiles property', function() {
returnTileJson('Data/CesiumTerrainTileJson/NoTiles.tile.json');
var provider = new CesiumTerrainProvider({
url : 'made/up/url'
});
var deferred = when.defer();
provider.errorEvent.addEventListener(function(e) {
deferred.resolve(e);
});
return deferred.promise.then(function(error) {
expect(error.message).toContain('does not specify any tile URL templates');
});
});
it('raises an error if layer.json tiles property is an empty array', function() {
returnTileJson('Data/CesiumTerrainTileJson/EmptyTilesArray.tile.json');
var provider = new CesiumTerrainProvider({
url : 'made/up/url'
});
var deferred = when.defer();
provider.errorEvent.addEventListener(function(e) {
deferred.resolve(e);
});
return deferred.promise.then(function(error) {
expect(error.message).toContain('does not specify any tile URL templates');
});
});
it('uses attribution specified in layer.json', function() {
returnTileJson('Data/CesiumTerrainTileJson/WithAttribution.tile.json');
var provider = new CesiumTerrainProvider({
url : 'made/up/url'
});
return pollToPromise(function() {
return provider.ready;
}).then(function() {
expect(provider._tileCredits[0].html).toBe('This amazing data is courtesy The Amazing Data Source!');
});
});
it('do not add blank attribution if layer.json does not have one', function() {
returnTileJson('Data/CesiumTerrainTileJson/WaterMask.tile.json');
var provider = new CesiumTerrainProvider({
url : 'made/up/url'
});
return pollToPromise(function() {
return provider.ready;
}).then(function() {
expect(provider._tileCredit).toBeUndefined();
});
});
describe('requestTileGeometry', function() {
it('uses multiple urls specified in layer.json', function() {
returnTileJson('Data/CesiumTerrainTileJson/MultipleUrls.tile.json');
var provider = new CesiumTerrainProvider({
url : 'made/up/url'
});
return pollToPromise(function() {
return provider.ready;
}).then(function() {
spyOn(Resource._Implementations, 'loadWithXhr');
provider.requestTileGeometry(0, 0, 0);
expect(Resource._Implementations.loadWithXhr.calls.mostRecent().args[0]).toContain('foo0.com');
provider.requestTileGeometry(1, 0, 0);
expect(Resource._Implementations.loadWithXhr.calls.mostRecent().args[0]).toContain('foo1.com');
provider.requestTileGeometry(1, -1, 0);
expect(Resource._Implementations.loadWithXhr.calls.mostRecent().args[0]).toContain('foo2.com');
provider.requestTileGeometry(1, 0, 1);
expect(Resource._Implementations.loadWithXhr.calls.mostRecent().args[0]).toContain('foo3.com');
});
});
it('supports scheme-less template URLs in layer.json resolved with absolute URL', function() {
returnTileJson('Data/CesiumTerrainTileJson/MultipleUrls.tile.json');
var url = getAbsoluteUri('Data/CesiumTerrainTileJson');
var provider = new CesiumTerrainProvider({
url : url
});
return pollToPromise(function() {
return provider.ready;
}).then(function() {
spyOn(Resource._Implementations, 'loadWithXhr');
provider.requestTileGeometry(0, 0, 0);
expect(Resource._Implementations.loadWithXhr.calls.mostRecent().args[0]).toContain('foo0.com');
provider.requestTileGeometry(1, 0, 0);
expect(Resource._Implementations.loadWithXhr.calls.mostRecent().args[0]).toContain('foo1.com');
provider.requestTileGeometry(1, -1, 0);
expect(Resource._Implementations.loadWithXhr.calls.mostRecent().args[0]).toContain('foo2.com');
provider.requestTileGeometry(1, 0, 1);
expect(Resource._Implementations.loadWithXhr.calls.mostRecent().args[0]).toContain('foo3.com');
});
});
it('provides HeightmapTerrainData', function() {
Resource._Implementations.loadWithXhr = function(url, responseType, method, data, headers, deferred, overrideMimeType) {
// Just return any old file, as long as its big enough
Resource._DefaultImplementations.loadWithXhr('Data/EarthOrientationParameters/IcrfToFixedStkComponentsRotationData.json', responseType, method, data, headers, deferred);
};
returnHeightmapTileJson();
return waitForTile(0, 0, 0, false, false, function(loadedData) {
expect(loadedData).toBeInstanceOf(HeightmapTerrainData);
});
});
it('provides QuantizedMeshTerrainData', function() {
Resource._Implementations.loadWithXhr = function(url, responseType, method, data, headers, deferred, overrideMimeType) {
Resource._DefaultImplementations.loadWithXhr('Data/CesiumTerrainTileJson/tile.terrain', responseType, method, data, headers, deferred);
};
returnQuantizedMeshTileJson();
return waitForTile(0, 0, 0, false, false, function(loadedData) {
expect(loadedData).toBeInstanceOf(QuantizedMeshTerrainData);
});
});
it('provides QuantizedMeshTerrainData with 32bit indices', function() {
Resource._Implementations.loadWithXhr = function(url, responseType, method, data, headers, deferred, overrideMimeType) {
Resource._DefaultImplementations.loadWithXhr('Data/CesiumTerrainTileJson/tile.32bitIndices.terrain', responseType, method, data, headers, deferred);
};
returnQuantizedMeshTileJson();
return waitForTile(0, 0, 0, false, false, function(loadedData) {
expect(loadedData).toBeInstanceOf(QuantizedMeshTerrainData);
expect(loadedData._indices.BYTES_PER_ELEMENT).toBe(4);
});
});
it('provides QuantizedMeshTerrainData with VertexNormals', function() {
Resource._Implementations.loadWithXhr = function(url, responseType, method, data, headers, deferred, overrideMimeType) {
Resource._DefaultImplementations.loadWithXhr('Data/CesiumTerrainTileJson/tile.vertexnormals.terrain', responseType, method, data, headers, deferred);
};
returnVertexNormalTileJson();
return waitForTile(0, 0, 0, true, false, function(loadedData) {
expect(loadedData).toBeInstanceOf(QuantizedMeshTerrainData);
expect(loadedData._encodedNormals).toBeDefined();
});
});
it('provides QuantizedMeshTerrainData with WaterMask', function() {
Resource._Implementations.loadWithXhr = function(url, responseType, method, data, headers, deferred, overrideMimeType) {
Resource._DefaultImplementations.loadWithXhr('Data/CesiumTerrainTileJson/tile.watermask.terrain', responseType, method, data, headers, deferred);
};
returnWaterMaskTileJson();
return waitForTile(0, 0, 0, false, true, function(loadedData) {
expect(loadedData).toBeInstanceOf(QuantizedMeshTerrainData);
expect(loadedData._waterMask).toBeDefined();
});
});
it('provides QuantizedMeshTerrainData with VertexNormals and WaterMask', function() {
Resource._Implementations.loadWithXhr = function(url, responseType, method, data, headers, deferred, overrideMimeType) {
Resource._DefaultImplementations.loadWithXhr('Data/CesiumTerrainTileJson/tile.octvertexnormals.watermask.terrain', responseType, method, data, headers, deferred);
};
returnWaterMaskTileJson();
return waitForTile(0, 0, 0, true, true, function(loadedData) {
expect(loadedData).toBeInstanceOf(QuantizedMeshTerrainData);
expect(loadedData._encodedNormals).toBeDefined();
expect(loadedData._waterMask).toBeDefined();
});
});
it('provides QuantizedMeshTerrainData with OctVertexNormals', function() {
Resource._Implementations.loadWithXhr = function(url, responseType, method, data, headers, deferred, overrideMimeType) {
Resource._DefaultImplementations.loadWithXhr('Data/CesiumTerrainTileJson/tile.octvertexnormals.terrain', responseType, method, data, headers, deferred);
};
returnOctVertexNormalTileJson();
return waitForTile(0, 0, 0, true, false, function(loadedData) {
expect(loadedData).toBeInstanceOf(QuantizedMeshTerrainData);
expect(loadedData._encodedNormals).toBeDefined();
});
});
it('provides QuantizedMeshTerrainData with VertexNormals and unknown extensions', function() {
Resource._Implementations.loadWithXhr = function(url, responseType, method, data, headers, deferred, overrideMimeType) {
Resource._DefaultImplementations.loadWithXhr('Data/CesiumTerrainTileJson/tile.vertexnormals.unknownext.terrain', responseType, method, data, headers, deferred);
};
returnVertexNormalTileJson();
return waitForTile(0, 0, 0, true, false, function(loadedData) {
expect(loadedData).toBeInstanceOf(QuantizedMeshTerrainData);
expect(loadedData._encodedNormals).toBeDefined();
});
});
it('provides QuantizedMeshTerrainData with OctVertexNormals and unknown extensions', function() {
Resource._Implementations.loadWithXhr = function(url, responseType, method, data, headers, deferred, overrideMimeType) {
Resource._DefaultImplementations.loadWithXhr('Data/CesiumTerrainTileJson/tile.octvertexnormals.unknownext.terrain', responseType, method, data, headers, deferred);
};
returnOctVertexNormalTileJson();
return waitForTile(0, 0, 0, true, false, function(loadedData) {
expect(loadedData).toBeInstanceOf(QuantizedMeshTerrainData);
expect(loadedData._encodedNormals).toBeDefined();
});
});
it('provides QuantizedMeshTerrainData with unknown extension', function() {
Resource._Implementations.loadWithXhr = function(url, responseType, method, data, headers, deferred, overrideMimeType) {
Resource._DefaultImplementations.loadWithXhr('Data/CesiumTerrainTileJson/tile.unknownext.terrain', responseType, method, data, headers, deferred);
};
returnOctVertexNormalTileJson();
return waitForTile(0, 0, 0, false, false, function(loadedData) {
expect(loadedData).toBeInstanceOf(QuantizedMeshTerrainData);
});
});
it('provides QuantizedMeshTerrainData with Metadata availability', function() {
Resource._Implementations.loadWithXhr = function(url, responseType, method, data, headers, deferred, overrideMimeType) {
Resource._DefaultImplementations.loadWithXhr('Data/CesiumTerrainTileJson/tile.metadataavailability.terrain', responseType, method, data, headers, deferred);
};
returnMetadataAvailabilityTileJson();
var terrainProvider = new CesiumTerrainProvider({
url : 'made/up/url'
});
return pollToPromise(function() {
return terrainProvider.ready;
}).then(function() {
expect(terrainProvider.hasMetadata).toBe(true);
expect(terrainProvider._layers[0].availabilityLevels).toBe(10);
expect(terrainProvider.availability.isTileAvailable(0,0,0)).toBe(true);
expect(terrainProvider.availability.isTileAvailable(0,1,0)).toBe(true);
expect(terrainProvider.availability.isTileAvailable(1,0,0)).toBe(false);
return terrainProvider.requestTileGeometry(0, 0, 0);
}).then(function(loadedData) {
expect(loadedData).toBeInstanceOf(QuantizedMeshTerrainData);
expect(terrainProvider.availability.isTileAvailable(1,0,0)).toBe(true);
});
});
it('returns undefined if too many requests are already in progress', function() {
var baseUrl = 'made/up/url';
var deferreds = [];
Resource._Implementations.loadWithXhr = function(url, responseType, method, data, headers, deferred, overrideMimeType) {
// Do nothing, so requests never complete
deferreds.push(deferred);
};
returnHeightmapTileJson();
var terrainProvider = new CesiumTerrainProvider({
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();
}
});
});
it('supports getTileDataAvailable()', function() {
var baseUrl = 'made/up/url';
Resource._Implementations.loadWithXhr = function(url, responseType, method, data, headers, deferred, overrideMimeType) {
Resource._DefaultImplementations.loadWithXhr('Data/CesiumTerrainTileJson/tile.terrain', responseType, method, data, headers, deferred);
};
returnQuantizedMeshTileJson();
var terrainProvider = new CesiumTerrainProvider({
url : baseUrl
});
return pollToPromise(function() {
return terrainProvider.ready;
}).then(function() {
expect(terrainProvider.getTileDataAvailable(0, 0, 0)).toBe(true);
expect(terrainProvider.getTileDataAvailable(0, 0, 2)).toBe(false);
});
});
it('getTileDataAvailable() converts xyz to tms', function() {
var baseUrl = 'made/up/url';
returnPartialAvailabilityTileJson();
var terrainProvider = new CesiumTerrainProvider({
url : baseUrl
});
return pollToPromise(function() {
return terrainProvider.ready;
}).then(function() {
expect(terrainProvider.getTileDataAvailable(1, 3, 2)).toBe(true);
expect(terrainProvider.getTileDataAvailable(1, 0, 2)).toBe(false);
});
});
it('getTileDataAvailable() with Metadata availability', function() {
Resource._Implementations.loadWithXhr = function(url, responseType, method, data, headers, deferred, overrideMimeType) {
Resource._DefaultImplementations.loadWithXhr('Data/CesiumTerrainTileJson/tile.metadataavailability.terrain', responseType, method, data, headers, deferred);
};
returnMetadataAvailabilityTileJson();
var terrainProvider = new CesiumTerrainProvider({
url : 'made/up/url'
});
return pollToPromise(function() {
return terrainProvider.ready;
}).then(function() {
expect(terrainProvider.getTileDataAvailable(0,0,0)).toBe(true);
expect(terrainProvider.getTileDataAvailable(0,0,1)).toBeUndefined();
return terrainProvider.requestTileGeometry(0, 0, 0);
}).then(function() {
expect(terrainProvider.getTileDataAvailable(0,0,1)).toBe(true);
});
});
it('supports a query string in the base URL', function() {
Resource._Implementations.loadWithXhr = function(url, responseType, method, data, headers, deferred, overrideMimeType) {
// Just return any old file, as long as its big enough
Resource._DefaultImplementations.loadWithXhr('Data/EarthOrientationParameters/IcrfToFixedStkComponentsRotationData.json', responseType, method, data, headers, deferred);
};
returnHeightmapTileJson();
return waitForTile(0, 0, 0, false, false, function(loadedData) {
expect(loadedData).toBeInstanceOf(HeightmapTerrainData);
});
});
it('Uses query parameter extensions for ion resource', function() {
var terrainProvider = new CesiumTerrainProvider({
url: IonResource.fromAssetId(1),
requestVertexNormals: true,
requestWaterMask: true
});
return pollToPromise(function() {
return terrainProvider.ready;
}).then(function() {
var getDerivedResource = spyOn(IonResource.prototype, 'getDerivedResource').and.callThrough();
terrainProvider.requestTileGeometry(0, 0, 0);
var options = getDerivedResource.calls.argsFor(0)[0];
expect(options.queryParameters.extensions).toEqual('octvertexnormals-watermask');
});
});
});
});