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');