814 lines
31 KiB
JavaScript
814 lines
31 KiB
JavaScript
|
|
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');
|
||
|
|
});
|
||
|
|
});
|
||
|
|
});
|
||
|
|
});
|