import { BoundingSphere } from "../../../Source/Cesium.js"; import { Cartesian3 } from "../../../Source/Cesium.js"; import { CartographicGeocoderService } from "../../../Source/Cesium.js"; import { Clock } from "../../../Source/Cesium.js"; import { ClockRange } from "../../../Source/Cesium.js"; import { ClockStep } from "../../../Source/Cesium.js"; import { Color } from "../../../Source/Cesium.js"; import { defined } from "../../../Source/Cesium.js"; import { EllipsoidTerrainProvider } from "../../../Source/Cesium.js"; import { HeadingPitchRange } from "../../../Source/Cesium.js"; import { JulianDate } from "../../../Source/Cesium.js"; import { Matrix4 } from "../../../Source/Cesium.js"; import { TimeIntervalCollection } from "../../../Source/Cesium.js"; import { WebMercatorProjection } from "../../../Source/Cesium.js"; import { ConstantPositionProperty } from "../../../Source/Cesium.js"; import { ConstantProperty } from "../../../Source/Cesium.js"; import { DataSourceClock } from "../../../Source/Cesium.js"; import { DataSourceCollection } from "../../../Source/Cesium.js"; import { DataSourceDisplay } from "../../../Source/Cesium.js"; import { Entity } from "../../../Source/Cesium.js"; import { Camera } from "../../../Source/Cesium.js"; import { CameraFlightPath } from "../../../Source/Cesium.js"; import { Cesium3DTileset } from "../../../Source/Cesium.js"; import { ImageryLayerCollection } from "../../../Source/Cesium.js"; import { SceneMode } from "../../../Source/Cesium.js"; import { ShadowMode } from "../../../Source/Cesium.js"; import { TimeDynamicPointCloud } from "../../../Source/Cesium.js"; import createViewer from "../../createViewer.js"; import DomEventSimulator from "../../DomEventSimulator.js"; import MockDataSource from "../../MockDataSource.js"; import pollToPromise from "../../pollToPromise.js"; import { Animation } from "../../../Source/Cesium.js"; import { BaseLayerPicker } from "../../../Source/Cesium.js"; import { ProviderViewModel } from "../../../Source/Cesium.js"; import { CesiumWidget } from "../../../Source/Cesium.js"; import { ClockViewModel } from "../../../Source/Cesium.js"; import { FullscreenButton } from "../../../Source/Cesium.js"; import { Geocoder } from "../../../Source/Cesium.js"; import { HomeButton } from "../../../Source/Cesium.js"; import { NavigationHelpButton } from "../../../Source/Cesium.js"; import { SceneModePicker } from "../../../Source/Cesium.js"; import { SelectionIndicator } from "../../../Source/Cesium.js"; import { Timeline } from "../../../Source/Cesium.js"; describe( "Widgets/Viewer/Viewer", function () { 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.useBrowserRecommendedResolution).toBe(true); 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, powerPreference: "low-power", 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.powerPreference).toEqual( webglOptions.powerPreference ); 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("can enable useBrowserRecommendedResolution", function () { viewer = createViewer(container, { useBrowserRecommendedResolution: true, }); expect(viewer.useBrowserRecommendedResolution).toBe(true); }); it("useBrowserRecommendedResolution ignores devicePixelRatio", function () { var oldDevicePixelRatio = window.devicePixelRatio; window.devicePixelRatio = 2.0; viewer = createViewer(container, { useDefaultRenderLoop: false, }); viewer.resolutionScale = 0.5; viewer.useBrowserRecommendedResolution = true; viewer.resize(); expect(viewer.scene.pixelRatio).toEqual(0.5); viewer.useBrowserRecommendedResolution = false; viewer.resize(); expect(viewer.scene.pixelRatio).toEqual(1.0); window.devicePixelRatio = oldDevicePixelRatio; }); 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.indexOf(error) !== -1) { 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" );