DSDSWeb/static/js/Cesium-1.53/Specs/Scene/SingleTileImageryProviderSp...

226 lines
7.1 KiB
JavaScript
Raw Normal View History

2024-07-11 18:02:47 +08:00
defineSuite([
'Scene/SingleTileImageryProvider',
'Core/DefaultProxy',
'Core/Ellipsoid',
'Core/GeographicTilingScheme',
'Core/Rectangle',
'Core/Resource',
'Scene/Imagery',
'Scene/ImageryLayer',
'Scene/ImageryProvider',
'Scene/ImageryState',
'Specs/pollToPromise',
'ThirdParty/when'
], function(
SingleTileImageryProvider,
DefaultProxy,
Ellipsoid,
GeographicTilingScheme,
Rectangle,
Resource,
Imagery,
ImageryLayer,
ImageryProvider,
ImageryState,
pollToPromise,
when) {
'use strict';
afterEach(function() {
Resource._Implementations.createImage = Resource._DefaultImplementations.createImage;
});
it('conforms to ImageryProvider interface', function() {
expect(SingleTileImageryProvider).toConformToInterface(ImageryProvider);
});
it('resolves readyPromise', function() {
var provider = new SingleTileImageryProvider({
url : 'Data/Images/Red16x16.png'
});
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 : 'Data/Images/Red16x16.png'
});
var provider = new SingleTileImageryProvider({
url : resource
});
return provider.readyPromise.then(function(result) {
expect(result).toBe(true);
expect(provider.ready).toBe(true);
});
});
it('rejects readyPromise on error', function() {
var provider = new SingleTileImageryProvider({
url : 'invalid.image.url'
});
return provider.readyPromise.then(function() {
fail('should not resolve');
}).otherwise(function (e) {
expect(provider.ready).toBe(false);
expect(e.message).toContain(provider.url);
});
});
it('returns valid value for hasAlphaChannel', function() {
var provider = new SingleTileImageryProvider({
url : 'Data/Images/Red16x16.png'
});
return pollToPromise(function() {
return provider.ready;
}).then(function() {
expect(typeof provider.hasAlphaChannel).toBe('boolean');
});
});
it('properties are gettable', function() {
var url = 'Data/Images/Red16x16.png';
var rectangle = new Rectangle(0.1, 0.2, 0.3, 0.4);
var credit = 'hi';
var provider = new SingleTileImageryProvider({
url : url,
rectangle : rectangle,
credit : credit
});
expect(provider.url).toEqual(url);
expect(provider.rectangle).toEqual(rectangle);
expect(provider.hasAlphaChannel).toEqual(true);
return pollToPromise(function() {
return provider.ready;
}).then(function() {
expect(provider.tilingScheme).toBeInstanceOf(GeographicTilingScheme);
expect(provider.tilingScheme.rectangle).toEqual(rectangle);
expect(provider.tileWidth).toEqual(16);
expect(provider.tileHeight).toEqual(16);
expect(provider.maximumLevel).toEqual(0);
expect(provider.tileDiscardPolicy).toBeUndefined();
});
});
it('url is required', function() {
function constructWithoutUrl() {
return new SingleTileImageryProvider({});
}
expect(constructWithoutUrl).toThrowDeveloperError();
});
it('can use a custom ellipsoid', function() {
var ellipsoid = new Ellipsoid(1, 2, 3);
var provider = new SingleTileImageryProvider({
url : 'Data/Images/Red16x16.png',
ellipsoid : ellipsoid
});
return pollToPromise(function() {
return provider.ready;
}).then(function() {
expect(provider.tilingScheme.ellipsoid).toEqual(ellipsoid);
});
});
it('requests the single image immediately upon construction', function() {
var imageUrl = 'Data/Images/Red16x16.png';
spyOn(Resource._Implementations, 'createImage').and.callFake(function(url, crossOrigin, deferred) {
expect(url).toEqual(imageUrl);
Resource._DefaultImplementations.createImage(url, crossOrigin, deferred);
});
var provider = new SingleTileImageryProvider({
url : imageUrl
});
expect(Resource._Implementations.createImage).toHaveBeenCalled();
return pollToPromise(function() {
return provider.ready;
}).then(function() {
return when(provider.requestImage(0, 0, 0), function(image) {
expect(image).toBeInstanceOf(Image);
});
});
});
it('turns the supplied credit into a logo', function() {
var provider = new SingleTileImageryProvider({
url : 'Data/Images/Red16x16.png'
});
return pollToPromise(function() {
return provider.ready;
}).then(function() {
expect(provider.credit).toBeUndefined();
var providerWithCredit = new SingleTileImageryProvider({
url : 'Data/Images/Red16x16.png',
credit : 'Thanks to our awesome made up source of this imagery!'
});
return pollToPromise(function() {
return providerWithCredit.ready;
}).then(function() {
expect(providerWithCredit.credit).toBeDefined();
});
});
});
it('raises error event when image cannot be loaded', function() {
var provider = new SingleTileImageryProvider({
url : 'made/up/url'
});
var layer = new ImageryLayer(provider);
var tries = 0;
provider.errorEvent.addEventListener(function(error) {
expect(error.timesRetried).toEqual(tries);
++tries;
if (tries < 3) {
error.retry = true;
}
});
Resource._Implementations.createImage = function(url, crossOrigin, deferred) {
if (tries === 2) {
// Succeed after 2 tries
Resource._DefaultImplementations.createImage('Data/Images/Red16x16.png', crossOrigin, deferred);
} else {
// fail
setTimeout(function() {
deferred.reject();
}, 1);
}
};
return pollToPromise(function() {
return provider.ready;
}).then(function() {
var imagery = new Imagery(layer, 0, 0, 0);
imagery.addReference();
layer._requestImagery(imagery);
return pollToPromise(function() {
return imagery.state === ImageryState.RECEIVED;
}).then(function() {
expect(imagery.image).toBeInstanceOf(Image);
expect(tries).toEqual(2);
imagery.releaseReference();
});
});
});
});