DSDSWeb/static/js/Cesium-1.53/Specs/Widgets/Viewer/ViewerSpec.js

1640 lines
61 KiB
JavaScript
Raw Normal View History

2024-07-11 18:02:47 +08:00
defineSuite([
'Core/BoundingSphere',
'Core/Cartesian3',
'Core/CartographicGeocoderService',
'Core/Clock',
'Core/ClockRange',
'Core/ClockStep',
'Core/Color',
'Core/defined',
'Core/EllipsoidTerrainProvider',
'Core/HeadingPitchRange',
'Core/JulianDate',
'Core/Matrix4',
'Core/TimeIntervalCollection',
'Core/WebMercatorProjection',
'DataSources/BoundingSphereState',
'DataSources/ConstantPositionProperty',
'DataSources/ConstantProperty',
'DataSources/DataSourceClock',
'DataSources/DataSourceCollection',
'DataSources/DataSourceDisplay',
'DataSources/Entity',
'Scene/Camera',
'Scene/CameraFlightPath',
'Scene/Cesium3DTileset',
'Scene/ImageryLayerCollection',
'Scene/SceneMode',
'Scene/ShadowMode',
'Scene/TimeDynamicPointCloud',
'Specs/createViewer',
'Specs/DomEventSimulator',
'Specs/MockDataSource',
'Specs/pollToPromise',
'Widgets/Animation/Animation',
'Widgets/BaseLayerPicker/BaseLayerPicker',
'Widgets/BaseLayerPicker/ProviderViewModel',
'Widgets/CesiumWidget/CesiumWidget',
'Widgets/ClockViewModel',
'Widgets/FullscreenButton/FullscreenButton',
'Widgets/Geocoder/Geocoder',
'Widgets/HomeButton/HomeButton',
'Widgets/NavigationHelpButton/NavigationHelpButton',
'Widgets/SceneModePicker/SceneModePicker',
'Widgets/SelectionIndicator/SelectionIndicator',
'Widgets/Timeline/Timeline'
], 'Widgets/Viewer/Viewer', function(
BoundingSphere,
Cartesian3,
CartographicGeocoderService,
Clock,
ClockRange,
ClockStep,
Color,
defined,
EllipsoidTerrainProvider,
HeadingPitchRange,
JulianDate,
Matrix4,
TimeIntervalCollection,
WebMercatorProjection,
BoundingSphereState,
ConstantPositionProperty,
ConstantProperty,
DataSourceClock,
DataSourceCollection,
DataSourceDisplay,
Entity,
Camera,
CameraFlightPath,
Cesium3DTileset,
ImageryLayerCollection,
SceneMode,
ShadowMode,
TimeDynamicPointCloud,
createViewer,
DomEventSimulator,
MockDataSource,
pollToPromise,
Animation,
BaseLayerPicker,
ProviderViewModel,
CesiumWidget,
ClockViewModel,
FullscreenButton,
Geocoder,
HomeButton,
NavigationHelpButton,
SceneModePicker,
SelectionIndicator,
Timeline) {
'use strict';
var testProvider = {
isReady : function() {
return false;
}
};
var testProviderViewModel = new ProviderViewModel({
name : 'name',
tooltip : 'tooltip',
iconUrl : 'url',
creationFunction : function() {
return testProvider;
}
});
var container;
var viewer;
beforeEach(function() {
container = document.createElement('div');
container.id = 'container';
container.style.width = '1px';
container.style.height = '1px';
container.style.overflow = 'hidden';
container.style.position = 'relative';
document.body.appendChild(container);
});
afterEach(function() {
if (viewer && !viewer.isDestroyed()) {
viewer = viewer.destroy();
}
document.body.removeChild(container);
});
it('constructor sets default values', function() {
viewer = createViewer(container);
expect(viewer.container).toBe(container);
expect(viewer.cesiumWidget).toBeInstanceOf(CesiumWidget);
expect(viewer.geocoder).toBeInstanceOf(Geocoder);
expect(viewer.homeButton).toBeInstanceOf(HomeButton);
expect(viewer.sceneModePicker).toBeInstanceOf(SceneModePicker);
expect(viewer.baseLayerPicker).toBeInstanceOf(BaseLayerPicker);
expect(viewer.navigationHelpButton).toBeInstanceOf(NavigationHelpButton);
expect(viewer.animation).toBeInstanceOf(Animation);
expect(viewer.clockViewModel).toBeInstanceOf(ClockViewModel);
expect(viewer.animation.viewModel.clockViewModel).toBe(viewer.clockViewModel);
expect(viewer.timeline).toBeInstanceOf(Timeline);
expect(viewer.fullscreenButton).toBeInstanceOf(FullscreenButton);
expect(viewer.selectionIndicator).toBeInstanceOf(SelectionIndicator);
expect(viewer.imageryLayers).toBeInstanceOf(ImageryLayerCollection);
expect(viewer.terrainProvider).toBeInstanceOf(EllipsoidTerrainProvider);
expect(viewer.camera).toBeInstanceOf(Camera);
expect(viewer.dataSourceDisplay).toBeInstanceOf(DataSourceDisplay);
expect(viewer.dataSources).toBeInstanceOf(DataSourceCollection);
expect(viewer.canvas).toBe(viewer.cesiumWidget.canvas);
expect(viewer.cesiumLogo).toBe(viewer.cesiumWidget.cesiumLogo);
expect(viewer.screenSpaceEventHandler).toBe(viewer.cesiumWidget.screenSpaceEventHandler);
expect(viewer.isDestroyed()).toEqual(false);
viewer.destroy();
expect(viewer.isDestroyed()).toEqual(true);
});
it('can specify custom clockViewModel', function() {
var clockViewModel = new ClockViewModel();
viewer = createViewer(container, {clockViewModel : clockViewModel});
expect(viewer.clockViewModel).toBe(clockViewModel);
expect(viewer.animation.viewModel.clockViewModel).toBe(viewer.clockViewModel);
viewer.destroy();
expect(clockViewModel.isDestroyed()).toBe(false);
clockViewModel.destroy();
});
it('can set shouldAnimate', function() {
viewer = createViewer(container, {
shouldAnimate : true
});
expect(viewer.clock.shouldAnimate).toBe(true);
});
it('setting shouldAnimate in options overrides clock shouldAnimate', function() {
var clockViewModel = new ClockViewModel(new Clock({
shouldAnimate : false
}));
viewer = createViewer(container, {
clockViewModel : clockViewModel,
shouldAnimate : true
});
expect(viewer.clock.shouldAnimate).toBe(true);
});
it('renders without errors', function() {
viewer = createViewer(container);
spyOn(viewer.scene.renderError, 'raiseEvent');
viewer.render();
expect(viewer.scene.renderError.raiseEvent).not.toHaveBeenCalled();
});
it('constructor works with container id string', function() {
viewer = createViewer('container');
expect(viewer.container).toBe(container);
});
it('can shut off HomeButton', function() {
viewer = createViewer(container, {
homeButton : false
});
expect(viewer.container).toBe(container);
expect(viewer.cesiumWidget).toBeInstanceOf(CesiumWidget);
expect(viewer.geocoder).toBeInstanceOf(Geocoder);
expect(viewer.homeButton).toBeUndefined();
expect(viewer.sceneModePicker).toBeInstanceOf(SceneModePicker);
expect(viewer.baseLayerPicker).toBeInstanceOf(BaseLayerPicker);
expect(viewer.navigationHelpButton).toBeInstanceOf(NavigationHelpButton);
expect(viewer.animation).toBeInstanceOf(Animation);
expect(viewer.timeline).toBeInstanceOf(Timeline);
expect(viewer.fullscreenButton).toBeInstanceOf(FullscreenButton);
expect(viewer.selectionIndicator).toBeInstanceOf(SelectionIndicator);
viewer.resize();
viewer.render();
});
it('can shut off SceneModePicker', function() {
viewer = createViewer(container, {
sceneModePicker : false
});
expect(viewer.container).toBe(container);
expect(viewer.cesiumWidget).toBeInstanceOf(CesiumWidget);
expect(viewer.geocoder).toBeInstanceOf(Geocoder);
expect(viewer.homeButton).toBeInstanceOf(HomeButton);
expect(viewer.sceneModePicker).toBeUndefined();
expect(viewer.baseLayerPicker).toBeInstanceOf(BaseLayerPicker);
expect(viewer.navigationHelpButton).toBeInstanceOf(NavigationHelpButton);
expect(viewer.animation).toBeInstanceOf(Animation);
expect(viewer.timeline).toBeInstanceOf(Timeline);
expect(viewer.fullscreenButton).toBeInstanceOf(FullscreenButton);
expect(viewer.selectionIndicator).toBeInstanceOf(SelectionIndicator);
viewer.resize();
viewer.render();
});
it('can shut off BaseLayerPicker', function() {
viewer = createViewer(container, {
baseLayerPicker : false
});
expect(viewer.container).toBe(container);
expect(viewer.cesiumWidget).toBeInstanceOf(CesiumWidget);
expect(viewer.geocoder).toBeInstanceOf(Geocoder);
expect(viewer.homeButton).toBeInstanceOf(HomeButton);
expect(viewer.sceneModePicker).toBeInstanceOf(SceneModePicker);
expect(viewer.baseLayerPicker).toBeUndefined();
expect(viewer.navigationHelpButton).toBeInstanceOf(NavigationHelpButton);
expect(viewer.animation).toBeInstanceOf(Animation);
expect(viewer.timeline).toBeInstanceOf(Timeline);
expect(viewer.fullscreenButton).toBeInstanceOf(FullscreenButton);
expect(viewer.selectionIndicator).toBeInstanceOf(SelectionIndicator);
viewer.resize();
viewer.render();
});
it('can shut off NavigationHelpButton', function() {
viewer = createViewer(container, {
navigationHelpButton : false
});
expect(viewer.container).toBe(container);
expect(viewer.cesiumWidget).toBeInstanceOf(CesiumWidget);
expect(viewer.geocoder).toBeInstanceOf(Geocoder);
expect(viewer.homeButton).toBeInstanceOf(HomeButton);
expect(viewer.sceneModePicker).toBeInstanceOf(SceneModePicker);
expect(viewer.baseLayerPicker).toBeInstanceOf(BaseLayerPicker);
expect(viewer.navigationHelpButton).toBeUndefined();
expect(viewer.animation).toBeInstanceOf(Animation);
expect(viewer.timeline).toBeInstanceOf(Timeline);
expect(viewer.fullscreenButton).toBeInstanceOf(FullscreenButton);
expect(viewer.selectionIndicator).toBeInstanceOf(SelectionIndicator);
viewer.resize();
viewer.render();
});
it('can shut off Animation', function() {
viewer = createViewer(container, {
animation : false
});
expect(viewer.container).toBe(container);
expect(viewer.cesiumWidget).toBeInstanceOf(CesiumWidget);
expect(viewer.geocoder).toBeInstanceOf(Geocoder);
expect(viewer.homeButton).toBeInstanceOf(HomeButton);
expect(viewer.sceneModePicker).toBeInstanceOf(SceneModePicker);
expect(viewer.baseLayerPicker).toBeInstanceOf(BaseLayerPicker);
expect(viewer.navigationHelpButton).toBeInstanceOf(NavigationHelpButton);
expect(viewer.animation).toBeUndefined();
expect(viewer.timeline).toBeInstanceOf(Timeline);
expect(viewer.fullscreenButton).toBeInstanceOf(FullscreenButton);
expect(viewer.selectionIndicator).toBeInstanceOf(SelectionIndicator);
viewer.resize();
viewer.render();
});
it('can shut off Timeline', function() {
viewer = createViewer(container, {
timeline : false
});
expect(viewer.container).toBe(container);
expect(viewer.cesiumWidget).toBeInstanceOf(CesiumWidget);
expect(viewer.geocoder).toBeInstanceOf(Geocoder);
expect(viewer.homeButton).toBeInstanceOf(HomeButton);
expect(viewer.sceneModePicker).toBeInstanceOf(SceneModePicker);
expect(viewer.baseLayerPicker).toBeInstanceOf(BaseLayerPicker);
expect(viewer.navigationHelpButton).toBeInstanceOf(NavigationHelpButton);
expect(viewer.animation).toBeInstanceOf(Animation);
expect(viewer.timeline).toBeUndefined();
expect(viewer.fullscreenButton).toBeInstanceOf(FullscreenButton);
expect(viewer.selectionIndicator).toBeInstanceOf(SelectionIndicator);
viewer.resize();
viewer.render();
});
it('can shut off FullscreenButton', function() {
viewer = createViewer(container, {
fullscreenButton : false
});
expect(viewer.container).toBe(container);
expect(viewer.cesiumWidget).toBeInstanceOf(CesiumWidget);
expect(viewer.geocoder).toBeInstanceOf(Geocoder);
expect(viewer.homeButton).toBeInstanceOf(HomeButton);
expect(viewer.sceneModePicker).toBeInstanceOf(SceneModePicker);
expect(viewer.baseLayerPicker).toBeInstanceOf(BaseLayerPicker);
expect(viewer.navigationHelpButton).toBeInstanceOf(NavigationHelpButton);
expect(viewer.animation).toBeInstanceOf(Animation);
expect(viewer.timeline).toBeInstanceOf(Timeline);
expect(viewer.fullscreenButton).toBeUndefined();
expect(viewer.selectionIndicator).toBeInstanceOf(SelectionIndicator);
viewer.resize();
viewer.render();
});
it('can shut off FullscreenButton and Timeline', function() {
viewer = createViewer(container, {
timeline : false,
fullscreenButton : false
});
expect(viewer.container).toBe(container);
expect(viewer.cesiumWidget).toBeInstanceOf(CesiumWidget);
expect(viewer.geocoder).toBeInstanceOf(Geocoder);
expect(viewer.homeButton).toBeInstanceOf(HomeButton);
expect(viewer.sceneModePicker).toBeInstanceOf(SceneModePicker);
expect(viewer.baseLayerPicker).toBeInstanceOf(BaseLayerPicker);
expect(viewer.navigationHelpButton).toBeInstanceOf(NavigationHelpButton);
expect(viewer.animation).toBeInstanceOf(Animation);
expect(viewer.timeline).toBeUndefined();
expect(viewer.fullscreenButton).toBeUndefined();
expect(viewer.selectionIndicator).toBeInstanceOf(SelectionIndicator);
viewer.resize();
viewer.render();
});
it('can shut off FullscreenButton, Timeline, and Animation', function() {
viewer = createViewer(container, {
timeline : false,
fullscreenButton : false,
animation : false
});
expect(viewer.container).toBe(container);
expect(viewer.cesiumWidget).toBeInstanceOf(CesiumWidget);
expect(viewer.geocoder).toBeInstanceOf(Geocoder);
expect(viewer.homeButton).toBeInstanceOf(HomeButton);
expect(viewer.sceneModePicker).toBeInstanceOf(SceneModePicker);
expect(viewer.baseLayerPicker).toBeInstanceOf(BaseLayerPicker);
expect(viewer.navigationHelpButton).toBeInstanceOf(NavigationHelpButton);
expect(viewer.animation).toBeUndefined(Animation);
expect(viewer.timeline).toBeUndefined();
expect(viewer.fullscreenButton).toBeUndefined();
expect(viewer.selectionIndicator).toBeInstanceOf(SelectionIndicator);
viewer.resize();
viewer.render();
});
it('can shut off Geocoder', function() {
viewer = createViewer(container, {
geocoder : false
});
expect(viewer.container).toBe(container);
expect(viewer.cesiumWidget).toBeInstanceOf(CesiumWidget);
expect(viewer.geocoder).toBeUndefined();
expect(viewer.homeButton).toBeInstanceOf(HomeButton);
expect(viewer.sceneModePicker).toBeInstanceOf(SceneModePicker);
expect(viewer.baseLayerPicker).toBeInstanceOf(BaseLayerPicker);
expect(viewer.navigationHelpButton).toBeInstanceOf(NavigationHelpButton);
expect(viewer.animation).toBeInstanceOf(Animation);
expect(viewer.timeline).toBeInstanceOf(Timeline);
expect(viewer.fullscreenButton).toBeInstanceOf(FullscreenButton);
expect(viewer.selectionIndicator).toBeInstanceOf(SelectionIndicator);
viewer.resize();
viewer.render();
});
it('constructs geocoder', function() {
viewer = createViewer(container, {
geocoder : true
});
expect(viewer.geocoder).toBeDefined();
expect(viewer.geocoder.viewModel._geocoderServices.length).toBe(2);
});
it('constructs geocoder with geocoder service option', function() {
var service = new CartographicGeocoderService();
viewer = createViewer(container, {
geocoder : service
});
expect(viewer.geocoder).toBeDefined();
expect(viewer.geocoder.viewModel._geocoderServices.length).toBe(1);
expect(viewer.geocoder.viewModel._geocoderServices[0]).toBe(service);
});
it('constructs geocoder with geocoder service options', function() {
var service = new CartographicGeocoderService();
viewer = createViewer(container, {
geocoder : [service]
});
expect(viewer.geocoder).toBeDefined();
expect(viewer.geocoder.viewModel._geocoderServices.length).toBe(1);
expect(viewer.geocoder.viewModel._geocoderServices[0]).toBe(service);
});
it('can shut off SelectionIndicator', function() {
viewer = createViewer(container, {
selectionIndicator : false
});
expect(viewer.container).toBe(container);
expect(viewer.cesiumWidget).toBeInstanceOf(CesiumWidget);
expect(viewer.geocoder).toBeInstanceOf(Geocoder);
expect(viewer.homeButton).toBeInstanceOf(HomeButton);
expect(viewer.sceneModePicker).toBeInstanceOf(SceneModePicker);
expect(viewer.baseLayerPicker).toBeInstanceOf(BaseLayerPicker);
expect(viewer.navigationHelpButton).toBeInstanceOf(NavigationHelpButton);
expect(viewer.animation).toBeInstanceOf(Animation);
expect(viewer.timeline).toBeInstanceOf(Timeline);
expect(viewer.fullscreenButton).toBeInstanceOf(FullscreenButton);
expect(viewer.selectionIndicator).toBeUndefined();
viewer.resize();
viewer.render();
});
it('can set shadows', function() {
viewer = createViewer(container, {
shadows : true
});
expect(viewer.shadows).toBe(true);
});
it('can set terrain shadows', function() {
viewer = createViewer(container, {
terrainShadows : ShadowMode.ENABLED
});
expect(viewer.terrainShadows).toBe(ShadowMode.ENABLED);
});
it('can set terrainProvider', function() {
var provider = new EllipsoidTerrainProvider();
viewer = createViewer(container, {
baseLayerPicker : false,
terrainProvider : provider
});
expect(viewer.scene.terrainProvider).toBe(provider);
var anotherProvider = new EllipsoidTerrainProvider();
viewer.terrainProvider = anotherProvider;
expect(viewer.terrainProvider).toBe(anotherProvider);
});
it('can set fullScreenElement', function() {
var testElement = document.createElement('span');
viewer = createViewer(container, {
fullscreenElement : testElement
});
expect(viewer.fullscreenButton.viewModel.fullscreenElement).toBe(testElement);
});
it('can set contextOptions', function() {
var webglOptions = {
alpha : true,
depth : true, //TODO Change to false when https://bugzilla.mozilla.org/show_bug.cgi?id=745912 is fixed.
stencil : true,
antialias : false,
premultipliedAlpha : true, // Workaround IE 11.0.8, which does not honor false.
preserveDrawingBuffer : true
};
var contextOptions = {
allowTextureFilterAnisotropic : false,
webgl : webglOptions
};
viewer = createViewer(container, {
contextOptions : contextOptions
});
var context = viewer.scene.context;
var contextAttributes = context._gl.getContextAttributes();
expect(context.options.allowTextureFilterAnisotropic).toEqual(false);
expect(contextAttributes.alpha).toEqual(webglOptions.alpha);
expect(contextAttributes.depth).toEqual(webglOptions.depth);
expect(contextAttributes.stencil).toEqual(webglOptions.stencil);
expect(contextAttributes.antialias).toEqual(webglOptions.antialias);
expect(contextAttributes.premultipliedAlpha).toEqual(webglOptions.premultipliedAlpha);
expect(contextAttributes.preserveDrawingBuffer).toEqual(webglOptions.preserveDrawingBuffer);
});
it('can disable Order Independent Translucency', function() {
viewer = createViewer(container, {
orderIndependentTranslucency : false
});
expect(viewer.scene.orderIndependentTranslucency).toBe(false);
});
it('can set scene mode', function() {
viewer = createViewer(container, {
sceneMode : SceneMode.SCENE2D
});
viewer.scene.completeMorph();
expect(viewer.scene.mode).toBe(SceneMode.SCENE2D);
});
it('can set map projection', function() {
var mapProjection = new WebMercatorProjection();
viewer = createViewer(container, {
mapProjection : mapProjection
});
expect(viewer.scene.mapProjection).toEqual(mapProjection);
});
it('can set selectedImageryProviderViewModel', function() {
viewer = createViewer(container, {
selectedImageryProviderViewModel : testProviderViewModel
});
expect(viewer.scene.imageryLayers.length).toEqual(1);
expect(viewer.scene.imageryLayers.get(0).imageryProvider).toBe(testProvider);
expect(viewer.baseLayerPicker.viewModel.selectedImagery).toBe(testProviderViewModel);
});
it('can set imageryProvider when BaseLayerPicker is disabled', function() {
viewer = createViewer(container, {
baseLayerPicker : false,
imageryProvider : testProvider
});
expect(viewer.scene.imageryLayers.length).toEqual(1);
expect(viewer.scene.imageryLayers.get(0).imageryProvider).toBe(testProvider);
});
it('can set imageryProviderViewModels', function() {
var models = [testProviderViewModel];
viewer = createViewer(container, {
imageryProviderViewModels : models
});
expect(viewer.scene.imageryLayers.length).toEqual(1);
expect(viewer.scene.imageryLayers.get(0).imageryProvider).toBe(testProvider);
expect(viewer.baseLayerPicker.viewModel.selectedImagery).toBe(testProviderViewModel);
expect(viewer.baseLayerPicker.viewModel.imageryProviderViewModels.length).toBe(models.length);
expect(viewer.baseLayerPicker.viewModel.imageryProviderViewModels[0]).toEqual(models[0]);
});
it('can disable render loop', function() {
viewer = createViewer(container, {
useDefaultRenderLoop : false
});
expect(viewer.useDefaultRenderLoop).toBe(false);
});
it('can set target frame rate', function() {
viewer = createViewer(container, {
targetFrameRate : 23
});
expect(viewer.targetFrameRate).toBe(23);
});
it('does not create a globe if option is false', function() {
viewer = createViewer(container, {
globe : false
});
expect(viewer.scene.globe).not.toBeDefined();
});
it('does not create a skyBox if option is false', function() {
viewer = createViewer(container, {
skyBox : false
});
expect(viewer.scene.skyBox).not.toBeDefined();
});
it('does not create a skyAtmosphere if option is false', function() {
viewer = createViewer(container, {
skyAtmosphere : false
});
expect(viewer.scene.skyAtmosphere).not.toBeDefined();
});
it('can set dataSources at construction', function() {
var collection = new DataSourceCollection();
viewer = createViewer(container, {
dataSources : collection
});
expect(viewer.dataSources).toBe(collection);
});
it('default DataSourceCollection is destroyed when Viewer is destroyed', function() {
viewer = createViewer(container);
var dataSources = viewer.dataSources;
viewer.destroy();
expect(dataSources.isDestroyed()).toBe(true);
});
it('specified DataSourceCollection is not destroyed when Viewer is destroyed', function() {
var collection = new DataSourceCollection();
viewer = createViewer(container, {
dataSources : collection
});
viewer.destroy();
expect(collection.isDestroyed()).toBe(false);
});
it('throws if targetFrameRate less than 0', function() {
viewer = createViewer(container);
expect(function() {
viewer.targetFrameRate = -1;
}).toThrowDeveloperError();
});
it('can set resolutionScale', function() {
viewer = createViewer(container);
viewer.resolutionScale = 0.5;
expect(viewer.resolutionScale).toBe(0.5);
});
it('throws if resolutionScale is less than 0', function() {
viewer = createViewer(container);
expect(function() {
viewer.resolutionScale = -1;
}).toThrowDeveloperError();
});
it('constructor throws with undefined container', function() {
expect(function() {
return createViewer(undefined);
}).toThrowDeveloperError();
});
it('constructor throws with non-existant string container', function() {
expect(function() {
return createViewer('doesNotExist');
}).toThrowDeveloperError();
});
it('constructor throws if using selectedImageryProviderViewModel with BaseLayerPicker disabled', function() {
expect(function() {
return createViewer(container, {
baseLayerPicker : false,
selectedImageryProviderViewModel : testProviderViewModel
});
}).toThrowDeveloperError();
});
it('extend throws with undefined mixin', function() {
viewer = createViewer(container);
expect(function() {
return viewer.extend(undefined);
}).toThrowDeveloperError();
});
it('stops the render loop when render throws', function() {
viewer = createViewer(container);
expect(viewer.useDefaultRenderLoop).toEqual(true);
var error = 'foo';
viewer.scene.primitives.update = function() {
throw error;
};
return pollToPromise(function() {
return !viewer.useDefaultRenderLoop;
}, 'render loop to be disabled.');
});
it('sets the clock and timeline based on the first data source', function() {
var dataSource = new MockDataSource();
dataSource.clock = new DataSourceClock();
dataSource.clock.startTime = JulianDate.fromIso8601('2013-08-01T18:00Z');
dataSource.clock.stopTime = JulianDate.fromIso8601('2013-08-21T02:00Z');
dataSource.clock.currentTime = JulianDate.fromIso8601('2013-08-02T00:00Z');
dataSource.clock.clockRange = ClockRange.CLAMPED;
dataSource.clock.clockStep = ClockStep.TICK_DEPENDENT;
dataSource.clock.multiplier = 20.0;
viewer = createViewer(container);
viewer.dataSources.add(dataSource);
expect(viewer.clock.startTime).toEqual(dataSource.clock.startTime);
expect(viewer.clock.stopTime).toEqual(dataSource.clock.stopTime);
expect(viewer.clock.currentTime).toEqual(dataSource.clock.currentTime);
expect(viewer.clock.clockRange).toEqual(dataSource.clock.clockRange);
expect(viewer.clock.clockStep).toEqual(dataSource.clock.clockStep);
expect(viewer.clock.multiplier).toEqual(dataSource.clock.multiplier);
});
it('sets the clock for multiple data sources', function() {
var dataSource1 = new MockDataSource();
dataSource1.clock = new DataSourceClock();
dataSource1.clock.startTime = JulianDate.fromIso8601('2013-08-01T18:00Z');
dataSource1.clock.stopTime = JulianDate.fromIso8601('2013-08-21T02:00Z');
dataSource1.clock.currentTime = JulianDate.fromIso8601('2013-08-02T00:00Z');
viewer = createViewer(container);
viewer.dataSources.add(dataSource1);
expect(viewer.clockTrackedDataSource).toBe(dataSource1);
expect(viewer.clock.startTime).toEqual(dataSource1.clock.startTime);
var dataSource2 = new MockDataSource();
dataSource2.clock = new DataSourceClock();
dataSource2.clock.startTime = JulianDate.fromIso8601('2014-08-01T18:00Z');
dataSource2.clock.stopTime = JulianDate.fromIso8601('2014-08-21T02:00Z');
dataSource2.clock.currentTime = JulianDate.fromIso8601('2014-08-02T00:00Z');
viewer.dataSources.add(dataSource2);
expect(viewer.clockTrackedDataSource).toBe(dataSource2);
expect(viewer.clock.startTime).toEqual(dataSource2.clock.startTime);
var dataSource3 = new MockDataSource();
dataSource3.clock = new DataSourceClock();
dataSource3.clock.startTime = JulianDate.fromIso8601('2015-08-01T18:00Z');
dataSource3.clock.stopTime = JulianDate.fromIso8601('2015-08-21T02:00Z');
dataSource3.clock.currentTime = JulianDate.fromIso8601('2015-08-02T00:00Z');
viewer.dataSources.add(dataSource3);
expect(viewer.clockTrackedDataSource).toBe(dataSource3);
expect(viewer.clock.startTime).toEqual(dataSource3.clock.startTime);
// Removing the last dataSource moves the clock to second-last.
viewer.dataSources.remove(dataSource3);
expect(viewer.clockTrackedDataSource).toBe(dataSource2);
expect(viewer.clock.startTime).toEqual(dataSource2.clock.startTime);
// Removing the first data source has no effect, because it's not active.
viewer.dataSources.remove(dataSource1);
expect(viewer.clockTrackedDataSource).toBe(dataSource2);
expect(viewer.clock.startTime).toEqual(dataSource2.clock.startTime);
});
it('updates the clock when the data source changes', function() {
var dataSource = new MockDataSource();
dataSource.clock = new DataSourceClock();
dataSource.clock.startTime = JulianDate.fromIso8601('2013-08-01T18:00Z');
dataSource.clock.stopTime = JulianDate.fromIso8601('2013-08-21T02:00Z');
dataSource.clock.currentTime = JulianDate.fromIso8601('2013-08-02T00:00Z');
dataSource.clock.clockRange = ClockRange.CLAMPED;
dataSource.clock.clockStep = ClockStep.TICK_DEPENDENT;
dataSource.clock.multiplier = 20.0;
viewer = createViewer(container);
viewer.dataSources.add(dataSource);
dataSource.clock.startTime = JulianDate.fromIso8601('2014-08-01T18:00Z');
dataSource.clock.stopTime = JulianDate.fromIso8601('2014-08-21T02:00Z');
dataSource.clock.currentTime = JulianDate.fromIso8601('2014-08-02T00:00Z');
dataSource.clock.clockRange = ClockRange.UNBOUNDED;
dataSource.clock.clockStep = ClockStep.SYSTEM_CLOCK_MULTIPLIER;
dataSource.clock.multiplier = 10.0;
dataSource.changedEvent.raiseEvent(dataSource);
expect(viewer.clock.startTime).toEqual(dataSource.clock.startTime);
expect(viewer.clock.stopTime).toEqual(dataSource.clock.stopTime);
expect(viewer.clock.currentTime).toEqual(dataSource.clock.currentTime);
expect(viewer.clock.clockRange).toEqual(dataSource.clock.clockRange);
expect(viewer.clock.clockStep).toEqual(dataSource.clock.clockStep);
expect(viewer.clock.multiplier).toEqual(dataSource.clock.multiplier);
dataSource.clock.clockStep = ClockStep.SYSTEM_CLOCK;
dataSource.clock.multiplier = 1.0;
dataSource.changedEvent.raiseEvent(dataSource);
expect(viewer.clock.clockStep).toEqual(dataSource.clock.clockStep);
});
it('can manually control the clock tracking', function() {
var dataSource1 = new MockDataSource();
dataSource1.clock = new DataSourceClock();
dataSource1.clock.startTime = JulianDate.fromIso8601('2013-08-01T18:00Z');
dataSource1.clock.stopTime = JulianDate.fromIso8601('2013-08-21T02:00Z');
dataSource1.clock.currentTime = JulianDate.fromIso8601('2013-08-02T00:00Z');
viewer = createViewer(container, {automaticallyTrackDataSourceClocks : false});
viewer.dataSources.add(dataSource1);
// Because of the above Viewer option, data sources are not automatically
// selected for clock tracking.
expect(viewer.clockTrackedDataSource).not.toBeDefined();
// The mock data source time is in the past, so will not be the default time.
expect(viewer.clock.startTime).not.toEqual(dataSource1.clock.startTime);
// Manually set the first data source as the tracked data source.
viewer.clockTrackedDataSource = dataSource1;
expect(viewer.clockTrackedDataSource).toBe(dataSource1);
expect(viewer.clock.startTime).toEqual(dataSource1.clock.startTime);
var dataSource2 = new MockDataSource();
dataSource2.clock = new DataSourceClock();
dataSource2.clock.startTime = JulianDate.fromIso8601('2014-08-01T18:00Z');
dataSource2.clock.stopTime = JulianDate.fromIso8601('2014-08-21T02:00Z');
dataSource2.clock.currentTime = JulianDate.fromIso8601('2014-08-02T00:00Z');
// Adding a second data source in manual mode still leaves the first one tracked.
viewer.dataSources.add(dataSource2);
expect(viewer.clockTrackedDataSource).toBe(dataSource1);
expect(viewer.clock.startTime).toEqual(dataSource1.clock.startTime);
// Removing the tracked data source in manual mode turns off tracking, even
// if other data sources remain available for tracking.
viewer.dataSources.remove(dataSource1);
expect(viewer.clockTrackedDataSource).not.toBeDefined();
});
it('shows the error panel when render throws', function() {
viewer = createViewer(container);
var error = 'foo';
viewer.scene.primitives.update = function() {
throw error;
};
return pollToPromise(function() {
return !viewer.useDefaultRenderLoop;
}).then(function() {
expect(viewer._element.querySelector('.cesium-widget-errorPanel')).not.toBeNull();
var messages = viewer._element.querySelectorAll('.cesium-widget-errorPanel-message');
var found = false;
for (var i = 0; i < messages.length; ++i) {
if (messages[i].textContent === error) {
found = true;
}
}
expect(found).toBe(true);
// click the OK button to dismiss the panel
DomEventSimulator.fireClick(viewer._element.querySelector('.cesium-button'));
expect(viewer._element.querySelector('.cesium-widget-errorPanel')).toBeNull();
});
});
it('does not show the error panel if disabled', function() {
viewer = createViewer(container, {
showRenderLoopErrors : false
});
var error = 'foo';
viewer.scene.primitives.update = function() {
throw error;
};
return pollToPromise(function() {
return !viewer.useDefaultRenderLoop;
}).then(function() {
expect(viewer._element.querySelector('.cesium-widget-errorPanel')).toBeNull();
});
});
it('can enable requestRender mode', function() {
viewer = createViewer(container, {
requestRenderMode : true
});
expect(viewer.scene.requestRenderMode).toBe(true);
});
it('can set maximumRenderTimeChange', function() {
viewer = createViewer(container, {
maximumRenderTimeChange : Number.POSITIVE_INFINITY
});
expect(viewer.scene.maximumRenderTimeChange).toBe(Number.POSITIVE_INFINITY);
});
it('can get and set trackedEntity', function() {
viewer = createViewer(container);
var entity = new Entity();
entity.position = new ConstantProperty(new Cartesian3(123456, 123456, 123456));
viewer.trackedEntity = entity;
expect(viewer.trackedEntity).toBe(entity);
viewer.trackedEntity = undefined;
expect(viewer.trackedEntity).toBeUndefined();
});
it('can get and set selectedEntity', function() {
var viewer = createViewer(container);
var dataSource = new MockDataSource();
viewer.dataSources.add(dataSource);
var entity = new Entity();
entity.position = new ConstantPositionProperty(new Cartesian3(123456, 123456, 123456));
dataSource.entities.add(entity);
viewer.selectedEntity = entity;
expect(viewer.selectedEntity).toBe(entity);
viewer.selectedEntity = undefined;
expect(viewer.selectedEntity).toBeUndefined();
viewer.destroy();
});
it('raises an event when the selected entity changes', function() {
var viewer = createViewer(container);
var dataSource = new MockDataSource();
viewer.dataSources.add(dataSource);
var entity = new Entity();
entity.position = new ConstantPositionProperty(new Cartesian3(123456, 123456, 123456));
dataSource.entities.add(entity);
var myEntity;
viewer.selectedEntityChanged.addEventListener(function(newSelection) {
myEntity = newSelection;
});
viewer.selectedEntity = entity;
expect(myEntity).toBe(entity);
viewer.selectedEntity = undefined;
expect(myEntity).toBeUndefined();
viewer.destroy();
});
it('raises an event when the tracked entity changes', function() {
var viewer = createViewer(container);
var dataSource = new MockDataSource();
viewer.dataSources.add(dataSource);
var entity = new Entity();
entity.position = new ConstantPositionProperty(new Cartesian3(123456, 123456, 123456));
dataSource.entities.add(entity);
var myEntity;
viewer.trackedEntityChanged.addEventListener(function(newValue) {
myEntity = newValue;
});
viewer.trackedEntity = entity;
expect(myEntity).toBe(entity);
viewer.trackedEntity = undefined;
expect(myEntity).toBeUndefined();
viewer.destroy();
});
it('selectedEntity sets InfoBox properties', function() {
var viewer = createViewer(container);
var entity = new Entity();
var viewModel = viewer.infoBox.viewModel;
expect(viewModel.showInfo).toBe(false);
viewer.selectedEntity = entity;
viewer.clock.tick();
expect(viewModel.showInfo).toBe(true);
expect(viewModel.titleText).toEqual(entity.id);
expect(viewModel.description).toEqual('');
entity.name = 'Yes, this is name.';
entity.description = 'tubelcane';
viewer.clock.tick();
expect(viewModel.showInfo).toBe(true);
expect(viewModel.titleText).toEqual(entity.name);
expect(viewModel.description).toEqual(entity.description.getValue());
viewer.selectedEntity = undefined;
viewer.clock.tick();
expect(viewModel.showInfo).toBe(false);
expect(viewModel.titleText).toEqual('');
expect(viewModel.description).toEqual('');
viewer.destroy();
});
it('home button resets tracked object', function() {
viewer = createViewer(container);
var entity = new Entity();
entity.position = new ConstantProperty(new Cartesian3(123456, 123456, 123456));
viewer.trackedEntity = entity;
expect(viewer.trackedEntity).toBe(entity);
//Needed to avoid actually creating a flight when we issue the home command.
spyOn(CameraFlightPath, 'createTween').and.returnValue({
startObject : {},
stopObject : {},
duration : 0.0
});
viewer.homeButton.viewModel.command();
expect(viewer.trackedEntity).toBeUndefined();
});
it('stops tracking when tracked object is removed', function() {
viewer = createViewer(container);
var entity = new Entity();
entity.position = new ConstantProperty(new Cartesian3(123456, 123456, 123456));
var dataSource = new MockDataSource();
dataSource.entities.add(entity);
viewer.dataSources.add(dataSource);
viewer.trackedEntity = entity;
expect(viewer.trackedEntity).toBe(entity);
return pollToPromise(function() {
viewer.render();
return Cartesian3.equals(Matrix4.getTranslation(viewer.scene.camera.transform, new Cartesian3()), entity.position.getValue());
}).then(function() {
dataSource.entities.remove(entity);
expect(viewer.trackedEntity).toBeUndefined();
expect(viewer.scene.camera.transform).toEqual(Matrix4.IDENTITY);
dataSource.entities.add(entity);
viewer.trackedEntity = entity;
expect(viewer.trackedEntity).toBe(entity);
return pollToPromise(function() {
viewer.render();
viewer.render();
return Cartesian3.equals(Matrix4.getTranslation(viewer.scene.camera.transform, new Cartesian3()), entity.position.getValue());
}).then(function() {
viewer.dataSources.remove(dataSource);
expect(viewer.trackedEntity).toBeUndefined();
expect(viewer.scene.camera.transform).toEqual(Matrix4.IDENTITY);
});
});
});
it('does not crash when tracking an object with a position property whose value is undefined.', function() {
viewer = createViewer(container);
var entity = new Entity();
entity.position = new ConstantProperty(undefined);
entity.polyline = {
positions : [Cartesian3.fromDegrees(0, 0, 0), Cartesian3.fromDegrees(0, 0, 1)]
};
viewer.entities.add(entity);
viewer.trackedEntity = entity;
spyOn(viewer.scene.renderError, 'raiseEvent');
return pollToPromise(function() {
viewer.render();
return viewer.dataSourceDisplay.update(viewer.clock.currentTime);
}).then(function() {
expect(viewer.scene.renderError.raiseEvent).not.toHaveBeenCalled();
});
});
it('zoomTo throws if target is not defined', function() {
viewer = createViewer(container);
expect(function() {
viewer.zoomTo();
}).toThrowDeveloperError();
});
it('zoomTo zooms to Cesium3DTileset with default offset when offset not defined', function() {
viewer = createViewer(container);
var path = './Data/Cesium3DTiles/Tilesets/TilesetOfTilesets/tileset.json';
var tileset = new Cesium3DTileset({
url : path
});
// load the tileset then check tests
return tileset.readyPromise.then(function() {
var expectedBoundingSphere = tileset.boundingSphere;
var expectedOffset = new HeadingPitchRange(0.0, -0.5, expectedBoundingSphere.radius);
var promise = viewer.zoomTo(tileset);
var wasCompleted = false;
spyOn(viewer.camera, 'viewBoundingSphere').and.callFake(function(boundingSphere, offset) {
expect(boundingSphere).toEqual(expectedBoundingSphere);
expect(offset).toEqual(expectedOffset);
wasCompleted = true;
});
viewer._postRender();
return promise.then(function() {
expect(wasCompleted).toEqual(true);
});
});
});
it('zoomTo zooms to Cesium3DTileset with offset', function() {
viewer = createViewer(container);
var path = './Data/Cesium3DTiles/Tilesets/TilesetOfTilesets/tileset.json';
var tileset = new Cesium3DTileset({
url : path
});
// load the tileset then check tests
return tileset.readyPromise.then(function() {
var expectedBoundingSphere = tileset.boundingSphere;
var expectedOffset = new HeadingPitchRange(0.4, 1.2, 4.0 * expectedBoundingSphere.radius);
var promise = viewer.zoomTo(tileset, expectedOffset);
var wasCompleted = false;
spyOn(viewer.camera, 'viewBoundingSphere').and.callFake(function(boundingSphere, offset) {
expect(boundingSphere).toEqual(expectedBoundingSphere);
expect(offset).toEqual(expectedOffset);
wasCompleted = true;
});
viewer._postRender();
return promise.then(function() {
expect(wasCompleted).toEqual(true);
});
});
});
function loadTimeDynamicPointCloud(viewer) {
var scene = viewer.scene;
var clock = viewer.clock;
var uri = './Data/Cesium3DTiles/PointCloud/PointCloudTimeDynamic/0.pnts';
var dates = [
'2018-07-19T15:18:00Z',
'2018-07-19T15:18:00.5Z'
];
function dataCallback() {
return {
uri: uri
};
}
var timeIntervalCollection = TimeIntervalCollection.fromIso8601DateArray({
iso8601Dates: dates,
dataCallback: dataCallback
});
var pointCloud = new TimeDynamicPointCloud({
intervals : timeIntervalCollection,
clock : clock
});
var start = JulianDate.fromIso8601(dates[0]);
clock.startTime = start;
clock.currentTime = start;
clock.multiplier = 0.0;
scene.primitives.add(pointCloud);
return pollToPromise(function() {
scene.render();
return defined(pointCloud.boundingSphere);
}).then(function() {
return pointCloud.readyPromise;
});
}
it('zoomTo zooms to TimeDynamicPointCloud with default offset when offset not defined', function() {
viewer = createViewer(container);
return loadTimeDynamicPointCloud(viewer).then(function(pointCloud) {
var expectedBoundingSphere = pointCloud.boundingSphere;
var expectedOffset = new HeadingPitchRange(0.0, -0.5, expectedBoundingSphere.radius);
var promise = viewer.zoomTo(pointCloud);
var wasCompleted = false;
spyOn(viewer.camera, 'viewBoundingSphere').and.callFake(function(boundingSphere, offset) {
expect(boundingSphere).toEqual(expectedBoundingSphere);
expect(offset).toEqual(expectedOffset);
wasCompleted = true;
});
viewer._postRender();
return promise.then(function() {
expect(wasCompleted).toEqual(true);
viewer.scene.primitives.remove(pointCloud);
});
});
});
it('zoomTo zooms to TimeDynamicPointCloud with offset', function() {
viewer = createViewer(container);
return loadTimeDynamicPointCloud(viewer).then(function(pointCloud) {
var expectedBoundingSphere = pointCloud.boundingSphere;
var expectedOffset = new HeadingPitchRange(0.4, 1.2, 4.0 * expectedBoundingSphere.radius);
var promise = viewer.zoomTo(pointCloud, expectedOffset);
var wasCompleted = false;
spyOn(viewer.camera, 'viewBoundingSphere').and.callFake(function(boundingSphere, offset) {
expect(boundingSphere).toEqual(expectedBoundingSphere);
expect(offset).toEqual(expectedOffset);
wasCompleted = true;
});
viewer._postRender();
return promise.then(function() {
expect(wasCompleted).toEqual(true);
viewer.scene.primitives.remove(pointCloud);
});
});
});
it('zoomTo zooms to entity with undefined offset when offset not defined', function() {
viewer = createViewer(container);
viewer.entities.add({
name : 'Blue box',
position : Cartesian3.fromDegrees(-114.0, 40.0, 300000.0),
box : {
dimensions : new Cartesian3(400000.0, 300000.0, 500000.0),
material : Color.BLUE
}
});
var entities = viewer.entities;
var promise = viewer.zoomTo(entities);
var wasCompleted = false;
spyOn(viewer._dataSourceDisplay, 'getBoundingSphere').and.callFake(function() {
return new BoundingSphere();
});
spyOn(viewer.camera, 'viewBoundingSphere').and.callFake(function(boundingSphere, offset) {
expect(boundingSphere).toBeDefined();
// expect offset to be undefined - doesn't use default bc of how zoomTo for entities is set up
expect(offset).toBeUndefined();
wasCompleted = true;
});
viewer._postRender();
return promise.then(function() {
expect(wasCompleted).toEqual(true);
});
});
it('zoomTo zooms to entity with offset', function() {
viewer = createViewer(container);
viewer.entities.add({
name : 'Blue box',
position : Cartesian3.fromDegrees(-114.0, 40.0, 300000.0),
box : {
dimensions : new Cartesian3(400000.0, 300000.0, 500000.0),
material : Color.BLUE
}
});
var entities = viewer.entities;
// fake temp offset
var expectedOffset = new HeadingPitchRange(3.0, 0.2, 2.3);
var promise = viewer.zoomTo(entities, expectedOffset);
var wasCompleted = false;
spyOn(viewer._dataSourceDisplay, 'getBoundingSphere').and.callFake(function() {
return new BoundingSphere();
});
spyOn(viewer.camera, 'viewBoundingSphere').and.callFake(function(boundingSphere, offset) {
expect(expectedOffset).toEqual(offset);
wasCompleted = true;
});
viewer._postRender();
return promise.then(function() {
expect(wasCompleted).toEqual(true);
});
});
it('flyTo throws if target is not defined', function() {
viewer = createViewer(container);
expect(function() {
viewer.flyTo();
}).toThrowDeveloperError();
});
it('flyTo flies to Cesium3DTileset with default offset when options not defined', function() {
viewer = createViewer(container);
var path = './Data/Cesium3DTiles/Tilesets/TilesetOfTilesets/tileset.json';
var tileset = new Cesium3DTileset({
url : path
});
// load tileset to test
return tileset.readyPromise.then(function() {
var promise = viewer.flyTo(tileset);
var wasCompleted = false;
spyOn(viewer.camera, 'flyToBoundingSphere').and.callFake(function(target, options) {
expect(options.offset).toBeDefined();
expect(options.duration).toBeUndefined();
expect(options.maximumHeight).toBeUndefined();
wasCompleted = true;
options.complete();
});
viewer._postRender();
return promise.then(function() {
expect(wasCompleted).toEqual(true);
});
});
});
it('flyTo flies to Cesium3DTileset with default offset when offset not defined', function() {
viewer = createViewer(container);
var path = './Data/Cesium3DTiles/Tilesets/TilesetOfTilesets/tileset.json';
var tileset = new Cesium3DTileset({
url : path
});
var options = {};
// load tileset to test
return tileset.readyPromise.then(function() {
var promise = viewer.flyTo(tileset, options);
var wasCompleted = false;
spyOn(viewer.camera, 'flyToBoundingSphere').and.callFake(function(target, options) {
expect(options.offset).toBeDefined();
expect(options.duration).toBeUndefined();
expect(options.maximumHeight).toBeUndefined();
wasCompleted = true;
options.complete();
});
viewer._postRender();
return promise.then(function() {
expect(wasCompleted).toEqual(true);
});
});
});
it('flyTo flies to Cesium3DTileset when options are defined', function() {
viewer = createViewer(container);
var path = './Data/Cesium3DTiles/Tilesets/TilesetOfTilesets/tileset.json';
var tileset = new Cesium3DTileset({
url : path
});
// load tileset to test
return tileset.readyPromise.then(function() {
var offsetVal = new HeadingPitchRange(3.0, 0.2, 2.3);
var options = {
offset : offsetVal,
duration : 3.0,
maximumHeight : 5.0
};
var promise = viewer.flyTo(tileset, options);
var wasCompleted = false;
spyOn(viewer.camera, 'flyToBoundingSphere').and.callFake(function(target, options) {
expect(options.duration).toBeDefined();
expect(options.maximumHeight).toBeDefined();
wasCompleted = true;
options.complete();
});
viewer._postRender();
return promise.then(function() {
expect(wasCompleted).toEqual(true);
});
});
});
it('flyTo flies to TimeDynamicPointCloud with default offset when options not defined', function() {
viewer = createViewer(container);
return loadTimeDynamicPointCloud(viewer).then(function(pointCloud) {
var promise = viewer.flyTo(pointCloud);
var wasCompleted = false;
spyOn(viewer.camera, 'flyToBoundingSphere').and.callFake(function(target, options) {
expect(options.offset).toBeDefined();
expect(options.duration).toBeUndefined();
expect(options.maximumHeight).toBeUndefined();
wasCompleted = true;
options.complete();
});
viewer._postRender();
return promise.then(function() {
expect(wasCompleted).toEqual(true);
viewer.scene.primitives.remove(pointCloud);
});
});
});
it('flyTo flies to TimeDynamicPointCloud with default offset when offset not defined', function() {
viewer = createViewer(container);
return loadTimeDynamicPointCloud(viewer).then(function(pointCloud) {
var options = {};
var promise = viewer.flyTo(pointCloud, options);
var wasCompleted = false;
spyOn(viewer.camera, 'flyToBoundingSphere').and.callFake(function(target, options) {
expect(options.offset).toBeDefined();
expect(options.duration).toBeUndefined();
expect(options.maximumHeight).toBeUndefined();
wasCompleted = true;
options.complete();
});
viewer._postRender();
return promise.then(function() {
expect(wasCompleted).toEqual(true);
viewer.scene.primitives.remove(pointCloud);
});
});
});
it('flyTo flies to TimeDynamicPointCloud when options are defined', function() {
viewer = createViewer(container);
return loadTimeDynamicPointCloud(viewer).then(function(pointCloud) {
var offsetVal = new HeadingPitchRange(3.0, 0.2, 2.3);
var options = {
offset : offsetVal,
duration : 3.0,
maximumHeight : 5.0
};
var promise = viewer.flyTo(pointCloud, options);
var wasCompleted = false;
spyOn(viewer.camera, 'flyToBoundingSphere').and.callFake(function(target, options) {
expect(options.duration).toBeDefined();
expect(options.maximumHeight).toBeDefined();
wasCompleted = true;
options.complete();
});
viewer._postRender();
return promise.then(function() {
expect(wasCompleted).toEqual(true);
viewer.scene.primitives.remove(pointCloud);
});
});
});
it('flyTo flies to entity with default offset when options not defined', function() {
viewer = createViewer(container);
viewer.entities.add({
name : 'Blue box',
position : Cartesian3.fromDegrees(-114.0, 40.0, 300000.0),
box : {
dimensions : new Cartesian3(400000.0, 300000.0, 500000.0),
material : Color.BLUE
}
});
var entities = viewer.entities;
var promise = viewer.flyTo(entities);
var wasCompleted = false;
spyOn(viewer._dataSourceDisplay, 'getBoundingSphere').and.callFake(function() {
return new BoundingSphere();
});
spyOn(viewer.camera, 'flyToBoundingSphere').and.callFake(function(target, options) {
expect(options.duration).toBeUndefined();
expect(options.maximumHeight).toBeUndefined();
wasCompleted = true;
options.complete();
});
viewer._postRender();
return promise.then(function() {
expect(wasCompleted).toEqual(true);
});
});
it('flyTo flys to entity with default offset when offset not defined', function() {
viewer = createViewer(container);
viewer.entities.add({
name : 'Blue box',
position : Cartesian3.fromDegrees(-114.0, 40.0, 300000.0),
box : {
dimensions : new Cartesian3(400000.0, 300000.0, 500000.0),
material : Color.BLUE
}
});
var entities = viewer.entities;
var options = {};
var promise = viewer.flyTo(entities, options);
var wasCompleted = false;
spyOn(viewer._dataSourceDisplay, 'getBoundingSphere').and.callFake(function() {
return new BoundingSphere();
});
spyOn(viewer.camera, 'flyToBoundingSphere').and.callFake(function(target, options) {
expect(options.duration).toBeUndefined();
expect(options.maximumHeight).toBeUndefined();
wasCompleted = true;
options.complete();
});
viewer._postRender();
return promise.then(function() {
expect(wasCompleted).toEqual(true);
});
});
it('flyTo flies to entity when options are defined', function() {
viewer = createViewer(container);
viewer.entities.add({
name : 'Blue box',
position : Cartesian3.fromDegrees(-114.0, 40.0, 300000.0),
box : {
dimensions : new Cartesian3(400000.0, 300000.0, 500000.0),
material : Color.BLUE
}
});
var entities = viewer.entities;
var offsetVal = new HeadingPitchRange(3.0, 0.2, 2.3);
var options = {
offset : offsetVal,
duration : 3.0,
maximumHeight : 5.0
};
var promise = viewer.flyTo(entities, options);
var wasCompleted = false;
spyOn(viewer._dataSourceDisplay, 'getBoundingSphere').and.callFake(function() {
return new BoundingSphere();
});
spyOn(viewer.camera, 'flyToBoundingSphere').and.callFake(function(target, options) {
expect(options.duration).toBeDefined();
expect(options.maximumHeight).toBeDefined();
wasCompleted = true;
options.complete();
});
viewer._postRender();
return promise.then(function() {
expect(wasCompleted).toEqual(true);
});
});
it('flyTo flies to entity when offset is defined but other options for flyTo are not', function() {
viewer = createViewer(container);
viewer.entities.add({
name : 'Blue box',
position : Cartesian3.fromDegrees(-114.0, 40.0, 300000.0),
box : {
dimensions : new Cartesian3(400000.0, 300000.0, 500000.0),
material : Color.BLUE
}
});
var entities = viewer.entities;
var offsetVal = new HeadingPitchRange(3.0, 0.2, 2.3);
var options = {
offset : offsetVal
};
var promise = viewer.flyTo(entities, options);
var wasCompleted = false;
spyOn(viewer._dataSourceDisplay, 'getBoundingSphere').and.callFake(function() {
return new BoundingSphere();
});
spyOn(viewer.camera, 'flyToBoundingSphere').and.callFake(function(target, options) {
expect(options.duration).toBeUndefined();
expect(options.maximumHeight).toBeUndefined();
wasCompleted = true;
options.complete();
});
viewer._postRender();
return promise.then(function() {
expect(wasCompleted).toEqual(true);
});
});
it('removes data source listeners when destroyed', function() {
viewer = createViewer(container);
//one data source that is added before mixing in
var preMixinDataSource = new MockDataSource();
viewer.dataSources.add(preMixinDataSource);
//one data source that is added after mixing in
var postMixinDataSource = new MockDataSource();
viewer.dataSources.add(postMixinDataSource);
var preMixinListenerCount = preMixinDataSource.entities.collectionChanged._listeners.length;
var postMixinListenerCount = postMixinDataSource.entities.collectionChanged._listeners.length;
viewer = viewer.destroy();
expect(preMixinDataSource.entities.collectionChanged._listeners.length).not.toEqual(preMixinListenerCount);
expect(postMixinDataSource.entities.collectionChanged._listeners.length).not.toEqual(postMixinListenerCount);
});
}, 'WebGL');